Compare commits
1546 Commits
sandbox/sl
...
v1.2.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b9ce430292 | ||
|
|
feba090e5f | ||
|
|
a1d929ea97 | ||
|
|
7a09f6b892 | ||
|
|
fd671152bc | ||
|
|
57e12be283 | ||
|
|
a0ad16e203 | ||
|
|
2cd48bdc92 | ||
|
|
cc91d655e4 | ||
|
|
74efda4bd6 | ||
|
|
3a19eebe4d | ||
|
|
000c8414b5 | ||
|
|
bc10eab41b | ||
|
|
ef2248a2a3 | ||
|
|
9a3de881c0 | ||
|
|
f2b36a4de7 | ||
|
|
bfca084fcd | ||
|
|
9961ad479a | ||
|
|
7891fb5eda | ||
|
|
836f8e9883 | ||
|
|
9bc8d5aab9 | ||
|
|
eebb648380 | ||
|
|
d034bfa947 | ||
|
|
464b1df6d4 | ||
|
|
6b1d95d6d8 | ||
|
|
efb2f92702 | ||
|
|
9cc6f078dc | ||
|
|
17718fbbcd | ||
|
|
0d80584327 | ||
|
|
b52288aaff | ||
|
|
8bb82fded5 | ||
|
|
6475224e4f | ||
|
|
999f31f71c | ||
|
|
7c7801e34d | ||
|
|
a5ffcdd8d4 | ||
|
|
cd7f6841aa | ||
|
|
83e8f2f976 | ||
|
|
7ebcaeb0fa | ||
|
|
4d9791e2b1 | ||
|
|
69d074841d | ||
|
|
80fe4723d2 | ||
|
|
fe91e47bc7 | ||
|
|
0a3eec86e5 | ||
|
|
78bf8284cf | ||
|
|
ee28bb87b4 | ||
|
|
01824d1848 | ||
|
|
95390b2b20 | ||
|
|
03c0af8747 | ||
|
|
7ee44eef13 | ||
|
|
ca003fbb22 | ||
|
|
9016fa22e0 | ||
|
|
3c8007f19e | ||
|
|
3b783d2217 | ||
|
|
9e06601db6 | ||
|
|
b0e1c5f899 | ||
|
|
8a6a7ae292 | ||
|
|
533470c998 | ||
|
|
65d73881f7 | ||
|
|
1fc3cc8e97 | ||
|
|
96e5939faf | ||
|
|
6106b72eb6 | ||
|
|
fd3078fd8f | ||
|
|
5ed84c2fdf | ||
|
|
861a6bbbfd | ||
|
|
adaf77c075 | ||
|
|
15dffcfefa | ||
|
|
4cf4c94ad1 | ||
|
|
9da8a34437 | ||
|
|
52bddd44c0 | ||
|
|
f6886c4b93 | ||
|
|
ec658125b0 | ||
|
|
d21070a538 | ||
|
|
81fd7ac589 | ||
|
|
4de7aed6fb | ||
|
|
8b698e8cb1 | ||
|
|
107f14bcf9 | ||
|
|
4c53bacce4 | ||
|
|
30d8ba541e | ||
|
|
55cff377dd | ||
|
|
1a89bc04e8 | ||
|
|
eb8e9f80c4 | ||
|
|
85b27a1271 | ||
|
|
cc017ca8df | ||
|
|
0e213fb999 | ||
|
|
e6109dbd41 | ||
|
|
4206c6dd01 | ||
|
|
f199bab7ab | ||
|
|
7ca59827e3 | ||
|
|
30f58b526d | ||
|
|
9bbab8e457 | ||
|
|
ea90cee2a9 | ||
|
|
6f35b1958e | ||
|
|
9704cdec9f | ||
|
|
d539c1db5a | ||
|
|
96f706655e | ||
|
|
3730963073 | ||
|
|
d377580d07 | ||
|
|
d9ed9f9dae | ||
|
|
ab98103fac | ||
|
|
a75a9cf2fd | ||
|
|
eb492100cd | ||
|
|
4e72915ebc | ||
|
|
f4316f39a1 | ||
|
|
0211cd899a | ||
|
|
22141d9d79 | ||
|
|
b501251e2e | ||
|
|
5979b89b92 | ||
|
|
c03cc3a85e | ||
|
|
e278673c8e | ||
|
|
154f1c2234 | ||
|
|
eec08d5cfc | ||
|
|
57c7e45066 | ||
|
|
1338a98d07 | ||
|
|
1076101b2b | ||
|
|
33d91719d0 | ||
|
|
0925442e66 | ||
|
|
a082467891 | ||
|
|
260f5071ed | ||
|
|
648cfcb437 | ||
|
|
08cf9faed0 | ||
|
|
7b7ca65bfc | ||
|
|
8d02833a61 | ||
|
|
818b10396d | ||
|
|
2ff6d35064 | ||
|
|
488ba1ab9c | ||
|
|
c6fd0a5dd6 | ||
|
|
7e9a519fbb | ||
|
|
64075c9b01 | ||
|
|
c953aeacd4 | ||
|
|
90625c3bc1 | ||
|
|
10f8b36146 | ||
|
|
7177c3220c | ||
|
|
446d85e4d7 | ||
|
|
c533f2a43e | ||
|
|
5746a76145 | ||
|
|
c522217d78 | ||
|
|
e75e249b75 | ||
|
|
2a96d6b0d5 | ||
|
|
24c346dffc | ||
|
|
8bec177dc4 | ||
|
|
f0b500bc4f | ||
|
|
e8d58d3fd0 | ||
|
|
cdb2a126a6 | ||
|
|
fa0f418523 | ||
|
|
bd6ffaa325 | ||
|
|
272974af36 | ||
|
|
12ddb75a9a | ||
|
|
e57394aa1d | ||
|
|
6cb50ce527 | ||
|
|
8ee88da060 | ||
|
|
b0cfcb2ca8 | ||
|
|
1829d03906 | ||
|
|
9f0b42247d | ||
|
|
985f09fdca | ||
|
|
d71ba03822 | ||
|
|
97fd7c5eb6 | ||
|
|
2b59e14a00 | ||
|
|
d1b6fa4161 | ||
|
|
b4ab43f12c | ||
|
|
ff61cbc510 | ||
|
|
4180dfd93c | ||
|
|
ec52713999 | ||
|
|
429743c56b | ||
|
|
51ebb9a396 | ||
|
|
3c37e7d2fa | ||
|
|
336ca9a43a | ||
|
|
aa165c8c5d | ||
|
|
a9a1eac6c7 | ||
|
|
69babd39f1 | ||
|
|
b78d90703c | ||
|
|
4b0b43632b | ||
|
|
0e17ee56e8 | ||
|
|
6ce58e84d3 | ||
|
|
1746b2adc6 | ||
|
|
a497cb59cd | ||
|
|
41aede61e9 | ||
|
|
a82c58c40f | ||
|
|
3c208a5a5e | ||
|
|
03b3fcecac | ||
|
|
cbc249ba00 | ||
|
|
1347b2ce0f | ||
|
|
d4d7589428 | ||
|
|
f47544745e | ||
|
|
ef4a9670a8 | ||
|
|
1161055129 | ||
|
|
aa4f9dd153 | ||
|
|
6b8665ebc4 | ||
|
|
e66e9ddfb4 | ||
|
|
0cdc046ff2 | ||
|
|
dd0100ddb1 | ||
|
|
e593014ebd | ||
|
|
4066c8b205 | ||
|
|
fbea897d85 | ||
|
|
8967fcaf84 | ||
|
|
980ca6324f | ||
|
|
fce8f063e3 | ||
|
|
5215c8f066 | ||
|
|
310666b1cd | ||
|
|
9f89c4c291 | ||
|
|
903efe8a2f | ||
|
|
fe8b1e51f4 | ||
|
|
9ec2552792 | ||
|
|
e3e63fbcba | ||
|
|
c0e80959ce | ||
|
|
a9cb6f6918 | ||
|
|
210fa2810a | ||
|
|
de6ddefa9f | ||
|
|
f31c40086e | ||
|
|
7f009975e9 | ||
|
|
4d3c3be6ba | ||
|
|
a6f4fc5a93 | ||
|
|
827e22c732 | ||
|
|
3eb4143fc3 | ||
|
|
a591209afd | ||
|
|
606ac45b2f | ||
|
|
b25ebf7dde | ||
|
|
94285b79ab | ||
|
|
07ff7fa811 | ||
|
|
e61573c5f4 | ||
|
|
bb3d510a18 | ||
|
|
15296c24a6 | ||
|
|
eab09e34e3 | ||
|
|
cdc35037a5 | ||
|
|
147e864629 | ||
|
|
b293698561 | ||
|
|
acd147c50c | ||
|
|
e7bbedce5f | ||
|
|
e2c5e78ad9 | ||
|
|
31fd98d724 | ||
|
|
e859faa29e | ||
|
|
532faf0f1c | ||
|
|
6c86ef2ea4 | ||
|
|
d67acd870a | ||
|
|
4e06b0c602 | ||
|
|
a441b60aa0 | ||
|
|
96b6b6bbf0 | ||
|
|
a87fb0da5b | ||
|
|
3cecdd683e | ||
|
|
1a376c407a | ||
|
|
17b34a1bba | ||
|
|
3897b48aba | ||
|
|
c8c71f1fbf | ||
|
|
007486329f | ||
|
|
c7acd6db5e | ||
|
|
6fc1d9efc4 | ||
|
|
6291dd4c2f | ||
|
|
d6e80deb32 | ||
|
|
7c32cb52b5 | ||
|
|
5daaa838a6 | ||
|
|
b178fe7bfb | ||
|
|
5eaa9bcfe3 | ||
|
|
0277c70a17 | ||
|
|
576629baaf | ||
|
|
8df79e9d42 | ||
|
|
7b0b6a2c41 | ||
|
|
0ca0c4f6a0 | ||
|
|
0164a1cc5b | ||
|
|
30fb976e3e | ||
|
|
52ec78be7d | ||
|
|
598759be1d | ||
|
|
71618e542c | ||
|
|
118b9931d7 | ||
|
|
538c6ea3d3 | ||
|
|
53d92e61cc | ||
|
|
9904c28f5b | ||
|
|
baedcedcbe | ||
|
|
5d0174bc02 | ||
|
|
363a67c601 | ||
|
|
5205d299bb | ||
|
|
2926571be6 | ||
|
|
e343988f9d | ||
|
|
965d8686bb | ||
|
|
2b10528adc | ||
|
|
c8a88a7642 | ||
|
|
0d3f31e83a | ||
|
|
7f63bfa6d2 | ||
|
|
cab6ac16e0 | ||
|
|
b073e3cdd4 | ||
|
|
cd0bf0e407 | ||
|
|
0927a41139 | ||
|
|
7fccab39b5 | ||
|
|
dd6134b472 | ||
|
|
fc2fc899ae | ||
|
|
f78e5a04e6 | ||
|
|
5715c39cf8 | ||
|
|
d7f26e13fe | ||
|
|
d850034443 | ||
|
|
ffe79d61d4 | ||
|
|
9ec20f85c4 | ||
|
|
caf0f14f84 | ||
|
|
d708e7fbbe | ||
|
|
d790bc1779 | ||
|
|
2fb29ff7f9 | ||
|
|
57faddb7c5 | ||
|
|
49f7f05f52 | ||
|
|
5e39a8c16f | ||
|
|
0f7e4665ae | ||
|
|
4890853010 | ||
|
|
410ae576e7 | ||
|
|
a419f0f232 | ||
|
|
cf0970157d | ||
|
|
ad479a9b3d | ||
|
|
ea392d4714 | ||
|
|
b9180fc049 | ||
|
|
2d225689d3 | ||
|
|
2bf62c1dbb | ||
|
|
e82d261d10 | ||
|
|
8631c1b8a2 | ||
|
|
eb5b965b44 | ||
|
|
600875cd6a | ||
|
|
0fe79aab19 | ||
|
|
38ddb426d0 | ||
|
|
c1b417c6ba | ||
|
|
282b58006b | ||
|
|
1e1799c9cb | ||
|
|
4853e5fb1b | ||
|
|
65dd157c3c | ||
|
|
51fe9168d5 | ||
|
|
eec30c891d | ||
|
|
871bd23e4c | ||
|
|
92963df086 | ||
|
|
44d35f7b25 | ||
|
|
c7ca380832 | ||
|
|
297dc90255 | ||
|
|
499510f2be | ||
|
|
2d6cb342c2 | ||
|
|
c8f4c187b3 | ||
|
|
9851486b2f | ||
|
|
6f3d7ecc66 | ||
|
|
14d827f44e | ||
|
|
22f56b93e5 | ||
|
|
3e32105d63 | ||
|
|
2bf8fb5889 | ||
|
|
f039a85fd8 | ||
|
|
f86993f195 | ||
|
|
357800e7cd | ||
|
|
9f9cc8fe71 | ||
|
|
ef8ba4f668 | ||
|
|
9260aa8e15 | ||
|
|
25a36d6b3c | ||
|
|
d8216b19b6 | ||
|
|
d46ddd0839 | ||
|
|
0cc044f071 | ||
|
|
8b1a14d12f | ||
|
|
e50c842755 | ||
|
|
22ae1403e9 | ||
|
|
28f5451572 | ||
|
|
14c9fce8e4 | ||
|
|
f2a6799cc9 | ||
|
|
e918ed98d4 | ||
|
|
e5cef5d5a6 | ||
|
|
faed00d844 | ||
|
|
101c2bd1fa | ||
|
|
414b5eaede | ||
|
|
3f252e30e4 | ||
|
|
f0605f4b7e | ||
|
|
60b36abf85 | ||
|
|
24e7b1b90d | ||
|
|
061a16d96e | ||
|
|
1b27e93cd1 | ||
|
|
3939e85b26 | ||
|
|
0c483d6b68 | ||
|
|
dba053898a | ||
|
|
504601bb14 | ||
|
|
b41c17d625 | ||
|
|
11876faa11 | ||
|
|
88e4a8af0f | ||
|
|
175495fe73 | ||
|
|
f4126995b7 | ||
|
|
a7eea3e267 | ||
|
|
d72c536ede | ||
|
|
8e858f90f3 | ||
|
|
abf1784c31 | ||
|
|
317d4244cb | ||
|
|
c311b3b3a9 | ||
|
|
5948a02106 | ||
|
|
441cac8ea6 | ||
|
|
97495c5c5c | ||
|
|
b35a0db0e7 | ||
|
|
a91b42f022 | ||
|
|
21173e1999 | ||
|
|
b5b61c179d | ||
|
|
0c261715b0 | ||
|
|
3c5ed6f52e | ||
|
|
6dc21bce63 | ||
|
|
87b12ac875 | ||
|
|
72b7db36f3 | ||
|
|
e0a80519c7 | ||
|
|
46da1cae05 | ||
|
|
e4dc2b9248 | ||
|
|
6b33ca395f | ||
|
|
9aa58f3fcb | ||
|
|
d9ca52452b | ||
|
|
8106df8f5a | ||
|
|
c459d37c26 | ||
|
|
811d0ff209 | ||
|
|
21ac3c8f26 | ||
|
|
4ed05a8bb1 | ||
|
|
00794a93ec | ||
|
|
8b15cf6929 | ||
|
|
3df4436e1a | ||
|
|
a46ec16569 | ||
|
|
3f8349467a | ||
|
|
31322c5faa | ||
|
|
a337725625 | ||
|
|
b3151c80fc | ||
|
|
0799cccce3 | ||
|
|
c88fc5b2f9 | ||
|
|
cb265a497d | ||
|
|
ccea000c4b | ||
|
|
403966ae00 | ||
|
|
bf2c903000 | ||
|
|
85ef83a173 | ||
|
|
1991123054 | ||
|
|
9e9f5f3d70 | ||
|
|
06dc2f6166 | ||
|
|
66ba79f5fb | ||
|
|
fd9df44a05 | ||
|
|
3c021e1d79 | ||
|
|
451ab0c01e | ||
|
|
bcee56bed5 | ||
|
|
921ffdd2c9 | ||
|
|
9ed1b2f09e | ||
|
|
6a819ce4fe | ||
|
|
56e8485c84 | ||
|
|
a05bf133ae | ||
|
|
e68953b7c8 | ||
|
|
9aa2bd8a03 | ||
|
|
6b7cf3077d | ||
|
|
eb0c5a6ffc | ||
|
|
422f97d7ab | ||
|
|
7af4eb014b | ||
|
|
20cd3e6b8f | ||
|
|
6b66c01c88 | ||
|
|
9c41143d66 | ||
|
|
e9cacfd66d | ||
|
|
301409107f | ||
|
|
ddf94f6184 | ||
|
|
c21f53a501 | ||
|
|
7a1590713e | ||
|
|
9ed874713f | ||
|
|
676610d2a8 | ||
|
|
fd903902ef | ||
|
|
154b4b4196 | ||
|
|
953c6a011e | ||
|
|
e50f96a4a3 | ||
|
|
5d88a82aa0 | ||
|
|
cbcfbe1b29 | ||
|
|
888699091d | ||
|
|
87c40b35eb | ||
|
|
a6f538cefa | ||
|
|
a60461a340 | ||
|
|
f0f609c2e2 | ||
|
|
91b5c98b3d | ||
|
|
8d07a97acc | ||
|
|
6d84322762 | ||
|
|
c34d91a84e | ||
|
|
aabae97e57 | ||
|
|
52cf4dcaea | ||
|
|
b8fa2839a2 | ||
|
|
2578b767c3 | ||
|
|
ce328b855f | ||
|
|
aab70f4d7a | ||
|
|
bcba86e2e9 | ||
|
|
9a4052a4ec | ||
|
|
b1bfd0ba87 | ||
|
|
019384f2d3 | ||
|
|
e2c6b05f9a | ||
|
|
61c5e31ca1 | ||
|
|
ad1216151d | ||
|
|
02a31e6b3c | ||
|
|
84be08b07f | ||
|
|
313bfbb6a2 | ||
|
|
2089f26b08 | ||
|
|
507ee87e3e | ||
|
|
f2bd11faa4 | ||
|
|
0c1cec2205 | ||
|
|
dadc9189ed | ||
|
|
f05feab7b9 | ||
|
|
02360dd2c2 | ||
|
|
b0a12a2880 | ||
|
|
b5ce9456db | ||
|
|
e6047a17a9 | ||
|
|
f93b1e7be1 | ||
|
|
04b9e0d787 | ||
|
|
ce42e79abc | ||
|
|
565d0e6feb | ||
|
|
6b151d436d | ||
|
|
5f0b303c28 | ||
|
|
3653fb473a | ||
|
|
9e50ed7f27 | ||
|
|
732cb9a643 | ||
|
|
c535025c12 | ||
|
|
e8223bd250 | ||
|
|
7989bb7fe7 | ||
|
|
6776bd62b5 | ||
|
|
a5879f7c81 | ||
|
|
12ee845ee7 | ||
|
|
d02e74a073 | ||
|
|
78071b3b97 | ||
|
|
efd54f8f41 | ||
|
|
8144132866 | ||
|
|
e6df50031e | ||
|
|
169823428f | ||
|
|
12d45f62f6 | ||
|
|
8c50a70a95 | ||
|
|
768ae275dc | ||
|
|
fea3556e20 | ||
|
|
2e0d55314c | ||
|
|
2dad8d65d9 | ||
|
|
51acb01167 | ||
|
|
417b852967 | ||
|
|
45f4b87e8e | ||
|
|
9df0d29823 | ||
|
|
a040eb37e4 | ||
|
|
fa1a9290e6 | ||
|
|
d8ebdcd89d | ||
|
|
11c706488b | ||
|
|
e2000cc5ca | ||
|
|
07c6eb18ad | ||
|
|
749bc98618 | ||
|
|
57d459ba82 | ||
|
|
8aae246089 | ||
|
|
109b69a706 | ||
|
|
0b0bc8d098 | ||
|
|
be8af188d0 | ||
|
|
61311e6103 | ||
|
|
510e0ab467 | ||
|
|
83a91e789c | ||
|
|
f103dcefaf | ||
|
|
2a8f57f50d | ||
|
|
fdb61a4531 | ||
|
|
ab77b4e898 | ||
|
|
55f74c59c7 | ||
|
|
a910049aea | ||
|
|
57cc35dd60 | ||
|
|
9951f46133 | ||
|
|
2b0aee4b5d | ||
|
|
5e3f607e73 | ||
|
|
21071373e7 | ||
|
|
8be41bba80 | ||
|
|
8978358358 | ||
|
|
319f7c4d56 | ||
|
|
83cef816fd | ||
|
|
294aa37745 | ||
|
|
630d3b95e2 | ||
|
|
c14754be1d | ||
|
|
8a6af9f98f | ||
|
|
892102842a | ||
|
|
f357e5e2f7 | ||
|
|
47dcd769c1 | ||
|
|
ac97b089d1 | ||
|
|
185eb70011 | ||
|
|
6a4ff6f325 | ||
|
|
4753ee4166 | ||
|
|
15c29afeca | ||
|
|
315b58ec38 | ||
|
|
de368fd0b5 | ||
|
|
d830573111 | ||
|
|
0e06bc817a | ||
|
|
d3879738bf | ||
|
|
ed208f7d2f | ||
|
|
c1c5932260 | ||
|
|
90b9f993c1 | ||
|
|
e479379abb | ||
|
|
4ade079633 | ||
|
|
bd5bfd94b8 | ||
|
|
9c2ca8c1ca | ||
|
|
e6c91b625e | ||
|
|
6c0d3d9522 | ||
|
|
6ce1f15dfb | ||
|
|
55610053af | ||
|
|
892e23a5ba | ||
|
|
34168287ed | ||
|
|
28aa08748e | ||
|
|
16a02e341c | ||
|
|
7ec139ccc8 | ||
|
|
80528410fc | ||
|
|
66da859e5e | ||
|
|
2a0d7b1a55 | ||
|
|
5f25d4c175 | ||
|
|
70a5104ead | ||
|
|
87aa846b47 | ||
|
|
0780f258da | ||
|
|
b2c8dff727 | ||
|
|
89cdfdb231 | ||
|
|
77119a5cd8 | ||
|
|
b73e6c89cd | ||
|
|
5bfa29b6c5 | ||
|
|
9f1083e9a0 | ||
|
|
33d9ea5471 | ||
|
|
2b2c0c9bda | ||
|
|
3cb92b85b9 | ||
|
|
31e86192ba | ||
|
|
b510863f8f | ||
|
|
2d8d15a71c | ||
|
|
03fadc4b20 | ||
|
|
d48ea5a2ab | ||
|
|
adb10c47a8 | ||
|
|
64c4be2669 | ||
|
|
09080d4e5e | ||
|
|
0c2b2c79ae | ||
|
|
f56918ba9c | ||
|
|
aa8650dd7f | ||
|
|
efb4783d36 | ||
|
|
a2407935d2 | ||
|
|
0c2f8e77cc | ||
|
|
bf1a8073c3 | ||
|
|
b651875e24 | ||
|
|
db389cb804 | ||
|
|
bb1915274f | ||
|
|
16a8948c45 | ||
|
|
1d7d18c69c | ||
|
|
63d9c4da5e | ||
|
|
b0056c3b5e | ||
|
|
056bcc8771 | ||
|
|
080919b3c2 | ||
|
|
c75f0ec379 | ||
|
|
fd294c553a | ||
|
|
c647ec4462 | ||
|
|
24196dd987 | ||
|
|
26c6a44c66 | ||
|
|
0ccefd2c8f | ||
|
|
a53d5a4c44 | ||
|
|
c8df1656bd | ||
|
|
e06c242baa | ||
|
|
d7e09b6ada | ||
|
|
72f459c77f | ||
|
|
4f8f360098 | ||
|
|
7d54dfc6e4 | ||
|
|
24beb58dd5 | ||
|
|
e542627b0c | ||
|
|
247e7343d5 | ||
|
|
c1c47e83b0 | ||
|
|
51c4f9e6b1 | ||
|
|
55fbdd58ac | ||
|
|
c4aeff94b1 | ||
|
|
f8b431c334 | ||
|
|
d6020f9d52 | ||
|
|
20573f0640 | ||
|
|
41e3da3a8c | ||
|
|
72af533f79 | ||
|
|
153eec46e0 | ||
|
|
8bc60e4749 | ||
|
|
6b2792b0e0 | ||
|
|
c4aa1d508e | ||
|
|
afa1b66108 | ||
|
|
6de67cd6e8 | ||
|
|
a4e410a3ca | ||
|
|
9fa6132fc5 | ||
|
|
a69810b893 | ||
|
|
e570b0406d | ||
|
|
254889cdfc | ||
|
|
be5bbc96e8 | ||
|
|
aa7335e610 | ||
|
|
6127af60c1 | ||
|
|
bdd60a7be7 | ||
|
|
16e101ba54 | ||
|
|
06fc0f83b6 | ||
|
|
34d7c8b3d4 | ||
|
|
f46e17fd6f | ||
|
|
4a91541c94 | ||
|
|
e2bacd581a | ||
|
|
15ea268d62 | ||
|
|
97259b460c | ||
|
|
b79879c2e3 | ||
|
|
640ddcabcc | ||
|
|
b5ee7b12d2 | ||
|
|
f2cd4ded22 | ||
|
|
e55974bf86 | ||
|
|
c84d42f864 | ||
|
|
c5434abc02 | ||
|
|
3c755577b8 | ||
|
|
120a464026 | ||
|
|
edd98b7310 | ||
|
|
3cad69430e | ||
|
|
7b0feac4a4 | ||
|
|
bdd35c13cc | ||
|
|
2a6daa72f0 | ||
|
|
3a9855556e | ||
|
|
87953d115f | ||
|
|
df49c7c58d | ||
|
|
9532bda0fb | ||
|
|
ea2229bab6 | ||
|
|
2999ca3094 | ||
|
|
3fcf0e3668 | ||
|
|
82e8884ad8 | ||
|
|
861ed6a5c1 | ||
|
|
5a2fd63a2a | ||
|
|
9d60506130 | ||
|
|
f89e109f56 | ||
|
|
4c14efd234 | ||
|
|
aa6afc0164 | ||
|
|
c954a33b05 | ||
|
|
cbf574cead | ||
|
|
b615a6d47f | ||
|
|
fa25a31ed4 | ||
|
|
75340193f7 | ||
|
|
9dc95b0a12 | ||
|
|
f89ea3432f | ||
|
|
f0c01413fb | ||
|
|
07c71ef7cc | ||
|
|
e1a55b504a | ||
|
|
44b5f76e34 | ||
|
|
7ca6c91732 | ||
|
|
d497ec688d | ||
|
|
46639567a0 | ||
|
|
e4f2ec7a52 | ||
|
|
8002c31804 | ||
|
|
63bf108731 | ||
|
|
c60cb01ce0 | ||
|
|
1427205215 | ||
|
|
e44720af84 | ||
|
|
e88f9e63ee | ||
|
|
9bf3bc9a72 | ||
|
|
88e24f07ae | ||
|
|
e0309e1509 | ||
|
|
cd1ef53d12 | ||
|
|
6064384d59 | ||
|
|
0db5599957 | ||
|
|
9452dce181 | ||
|
|
294777b915 | ||
|
|
21970d1dc2 | ||
|
|
efa69d26a1 | ||
|
|
ff1d170e69 | ||
|
|
de82809444 | ||
|
|
f9dba66877 | ||
|
|
e03330bd80 | ||
|
|
9409af2083 | ||
|
|
3579baa115 | ||
|
|
2b5e6de806 | ||
|
|
a82cc0205d | ||
|
|
062864f4cc | ||
|
|
49ea2bc3f4 | ||
|
|
f182376dd6 | ||
|
|
231339932b | ||
|
|
bac6c229e5 | ||
|
|
a99c20c0f4 | ||
|
|
e59d53e999 | ||
|
|
bdb4fb8991 | ||
|
|
8b153a55c9 | ||
|
|
2c0b4a24b9 | ||
|
|
3d9c3f4937 | ||
|
|
bc7151131d | ||
|
|
7cdc986cdf | ||
|
|
c6fb97a376 | ||
|
|
f382173225 | ||
|
|
5e54085703 | ||
|
|
63a77cbed9 | ||
|
|
efa17efced | ||
|
|
ed9c66f584 | ||
|
|
8d00562fba | ||
|
|
664d9921b7 | ||
|
|
4341e5af66 | ||
|
|
2f9e51b8c9 | ||
|
|
2d5c7f6740 | ||
|
|
a5cd42feb9 | ||
|
|
6505adf271 | ||
|
|
04182a121a | ||
|
|
217591fde5 | ||
|
|
07ba411914 | ||
|
|
05bde9d4a4 | ||
|
|
c0de35b413 | ||
|
|
af12c23e8e | ||
|
|
8f8b526b54 | ||
|
|
538865dfa5 | ||
|
|
86712c50f2 | ||
|
|
016a38be93 | ||
|
|
2aa408524c | ||
|
|
48b1917112 | ||
|
|
ab00d209bc | ||
|
|
3556deaca3 | ||
|
|
7bce513afe | ||
|
|
a572ac8327 | ||
|
|
b6e27d5f0b | ||
|
|
69aa303d96 | ||
|
|
22ea8592c1 | ||
|
|
380d64ecb1 | ||
|
|
9b85079342 | ||
|
|
6f9457ec12 | ||
|
|
3c85c532bb | ||
|
|
fa3e530bca | ||
|
|
9f41a8b0aa | ||
|
|
4a6ac727fe | ||
|
|
1a7d25a484 | ||
|
|
17c754fc00 | ||
|
|
bd0c3409a8 | ||
|
|
6829e62718 | ||
|
|
86e07525d5 | ||
|
|
3a16276cf7 | ||
|
|
fdd51829b1 | ||
|
|
0c2529a812 | ||
|
|
3c19bc3fb3 | ||
|
|
e529a825f7 | ||
|
|
4c3ad66b7f | ||
|
|
2a4b2a000c | ||
|
|
35ce4eb01d | ||
|
|
c0ee870b0a | ||
|
|
b854bbd844 | ||
|
|
e47306eb7a | ||
|
|
6aea309a93 | ||
|
|
5bc7b3a68e | ||
|
|
c4b9089bb9 | ||
|
|
222c72e50f | ||
|
|
0e05f2c6c9 | ||
|
|
800b70a3bf | ||
|
|
bc9293b815 | ||
|
|
1f20202e2c | ||
|
|
4797a97215 | ||
|
|
b870947d42 | ||
|
|
112bd4e2b4 | ||
|
|
1de5da80c9 | ||
|
|
85358d04cd | ||
|
|
c5f890af2c | ||
|
|
694d4e7777 | ||
|
|
b7a6f1d20e | ||
|
|
734b1b2041 | ||
|
|
f8e3d23b99 | ||
|
|
2f964bac26 | ||
|
|
01376858cd | ||
|
|
edec5eb5e7 | ||
|
|
4e8d35a461 | ||
|
|
744f482350 | ||
|
|
19987dcbfa | ||
|
|
9cc1611588 | ||
|
|
20307c70ae | ||
|
|
99d870a472 | ||
|
|
ff35649758 | ||
|
|
5e562c77db | ||
|
|
e96131705a | ||
|
|
a4c2211ea3 | ||
|
|
a609be5633 | ||
|
|
cdae03a4eb | ||
|
|
4645c89889 | ||
|
|
91206793c2 | ||
|
|
3e10be93f2 | ||
|
|
810a06b12c | ||
|
|
b84e8f20c3 | ||
|
|
56417a3075 | ||
|
|
9eb0b2f1da | ||
|
|
e28e08146e | ||
|
|
f3538f2b81 | ||
|
|
a49b9e0014 | ||
|
|
238dae8604 | ||
|
|
b9f19f8917 | ||
|
|
06f58c0df7 | ||
|
|
c1bf6ca6cc | ||
|
|
30e5deae5d | ||
|
|
ea8d436f30 | ||
|
|
27ee521753 | ||
|
|
b956f2ceb2 | ||
|
|
e6847aa0f0 | ||
|
|
edfed938ba | ||
|
|
f475f0c1bb | ||
|
|
81da41732c | ||
|
|
06c3d5bb9a | ||
|
|
3e8c6d3d35 | ||
|
|
b8791980b4 | ||
|
|
61046b8d7a | ||
|
|
7d984d8c38 | ||
|
|
8ef25de377 | ||
|
|
6f080f9cec | ||
|
|
1f71d2e2c8 | ||
|
|
56b06aef6d | ||
|
|
1654ae9a2a | ||
|
|
2f2302f8d5 | ||
|
|
f11613b620 | ||
|
|
bde2afbe23 | ||
|
|
3a975d9489 | ||
|
|
db8f0d2ca9 | ||
|
|
b45065d38b | ||
|
|
ca7e346669 | ||
|
|
a11624497c | ||
|
|
495b241fa6 | ||
|
|
4894b45ced | ||
|
|
76eb402668 | ||
|
|
5b0de48ddd | ||
|
|
fe270dd527 | ||
|
|
65dfcf4696 | ||
|
|
773bcc300d | ||
|
|
a04ed0e8f3 | ||
|
|
829179e888 | ||
|
|
20bd1446c0 | ||
|
|
52d13777da | ||
|
|
ddcdbfd71e | ||
|
|
1647f00c29 | ||
|
|
0453aca5af | ||
|
|
2bdda84e37 | ||
|
|
c5fe641179 | ||
|
|
7d1b37cdac | ||
|
|
0afcc76971 | ||
|
|
b2d9700f53 | ||
|
|
d98a5ed4dd | ||
|
|
6afafc313c | ||
|
|
a25f6a9c88 | ||
|
|
b5ea2fbc2c | ||
|
|
74ad25a4c6 | ||
|
|
da39e505dd | ||
|
|
fd41cb8491 | ||
|
|
e68894fa03 | ||
|
|
f676171e52 | ||
|
|
4e82f01547 | ||
|
|
6b6f367c3d | ||
|
|
04dce631a2 | ||
|
|
4ab3175b12 | ||
|
|
f1f28535c3 | ||
|
|
b73a3693e5 | ||
|
|
139577f937 | ||
|
|
0e9a6ed72a | ||
|
|
e9751d4b74 | ||
|
|
84c3cd79d1 | ||
|
|
7f0b11c0ae | ||
|
|
211694f67e | ||
|
|
8f910594bd | ||
|
|
1a219c22b1 | ||
|
|
d9b825cff2 | ||
|
|
d89eb6ad5a | ||
|
|
c156a68d06 | ||
|
|
c231b0175d | ||
|
|
283b0e25ac | ||
|
|
ede0b15c9d | ||
|
|
587ca06da9 | ||
|
|
e83d36c053 | ||
|
|
40991faeae | ||
|
|
01433c5043 | ||
|
|
6ae12c415e | ||
|
|
622958449b | ||
|
|
973a9c075d | ||
|
|
37de0b8bdf | ||
|
|
b4f70084cc | ||
|
|
c8a23ad3f4 | ||
|
|
ae8aa836d5 | ||
|
|
80c3bbf657 | ||
|
|
b748045470 | ||
|
|
3e4a80cc35 | ||
|
|
034cea5e72 | ||
|
|
bb0ca87a0d | ||
|
|
eacaabc592 | ||
|
|
11694aab66 | ||
|
|
fe53107fda | ||
|
|
6611f66978 | ||
|
|
05239f0c41 | ||
|
|
f3a13cb236 | ||
|
|
dc004e8c17 | ||
|
|
02c30cdeef | ||
|
|
2d29457c4d | ||
|
|
b32da7c3da | ||
|
|
9bcf07ae4a | ||
|
|
14566125ea | ||
|
|
db6ee54353 | ||
|
|
4e4f835232 | ||
|
|
81c0546407 | ||
|
|
7296b3f922 | ||
|
|
b433e12a3d | ||
|
|
4cb0ebe5b2 | ||
|
|
e3f850ee05 | ||
|
|
be99868bd1 | ||
|
|
8a9a11e8dc | ||
|
|
2007c3bb38 | ||
|
|
ba0822ba96 | ||
|
|
deca8cfc44 | ||
|
|
0d87098e08 | ||
|
|
db67dcba6a | ||
|
|
259ea23297 | ||
|
|
ac998ec8d8 | ||
|
|
c96f8e238d | ||
|
|
3fde9964ce | ||
|
|
2bd90c13a0 | ||
|
|
653e69e334 | ||
|
|
76495617e0 | ||
|
|
55c3963c88 | ||
|
|
109c20299c | ||
|
|
6f23f24afe | ||
|
|
10ed60dc71 | ||
|
|
67a1f98c2c | ||
|
|
458fb8f491 | ||
|
|
2cd1c2855e | ||
|
|
a60fc419f5 | ||
|
|
87fd66bb0e | ||
|
|
eb645abeac | ||
|
|
d9959e336e | ||
|
|
91b167202d | ||
|
|
5223016337 | ||
|
|
61599fb59f | ||
|
|
1ade44b352 | ||
|
|
299193dd1c | ||
|
|
e7e5a58d0c | ||
|
|
c7e6aabbca | ||
|
|
7be5b6dae4 | ||
|
|
92b0e544f3 | ||
|
|
bf6b314d89 | ||
|
|
9909047461 | ||
|
|
5405bd9793 | ||
|
|
532c30c83e | ||
|
|
223d1b54cf | ||
|
|
e71a010646 | ||
|
|
66533b1a8d | ||
|
|
f3ba4c6b82 | ||
|
|
361717d2be | ||
|
|
45feea4cf0 | ||
|
|
af49c11250 | ||
|
|
79327be6c7 | ||
|
|
baa17db184 | ||
|
|
abb7c2181e | ||
|
|
8767ac3bc7 | ||
|
|
9e4df2bcf5 | ||
|
|
254a7483e5 | ||
|
|
001bd51ceb | ||
|
|
dce64343d6 | ||
|
|
91907e0bf4 | ||
|
|
69d8d386ed | ||
|
|
1fba1e38ea | ||
|
|
5fafa2d524 | ||
|
|
96a42aaa2d | ||
|
|
e90d17d240 | ||
|
|
4e81a68af7 | ||
|
|
7368dd4f8f | ||
|
|
59129afc05 | ||
|
|
221e00eaa9 | ||
|
|
5c166470a5 | ||
|
|
346358a5b7 | ||
|
|
afb84bb1cc | ||
|
|
8c2ee4273c | ||
|
|
0e3bcc6f32 | ||
|
|
1374a4db3b | ||
|
|
d4700731ca | ||
|
|
03973017a7 | ||
|
|
04edde2b11 | ||
|
|
da8eb716e8 | ||
|
|
c73eb2ffff | ||
|
|
d1c0ba8f7a | ||
|
|
824e9410c6 | ||
|
|
212f618373 | ||
|
|
f1d6cc79e4 | ||
|
|
8c5b73de2a | ||
|
|
e5c236c210 | ||
|
|
773768ae27 | ||
|
|
9f002bee53 | ||
|
|
4ce6928d5b | ||
|
|
5b2fb32961 | ||
|
|
4101b5c5ed | ||
|
|
69ba6bd142 | ||
|
|
5610970fe9 | ||
|
|
34ba18760f | ||
|
|
50916c6a7d | ||
|
|
61f0c090df | ||
|
|
9e4f76c154 | ||
|
|
1a5a1903ea | ||
|
|
0a72f568ec | ||
|
|
5305e79eae | ||
|
|
4a4ade6dc8 | ||
|
|
8795b52512 | ||
|
|
4fb5ce6a92 | ||
|
|
4d052bdd91 | ||
|
|
ba420f1097 | ||
|
|
5a8cbb8955 | ||
|
|
2dc24635ec | ||
|
|
4f586f7bd0 | ||
|
|
1fe5070b76 | ||
|
|
9a248f1593 | ||
|
|
40b850b458 | ||
|
|
d8c525b8b1 | ||
|
|
13b56eeb7a | ||
|
|
f299d628f3 | ||
|
|
22c05c0575 | ||
|
|
b6679879b8 | ||
|
|
a615c40499 | ||
|
|
d75eb73653 | ||
|
|
a39321f37e | ||
|
|
cfab2caee1 | ||
|
|
b5278f38b0 | ||
|
|
e11f21af9a | ||
|
|
fbea372817 | ||
|
|
69aad3a720 | ||
|
|
a126cd1760 | ||
|
|
99fb568e67 | ||
|
|
7838f4cfff | ||
|
|
ab2dfd22f3 | ||
|
|
ad6fe4a88c | ||
|
|
8196cc85f8 | ||
|
|
6d82d2d22e | ||
|
|
1fbc81a970 | ||
|
|
a0c11928db | ||
|
|
a4c69e9a0f | ||
|
|
1f3f18443d | ||
|
|
d5b8f7860f | ||
|
|
caa1b28be3 | ||
|
|
63cb1a7ce0 | ||
|
|
dba79821f0 | ||
|
|
048497720c | ||
|
|
99b9757685 | ||
|
|
914f7c36d7 | ||
|
|
c684d5e5f2 | ||
|
|
ff39958cee | ||
|
|
21ca4c4d5d | ||
|
|
7def902261 | ||
|
|
e3081b2502 | ||
|
|
d04f852368 | ||
|
|
a84177b432 | ||
|
|
87254e0b7b | ||
|
|
f96d56c4aa | ||
|
|
00a1e2f8e4 | ||
|
|
9c62f94129 | ||
|
|
f62b33f140 | ||
|
|
eafdc5e10a | ||
|
|
5608c14020 | ||
|
|
0e86235265 | ||
|
|
ff52bf3691 | ||
|
|
5ed116e220 | ||
|
|
71a7501bcf | ||
|
|
6b25501bf1 | ||
|
|
6ed81fa5b3 | ||
|
|
b4da1f83e6 | ||
|
|
bd9d890605 | ||
|
|
ba6f60dba7 | ||
|
|
1bcf4e66bb | ||
|
|
f7cf439b34 | ||
|
|
814532a33c | ||
|
|
df2023a6cb | ||
|
|
c7a56f677d | ||
|
|
cb7b1fb144 | ||
|
|
a7d4d3c550 | ||
|
|
89c6017cc0 | ||
|
|
5c756005aa | ||
|
|
52490354f3 | ||
|
|
abc9958c52 | ||
|
|
4ead98fa84 | ||
|
|
33fa7c4ebe | ||
|
|
eeb8117303 | ||
|
|
eb16f00cf2 | ||
|
|
ca5c1b17a2 | ||
|
|
aeb86d615c | ||
|
|
a6aa389d2f | ||
|
|
3fbade23a2 | ||
|
|
04ec930abc | ||
|
|
e9465daee3 | ||
|
|
6c565fada0 | ||
|
|
bbf890fe27 | ||
|
|
c09d8c1419 | ||
|
|
a66d8d33dd | ||
|
|
8942f70cdf | ||
|
|
5a23352c03 | ||
|
|
57ad189129 | ||
|
|
dfa9e2c5ea | ||
|
|
1b2abc5f49 | ||
|
|
f10732554b | ||
|
|
5db296dd70 | ||
|
|
219ba87a93 | ||
|
|
ccd6f7ed77 | ||
|
|
1e7ded69cf | ||
|
|
2e102855f4 | ||
|
|
085fb4b737 | ||
|
|
1083fe4999 | ||
|
|
00fdb135a7 | ||
|
|
5abafcc381 | ||
|
|
4226f0ce64 | ||
|
|
64355ecad3 | ||
|
|
f8ffecb176 | ||
|
|
5e1fd41357 | ||
|
|
9594370e0c | ||
|
|
db5057c742 | ||
|
|
81d2206ff8 | ||
|
|
0da77a840b | ||
|
|
7a2b9c50a3 | ||
|
|
d5c46bdfc0 | ||
|
|
01527e743f | ||
|
|
fd6da3b2e7 | ||
|
|
1f32b1489c | ||
|
|
47bc1c7013 | ||
|
|
cfbfd39de8 | ||
|
|
ef86bad0d1 | ||
|
|
76557e34d2 | ||
|
|
d9f898ab6d | ||
|
|
454cbc96b7 | ||
|
|
aa926fbd27 | ||
|
|
2089b2cee5 | ||
|
|
8d5ce819dd | ||
|
|
72c76ca256 | ||
|
|
aeca599087 | ||
|
|
c36b6d4d01 | ||
|
|
5b67329747 | ||
|
|
373dcec57a | ||
|
|
496bcbb0de | ||
|
|
73c3d32705 | ||
|
|
d2a6eb4b1e | ||
|
|
ddb6edd831 | ||
|
|
508ae1b3d5 | ||
|
|
6f6cd3abb9 | ||
|
|
3698c1f620 | ||
|
|
7a49accd0b | ||
|
|
09c933ea80 | ||
|
|
43464e94ed | ||
|
|
ad6a8ca58b | ||
|
|
4a2b684ef4 | ||
|
|
a9b465c5c9 | ||
|
|
c7cfde42a9 | ||
|
|
48438d6016 | ||
|
|
b8f0b59985 | ||
|
|
d5069b5af0 | ||
|
|
cd103a5721 | ||
|
|
05d9421e8b | ||
|
|
c619f6cb0f | ||
|
|
e1a8b6c8d5 | ||
|
|
8fcb801d15 | ||
|
|
8ba58951e9 | ||
|
|
d889035fe6 | ||
|
|
9409e38050 | ||
|
|
f64f425a50 | ||
|
|
0d2abe3084 | ||
|
|
1312a7a2e2 | ||
|
|
487c0299c9 | ||
|
|
a3399291ad | ||
|
|
918fb5487e | ||
|
|
63f15987a5 | ||
|
|
e749ae510f | ||
|
|
8608de1c6f | ||
|
|
ab48305fb6 | ||
|
|
5e7a3bb69a | ||
|
|
33cefd6f6e | ||
|
|
8861174624 | ||
|
|
88841f1059 | ||
|
|
70f30aa95d | ||
|
|
c99f9d7abf | ||
|
|
538f110407 | ||
|
|
e689a27d62 | ||
|
|
fd09009227 | ||
|
|
1aadcedcfb | ||
|
|
4fd81a99f8 | ||
|
|
d1abe62d1c | ||
|
|
a9ce3e3834 | ||
|
|
4b43167ad1 | ||
|
|
6e156a4cd7 | ||
|
|
921a32a306 | ||
|
|
de4e9e3b44 | ||
|
|
d4cdb683a4 | ||
|
|
08702002e8 | ||
|
|
aec5487cdd | ||
|
|
2de858b9fc | ||
|
|
9e9f61a317 | ||
|
|
02423b2e92 | ||
|
|
c32e0ecc59 | ||
|
|
f212a98ee7 | ||
|
|
91036996ac | ||
|
|
610dd90288 | ||
|
|
15f03c2f13 | ||
|
|
f5c0d95e8c | ||
|
|
af1acc851b | ||
|
|
3d6815817c | ||
|
|
fd7040d2b6 | ||
|
|
82315be75d | ||
|
|
8520b5c785 | ||
|
|
ba11e24d47 | ||
|
|
cec76a36d6 | ||
|
|
9d138379a2 | ||
|
|
f56b9ee92e | ||
|
|
297b27655e | ||
|
|
607f8420f3 | ||
|
|
53e9987b4d | ||
|
|
7d335868df | ||
|
|
26b6a3b088 | ||
|
|
0e43668546 | ||
|
|
534ea700bd | ||
|
|
b843aa4eda | ||
|
|
f0c22a3f33 | ||
|
|
49c31dc2b4 | ||
|
|
6fdc9aa79f | ||
|
|
4be062bbc3 | ||
|
|
f5e433464b | ||
|
|
beaafefcf1 | ||
|
|
8edaf6e2f2 | ||
|
|
4cde2ab765 | ||
|
|
edfc93aeba | ||
|
|
577910b464 | ||
|
|
2fced87e75 | ||
|
|
73065b67e4 | ||
|
|
2cbd962088 | ||
|
|
769c74c0ac | ||
|
|
500fec2d5f | ||
|
|
a61785b6a1 | ||
|
|
bfe803bda3 | ||
|
|
429dc676b1 | ||
|
|
185557344a | ||
|
|
de5182eef3 | ||
|
|
8431e768c9 | ||
|
|
de50520a8c | ||
|
|
346b3e7ce9 | ||
|
|
71bcd9f1af | ||
|
|
6795e256c1 | ||
|
|
8c48c943e7 | ||
|
|
aa4a90c880 | ||
|
|
2ec0cfbe99 | ||
|
|
d0ec28b3d3 | ||
|
|
e54dcfe88d | ||
|
|
52f6e28e9e | ||
|
|
3788b3564c | ||
|
|
27972d2c1d | ||
|
|
5c60a646f3 | ||
|
|
75051c8b59 | ||
|
|
5db0eeea21 | ||
|
|
6e73748492 | ||
|
|
170b87390e | ||
|
|
2ae91fbef0 | ||
|
|
e34e417d94 | ||
|
|
3c9dd6c3ef | ||
|
|
c5c5dcd0be | ||
|
|
29c46b64a2 | ||
|
|
3dc382294b | ||
|
|
3f6f7289aa | ||
|
|
b2aa401776 | ||
|
|
76ec21928c | ||
|
|
9c836daf65 | ||
|
|
3ae2465788 | ||
|
|
7ab08e1fee | ||
|
|
128d2c23b3 | ||
|
|
6daacdb785 | ||
|
|
ed40ff9e2d | ||
|
|
f3e9e2a0f8 | ||
|
|
a0306ea660 | ||
|
|
c5a049babd | ||
|
|
5c24071504 | ||
|
|
43baf7ff21 | ||
|
|
7b8e7f0f3a | ||
|
|
4561109a69 | ||
|
|
7966dd5287 | ||
|
|
fa836faede | ||
|
|
56efffdcd1 | ||
|
|
fb037ec05b | ||
|
|
419f638910 | ||
|
|
95adf3df77 | ||
|
|
859abd6b5d | ||
|
|
8432a1729f | ||
|
|
e8f7b0f7f5 | ||
|
|
244e2e1451 | ||
|
|
5091e01ea1 | ||
|
|
ddd260eb62 | ||
|
|
e6948bf0f9 | ||
|
|
de87c420ef | ||
|
|
0eccee4378 | ||
|
|
5d1d9911cb | ||
|
|
1016b856d1 | ||
|
|
fe9a604b1e | ||
|
|
bc9c30a003 | ||
|
|
9fc8cb39aa | ||
|
|
8e87d58712 | ||
|
|
0491c2cfc8 | ||
|
|
3fae3283e6 | ||
|
|
d05c4d8841 | ||
|
|
e38c1680d6 | ||
|
|
77ed11c506 | ||
|
|
4a742e5c79 | ||
|
|
27c04aaa67 | ||
|
|
0bc31f1887 | ||
|
|
fb37eda3e2 | ||
|
|
05d75b4353 | ||
|
|
eed2ce58e3 | ||
|
|
84f7f20985 | ||
|
|
1de99a2a81 | ||
|
|
36be4f7f06 | ||
|
|
a1cfcb413d | ||
|
|
6f5189c044 | ||
|
|
06ce0d8830 | ||
|
|
987ac89403 | ||
|
|
cfaee9f7c6 | ||
|
|
3e6d476ac3 | ||
|
|
d96ba65a23 | ||
|
|
4decd27947 | ||
|
|
31dab574cc | ||
|
|
da761c9a22 | ||
|
|
e4fa638653 | ||
|
|
1fae7018a8 | ||
|
|
d8fc974ac0 | ||
|
|
6da2018789 | ||
|
|
1771722b2f | ||
|
|
8e17e82d9e | ||
|
|
861175ef00 | ||
|
|
d53492bba4 | ||
|
|
658454a04c | ||
|
|
b862c108dd | ||
|
|
aee120afb9 | ||
|
|
8ae92aef66 | ||
|
|
e6db21ecc4 | ||
|
|
418f4219fa | ||
|
|
7af0d906e3 | ||
|
|
945dad277d | ||
|
|
c764c2a20f | ||
|
|
3ed8fe8778 | ||
|
|
cbf923b12c | ||
|
|
d371ca93e5 | ||
|
|
597d02b508 | ||
|
|
fb5a692d27 | ||
|
|
c6ef75690f | ||
|
|
b2ae57f1b6 | ||
|
|
562f1470ce | ||
|
|
ac10665ad8 | ||
|
|
07f7b66fae | ||
|
|
c351aa7f1b | ||
|
|
f42d52e6bd | ||
|
|
da9402fbf6 | ||
|
|
da227b901d | ||
|
|
0c2cfff9b0 | ||
|
|
0030303b69 | ||
|
|
7725a7eb56 | ||
|
|
27dad21548 | ||
|
|
94d4fee08f | ||
|
|
2debd5b5f7 | ||
|
|
404e998eb7 | ||
|
|
d3dfcde0f7 | ||
|
|
d419b93e3e | ||
|
|
0ff10bb1f7 | ||
|
|
bb6bcbccda | ||
|
|
353246bd60 | ||
|
|
9d0b2cbbce | ||
|
|
1ef86980b9 | ||
|
|
4f8a166058 | ||
|
|
6f53e59641 | ||
|
|
02321de0f2 | ||
|
|
41e6eceb28 | ||
|
|
7d8199f0c3 | ||
|
|
19054ab6da | ||
|
|
fffa2a61d7 | ||
|
|
c2b43164bd | ||
|
|
9954d05ca6 | ||
|
|
a39b5af10b | ||
|
|
315e3c2518 | ||
|
|
85e79ce288 | ||
|
|
c96031da69 | ||
|
|
cb14764fab | ||
|
|
e5aaac24bb | ||
|
|
cc17629f30 | ||
|
|
13db80c282 | ||
|
|
40dcae9c2e | ||
|
|
615c90c948 | ||
|
|
ddacf1cf69 | ||
|
|
48140167cd | ||
|
|
3273c7b679 | ||
|
|
eaadfb5869 | ||
|
|
adaf2b697c | ||
|
|
58d2e70fc5 | ||
|
|
0905af38fc | ||
|
|
bb9c95ea53 | ||
|
|
350ffe8dae | ||
|
|
b601eb8cda | ||
|
|
63fc44dfa5 | ||
|
|
6bf7e2cc37 | ||
|
|
ffc6aeef14 | ||
|
|
c0a9cbebe1 | ||
|
|
bf5f585b0d | ||
|
|
209def2d72 | ||
|
|
4aa12b6c5f | ||
|
|
a870315629 | ||
|
|
72ebafff51 | ||
|
|
e5904f2d5e | ||
|
|
07a7c08aef | ||
|
|
a5ecaca6a7 | ||
|
|
b18df82e1d | ||
|
|
4e7e79f770 | ||
|
|
385c2a76d1 | ||
|
|
9e7fec216e | ||
|
|
317f0da91e | ||
|
|
4a15e55793 | ||
|
|
60fde4d342 | ||
|
|
6d19d40718 | ||
|
|
f6214d1db8 | ||
|
|
2d03f073a7 | ||
|
|
408a8adc15 | ||
|
|
8f279596cb | ||
|
|
f3cb9ae459 | ||
|
|
7cbe684ef5 | ||
|
|
e9f513d74a | ||
|
|
dcb23e2aaa | ||
|
|
11a222f5d9 | ||
|
|
73207a1d8b | ||
|
|
27000ed6d9 | ||
|
|
8a5c255b3d | ||
|
|
bb30ffc4dc | ||
|
|
3ee4e1e79f | ||
|
|
3c18a2bb2e | ||
|
|
cac54404b9 | ||
|
|
c4887da39c | ||
|
|
35bb74a6bd | ||
|
|
e8e09d33df | ||
|
|
82266a1ac9 | ||
|
|
be3e0ff7c3 | ||
|
|
0def48b60f | ||
|
|
a3f71ccff6 | ||
|
|
2caa36aa4f | ||
|
|
999e155f55 | ||
|
|
53d8e9dc97 | ||
|
|
907e98fbb5 | ||
|
|
58f19cc697 | ||
|
|
dcaaadd8ed | ||
|
|
af7d23c9b4 | ||
|
|
2168a94495 | ||
|
|
4e149bb447 | ||
|
|
3bf235a4c9 | ||
|
|
a69c18980f | ||
|
|
336aa0b7da | ||
|
|
eb8b4d9a99 | ||
|
|
0ee525d6de | ||
|
|
d3e9409bb0 | ||
|
|
0822a62f40 | ||
|
|
0cdfef1e22 | ||
|
|
8064583d26 | ||
|
|
419553258d | ||
|
|
815e1e9fe4 | ||
|
|
06e7320c3e | ||
|
|
e867516843 | ||
|
|
2f0331c90c | ||
|
|
67fb3a5155 | ||
|
|
f97f2b1bb6 | ||
|
|
ce6c954d2e | ||
|
|
edcf74c6ad | ||
|
|
d6d5d43708 | ||
|
|
57136a268a | ||
|
|
cb791aaa2f | ||
|
|
339c512762 | ||
|
|
15f9bea73b | ||
|
|
a1a4d23797 | ||
|
|
3aafb47729 | ||
|
|
8f711db4e8 | ||
|
|
415371c9d9 | ||
|
|
2c1b06e672 | ||
|
|
72e22b0bb8 | ||
|
|
c8338ebf7a | ||
|
|
b082790c7d | ||
|
|
eda7d538bf | ||
|
|
55acda98f7 | ||
|
|
96fd758ea9 | ||
|
|
6ff2b0883a | ||
|
|
e88d7ab245 | ||
|
|
f50f2fd2a7 | ||
|
|
1546e6a8c9 | ||
|
|
48c28fc42c | ||
|
|
3675b2291c | ||
|
|
cf7c4732e5 | ||
|
|
405499d835 | ||
|
|
c28b10adeb | ||
|
|
e0846c9c8c | ||
|
|
ba976eaa9b | ||
|
|
3af3593c8e | ||
|
|
f7e2f1fedf | ||
|
|
dd314351e6 | ||
|
|
6dbdfe3422 | ||
|
|
8b0cf5f79d | ||
|
|
1942eeb886 | ||
|
|
431dac08d1 |
11
.gitignore
vendored
11
.gitignore
vendored
@@ -32,6 +32,8 @@
|
|||||||
/ivfdec.dox
|
/ivfdec.dox
|
||||||
/ivfenc
|
/ivfenc
|
||||||
/ivfenc.dox
|
/ivfenc.dox
|
||||||
|
/libvpx.so*
|
||||||
|
/libvpx.ver
|
||||||
/obj_int_extract
|
/obj_int_extract
|
||||||
/postproc
|
/postproc
|
||||||
/postproc.c
|
/postproc.c
|
||||||
@@ -43,12 +45,12 @@
|
|||||||
/simple_encoder
|
/simple_encoder
|
||||||
/simple_encoder.c
|
/simple_encoder.c
|
||||||
/simple_encoder.dox
|
/simple_encoder.dox
|
||||||
|
/test_libvpx
|
||||||
/twopass_encoder
|
/twopass_encoder
|
||||||
/twopass_encoder.c
|
/twopass_encoder.c
|
||||||
/twopass_encoder.dox
|
/twopass_encoder.dox
|
||||||
/vp8_api1_migration.dox
|
/vp8_api1_migration.dox
|
||||||
/vp8_scalable_patterns
|
/vp8_scalable_patterns
|
||||||
/vp8_scalable_patterns.c
|
|
||||||
/vp8_scalable_patterns.dox
|
/vp8_scalable_patterns.dox
|
||||||
/vp8_set_maps
|
/vp8_set_maps
|
||||||
/vp8_set_maps.c
|
/vp8_set_maps.c
|
||||||
@@ -56,7 +58,14 @@
|
|||||||
/vp8cx_set_ref
|
/vp8cx_set_ref
|
||||||
/vp8cx_set_ref.c
|
/vp8cx_set_ref.c
|
||||||
/vp8cx_set_ref.dox
|
/vp8cx_set_ref.dox
|
||||||
|
/vpx.pc
|
||||||
/vpx_config.c
|
/vpx_config.c
|
||||||
/vpx_config.h
|
/vpx_config.h
|
||||||
|
/vpx_rtcd.h
|
||||||
/vpx_version.h
|
/vpx_version.h
|
||||||
|
/vpxdec
|
||||||
|
/vpxenc
|
||||||
TAGS
|
TAGS
|
||||||
|
.cproject
|
||||||
|
.project
|
||||||
|
.settings
|
||||||
|
|||||||
6
.mailmap
6
.mailmap
@@ -1,2 +1,8 @@
|
|||||||
Adrian Grange <agrange@google.com>
|
Adrian Grange <agrange@google.com>
|
||||||
Johann Koenig <johannkoenig@google.com>
|
Johann Koenig <johannkoenig@google.com>
|
||||||
|
Tero Rintaluoma <teror@google.com> <tero.rintaluoma@on2.com>
|
||||||
|
Tom Finegan <tomfinegan@google.com>
|
||||||
|
Ralph Giles <giles@xiph.org> <giles@entropywave.com>
|
||||||
|
Ralph Giles <giles@xiph.org> <giles@mozilla.com>
|
||||||
|
Alpha Lam <hclam@google.com> <hclam@chromium.org>
|
||||||
|
Deb Mukherjee <debargha@google.com>
|
||||||
|
|||||||
29
AUTHORS
29
AUTHORS
@@ -4,29 +4,58 @@
|
|||||||
Aaron Watry <awatry@gmail.com>
|
Aaron Watry <awatry@gmail.com>
|
||||||
Adrian Grange <agrange@google.com>
|
Adrian Grange <agrange@google.com>
|
||||||
Alex Converse <alex.converse@gmail.com>
|
Alex Converse <alex.converse@gmail.com>
|
||||||
|
Alexis Ballier <aballier@gentoo.org>
|
||||||
|
Alok Ahuja <waveletcoeff@gmail.com>
|
||||||
|
Alpha Lam <hclam@google.com>
|
||||||
|
Andoni Morales Alastruey <ylatuya@gmail.com>
|
||||||
Andres Mejia <mcitadel@gmail.com>
|
Andres Mejia <mcitadel@gmail.com>
|
||||||
|
Aron Rosenberg <arosenberg@logitech.com>
|
||||||
|
Attila Nagy <attilanagy@google.com>
|
||||||
|
Deb Mukherjee <debargha@google.com>
|
||||||
Fabio Pedretti <fabio.ped@libero.it>
|
Fabio Pedretti <fabio.ped@libero.it>
|
||||||
Frank Galligan <fgalligan@google.com>
|
Frank Galligan <fgalligan@google.com>
|
||||||
Fredrik Söderquist <fs@opera.com>
|
Fredrik Söderquist <fs@opera.com>
|
||||||
Fritz Koenig <frkoenig@google.com>
|
Fritz Koenig <frkoenig@google.com>
|
||||||
|
Gaute Strokkenes <gaute.strokkenes@broadcom.com>
|
||||||
Giuseppe Scrivano <gscrivano@gnu.org>
|
Giuseppe Scrivano <gscrivano@gnu.org>
|
||||||
Guillermo Ballester Valor <gbvalor@gmail.com>
|
Guillermo Ballester Valor <gbvalor@gmail.com>
|
||||||
|
Henrik Lundin <hlundin@google.com>
|
||||||
|
James Berry <jamesberry@google.com>
|
||||||
James Zern <jzern@google.com>
|
James Zern <jzern@google.com>
|
||||||
Jan Kratochvil <jan.kratochvil@redhat.com>
|
Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||||
|
Jeff Faust <jfaust@google.com>
|
||||||
Jeff Muizelaar <jmuizelaar@mozilla.com>
|
Jeff Muizelaar <jmuizelaar@mozilla.com>
|
||||||
Jim Bankoski <jimbankoski@google.com>
|
Jim Bankoski <jimbankoski@google.com>
|
||||||
Johann Koenig <johannkoenig@google.com>
|
Johann Koenig <johannkoenig@google.com>
|
||||||
John Koleszar <jkoleszar@google.com>
|
John Koleszar <jkoleszar@google.com>
|
||||||
|
Joshua Bleecher Snyder <josh@treelinelabs.com>
|
||||||
Justin Clift <justin@salasaga.org>
|
Justin Clift <justin@salasaga.org>
|
||||||
Justin Lebar <justin.lebar@gmail.com>
|
Justin Lebar <justin.lebar@gmail.com>
|
||||||
|
KO Myung-Hun <komh@chollian.net>
|
||||||
|
Lou Quillio <louquillio@google.com>
|
||||||
Luca Barbato <lu_zero@gentoo.org>
|
Luca Barbato <lu_zero@gentoo.org>
|
||||||
Makoto Kato <makoto.kt@gmail.com>
|
Makoto Kato <makoto.kt@gmail.com>
|
||||||
|
Marco Paniconi <marpan@google.com>
|
||||||
Martin Ettl <ettl.martin78@googlemail.com>
|
Martin Ettl <ettl.martin78@googlemail.com>
|
||||||
Michael Kohler <michaelkohler@live.com>
|
Michael Kohler <michaelkohler@live.com>
|
||||||
|
Mike Hommey <mhommey@mozilla.com>
|
||||||
|
Mikhal Shemer <mikhal@google.com>
|
||||||
|
Pascal Massimino <pascal.massimino@gmail.com>
|
||||||
|
Patrik Westin <patrik.westin@gmail.com>
|
||||||
Paul Wilkins <paulwilkins@google.com>
|
Paul Wilkins <paulwilkins@google.com>
|
||||||
Pavol Rusnak <stick@gk2.sk>
|
Pavol Rusnak <stick@gk2.sk>
|
||||||
Philip Jägenstedt <philipj@opera.com>
|
Philip Jägenstedt <philipj@opera.com>
|
||||||
|
Priit Laes <plaes@plaes.org>
|
||||||
|
Rafael Ávila de Espíndola <rafael.espindola@gmail.com>
|
||||||
|
Rafaël Carré <funman@videolan.org>
|
||||||
|
Ralph Giles <giles@xiph.org>
|
||||||
|
Ronald S. Bultje <rbultje@google.com>
|
||||||
Scott LaVarnway <slavarnway@google.com>
|
Scott LaVarnway <slavarnway@google.com>
|
||||||
|
Stefan Holmer <holmer@google.com>
|
||||||
|
Taekhyun Kim <takim@nvidia.com>
|
||||||
|
Takanori MATSUURA <t.matsuu@gmail.com>
|
||||||
|
Tero Rintaluoma <teror@google.com>
|
||||||
|
Thijs Vermeir <thijsvermeir@gmail.com>
|
||||||
Timothy B. Terriberry <tterribe@xiph.org>
|
Timothy B. Terriberry <tterribe@xiph.org>
|
||||||
Tom Finegan <tomfinegan@google.com>
|
Tom Finegan <tomfinegan@google.com>
|
||||||
Yaowu Xu <yaowu@google.com>
|
Yaowu Xu <yaowu@google.com>
|
||||||
|
|||||||
358
CHANGELOG
358
CHANGELOG
@@ -1,3 +1,361 @@
|
|||||||
|
2012-12-21 v1.2.0
|
||||||
|
This release acts as a checkpoint for a large amount of internal refactoring
|
||||||
|
and testing. It also contains a number of small bugfixes, so all users are
|
||||||
|
encouraged to upgrade.
|
||||||
|
|
||||||
|
- Upgrading:
|
||||||
|
This release is ABI and API compatible with Duclair (v1.0.0). Users
|
||||||
|
of older releases should refer to the Upgrading notes in this
|
||||||
|
document for that release.
|
||||||
|
|
||||||
|
- Enhancements:
|
||||||
|
VP8 optimizations for MIPS dspr2
|
||||||
|
vpxenc: add -quiet option
|
||||||
|
|
||||||
|
- Speed:
|
||||||
|
Encoder and decoder speed is consistent with the Eider release.
|
||||||
|
|
||||||
|
- Quality:
|
||||||
|
In general, quality is consistent with the Eider release.
|
||||||
|
|
||||||
|
Minor tweaks to ARNR filtering
|
||||||
|
Minor improvements to real time encoding with multiple temporal layers
|
||||||
|
|
||||||
|
- Bug Fixes:
|
||||||
|
Fixes multithreaded encoder race condition in loopfilter
|
||||||
|
Fixes multi-resolution threaded encoding
|
||||||
|
Fix potential encoder dead-lock after picture resize
|
||||||
|
|
||||||
|
|
||||||
|
2012-05-09 v1.1.0 "Eider"
|
||||||
|
This introduces a number of enhancements, mostly focused on real-time
|
||||||
|
encoding. In addition, it fixes a decoder bug (first introduced in
|
||||||
|
Duclair) so all users of that release are encouraged to upgrade.
|
||||||
|
|
||||||
|
- Upgrading:
|
||||||
|
This release is ABI and API compatible with Duclair (v1.0.0). Users
|
||||||
|
of older releases should refer to the Upgrading notes in this
|
||||||
|
document for that release.
|
||||||
|
|
||||||
|
This release introduces a new temporal denoiser, controlled by the
|
||||||
|
VP8E_SET_NOISE_SENSITIVITY control. The temporal denoiser does not
|
||||||
|
currently take a strength parameter, so the control is effectively
|
||||||
|
a boolean - zero (off) or non-zero (on). For compatibility with
|
||||||
|
existing applications, the values accepted are the same as those
|
||||||
|
for the spatial denoiser (0-6). The temporal denoiser is enabled
|
||||||
|
by default, and the older spatial denoiser may be restored by
|
||||||
|
configuring with --disable-temporal-denoising. The temporal denoiser
|
||||||
|
is more computationally intensive than the spatial one.
|
||||||
|
|
||||||
|
This release removes support for a legacy, decode only API that was
|
||||||
|
supported, but deprecated, at the initial release of libvpx
|
||||||
|
(v0.9.0). This is not expected to have any impact. If you are
|
||||||
|
impacted, you can apply a reversion to commit 2bf8fb58 locally.
|
||||||
|
Please update to the latest libvpx API if you are affected.
|
||||||
|
|
||||||
|
- Enhancements:
|
||||||
|
Adds a motion compensated temporal denoiser to the encoder, which
|
||||||
|
gives higher quality than the older spatial denoiser. (See above
|
||||||
|
for notes on upgrading).
|
||||||
|
|
||||||
|
In addition, support for new compilers and platforms were added,
|
||||||
|
including:
|
||||||
|
improved support for XCode
|
||||||
|
Android x86 NDK build
|
||||||
|
OS/2 support
|
||||||
|
SunCC support
|
||||||
|
|
||||||
|
Changing resolution with vpx_codec_enc_config_set() is now
|
||||||
|
supported. Previously, reinitializing the codec was required to
|
||||||
|
change the input resolution.
|
||||||
|
|
||||||
|
The vpxenc application has initial support for producing multiple
|
||||||
|
encodes from the same input in one call. Resizing is not yet
|
||||||
|
supported, but varying other codec parameters is. Use -- to
|
||||||
|
delineate output streams. Options persist from one stream to the
|
||||||
|
next.
|
||||||
|
|
||||||
|
Also, the vpxenc application will now use a keyframe interval of
|
||||||
|
5 seconds by default. Use the --kf-max-dist option to override.
|
||||||
|
|
||||||
|
- Speed:
|
||||||
|
Decoder performance improved 2.5% versus Duclair. Encoder speed is
|
||||||
|
consistent with Duclair for most material. Two pass encoding of
|
||||||
|
slideshow-like material will see significant improvements.
|
||||||
|
|
||||||
|
Large realtime encoding speed gains at a small quality expense are
|
||||||
|
possible by configuring the on-the-fly bitpacking experiment with
|
||||||
|
--enable-onthefly-bitpacking. Realtime encoder can be up to 13%
|
||||||
|
faster (ARM) depending on the number of threads and bitrate
|
||||||
|
settings. This technique sees constant gain over the 5-16 speed
|
||||||
|
range. For VC style input the loss seen is up to 0.2dB. See commit
|
||||||
|
52cf4dca for further details.
|
||||||
|
|
||||||
|
- Quality:
|
||||||
|
On the whole, quality is consistent with the Duclair release. Some
|
||||||
|
tweaks:
|
||||||
|
|
||||||
|
Reduced blockiness in easy sections by applying a penalty to
|
||||||
|
intra modes.
|
||||||
|
|
||||||
|
Improved quality of static sections (like slideshows) with
|
||||||
|
two pass encoding.
|
||||||
|
|
||||||
|
Improved keyframe sizing with multiple temporal layers
|
||||||
|
|
||||||
|
- Bug Fixes:
|
||||||
|
Corrected alt-ref contribution to frame rate for visible updates
|
||||||
|
to the alt-ref buffer. This affected applications making manual
|
||||||
|
usage of the frame reference flags, or temporal layers.
|
||||||
|
|
||||||
|
Additional constraints were added to disable multi-frame quality
|
||||||
|
enhancement (MFQE) in sections of the frame where there is motion.
|
||||||
|
(#392)
|
||||||
|
|
||||||
|
Fixed corruption issues when vpx_codec_enc_config_set() was called
|
||||||
|
with spatial resampling enabled.
|
||||||
|
|
||||||
|
Fixed a decoder error introduced in Duclair where the segmentation
|
||||||
|
map was not being reinitialized on keyframes (#378)
|
||||||
|
|
||||||
|
|
||||||
|
2012-01-27 v1.0.0 "Duclair"
|
||||||
|
Our fourth named release, focused on performance and features related to
|
||||||
|
real-time encoding. It also fixes a decoder crash bug introduced in
|
||||||
|
v0.9.7, so all users of that release are encouraged to upgrade.
|
||||||
|
|
||||||
|
- Upgrading:
|
||||||
|
This release is ABI incompatible with prior releases of libvpx, so the
|
||||||
|
"major" version number has been bumped to 1. You must recompile your
|
||||||
|
applications against the latest version of the libvpx headers. The
|
||||||
|
API remains compatible, and this should not require code changes in most
|
||||||
|
applications.
|
||||||
|
|
||||||
|
- Enhancements:
|
||||||
|
This release introduces several substantial new features to the encoder,
|
||||||
|
of particular interest to real time streaming applications.
|
||||||
|
|
||||||
|
Temporal scalability allows the encoder to produce a stream that can
|
||||||
|
be decimated to different frame rates, with independent rate targetting
|
||||||
|
for each substream.
|
||||||
|
|
||||||
|
Multiframe quality enhancement postprocessing can make visual quality
|
||||||
|
more consistent in the presence of frames that are substantially
|
||||||
|
different quality than the surrounding frames, as in the temporal
|
||||||
|
scalability case and in some forced keyframe scenarios.
|
||||||
|
|
||||||
|
Multiple-resolution encoding support allows the encoding of the
|
||||||
|
same content at different resolutions faster than encoding them
|
||||||
|
separately.
|
||||||
|
|
||||||
|
- Speed:
|
||||||
|
Optimization targets for this release included the decoder and the real-
|
||||||
|
time modes of the encoder. Decoder speed on x86 has improved 10.5% with
|
||||||
|
this release. Encoder improvements followed a curve where speeds 1-3
|
||||||
|
improved 4.0%-1.5%, speeds 4-8 improved <1%, and speeds 9-16 improved
|
||||||
|
1.5% to 10.5%, respectively. "Best" mode speed is consistent with the
|
||||||
|
Cayuga release.
|
||||||
|
|
||||||
|
- Quality:
|
||||||
|
Encoder quality in the single stream case is consistent with the Cayuga
|
||||||
|
release.
|
||||||
|
|
||||||
|
- Bug Fixes:
|
||||||
|
This release fixes an OOB read decoder crash bug present in v0.9.7
|
||||||
|
related to the clamping of motion vectors in SPLITMV blocks. This
|
||||||
|
behavior could be triggered by corrupt input or by starting
|
||||||
|
decoding from a P-frame.
|
||||||
|
|
||||||
|
|
||||||
|
2011-08-15 v0.9.7-p1 "Cayuga" patch 1
|
||||||
|
This is an incremental bugfix release against Cayuga. All users of that
|
||||||
|
release are strongly encouraged to upgrade.
|
||||||
|
|
||||||
|
- Fix potential OOB reads (cdae03a)
|
||||||
|
|
||||||
|
An unbounded out of bounds read was discovered when the
|
||||||
|
decoder was requested to perform error concealment (new in
|
||||||
|
Cayuga) given a frame with corrupt partition sizes.
|
||||||
|
|
||||||
|
A bounded out of bounds read was discovered affecting all
|
||||||
|
versions of libvpx. Given an multipartition input frame that
|
||||||
|
is truncated between the mode/mv partition and the first
|
||||||
|
residiual paritition (in the block of partition offsets), up
|
||||||
|
to 3 extra bytes could have been read from the source buffer.
|
||||||
|
The code will not take any action regardless of the contents
|
||||||
|
of these undefined bytes, as the truncated buffer is detected
|
||||||
|
immediately following the read based on the calculated
|
||||||
|
starting position of the coefficient partition.
|
||||||
|
|
||||||
|
- Fix potential error concealment crash when the very first frame
|
||||||
|
is missing or corrupt (a609be5)
|
||||||
|
|
||||||
|
- Fix significant artifacts in error concealment (a4c2211, 99d870a)
|
||||||
|
|
||||||
|
- Revert 1-pass CBR rate control changes (e961317)
|
||||||
|
Further testing showed this change produced undesirable visual
|
||||||
|
artifacts, rolling back for now.
|
||||||
|
|
||||||
|
|
||||||
|
2011-08-02 v0.9.7 "Cayuga"
|
||||||
|
Our third named release, focused on a faster, higher quality, encoder.
|
||||||
|
|
||||||
|
- Upgrading:
|
||||||
|
This release is backwards compatible with Aylesbury (v0.9.5) and
|
||||||
|
Bali (v0.9.6). Users of older releases should refer to the Upgrading
|
||||||
|
notes in this document for that release.
|
||||||
|
|
||||||
|
- Enhancements:
|
||||||
|
Stereo 3D format support for vpxenc
|
||||||
|
Runtime detection of available processor cores.
|
||||||
|
Allow specifying --end-usage by enum name
|
||||||
|
vpxdec: test for frame corruption
|
||||||
|
vpxenc: add quantizer histogram display
|
||||||
|
vpxenc: add rate histogram display
|
||||||
|
Set VPX_FRAME_IS_DROPPABLE
|
||||||
|
update configure for ios sdk 4.3
|
||||||
|
Avoid text relocations in ARM vp8 decoder
|
||||||
|
Generate a vpx.pc file for pkg-config.
|
||||||
|
New ways of passing encoded data between encoder and decoder.
|
||||||
|
|
||||||
|
- Speed:
|
||||||
|
This release includes across-the-board speed improvements to the
|
||||||
|
encoder. On x86, these measure at approximately 11.5% in Best mode,
|
||||||
|
21.5% in Good mode (speed 0), and 22.5% in Realtime mode (speed 6).
|
||||||
|
On ARM Cortex A9 with Neon extensions, real-time encoding of video
|
||||||
|
telephony content is 35% faster than Bali on single core and 48%
|
||||||
|
faster on multi-core. On the NVidia Tegra2 platform, real time
|
||||||
|
encoding is 40% faster than Bali.
|
||||||
|
|
||||||
|
Decoder speed was not a priority for this release, but improved
|
||||||
|
approximately 8.4% on x86.
|
||||||
|
|
||||||
|
Reduce motion vector search on alt-ref frame.
|
||||||
|
Encoder loopfilter running in its own thread
|
||||||
|
Reworked loopfilter to precalculate more parameters
|
||||||
|
SSE2/SSSE3 optimizations for build_predictors_mbuv{,_s}().
|
||||||
|
Make hor UV predict ~2x faster (73 vs 132 cycles) using SSSE3.
|
||||||
|
Removed redundant checks
|
||||||
|
Reduced structure sizes
|
||||||
|
utilize preload in ARMv6 MC/LPF/Copy routines
|
||||||
|
ARM optimized quantization, dfct, variance, subtract
|
||||||
|
Increase chrow row alignment to 16 bytes.
|
||||||
|
disable trellis optimization for first pass
|
||||||
|
Write SSSE3 sub-pixel filter function
|
||||||
|
Improve SSE2 half-pixel filter funtions
|
||||||
|
Add vp8_sub_pixel_variance16x8_ssse3 function
|
||||||
|
Reduce unnecessary distortion computation
|
||||||
|
Use diamond search to replace full search
|
||||||
|
Preload reference area in sub-pixel motion search (real-time mode)
|
||||||
|
|
||||||
|
- Quality:
|
||||||
|
This release focused primarily on one-pass use cases, including
|
||||||
|
video conferencing. Low latency data rate control was significantly
|
||||||
|
improved, improving streamability over bandwidth constrained links.
|
||||||
|
Added support for error concealment, allowing frames to maintain
|
||||||
|
visual quality in the presence of substantial packet loss.
|
||||||
|
|
||||||
|
Add rc_max_intra_bitrate_pct control
|
||||||
|
Limit size of initial keyframe in one-pass.
|
||||||
|
Improve framerate adaptation
|
||||||
|
Improved 1-pass CBR rate control
|
||||||
|
Improved KF insertion after fades to still.
|
||||||
|
Improved key frame detection.
|
||||||
|
Improved activity masking (lower PSNR impact for same SSIM boost)
|
||||||
|
Improved interaction between GF and ARFs
|
||||||
|
Adding error-concealment to the decoder.
|
||||||
|
Adding support for independent partitions
|
||||||
|
Adjusted rate-distortion constants
|
||||||
|
|
||||||
|
|
||||||
|
- Bug Fixes:
|
||||||
|
Removed firstpass motion map
|
||||||
|
Fix parallel make install
|
||||||
|
Fix multithreaded encoding for 1 MB wide frame
|
||||||
|
Fixed iwalsh_neon build problems with RVDS4.1
|
||||||
|
Fix semaphore emulation, spin-wait intrinsics on Windows
|
||||||
|
Fix build with xcode4 and simplify GLOBAL.
|
||||||
|
Mark ARM asm objects as allowing a non-executable stack.
|
||||||
|
Fix vpxenc encoding incorrect webm file header on big endian
|
||||||
|
|
||||||
|
|
||||||
|
2011-03-07 v0.9.6 "Bali"
|
||||||
|
Our second named release, focused on a faster, higher quality, encoder.
|
||||||
|
|
||||||
|
- Upgrading:
|
||||||
|
This release is backwards compatible with Aylesbury (v0.9.5). Users
|
||||||
|
of older releases should refer to the Upgrading notes in this
|
||||||
|
document for that release.
|
||||||
|
|
||||||
|
- Enhancements:
|
||||||
|
vpxenc --psnr shows a summary when encode completes
|
||||||
|
--tune=ssim option to enable activity masking
|
||||||
|
improved postproc visualizations for development
|
||||||
|
updated support for Apple iOS to SDK 4.2
|
||||||
|
query decoder to determine which reference frames were updated
|
||||||
|
implemented error tracking in the decoder
|
||||||
|
fix pipe support on windows
|
||||||
|
|
||||||
|
- Speed:
|
||||||
|
Primary focus was on good quality mode, speed 0. Average improvement
|
||||||
|
on x86 about 40%, up to 100% on user-generated content at that speed.
|
||||||
|
Best quality mode speed improved 35%, and realtime speed 10-20%. This
|
||||||
|
release also saw significant improvement in realtime encoding speed
|
||||||
|
on ARM platforms.
|
||||||
|
|
||||||
|
Improved encoder threading
|
||||||
|
Dont pick encoder filter level when loopfilter is disabled.
|
||||||
|
Avoid double copying of key frames into alt and golden buffer
|
||||||
|
FDCT optimizations.
|
||||||
|
x86 sse2 temporal filter
|
||||||
|
SSSE3 version of fast quantizer
|
||||||
|
vp8_rd_pick_best_mbsegmentation code restructure
|
||||||
|
Adjusted breakout RD for SPLITMV
|
||||||
|
Changed segmentation check order
|
||||||
|
Improved rd_pick_intra4x4block
|
||||||
|
Adds armv6 optimized variance calculation
|
||||||
|
ARMv6 optimized sad16x16
|
||||||
|
ARMv6 optimized half pixel variance calculations
|
||||||
|
Full search SAD function optimization in SSE4.1
|
||||||
|
Improve MV prediction accuracy to achieve performance gain
|
||||||
|
Improve MV prediction in vp8_pick_inter_mode() for speed>3
|
||||||
|
|
||||||
|
- Quality:
|
||||||
|
Best quality mode improved PSNR 6.3%, and SSIM 6.1%. This release
|
||||||
|
also includes support for "activity masking," which greatly improves
|
||||||
|
SSIM at the expense of PSNR. For now, this feature is available with
|
||||||
|
the --tune=ssim option. Further experimentation in this area
|
||||||
|
is ongoing. This release also introduces a new rate control mode
|
||||||
|
called "CQ," which changes the allocation of bits within a clip to
|
||||||
|
the sections where they will have the most visual impact.
|
||||||
|
|
||||||
|
Tuning for the more exact quantizer.
|
||||||
|
Relax rate control for last few frames
|
||||||
|
CQ Mode
|
||||||
|
Limit key frame quantizer for forced key frames.
|
||||||
|
KF/GF Pulsing
|
||||||
|
Add simple version of activity masking.
|
||||||
|
make rdmult adaptive for intra in quantizer RDO
|
||||||
|
cap the best quantizer for 2nd order DC
|
||||||
|
change the threshold of DC check for encode breakout
|
||||||
|
|
||||||
|
- Bug Fixes:
|
||||||
|
Fix crash on Sparc Solaris.
|
||||||
|
Fix counter of fixed keyframe distance
|
||||||
|
ARNR filter pointer update bug fix
|
||||||
|
Fixed use of motion percentage in KF/GF group calc
|
||||||
|
Changed condition for using RD in Intra Mode
|
||||||
|
Fix encoder real-time only configuration.
|
||||||
|
Fix ARM encoder crash with multiple token partitions
|
||||||
|
Fixed bug first cluster timecode of webm file is wrong.
|
||||||
|
Fixed various encoder bugs with odd-sized images
|
||||||
|
vp8e_get_preview fixed when spatial resampling enabled
|
||||||
|
quantizer: fix assertion in fast quantizer path
|
||||||
|
Allocate source buffers to be multiples of 16
|
||||||
|
Fix for manual Golden frame frequency
|
||||||
|
Fix drastic undershoot in long form content
|
||||||
|
|
||||||
|
|
||||||
2010-10-28 v0.9.5 "Aylesbury"
|
2010-10-28 v0.9.5 "Aylesbury"
|
||||||
Our first named release, focused on a faster decoder, and a better encoder.
|
Our first named release, focused on a faster decoder, and a better encoder.
|
||||||
|
|
||||||
|
|||||||
9
LICENSE
9
LICENSE
@@ -1,4 +1,4 @@
|
|||||||
Copyright (c) 2010, Google Inc. All rights reserved.
|
Copyright (c) 2010, The WebM Project authors. All rights reserved.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
Redistribution and use in source and binary forms, with or without
|
||||||
modification, are permitted provided that the following conditions are
|
modification, are permitted provided that the following conditions are
|
||||||
@@ -12,9 +12,10 @@ met:
|
|||||||
the documentation and/or other materials provided with the
|
the documentation and/or other materials provided with the
|
||||||
distribution.
|
distribution.
|
||||||
|
|
||||||
* Neither the name of Google nor the names of its contributors may
|
* Neither the name of Google, nor the WebM Project, nor the names
|
||||||
be used to endorse or promote products derived from this software
|
of its contributors may be used to endorse or promote products
|
||||||
without specific prior written permission.
|
derived from this software without specific prior written
|
||||||
|
permission.
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
|||||||
24
README
24
README
@@ -1,5 +1,5 @@
|
|||||||
vpx Multi-Format Codec SDK
|
vpx Multi-Format Codec SDK
|
||||||
README - 19 May 2010
|
README - 21 June 2012
|
||||||
|
|
||||||
Welcome to the WebM VP8 Codec SDK!
|
Welcome to the WebM VP8 Codec SDK!
|
||||||
|
|
||||||
@@ -15,11 +15,19 @@ COMPILING THE APPLICATIONS/LIBRARIES:
|
|||||||
* Building the documentation requires PHP[3] and Doxygen[4]. If you do not
|
* Building the documentation requires PHP[3] and Doxygen[4]. If you do not
|
||||||
have these packages, you must pass --disable-install-docs to the
|
have these packages, you must pass --disable-install-docs to the
|
||||||
configure script.
|
configure script.
|
||||||
|
* Downloading the data for the unit tests requires curl[5] and sha1sum.
|
||||||
|
sha1sum is provided via the GNU coreutils, installed by default on
|
||||||
|
many *nix platforms, as well as MinGW and Cygwin. If coreutils is not
|
||||||
|
available, a compatible version of sha1sum can be built from
|
||||||
|
source[6]. These requirements are optional if not running the unit
|
||||||
|
tests.
|
||||||
|
|
||||||
[1]: http://www.tortall.net/projects/yasm
|
[1]: http://www.tortall.net/projects/yasm
|
||||||
[2]: http://www.cygwin.com
|
[2]: http://www.cygwin.com
|
||||||
[3]: http://php.net
|
[3]: http://php.net
|
||||||
[4]: http://www.doxygen.org
|
[4]: http://www.doxygen.org
|
||||||
|
[5]: http://curl.haxx.se
|
||||||
|
[6]: http://www.microbrew.org/tools/md5sha1sum/
|
||||||
|
|
||||||
2. Out-of-tree builds
|
2. Out-of-tree builds
|
||||||
Out of tree builds are a supported method of building the application. For
|
Out of tree builds are a supported method of building the application. For
|
||||||
@@ -42,21 +50,13 @@ COMPILING THE APPLICATIONS/LIBRARIES:
|
|||||||
--help output of the configure script. As of this writing, the list of
|
--help output of the configure script. As of this writing, the list of
|
||||||
available targets is:
|
available targets is:
|
||||||
|
|
||||||
|
armv5te-android-gcc
|
||||||
armv5te-linux-rvct
|
armv5te-linux-rvct
|
||||||
armv5te-linux-gcc
|
armv5te-linux-gcc
|
||||||
armv5te-symbian-gcc
|
|
||||||
armv5te-wince-vs8
|
|
||||||
armv6-darwin-gcc
|
armv6-darwin-gcc
|
||||||
armv6-linux-rvct
|
armv6-linux-rvct
|
||||||
armv6-linux-gcc
|
armv6-linux-gcc
|
||||||
armv6-symbian-gcc
|
armv7-android-gcc
|
||||||
armv6-wince-vs8
|
|
||||||
iwmmxt-linux-rvct
|
|
||||||
iwmmxt-linux-gcc
|
|
||||||
iwmmxt-wince-vs8
|
|
||||||
iwmmxt2-linux-rvct
|
|
||||||
iwmmxt2-linux-gcc
|
|
||||||
iwmmxt2-wince-vs8
|
|
||||||
armv7-linux-rvct
|
armv7-linux-rvct
|
||||||
armv7-linux-gcc
|
armv7-linux-gcc
|
||||||
mips32-linux-gcc
|
mips32-linux-gcc
|
||||||
@@ -102,5 +102,5 @@ COMPILING THE APPLICATIONS/LIBRARIES:
|
|||||||
|
|
||||||
SUPPORT
|
SUPPORT
|
||||||
This library is an open source project supported by its community. Please
|
This library is an open source project supported by its community. Please
|
||||||
please email webm-users@webmproject.org for help.
|
please email webm-discuss@webmproject.org for help.
|
||||||
|
|
||||||
|
|||||||
2
args.c
2
args.c
@@ -57,7 +57,7 @@ int arg_match(struct arg *arg_, const struct arg_def *def, char **argv)
|
|||||||
}
|
}
|
||||||
else if (def->long_name)
|
else if (def->long_name)
|
||||||
{
|
{
|
||||||
int name_len = strlen(def->long_name);
|
const size_t name_len = strlen(def->long_name);
|
||||||
|
|
||||||
if (strlen(arg.argv[0]) >= name_len + 2
|
if (strlen(arg.argv[0]) >= name_len + 2
|
||||||
&& arg.argv[0][1] == '-'
|
&& arg.argv[0][1] == '-'
|
||||||
|
|||||||
@@ -1,20 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<VisualStudioToolFile
|
|
||||||
Name="armasm"
|
|
||||||
Version="8.00"
|
|
||||||
>
|
|
||||||
<Rules>
|
|
||||||
<CustomBuildRule
|
|
||||||
Name="ARMASM"
|
|
||||||
DisplayName="Armasm Assembler"
|
|
||||||
CommandLine="armasm -o "$(IntDir)\$(InputName).obj" $(InputPath) -32 -ARCH 5
"
|
|
||||||
Outputs="$(IntDir)\$(InputName).obj"
|
|
||||||
FileExtensions="*.asm"
|
|
||||||
ExecutionDescription="Assembling $(InputName).asm"
|
|
||||||
ShowOnlyRuleProperties="false"
|
|
||||||
>
|
|
||||||
<Properties>
|
|
||||||
</Properties>
|
|
||||||
</CustomBuildRule>
|
|
||||||
</Rules>
|
|
||||||
</VisualStudioToolFile>
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<VisualStudioToolFile
|
|
||||||
Name="armasm"
|
|
||||||
Version="8.00"
|
|
||||||
>
|
|
||||||
<Rules>
|
|
||||||
<CustomBuildRule
|
|
||||||
Name="ARMASM"
|
|
||||||
DisplayName="Armasm Assembler"
|
|
||||||
CommandLine="armasm -o "$(IntDir)\$(InputName).obj" $(InputPath) -32 -ARCH 6
"
|
|
||||||
Outputs="$(IntDir)\$(InputName).obj"
|
|
||||||
FileExtensions="*.asm"
|
|
||||||
ExecutionDescription="Assembling $(InputName).asm"
|
|
||||||
ShowOnlyRuleProperties="false"
|
|
||||||
>
|
|
||||||
<Properties>
|
|
||||||
</Properties>
|
|
||||||
</CustomBuildRule>
|
|
||||||
</Rules>
|
|
||||||
</VisualStudioToolFile>
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<VisualStudioToolFile
|
|
||||||
Name="armasm"
|
|
||||||
Version="8.00"
|
|
||||||
>
|
|
||||||
<Rules>
|
|
||||||
<CustomBuildRule
|
|
||||||
Name="ARMASM"
|
|
||||||
DisplayName="Armasm Assembler"
|
|
||||||
CommandLine="armasm -o "$(IntDir)\$(InputName).obj" $(InputPath) -32 -cpu XSCALE
"
|
|
||||||
Outputs="$(IntDir)\$(InputName).obj"
|
|
||||||
FileExtensions="*.asm"
|
|
||||||
ExecutionDescription="Assembling $(InputName).asm"
|
|
||||||
ShowOnlyRuleProperties="false"
|
|
||||||
>
|
|
||||||
<Properties>
|
|
||||||
</Properties>
|
|
||||||
</CustomBuildRule>
|
|
||||||
</Rules>
|
|
||||||
</VisualStudioToolFile>
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
@echo off
|
|
||||||
REM Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
|
||||||
REM
|
|
||||||
REM Use of this source code is governed by a BSD-style license
|
|
||||||
REM that can be found in the LICENSE file in the root of the source
|
|
||||||
REM tree. An additional intellectual property rights grant can be found
|
|
||||||
REM in the file PATENTS. All contributing project authors may
|
|
||||||
REM be found in the AUTHORS file in the root of the source tree.
|
|
||||||
echo on
|
|
||||||
|
|
||||||
|
|
||||||
cl /I ".\\" /I "..\vp6_decoder_sdk" /I "..\vp6_decoder_sdk\vpx_ports" /D "NDEBUG" /D "_WIN32_WCE=0x420" /D "UNDER_CE" /D "WIN32_PLATFORM_PSPC" /D "WINCE" /D "_LIB" /D "ARM" /D "_ARM_" /D "_UNICODE" /D "UNICODE" /FD /EHsc /MT /GS- /fp:fast /GR- /Fo"Pocket_PC_2003__ARMV4_\%1/" /Fd"Pocket_PC_2003__ARMV4_\%1/vc80.pdb" /W3 /nologo /c /TC ..\vp6_decoder_sdk\vp6_decoder\algo\common\arm\dec_asm_offsets_arm.c
|
|
||||||
obj_int_extract.exe rvds "Pocket_PC_2003__ARMV4_\%1/dec_asm_offsets_arm.obj"
|
|
||||||
@@ -1,88 +0,0 @@
|
|||||||
Microsoft Visual Studio Solution File, Format Version 9.00
|
|
||||||
# Visual Studio 2005
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example", "example.vcproj", "{BA5FE66F-38DD-E034-F542-B1578C5FB950}"
|
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
|
||||||
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74} = {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}
|
|
||||||
{E1360C65-D375-4335-8057-7ED99CC3F9B2} = {E1360C65-D375-4335-8057-7ED99CC3F9B2}
|
|
||||||
EndProjectSection
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "obj_int_extract", "obj_int_extract.vcproj", "{E1360C65-D375-4335-8057-7ED99CC3F9B2}"
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vpx", "vpx.vcproj", "{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}"
|
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
|
||||||
{E1360C65-D375-4335-8057-7ED99CC3F9B2} = {E1360C65-D375-4335-8057-7ED99CC3F9B2}
|
|
||||||
EndProjectSection
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xma", "xma.vcproj", "{A955FC4A-73F1-44F7-135E-30D84D32F022}"
|
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
|
||||||
{E1360C65-D375-4335-8057-7ED99CC3F9B2} = {E1360C65-D375-4335-8057-7ED99CC3F9B2}
|
|
||||||
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74} = {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}
|
|
||||||
EndProjectSection
|
|
||||||
EndProject
|
|
||||||
Global
|
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
|
||||||
Debug|Mixed Platforms = Debug|Mixed Platforms
|
|
||||||
Debug|Pocket PC 2003 (ARMV4) = Debug|Pocket PC 2003 (ARMV4)
|
|
||||||
Debug|Win32 = Debug|Win32
|
|
||||||
Release|Mixed Platforms = Release|Mixed Platforms
|
|
||||||
Release|Pocket PC 2003 (ARMV4) = Release|Pocket PC 2003 (ARMV4)
|
|
||||||
Release|Win32 = Release|Win32
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
|
||||||
{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Debug|Mixed Platforms.ActiveCfg = Debug|Pocket PC 2003 (ARMV4)
|
|
||||||
{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Debug|Mixed Platforms.Build.0 = Debug|Pocket PC 2003 (ARMV4)
|
|
||||||
{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Debug|Mixed Platforms.Deploy.0 = Debug|Pocket PC 2003 (ARMV4)
|
|
||||||
{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Debug|Pocket PC 2003 (ARMV4).ActiveCfg = Debug|Pocket PC 2003 (ARMV4)
|
|
||||||
{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Debug|Pocket PC 2003 (ARMV4).Build.0 = Debug|Pocket PC 2003 (ARMV4)
|
|
||||||
{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Debug|Pocket PC 2003 (ARMV4).Deploy.0 = Debug|Pocket PC 2003 (ARMV4)
|
|
||||||
{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Debug|Win32.ActiveCfg = Debug|Pocket PC 2003 (ARMV4)
|
|
||||||
{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Release|Mixed Platforms.ActiveCfg = Release|Pocket PC 2003 (ARMV4)
|
|
||||||
{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Release|Mixed Platforms.Build.0 = Release|Pocket PC 2003 (ARMV4)
|
|
||||||
{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Release|Mixed Platforms.Deploy.0 = Release|Pocket PC 2003 (ARMV4)
|
|
||||||
{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Release|Pocket PC 2003 (ARMV4).ActiveCfg = Release|Pocket PC 2003 (ARMV4)
|
|
||||||
{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Release|Pocket PC 2003 (ARMV4).Build.0 = Release|Pocket PC 2003 (ARMV4)
|
|
||||||
{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Release|Pocket PC 2003 (ARMV4).Deploy.0 = Release|Pocket PC 2003 (ARMV4)
|
|
||||||
{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Release|Win32.ActiveCfg = Release|Pocket PC 2003 (ARMV4)
|
|
||||||
{E1360C65-D375-4335-8057-7ED99CC3F9B2}.Debug|Mixed Platforms.ActiveCfg = Release|Win32
|
|
||||||
{E1360C65-D375-4335-8057-7ED99CC3F9B2}.Debug|Mixed Platforms.Build.0 = Release|Win32
|
|
||||||
{E1360C65-D375-4335-8057-7ED99CC3F9B2}.Debug|Pocket PC 2003 (ARMV4).ActiveCfg = Release|Win32
|
|
||||||
{E1360C65-D375-4335-8057-7ED99CC3F9B2}.Debug|Win32.ActiveCfg = Release|Win32
|
|
||||||
{E1360C65-D375-4335-8057-7ED99CC3F9B2}.Debug|Win32.Build.0 = Release|Win32
|
|
||||||
{E1360C65-D375-4335-8057-7ED99CC3F9B2}.Release|Mixed Platforms.ActiveCfg = Release|Win32
|
|
||||||
{E1360C65-D375-4335-8057-7ED99CC3F9B2}.Release|Mixed Platforms.Build.0 = Release|Win32
|
|
||||||
{E1360C65-D375-4335-8057-7ED99CC3F9B2}.Release|Pocket PC 2003 (ARMV4).ActiveCfg = Release|Win32
|
|
||||||
{E1360C65-D375-4335-8057-7ED99CC3F9B2}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{E1360C65-D375-4335-8057-7ED99CC3F9B2}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Debug|Mixed Platforms.ActiveCfg = Debug|Pocket PC 2003 (ARMV4)
|
|
||||||
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Debug|Mixed Platforms.Build.0 = Debug|Pocket PC 2003 (ARMV4)
|
|
||||||
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Debug|Mixed Platforms.Deploy.0 = Debug|Pocket PC 2003 (ARMV4)
|
|
||||||
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Debug|Pocket PC 2003 (ARMV4).ActiveCfg = Debug|Pocket PC 2003 (ARMV4)
|
|
||||||
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Debug|Pocket PC 2003 (ARMV4).Build.0 = Debug|Pocket PC 2003 (ARMV4)
|
|
||||||
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Debug|Pocket PC 2003 (ARMV4).Deploy.0 = Debug|Pocket PC 2003 (ARMV4)
|
|
||||||
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Debug|Win32.ActiveCfg = Debug|Pocket PC 2003 (ARMV4)
|
|
||||||
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Release|Mixed Platforms.ActiveCfg = Release|Pocket PC 2003 (ARMV4)
|
|
||||||
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Release|Mixed Platforms.Build.0 = Release|Pocket PC 2003 (ARMV4)
|
|
||||||
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Release|Mixed Platforms.Deploy.0 = Release|Pocket PC 2003 (ARMV4)
|
|
||||||
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Release|Pocket PC 2003 (ARMV4).ActiveCfg = Release|Pocket PC 2003 (ARMV4)
|
|
||||||
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Release|Pocket PC 2003 (ARMV4).Build.0 = Release|Pocket PC 2003 (ARMV4)
|
|
||||||
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Release|Pocket PC 2003 (ARMV4).Deploy.0 = Release|Pocket PC 2003 (ARMV4)
|
|
||||||
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Release|Win32.ActiveCfg = Release|Pocket PC 2003 (ARMV4)
|
|
||||||
{A955FC4A-73F1-44F7-135E-30D84D32F022}.Debug|Mixed Platforms.ActiveCfg = Debug|Pocket PC 2003 (ARMV4)
|
|
||||||
{A955FC4A-73F1-44F7-135E-30D84D32F022}.Debug|Mixed Platforms.Build.0 = Debug|Pocket PC 2003 (ARMV4)
|
|
||||||
{A955FC4A-73F1-44F7-135E-30D84D32F022}.Debug|Mixed Platforms.Deploy.0 = Debug|Pocket PC 2003 (ARMV4)
|
|
||||||
{A955FC4A-73F1-44F7-135E-30D84D32F022}.Debug|Pocket PC 2003 (ARMV4).ActiveCfg = Debug|Pocket PC 2003 (ARMV4)
|
|
||||||
{A955FC4A-73F1-44F7-135E-30D84D32F022}.Debug|Pocket PC 2003 (ARMV4).Build.0 = Debug|Pocket PC 2003 (ARMV4)
|
|
||||||
{A955FC4A-73F1-44F7-135E-30D84D32F022}.Debug|Pocket PC 2003 (ARMV4).Deploy.0 = Debug|Pocket PC 2003 (ARMV4)
|
|
||||||
{A955FC4A-73F1-44F7-135E-30D84D32F022}.Debug|Win32.ActiveCfg = Debug|Pocket PC 2003 (ARMV4)
|
|
||||||
{A955FC4A-73F1-44F7-135E-30D84D32F022}.Release|Mixed Platforms.ActiveCfg = Release|Pocket PC 2003 (ARMV4)
|
|
||||||
{A955FC4A-73F1-44F7-135E-30D84D32F022}.Release|Mixed Platforms.Build.0 = Release|Pocket PC 2003 (ARMV4)
|
|
||||||
{A955FC4A-73F1-44F7-135E-30D84D32F022}.Release|Mixed Platforms.Deploy.0 = Release|Pocket PC 2003 (ARMV4)
|
|
||||||
{A955FC4A-73F1-44F7-135E-30D84D32F022}.Release|Pocket PC 2003 (ARMV4).ActiveCfg = Release|Pocket PC 2003 (ARMV4)
|
|
||||||
{A955FC4A-73F1-44F7-135E-30D84D32F022}.Release|Pocket PC 2003 (ARMV4).Build.0 = Release|Pocket PC 2003 (ARMV4)
|
|
||||||
{A955FC4A-73F1-44F7-135E-30D84D32F022}.Release|Pocket PC 2003 (ARMV4).Deploy.0 = Release|Pocket PC 2003 (ARMV4)
|
|
||||||
{A955FC4A-73F1-44F7-135E-30D84D32F022}.Release|Win32.ActiveCfg = Release|Pocket PC 2003 (ARMV4)
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
|
||||||
HideSolutionNode = FALSE
|
|
||||||
EndGlobalSection
|
|
||||||
EndGlobal
|
|
||||||
211
build/make/Android.mk
Normal file
211
build/make/Android.mk
Normal file
@@ -0,0 +1,211 @@
|
|||||||
|
##
|
||||||
|
## Copyright (c) 2012 The WebM project authors. All Rights Reserved.
|
||||||
|
##
|
||||||
|
## Use of this source code is governed by a BSD-style license
|
||||||
|
## that can be found in the LICENSE file in the root of the source
|
||||||
|
## tree. An additional intellectual property rights grant can be found
|
||||||
|
## in the file PATENTS. All contributing project authors may
|
||||||
|
## be found in the AUTHORS file in the root of the source tree.
|
||||||
|
##
|
||||||
|
|
||||||
|
#
|
||||||
|
# This file is to be used for compiling libvpx for Android using the NDK.
|
||||||
|
# In an Android project place a libvpx checkout in the jni directory.
|
||||||
|
# Run the configure script from the jni directory. Base libvpx
|
||||||
|
# encoder/decoder configuration will look similar to:
|
||||||
|
# ./libvpx/configure --target=armv7-android-gcc --disable-examples \
|
||||||
|
# --sdk-path=/opt/android-ndk-r6b/
|
||||||
|
#
|
||||||
|
# When targeting Android, realtime-only is enabled by default. This can
|
||||||
|
# be overridden by adding the command line flag:
|
||||||
|
# --disable-realtime-only
|
||||||
|
#
|
||||||
|
# This will create .mk files that contain variables that contain the
|
||||||
|
# source files to compile.
|
||||||
|
#
|
||||||
|
# Place an Android.mk file in the jni directory that references the
|
||||||
|
# Android.mk file in the libvpx directory:
|
||||||
|
# LOCAL_PATH := $(call my-dir)
|
||||||
|
# include $(CLEAR_VARS)
|
||||||
|
# include jni/libvpx/build/make/Android.mk
|
||||||
|
#
|
||||||
|
# There are currently two TARGET_ARCH_ABI targets for ARM.
|
||||||
|
# armeabi and armeabi-v7a. armeabi-v7a is selected by creating an
|
||||||
|
# Application.mk in the jni directory that contains:
|
||||||
|
# APP_ABI := armeabi-v7a
|
||||||
|
#
|
||||||
|
# By default libvpx will detect at runtime the existance of NEON extension.
|
||||||
|
# For this we import the 'cpufeatures' module from the NDK sources.
|
||||||
|
# libvpx can also be configured without this runtime detection method.
|
||||||
|
# Configuring with --disable-runtime-cpu-detect will assume presence of NEON.
|
||||||
|
# Configuring with --disable-runtime-cpu-detect --disable-neon will remove any
|
||||||
|
# NEON dependency.
|
||||||
|
|
||||||
|
# To change to building armeabi, run ./libvpx/configure again, but with
|
||||||
|
# --target=arm5te-android-gcc and modify the Application.mk file to
|
||||||
|
# set APP_ABI := armeabi
|
||||||
|
#
|
||||||
|
# Running ndk-build will build libvpx and include it in your project.
|
||||||
|
#
|
||||||
|
|
||||||
|
CONFIG_DIR := $(LOCAL_PATH)
|
||||||
|
LIBVPX_PATH := $(LOCAL_PATH)/libvpx
|
||||||
|
ASM_CNV_PATH_LOCAL := $(TARGET_ARCH_ABI)/ads2gas
|
||||||
|
ASM_CNV_PATH := $(LOCAL_PATH)/$(ASM_CNV_PATH_LOCAL)
|
||||||
|
|
||||||
|
# Makefiles created by the libvpx configure process
|
||||||
|
# This will need to be fixed to handle x86.
|
||||||
|
ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
|
||||||
|
include $(CONFIG_DIR)/libs-armv7-android-gcc.mk
|
||||||
|
else
|
||||||
|
include $(CONFIG_DIR)/libs-armv5te-android-gcc.mk
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Rule that is normally in Makefile created by libvpx
|
||||||
|
# configure. Used to filter out source files based on configuration.
|
||||||
|
enabled=$(filter-out $($(1)-no),$($(1)-yes))
|
||||||
|
|
||||||
|
# Override the relative path that is defined by the libvpx
|
||||||
|
# configure process
|
||||||
|
SRC_PATH_BARE := $(LIBVPX_PATH)
|
||||||
|
|
||||||
|
# Include the list of files to be built
|
||||||
|
include $(LIBVPX_PATH)/libs.mk
|
||||||
|
|
||||||
|
# Want arm, not thumb, optimized
|
||||||
|
LOCAL_ARM_MODE := arm
|
||||||
|
LOCAL_CFLAGS := -O3
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# Template : asm_offsets_template
|
||||||
|
# Arguments : 1: assembly offsets file to be created
|
||||||
|
# 2: c file to base assembly offsets on
|
||||||
|
# Returns : None
|
||||||
|
# Usage : $(eval $(call asm_offsets_template,<asmfile>, <srcfile>
|
||||||
|
# Rationale : Create offsets at compile time using for structures that are
|
||||||
|
# defined in c, but used in assembly functions.
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
define asm_offsets_template
|
||||||
|
|
||||||
|
_SRC:=$(2)
|
||||||
|
_OBJ:=$(ASM_CNV_PATH)/$$(notdir $(2)).S
|
||||||
|
|
||||||
|
_FLAGS = $$($$(my)CFLAGS) \
|
||||||
|
$$(call get-src-file-target-cflags,$(2)) \
|
||||||
|
$$(call host-c-includes,$$(LOCAL_C_INCLUDES) $$(CONFIG_DIR)) \
|
||||||
|
$$(LOCAL_CFLAGS) \
|
||||||
|
$$(NDK_APP_CFLAGS) \
|
||||||
|
$$(call host-c-includes,$$($(my)C_INCLUDES)) \
|
||||||
|
-DINLINE_ASM \
|
||||||
|
-S \
|
||||||
|
|
||||||
|
_TEXT = "Compile $$(call get-src-file-text,$(2))"
|
||||||
|
_CC = $$(TARGET_CC)
|
||||||
|
|
||||||
|
$$(eval $$(call ev-build-file))
|
||||||
|
|
||||||
|
$(1) : $$(_OBJ) $(2)
|
||||||
|
@mkdir -p $$(dir $$@)
|
||||||
|
@grep $(OFFSET_PATTERN) $$< | tr -d '\#' | $(CONFIG_DIR)/$(ASM_CONVERSION) > $$@
|
||||||
|
endef
|
||||||
|
|
||||||
|
# Use ads2gas script to convert from RVCT format to GAS format. This passes
|
||||||
|
# puts the processed file under $(ASM_CNV_PATH). Local clean rule
|
||||||
|
# to handle removing these
|
||||||
|
ASM_CNV_OFFSETS_DEPEND = $(ASM_CNV_PATH)/asm_com_offsets.asm
|
||||||
|
ifeq ($(CONFIG_VP8_DECODER), yes)
|
||||||
|
ASM_CNV_OFFSETS_DEPEND += $(ASM_CNV_PATH)/asm_dec_offsets.asm
|
||||||
|
endif
|
||||||
|
ifeq ($(CONFIG_VP8_ENCODER), yes)
|
||||||
|
ASM_CNV_OFFSETS_DEPEND += $(ASM_CNV_PATH)/asm_enc_offsets.asm
|
||||||
|
endif
|
||||||
|
|
||||||
|
.PRECIOUS: %.asm.s
|
||||||
|
$(ASM_CNV_PATH)/libvpx/%.asm.s: $(LIBVPX_PATH)/%.asm $(ASM_CNV_OFFSETS_DEPEND)
|
||||||
|
@mkdir -p $(dir $@)
|
||||||
|
@$(CONFIG_DIR)/$(ASM_CONVERSION) <$< > $@
|
||||||
|
|
||||||
|
# For building vpx_rtcd.h, which has a rule in libs.mk
|
||||||
|
TGT_ISA:=$(word 1, $(subst -, ,$(TOOLCHAIN)))
|
||||||
|
target := libs
|
||||||
|
|
||||||
|
LOCAL_SRC_FILES += vpx_config.c
|
||||||
|
|
||||||
|
# Remove duplicate entries
|
||||||
|
CODEC_SRCS_UNIQUE = $(sort $(CODEC_SRCS))
|
||||||
|
|
||||||
|
# Pull out C files. vpx_config.c is in the immediate directory and
|
||||||
|
# so it does not need libvpx/ prefixed like the rest of the source files.
|
||||||
|
CODEC_SRCS_C = $(filter %.c, $(CODEC_SRCS_UNIQUE))
|
||||||
|
LOCAL_CODEC_SRCS_C = $(filter-out vpx_config.c, $(CODEC_SRCS_C))
|
||||||
|
|
||||||
|
LOCAL_SRC_FILES += $(foreach file, $(LOCAL_CODEC_SRCS_C), libvpx/$(file))
|
||||||
|
|
||||||
|
# Pull out assembly files, splitting NEON from the rest. This is
|
||||||
|
# done to specify that the NEON assembly files use NEON assembler flags.
|
||||||
|
CODEC_SRCS_ASM_ALL = $(filter %.asm.s, $(CODEC_SRCS_UNIQUE))
|
||||||
|
CODEC_SRCS_ASM = $(foreach v, \
|
||||||
|
$(CODEC_SRCS_ASM_ALL), \
|
||||||
|
$(if $(findstring neon,$(v)),,$(v)))
|
||||||
|
CODEC_SRCS_ASM_ADS2GAS = $(patsubst %.s, \
|
||||||
|
$(ASM_CNV_PATH_LOCAL)/libvpx/%.s, \
|
||||||
|
$(CODEC_SRCS_ASM))
|
||||||
|
LOCAL_SRC_FILES += $(CODEC_SRCS_ASM_ADS2GAS)
|
||||||
|
|
||||||
|
ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
|
||||||
|
CODEC_SRCS_ASM_NEON = $(foreach v, \
|
||||||
|
$(CODEC_SRCS_ASM_ALL),\
|
||||||
|
$(if $(findstring neon,$(v)),$(v),))
|
||||||
|
CODEC_SRCS_ASM_NEON_ADS2GAS = $(patsubst %.s, \
|
||||||
|
$(ASM_CNV_PATH_LOCAL)/libvpx/%.s, \
|
||||||
|
$(CODEC_SRCS_ASM_NEON))
|
||||||
|
LOCAL_SRC_FILES += $(patsubst %.s, \
|
||||||
|
%.s.neon, \
|
||||||
|
$(CODEC_SRCS_ASM_NEON_ADS2GAS))
|
||||||
|
endif
|
||||||
|
|
||||||
|
LOCAL_CFLAGS += \
|
||||||
|
-DHAVE_CONFIG_H=vpx_config.h \
|
||||||
|
-I$(LIBVPX_PATH) \
|
||||||
|
-I$(ASM_CNV_PATH)
|
||||||
|
|
||||||
|
LOCAL_MODULE := libvpx
|
||||||
|
|
||||||
|
LOCAL_LDLIBS := -llog
|
||||||
|
|
||||||
|
ifeq ($(CONFIG_RUNTIME_CPU_DETECT),yes)
|
||||||
|
LOCAL_STATIC_LIBRARIES := cpufeatures
|
||||||
|
endif
|
||||||
|
|
||||||
|
$(foreach file, $(LOCAL_SRC_FILES), $(LOCAL_PATH)/$(file)): vpx_rtcd.h
|
||||||
|
|
||||||
|
.PHONY: clean
|
||||||
|
clean:
|
||||||
|
@echo "Clean: ads2gas files [$(TARGET_ARCH_ABI)]"
|
||||||
|
@$(RM) $(CODEC_SRCS_ASM_ADS2GAS) $(CODEC_SRCS_ASM_NEON_ADS2GAS)
|
||||||
|
@$(RM) $(patsubst %.asm, %.*, $(ASM_CNV_OFFSETS_DEPEND))
|
||||||
|
@$(RM) -r $(ASM_CNV_PATH)
|
||||||
|
@$(RM) $(CLEAN-OBJS)
|
||||||
|
|
||||||
|
include $(BUILD_SHARED_LIBRARY)
|
||||||
|
|
||||||
|
$(eval $(call asm_offsets_template,\
|
||||||
|
$(ASM_CNV_PATH)/asm_com_offsets.asm, \
|
||||||
|
$(LIBVPX_PATH)/vp8/common/asm_com_offsets.c))
|
||||||
|
|
||||||
|
ifeq ($(CONFIG_VP8_DECODER), yes)
|
||||||
|
$(eval $(call asm_offsets_template,\
|
||||||
|
$(ASM_CNV_PATH)/asm_dec_offsets.asm, \
|
||||||
|
$(LIBVPX_PATH)/vp8/decoder/asm_dec_offsets.c))
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(CONFIG_VP8_ENCODER), yes)
|
||||||
|
$(eval $(call asm_offsets_template,\
|
||||||
|
$(ASM_CNV_PATH)/asm_enc_offsets.asm, \
|
||||||
|
$(LIBVPX_PATH)/vp8/encoder/asm_enc_offsets.c))
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(CONFIG_RUNTIME_CPU_DETECT),yes)
|
||||||
|
$(call import-module,cpufeatures)
|
||||||
|
endif
|
||||||
|
|
||||||
58
build/make/Makefile
Executable file → Normal file
58
build/make/Makefile
Executable file → Normal file
@@ -20,6 +20,8 @@ ifeq ($(target),)
|
|||||||
all: .DEFAULT
|
all: .DEFAULT
|
||||||
clean:: .DEFAULT
|
clean:: .DEFAULT
|
||||||
install:: .DEFAULT
|
install:: .DEFAULT
|
||||||
|
test:: .DEFAULT
|
||||||
|
testdata:: .DEFAULT
|
||||||
|
|
||||||
|
|
||||||
# Note: md5sum is not installed on OS X, but openssl is. Openssl may not be
|
# Note: md5sum is not installed on OS X, but openssl is. Openssl may not be
|
||||||
@@ -65,6 +67,7 @@ endif
|
|||||||
BUILD_ROOT?=.
|
BUILD_ROOT?=.
|
||||||
VPATH=$(SRC_PATH_BARE)
|
VPATH=$(SRC_PATH_BARE)
|
||||||
CFLAGS+=-I$(BUILD_PFX)$(BUILD_ROOT) -I$(SRC_PATH)
|
CFLAGS+=-I$(BUILD_PFX)$(BUILD_ROOT) -I$(SRC_PATH)
|
||||||
|
CXXFLAGS+=-I$(BUILD_PFX)$(BUILD_ROOT) -I$(SRC_PATH)
|
||||||
ASFLAGS+=-I$(BUILD_PFX)$(BUILD_ROOT)/ -I$(SRC_PATH)/
|
ASFLAGS+=-I$(BUILD_PFX)$(BUILD_ROOT)/ -I$(SRC_PATH)/
|
||||||
DIST_DIR?=dist
|
DIST_DIR?=dist
|
||||||
HOSTCC?=gcc
|
HOSTCC?=gcc
|
||||||
@@ -78,12 +81,13 @@ qexec=$(if $(quiet),@)
|
|||||||
%: %.o
|
%: %.o
|
||||||
%.asm:
|
%.asm:
|
||||||
%.a:
|
%.a:
|
||||||
|
%: %.cc
|
||||||
|
|
||||||
#
|
#
|
||||||
# Common rules"
|
# Common rules"
|
||||||
#
|
#
|
||||||
.PHONY: all-$(target)
|
.PHONY: all
|
||||||
all-$(target):
|
all:
|
||||||
|
|
||||||
.PHONY: clean
|
.PHONY: clean
|
||||||
clean::
|
clean::
|
||||||
@@ -94,15 +98,28 @@ clean::
|
|||||||
dist:
|
dist:
|
||||||
.PHONY: install
|
.PHONY: install
|
||||||
install::
|
install::
|
||||||
|
.PHONY: test
|
||||||
|
test::
|
||||||
|
.PHONY: testdata
|
||||||
|
testdata::
|
||||||
|
|
||||||
$(BUILD_PFX)%.c.d: %.c
|
$(BUILD_PFX)%.c.d: %.c
|
||||||
$(if $(quiet),@echo " [DEP] $@")
|
$(if $(quiet),@echo " [DEP] $@")
|
||||||
$(qexec)mkdir -p $(dir $@)
|
$(qexec)mkdir -p $(dir $@)
|
||||||
$(qexec)$(CC) $(CFLAGS) -M $< | $(fmt_deps) > $@
|
$(qexec)$(CC) $(INTERNAL_CFLAGS) $(CFLAGS) -M $< | $(fmt_deps) > $@
|
||||||
|
|
||||||
$(BUILD_PFX)%.c.o: %.c
|
$(BUILD_PFX)%.c.o: %.c
|
||||||
$(if $(quiet),@echo " [CC] $@")
|
$(if $(quiet),@echo " [CC] $@")
|
||||||
$(qexec)$(CC) $(CFLAGS) -c -o $@ $<
|
$(qexec)$(CC) $(INTERNAL_CFLAGS) $(CFLAGS) -c -o $@ $<
|
||||||
|
|
||||||
|
$(BUILD_PFX)%.cc.d: %.cc
|
||||||
|
$(if $(quiet),@echo " [DEP] $@")
|
||||||
|
$(qexec)mkdir -p $(dir $@)
|
||||||
|
$(qexec)$(CXX) $(INTERNAL_CFLAGS) $(CXXFLAGS) -M $< | $(fmt_deps) > $@
|
||||||
|
|
||||||
|
$(BUILD_PFX)%.cc.o: %.cc
|
||||||
|
$(if $(quiet),@echo " [CXX] $@")
|
||||||
|
$(qexec)$(CXX) $(INTERNAL_CFLAGS) $(CXXFLAGS) -c -o $@ $<
|
||||||
|
|
||||||
$(BUILD_PFX)%.asm.d: %.asm
|
$(BUILD_PFX)%.asm.d: %.asm
|
||||||
$(if $(quiet),@echo " [DEP] $@")
|
$(if $(quiet),@echo " [DEP] $@")
|
||||||
@@ -124,6 +141,12 @@ $(BUILD_PFX)%.s.o: %.s
|
|||||||
$(if $(quiet),@echo " [AS] $@")
|
$(if $(quiet),@echo " [AS] $@")
|
||||||
$(qexec)$(AS) $(ASFLAGS) -o $@ $<
|
$(qexec)$(AS) $(ASFLAGS) -o $@ $<
|
||||||
|
|
||||||
|
.PRECIOUS: %.c.S
|
||||||
|
%.c.S: CFLAGS += -DINLINE_ASM
|
||||||
|
$(BUILD_PFX)%.c.S: %.c
|
||||||
|
$(if $(quiet),@echo " [GEN] $@")
|
||||||
|
$(qexec)$(CC) -S $(CFLAGS) -o $@ $<
|
||||||
|
|
||||||
.PRECIOUS: %.asm.s
|
.PRECIOUS: %.asm.s
|
||||||
$(BUILD_PFX)%.asm.s: %.asm
|
$(BUILD_PFX)%.asm.s: %.asm
|
||||||
$(if $(quiet),@echo " [ASM CONVERSION] $@")
|
$(if $(quiet),@echo " [ASM CONVERSION] $@")
|
||||||
@@ -152,8 +175,8 @@ endif
|
|||||||
# Rule to extract assembly constants from C sources
|
# Rule to extract assembly constants from C sources
|
||||||
#
|
#
|
||||||
obj_int_extract: build/make/obj_int_extract.c
|
obj_int_extract: build/make/obj_int_extract.c
|
||||||
$(if $(quiet),echo " [HOSTCC] $@")
|
$(if $(quiet),@echo " [HOSTCC] $@")
|
||||||
$(qexec)$(HOSTCC) -I. -o $@ $<
|
$(qexec)$(HOSTCC) -I. -I$(SRC_PATH_BARE) -o $@ $<
|
||||||
CLEAN-OBJS += obj_int_extract
|
CLEAN-OBJS += obj_int_extract
|
||||||
|
|
||||||
#
|
#
|
||||||
@@ -169,7 +192,7 @@ cond_enabled=$(if $(filter yes,$($(1))), $(call enabled,$(2)))
|
|||||||
|
|
||||||
find_file1=$(word 1,$(wildcard $(subst //,/,$(addsuffix /$(1),$(2)))))
|
find_file1=$(word 1,$(wildcard $(subst //,/,$(addsuffix /$(1),$(2)))))
|
||||||
find_file=$(foreach f,$(1),$(call find_file1,$(strip $(f)),$(strip $(2))) )
|
find_file=$(foreach f,$(1),$(call find_file1,$(strip $(f)),$(strip $(2))) )
|
||||||
obj_pats=.c=.c.o $(AS_SFX)=$(AS_SFX).o
|
obj_pats=.c=.c.o $(AS_SFX)=$(AS_SFX).o .cc=.cc.o
|
||||||
objs=$(addprefix $(BUILD_PFX),$(foreach p,$(obj_pats),$(filter %.o,$(1:$(p))) ))
|
objs=$(addprefix $(BUILD_PFX),$(foreach p,$(obj_pats),$(filter %.o,$(1:$(p))) ))
|
||||||
|
|
||||||
install_map_templates=$(eval $(call install_map_template,$(1),$(2)))
|
install_map_templates=$(eval $(call install_map_template,$(1),$(2)))
|
||||||
@@ -188,7 +211,13 @@ define linker_template
|
|||||||
$(1): $(filter-out -%,$(2))
|
$(1): $(filter-out -%,$(2))
|
||||||
$(1):
|
$(1):
|
||||||
$(if $(quiet),@echo " [LD] $$@")
|
$(if $(quiet),@echo " [LD] $$@")
|
||||||
$(qexec)$$(LD) $$(strip $$(LDFLAGS) -o $$@ $(2) $(3) $$(extralibs))
|
$(qexec)$$(LD) $$(strip $$(INTERNAL_LDFLAGS) $$(LDFLAGS) -o $$@ $(2) $(3) $$(extralibs))
|
||||||
|
endef
|
||||||
|
define linkerxx_template
|
||||||
|
$(1): $(filter-out -%,$(2))
|
||||||
|
$(1):
|
||||||
|
$(if $(quiet),@echo " [LD] $$@")
|
||||||
|
$(qexec)$$(CXX) $$(strip $$(INTERNAL_LDFLAGS) $$(LDFLAGS) -o $$@ $(2) $(3) $$(extralibs))
|
||||||
endef
|
endef
|
||||||
# make-3.80 has a bug with expanding large input strings to the eval function,
|
# make-3.80 has a bug with expanding large input strings to the eval function,
|
||||||
# which was triggered in some cases by the following component of
|
# which was triggered in some cases by the following component of
|
||||||
@@ -255,7 +284,7 @@ ifeq ($(filter clean,$(MAKECMDGOALS)),)
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
#
|
#
|
||||||
# Configuration dependant rules
|
# Configuration dependent rules
|
||||||
#
|
#
|
||||||
$(call pairmap,install_map_templates,$(INSTALL_MAPS))
|
$(call pairmap,install_map_templates,$(INSTALL_MAPS))
|
||||||
|
|
||||||
@@ -330,12 +359,10 @@ ifneq ($(call enabled,DIST-SRCS),)
|
|||||||
DIST-SRCS-$(CONFIG_MSVS) += build/make/gen_msvs_proj.sh
|
DIST-SRCS-$(CONFIG_MSVS) += build/make/gen_msvs_proj.sh
|
||||||
DIST-SRCS-$(CONFIG_MSVS) += build/make/gen_msvs_sln.sh
|
DIST-SRCS-$(CONFIG_MSVS) += build/make/gen_msvs_sln.sh
|
||||||
DIST-SRCS-$(CONFIG_MSVS) += build/x86-msvs/yasm.rules
|
DIST-SRCS-$(CONFIG_MSVS) += build/x86-msvs/yasm.rules
|
||||||
|
DIST-SRCS-$(CONFIG_MSVS) += build/x86-msvs/obj_int_extract.bat
|
||||||
DIST-SRCS-$(CONFIG_RVCT) += build/make/armlink_adapter.sh
|
DIST-SRCS-$(CONFIG_RVCT) += build/make/armlink_adapter.sh
|
||||||
#
|
# Include obj_int_extract if we use offsets from asm_*_offsets
|
||||||
# This isn't really ARCH_ARM dependent, it's dependant on whether we're
|
DIST-SRCS-$(ARCH_ARM)$(ARCH_X86)$(ARCH_X86_64) += build/make/obj_int_extract.c
|
||||||
# using assembly code or not (CONFIG_OPTIMIZATIONS maybe). Just use
|
|
||||||
# this for now.
|
|
||||||
DIST-SRCS-$(ARCH_ARM) += build/make/obj_int_extract.c
|
|
||||||
DIST-SRCS-$(ARCH_ARM) += build/make/ads2gas.pl
|
DIST-SRCS-$(ARCH_ARM) += build/make/ads2gas.pl
|
||||||
DIST-SRCS-yes += $(target:-$(TOOLCHAIN)=).mk
|
DIST-SRCS-yes += $(target:-$(TOOLCHAIN)=).mk
|
||||||
endif
|
endif
|
||||||
@@ -355,6 +382,7 @@ ifeq ($(CONFIG_EXTERNAL_BUILD),yes)
|
|||||||
endif
|
endif
|
||||||
BUILD_TARGETS += .docs .libs .bins
|
BUILD_TARGETS += .docs .libs .bins
|
||||||
INSTALL_TARGETS += .install-docs .install-srcs .install-libs .install-bins
|
INSTALL_TARGETS += .install-docs .install-srcs .install-libs .install-bins
|
||||||
all-$(target): $(BUILD_TARGETS)
|
all: $(BUILD_TARGETS)
|
||||||
install:: $(INSTALL_TARGETS)
|
install:: $(INSTALL_TARGETS)
|
||||||
dist: $(INSTALL_TARGETS)
|
dist: $(INSTALL_TARGETS)
|
||||||
|
test::
|
||||||
|
|||||||
@@ -21,10 +21,26 @@ print "@ This file was created from a .asm file\n";
|
|||||||
print "@ using the ads2gas.pl script.\n";
|
print "@ using the ads2gas.pl script.\n";
|
||||||
print "\t.equ DO1STROUNDING, 0\n";
|
print "\t.equ DO1STROUNDING, 0\n";
|
||||||
|
|
||||||
|
# Stack of procedure names.
|
||||||
|
@proc_stack = ();
|
||||||
|
|
||||||
while (<STDIN>)
|
while (<STDIN>)
|
||||||
{
|
{
|
||||||
# Comment character
|
undef $comment;
|
||||||
s/;/@/g;
|
undef $line;
|
||||||
|
$comment_char = ";";
|
||||||
|
$comment_sub = "@";
|
||||||
|
|
||||||
|
# Handle comments.
|
||||||
|
if (/$comment_char/)
|
||||||
|
{
|
||||||
|
$comment = "";
|
||||||
|
($line, $comment) = /(.*?)$comment_char(.*)/;
|
||||||
|
$_ = $line;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Load and store alignment
|
||||||
|
s/@/,:/g;
|
||||||
|
|
||||||
# Hexadecimal constants prefaced by 0x
|
# Hexadecimal constants prefaced by 0x
|
||||||
s/#&/#0x/g;
|
s/#&/#0x/g;
|
||||||
@@ -45,16 +61,27 @@ while (<STDIN>)
|
|||||||
s/:SHR:/ >> /g;
|
s/:SHR:/ >> /g;
|
||||||
|
|
||||||
# Convert ELSE to .else
|
# Convert ELSE to .else
|
||||||
s/ELSE/.else/g;
|
s/\bELSE\b/.else/g;
|
||||||
|
|
||||||
# Convert ENDIF to .endif
|
# Convert ENDIF to .endif
|
||||||
s/ENDIF/.endif/g;
|
s/\bENDIF\b/.endif/g;
|
||||||
|
|
||||||
# Convert ELSEIF to .elseif
|
# Convert ELSEIF to .elseif
|
||||||
s/ELSEIF/.elseif/g;
|
s/\bELSEIF\b/.elseif/g;
|
||||||
|
|
||||||
# Convert LTORG to .ltorg
|
# Convert LTORG to .ltorg
|
||||||
s/LTORG/.ltorg/g;
|
s/\bLTORG\b/.ltorg/g;
|
||||||
|
|
||||||
|
# Convert endfunc to nothing.
|
||||||
|
s/\bendfunc\b//ig;
|
||||||
|
|
||||||
|
# Convert FUNCTION to nothing.
|
||||||
|
s/\bFUNCTION\b//g;
|
||||||
|
s/\bfunction\b//g;
|
||||||
|
|
||||||
|
s/\bENTRY\b//g;
|
||||||
|
s/\bMSARMASM\b/0/g;
|
||||||
|
s/^\s+end\s+$//g;
|
||||||
|
|
||||||
# Convert IF :DEF:to .if
|
# Convert IF :DEF:to .if
|
||||||
# gcc doesn't have the ability to do a conditional
|
# gcc doesn't have the ability to do a conditional
|
||||||
@@ -79,7 +106,10 @@ while (<STDIN>)
|
|||||||
s/CODE([0-9][0-9])/.code $1/;
|
s/CODE([0-9][0-9])/.code $1/;
|
||||||
|
|
||||||
# No AREA required
|
# No AREA required
|
||||||
s/^\s*AREA.*$/.text/;
|
# But ALIGNs in AREA must be obeyed
|
||||||
|
s/^\s*AREA.*ALIGN=([0-9])$/.text\n.p2align $1/;
|
||||||
|
# If no ALIGN, strip the AREA and align to 4 bytes
|
||||||
|
s/^\s*AREA.*$/.text\n.p2align 2/;
|
||||||
|
|
||||||
# DCD to .word
|
# DCD to .word
|
||||||
# This one is for incoming symbols
|
# This one is for incoming symbols
|
||||||
@@ -97,6 +127,7 @@ while (<STDIN>)
|
|||||||
if (s/RN\s+([Rr]\d+|lr)/.req $1/)
|
if (s/RN\s+([Rr]\d+|lr)/.req $1/)
|
||||||
{
|
{
|
||||||
print;
|
print;
|
||||||
|
print "$comment_sub$comment\n" if defined $comment;
|
||||||
next;
|
next;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -105,6 +136,9 @@ while (<STDIN>)
|
|||||||
s/EXPORT\s+\|([\$\w]*)\|/.global $1 \n\t.type $1, function/;
|
s/EXPORT\s+\|([\$\w]*)\|/.global $1 \n\t.type $1, function/;
|
||||||
s/IMPORT\s+\|([\$\w]*)\|/.global $1/;
|
s/IMPORT\s+\|([\$\w]*)\|/.global $1/;
|
||||||
|
|
||||||
|
s/EXPORT\s+([\$\w]*)/.global $1/;
|
||||||
|
s/export\s+([\$\w]*)/.global $1/;
|
||||||
|
|
||||||
# No vertical bars required; make additional symbol with prepended
|
# No vertical bars required; make additional symbol with prepended
|
||||||
# underscore
|
# underscore
|
||||||
s/^\|(\$?\w+)\|/_$1\n\t$1:/g;
|
s/^\|(\$?\w+)\|/_$1\n\t$1:/g;
|
||||||
@@ -114,28 +148,52 @@ while (<STDIN>)
|
|||||||
# put the colon at the end of the line in the macro
|
# put the colon at the end of the line in the macro
|
||||||
s/^([a-zA-Z_0-9\$]+)/$1:/ if !/EQU/;
|
s/^([a-zA-Z_0-9\$]+)/$1:/ if !/EQU/;
|
||||||
|
|
||||||
# Strip ALIGN
|
# ALIGN directive
|
||||||
s/\sALIGN/@ ALIGN/g;
|
s/\bALIGN\b/.balign/g;
|
||||||
|
|
||||||
# Strip ARM
|
# ARM code
|
||||||
s/\sARM/@ ARM/g;
|
s/\sARM/.arm/g;
|
||||||
|
|
||||||
# Strip REQUIRE8
|
# push/pop
|
||||||
#s/\sREQUIRE8/@ REQUIRE8/g;
|
s/(push\s+)(r\d+)/stmdb sp\!, \{$2\}/g;
|
||||||
s/\sREQUIRE8/@ /g; #EQU cause problem
|
s/(pop\s+)(r\d+)/ldmia sp\!, \{$2\}/g;
|
||||||
|
|
||||||
# Strip PRESERVE8
|
# NEON code
|
||||||
s/\sPRESERVE8/@ PRESERVE8/g;
|
s/(vld1.\d+\s+)(q\d+)/$1\{$2\}/g;
|
||||||
|
s/(vtbl.\d+\s+[^,]+),([^,]+)/$1,\{$2\}/g;
|
||||||
|
|
||||||
# Strip PROC and ENDPROC
|
# eabi_attributes numerical equivalents can be found in the
|
||||||
s/\sPROC/@/g;
|
# "ARM IHI 0045C" document.
|
||||||
s/\sENDP/@/g;
|
|
||||||
|
# REQUIRE8 Stack is required to be 8-byte aligned
|
||||||
|
s/\sREQUIRE8/.eabi_attribute 24, 1 \@Tag_ABI_align_needed/g;
|
||||||
|
|
||||||
|
# PRESERVE8 Stack 8-byte align is preserved
|
||||||
|
s/\sPRESERVE8/.eabi_attribute 25, 1 \@Tag_ABI_align_preserved/g;
|
||||||
|
|
||||||
|
# Use PROC and ENDP to give the symbols a .size directive.
|
||||||
|
# This makes them show up properly in debugging tools like gdb and valgrind.
|
||||||
|
if (/\bPROC\b/)
|
||||||
|
{
|
||||||
|
my $proc;
|
||||||
|
/^_([\.0-9A-Z_a-z]\w+)\b/;
|
||||||
|
$proc = $1;
|
||||||
|
push(@proc_stack, $proc) if ($proc);
|
||||||
|
s/\bPROC\b/@ $&/;
|
||||||
|
}
|
||||||
|
if (/\bENDP\b/)
|
||||||
|
{
|
||||||
|
my $proc;
|
||||||
|
s/\bENDP\b/@ $&/;
|
||||||
|
$proc = pop(@proc_stack);
|
||||||
|
$_ = "\t.size $proc, .-$proc".$_ if ($proc);
|
||||||
|
}
|
||||||
|
|
||||||
# EQU directive
|
# EQU directive
|
||||||
s/(.*)EQU(.*)/.equ $1, $2/;
|
s/(\S+\s+)EQU(\s+\S+)/.equ $1, $2/;
|
||||||
|
|
||||||
# Begin macro definition
|
# Begin macro definition
|
||||||
if (/MACRO/) {
|
if (/\bMACRO\b/) {
|
||||||
$_ = <STDIN>;
|
$_ = <STDIN>;
|
||||||
s/^/.macro/;
|
s/^/.macro/;
|
||||||
s/\$//g; # remove formal param reference
|
s/\$//g; # remove formal param reference
|
||||||
@@ -144,7 +202,11 @@ while (<STDIN>)
|
|||||||
|
|
||||||
# For macros, use \ to reference formal params
|
# For macros, use \ to reference formal params
|
||||||
s/\$/\\/g; # End macro definition
|
s/\$/\\/g; # End macro definition
|
||||||
s/MEND/.endm/; # No need to tell it where to stop assembling
|
s/\bMEND\b/.endm/; # No need to tell it where to stop assembling
|
||||||
next if /^\s*END\s*$/;
|
next if /^\s*END\s*$/;
|
||||||
print;
|
print;
|
||||||
|
print "$comment_sub$comment\n" if defined $comment;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Mark that this object doesn't need an executable stack.
|
||||||
|
printf ("\t.section\t.note.GNU-stack,\"\",\%\%progbits\n");
|
||||||
|
|||||||
@@ -30,6 +30,8 @@ my @mapping_list = ("\$0", "\$1", "\$2", "\$3", "\$4", "\$5", "\$6", "\$7", "\$8
|
|||||||
|
|
||||||
my @incoming_array;
|
my @incoming_array;
|
||||||
|
|
||||||
|
my @imported_functions;
|
||||||
|
|
||||||
# Perl trim function to remove whitespace from the start and end of the string
|
# Perl trim function to remove whitespace from the start and end of the string
|
||||||
sub trim($)
|
sub trim($)
|
||||||
{
|
{
|
||||||
@@ -41,6 +43,9 @@ sub trim($)
|
|||||||
|
|
||||||
while (<STDIN>)
|
while (<STDIN>)
|
||||||
{
|
{
|
||||||
|
# Load and store alignment
|
||||||
|
s/@/,:/g;
|
||||||
|
|
||||||
# Comment character
|
# Comment character
|
||||||
s/;/@/g;
|
s/;/@/g;
|
||||||
|
|
||||||
@@ -97,7 +102,10 @@ while (<STDIN>)
|
|||||||
s/CODE([0-9][0-9])/.code $1/;
|
s/CODE([0-9][0-9])/.code $1/;
|
||||||
|
|
||||||
# No AREA required
|
# No AREA required
|
||||||
s/^\s*AREA.*$/.text/;
|
# But ALIGNs in AREA must be obeyed
|
||||||
|
s/^\s*AREA.*ALIGN=([0-9])$/.text\n.p2align $1/;
|
||||||
|
# If no ALIGN, strip the AREA and align to 4 bytes
|
||||||
|
s/^\s*AREA.*$/.text\n.p2align 2/;
|
||||||
|
|
||||||
# DCD to .word
|
# DCD to .word
|
||||||
# This one is for incoming symbols
|
# This one is for incoming symbols
|
||||||
@@ -126,7 +134,18 @@ while (<STDIN>)
|
|||||||
# Make function visible to linker, and make additional symbol with
|
# Make function visible to linker, and make additional symbol with
|
||||||
# prepended underscore
|
# prepended underscore
|
||||||
s/EXPORT\s+\|([\$\w]*)\|/.globl _$1\n\t.globl $1/;
|
s/EXPORT\s+\|([\$\w]*)\|/.globl _$1\n\t.globl $1/;
|
||||||
s/IMPORT\s+\|([\$\w]*)\|/.globl $1/;
|
|
||||||
|
# Prepend imported functions with _
|
||||||
|
if (s/IMPORT\s+\|([\$\w]*)\|/.globl $1/)
|
||||||
|
{
|
||||||
|
$function = trim($1);
|
||||||
|
push(@imported_functions, $function);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach $function (@imported_functions)
|
||||||
|
{
|
||||||
|
s/$function/_$function/;
|
||||||
|
}
|
||||||
|
|
||||||
# No vertical bars required; make additional symbol with prepended
|
# No vertical bars required; make additional symbol with prepended
|
||||||
# underscore
|
# underscore
|
||||||
@@ -137,8 +156,8 @@ while (<STDIN>)
|
|||||||
# put the colon at the end of the line in the macro
|
# put the colon at the end of the line in the macro
|
||||||
s/^([a-zA-Z_0-9\$]+)/$1:/ if !/EQU/;
|
s/^([a-zA-Z_0-9\$]+)/$1:/ if !/EQU/;
|
||||||
|
|
||||||
# Strip ALIGN
|
# ALIGN directive
|
||||||
s/\sALIGN/@ ALIGN/g;
|
s/ALIGN/.balign/g;
|
||||||
|
|
||||||
# Strip ARM
|
# Strip ARM
|
||||||
s/\sARM/@ ARM/g;
|
s/\sARM/@ ARM/g;
|
||||||
@@ -151,8 +170,8 @@ while (<STDIN>)
|
|||||||
s/\sPRESERVE8/@ PRESERVE8/g;
|
s/\sPRESERVE8/@ PRESERVE8/g;
|
||||||
|
|
||||||
# Strip PROC and ENDPROC
|
# Strip PROC and ENDPROC
|
||||||
s/PROC/@/g;
|
s/\bPROC\b/@/g;
|
||||||
s/ENDP/@/g;
|
s/\bENDP\b/@/g;
|
||||||
|
|
||||||
# EQU directive
|
# EQU directive
|
||||||
s/(.*)EQU(.*)/.set $1, $2/;
|
s/(.*)EQU(.*)/.set $1, $2/;
|
||||||
|
|||||||
@@ -17,6 +17,8 @@ for i; do
|
|||||||
on_of=1
|
on_of=1
|
||||||
elif [ "$i" == "-v" ]; then
|
elif [ "$i" == "-v" ]; then
|
||||||
verbose=1
|
verbose=1
|
||||||
|
elif [ "$i" == "-g" ]; then
|
||||||
|
args="${args} --debug"
|
||||||
elif [ "$on_of" == "1" ]; then
|
elif [ "$on_of" == "1" ]; then
|
||||||
outfile=$i
|
outfile=$i
|
||||||
on_of=0
|
on_of=0
|
||||||
|
|||||||
@@ -78,11 +78,12 @@ Build options:
|
|||||||
--log=yes|no|FILE file configure log is written to [config.err]
|
--log=yes|no|FILE file configure log is written to [config.err]
|
||||||
--target=TARGET target platform tuple [generic-gnu]
|
--target=TARGET target platform tuple [generic-gnu]
|
||||||
--cpu=CPU optimize for a specific cpu rather than a family
|
--cpu=CPU optimize for a specific cpu rather than a family
|
||||||
|
--extra-cflags=ECFLAGS add ECFLAGS to CFLAGS [$CFLAGS]
|
||||||
${toggle_extra_warnings} emit harmless warnings (always non-fatal)
|
${toggle_extra_warnings} emit harmless warnings (always non-fatal)
|
||||||
${toggle_werror} treat warnings as errors, if possible
|
${toggle_werror} treat warnings as errors, if possible
|
||||||
(not available with all compilers)
|
(not available with all compilers)
|
||||||
${toggle_optimizations} turn on/off compiler optimization flags
|
${toggle_optimizations} turn on/off compiler optimization flags
|
||||||
${toggle_pic} turn on/off Position Independant Code
|
${toggle_pic} turn on/off Position Independent Code
|
||||||
${toggle_ccache} turn on/off compiler cache
|
${toggle_ccache} turn on/off compiler cache
|
||||||
${toggle_debug} enable/disable debug mode
|
${toggle_debug} enable/disable debug mode
|
||||||
${toggle_gprof} enable/disable gprof profiling instrumentation
|
${toggle_gprof} enable/disable gprof profiling instrumentation
|
||||||
@@ -165,6 +166,17 @@ is_in(){
|
|||||||
|
|
||||||
add_cflags() {
|
add_cflags() {
|
||||||
CFLAGS="${CFLAGS} $@"
|
CFLAGS="${CFLAGS} $@"
|
||||||
|
CXXFLAGS="${CXXFLAGS} $@"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
add_cflags_only() {
|
||||||
|
CFLAGS="${CFLAGS} $@"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
add_cxxflags_only() {
|
||||||
|
CXXFLAGS="${CXXFLAGS} $@"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -276,6 +288,13 @@ check_cc() {
|
|||||||
check_cmd ${CC} ${CFLAGS} "$@" -c -o ${TMP_O} ${TMP_C}
|
check_cmd ${CC} ${CFLAGS} "$@" -c -o ${TMP_O} ${TMP_C}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
check_cxx() {
|
||||||
|
log check_cxx "$@"
|
||||||
|
cat >${TMP_C}
|
||||||
|
log_file ${TMP_C}
|
||||||
|
check_cmd ${CXX} ${CXXFLAGS} "$@" -c -o ${TMP_O} ${TMP_C}
|
||||||
|
}
|
||||||
|
|
||||||
check_cpp() {
|
check_cpp() {
|
||||||
log check_cpp "$@"
|
log check_cpp "$@"
|
||||||
cat > ${TMP_C}
|
cat > ${TMP_C}
|
||||||
@@ -309,8 +328,25 @@ int x;
|
|||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
|
check_cxxflags() {
|
||||||
|
log check_cxxflags "$@"
|
||||||
|
|
||||||
|
# Catch CFLAGS that trigger CXX warnings
|
||||||
|
case "$CXX" in
|
||||||
|
*g++*) check_cxx -Werror "$@" <<EOF
|
||||||
|
int x;
|
||||||
|
EOF
|
||||||
|
;;
|
||||||
|
*) check_cxx "$@" <<EOF
|
||||||
|
int x;
|
||||||
|
EOF
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
check_add_cflags() {
|
check_add_cflags() {
|
||||||
check_cflags "$@" && add_cflags "$@"
|
check_cxxflags "$@" && add_cxxflags_only "$@"
|
||||||
|
check_cflags "$@" && add_cflags_only "$@"
|
||||||
}
|
}
|
||||||
|
|
||||||
check_add_asflags() {
|
check_add_asflags() {
|
||||||
@@ -339,7 +375,8 @@ EOF
|
|||||||
}
|
}
|
||||||
|
|
||||||
write_common_config_banner() {
|
write_common_config_banner() {
|
||||||
echo '# This file automatically generated by configure. Do not edit!' > config.mk
|
print_webm_license config.mk "##" ""
|
||||||
|
echo '# This file automatically generated by configure. Do not edit!' >> config.mk
|
||||||
echo "TOOLCHAIN := ${toolchain}" >> config.mk
|
echo "TOOLCHAIN := ${toolchain}" >> config.mk
|
||||||
|
|
||||||
case ${toolchain} in
|
case ${toolchain} in
|
||||||
@@ -365,9 +402,12 @@ true
|
|||||||
|
|
||||||
write_common_target_config_mk() {
|
write_common_target_config_mk() {
|
||||||
local CC=${CC}
|
local CC=${CC}
|
||||||
|
local CXX=${CXX}
|
||||||
enabled ccache && CC="ccache ${CC}"
|
enabled ccache && CC="ccache ${CC}"
|
||||||
|
enabled ccache && CXX="ccache ${CXX}"
|
||||||
|
print_webm_license $1 "##" ""
|
||||||
|
|
||||||
cat > $1 << EOF
|
cat >> $1 << EOF
|
||||||
# This file automatically generated by configure. Do not edit!
|
# This file automatically generated by configure. Do not edit!
|
||||||
SRC_PATH="$source_path"
|
SRC_PATH="$source_path"
|
||||||
SRC_PATH_BARE=$source_path
|
SRC_PATH_BARE=$source_path
|
||||||
@@ -376,6 +416,7 @@ TOOLCHAIN=${toolchain}
|
|||||||
ASM_CONVERSION=${asm_conversion_cmd:-${source_path}/build/make/ads2gas.pl}
|
ASM_CONVERSION=${asm_conversion_cmd:-${source_path}/build/make/ads2gas.pl}
|
||||||
|
|
||||||
CC=${CC}
|
CC=${CC}
|
||||||
|
CXX=${CXX}
|
||||||
AR=${AR}
|
AR=${AR}
|
||||||
LD=${LD}
|
LD=${LD}
|
||||||
AS=${AS}
|
AS=${AS}
|
||||||
@@ -383,11 +424,14 @@ STRIP=${STRIP}
|
|||||||
NM=${NM}
|
NM=${NM}
|
||||||
|
|
||||||
CFLAGS = ${CFLAGS}
|
CFLAGS = ${CFLAGS}
|
||||||
|
CXXFLAGS = ${CXXFLAGS}
|
||||||
ARFLAGS = -rus\$(if \$(quiet),c,v)
|
ARFLAGS = -rus\$(if \$(quiet),c,v)
|
||||||
LDFLAGS = ${LDFLAGS}
|
LDFLAGS = ${LDFLAGS}
|
||||||
ASFLAGS = ${ASFLAGS}
|
ASFLAGS = ${ASFLAGS}
|
||||||
extralibs = ${extralibs}
|
extralibs = ${extralibs}
|
||||||
AS_SFX = ${AS_SFX:-.asm}
|
AS_SFX = ${AS_SFX:-.asm}
|
||||||
|
EXE_SFX = ${EXE_SFX}
|
||||||
|
RTCD_OPTIONS = ${RTCD_OPTIONS}
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
if enabled rvct; then cat >> $1 << EOF
|
if enabled rvct; then cat >> $1 << EOF
|
||||||
@@ -409,13 +453,17 @@ EOF
|
|||||||
|
|
||||||
|
|
||||||
write_common_target_config_h() {
|
write_common_target_config_h() {
|
||||||
cat > ${TMP_H} << EOF
|
print_webm_license ${TMP_H} "/*" " */"
|
||||||
|
cat >> ${TMP_H} << EOF
|
||||||
/* This file automatically generated by configure. Do not edit! */
|
/* This file automatically generated by configure. Do not edit! */
|
||||||
|
#ifndef VPX_CONFIG_H
|
||||||
|
#define VPX_CONFIG_H
|
||||||
#define RESTRICT ${RESTRICT}
|
#define RESTRICT ${RESTRICT}
|
||||||
EOF
|
EOF
|
||||||
print_config_h ARCH "${TMP_H}" ${ARCH_LIST}
|
print_config_h ARCH "${TMP_H}" ${ARCH_LIST}
|
||||||
print_config_h HAVE "${TMP_H}" ${HAVE_LIST}
|
print_config_h HAVE "${TMP_H}" ${HAVE_LIST}
|
||||||
print_config_h CONFIG "${TMP_H}" ${CONFIG_LIST}
|
print_config_h CONFIG "${TMP_H}" ${CONFIG_LIST}
|
||||||
|
echo "#endif /* VPX_CONFIG_H */" >> ${TMP_H}
|
||||||
mkdir -p `dirname "$1"`
|
mkdir -p `dirname "$1"`
|
||||||
cmp "$1" ${TMP_H} >/dev/null 2>&1 || mv ${TMP_H} "$1"
|
cmp "$1" ${TMP_H} >/dev/null 2>&1 || mv ${TMP_H} "$1"
|
||||||
}
|
}
|
||||||
@@ -442,11 +490,30 @@ process_common_cmdline() {
|
|||||||
;;
|
;;
|
||||||
--cpu=*) tune_cpu="$optval"
|
--cpu=*) tune_cpu="$optval"
|
||||||
;;
|
;;
|
||||||
|
--extra-cflags=*)
|
||||||
|
extra_cflags="${optval}"
|
||||||
|
;;
|
||||||
--enable-?*|--disable-?*)
|
--enable-?*|--disable-?*)
|
||||||
eval `echo "$opt" | sed 's/--/action=/;s/-/ option=/;s/-/_/g'`
|
eval `echo "$opt" | sed 's/--/action=/;s/-/ option=/;s/-/_/g'`
|
||||||
echo "${CMDLINE_SELECT} ${ARCH_EXT_LIST}" | grep "^ *$option\$" >/dev/null || die_unknown $opt
|
if echo "${ARCH_EXT_LIST}" | grep "^ *$option\$" >/dev/null; then
|
||||||
|
[ $action = "disable" ] && RTCD_OPTIONS="${RTCD_OPTIONS}${opt} "
|
||||||
|
elif [ $action = "disable" ] && ! disabled $option ; then
|
||||||
|
echo "${CMDLINE_SELECT}" | grep "^ *$option\$" >/dev/null ||
|
||||||
|
die_unknown $opt
|
||||||
|
elif [ $action = "enable" ] && ! enabled $option ; then
|
||||||
|
echo "${CMDLINE_SELECT}" | grep "^ *$option\$" >/dev/null ||
|
||||||
|
die_unknown $opt
|
||||||
|
fi
|
||||||
$action $option
|
$action $option
|
||||||
;;
|
;;
|
||||||
|
--require-?*)
|
||||||
|
eval `echo "$opt" | sed 's/--/action=/;s/-/ option=/;s/-/_/g'`
|
||||||
|
if echo "${ARCH_EXT_LIST}" none | grep "^ *$option\$" >/dev/null; then
|
||||||
|
RTCD_OPTIONS="${RTCD_OPTIONS}${opt} "
|
||||||
|
else
|
||||||
|
die_unknown $opt
|
||||||
|
fi
|
||||||
|
;;
|
||||||
--force-enable-?*|--force-disable-?*)
|
--force-enable-?*|--force-disable-?*)
|
||||||
eval `echo "$opt" | sed 's/--force-/action=/;s/-/ option=/;s/-/_/g'`
|
eval `echo "$opt" | sed 's/--force-/action=/;s/-/ option=/;s/-/_/g'`
|
||||||
$action $option
|
$action $option
|
||||||
@@ -467,7 +534,11 @@ process_common_cmdline() {
|
|||||||
--libdir=*)
|
--libdir=*)
|
||||||
libdir="${optval}"
|
libdir="${optval}"
|
||||||
;;
|
;;
|
||||||
--libc|--as|--prefix|--libdir)
|
--sdk-path=*)
|
||||||
|
[ -d "${optval}" ] || die "Not a directory: ${optval}"
|
||||||
|
sdk_path="${optval}"
|
||||||
|
;;
|
||||||
|
--libc|--as|--prefix|--libdir|--sdk-path)
|
||||||
die "Option ${opt} requires argument"
|
die "Option ${opt} requires argument"
|
||||||
;;
|
;;
|
||||||
--help|-h) show_help
|
--help|-h) show_help
|
||||||
@@ -506,20 +577,31 @@ post_process_cmdline() {
|
|||||||
|
|
||||||
setup_gnu_toolchain() {
|
setup_gnu_toolchain() {
|
||||||
CC=${CC:-${CROSS}gcc}
|
CC=${CC:-${CROSS}gcc}
|
||||||
|
CXX=${CXX:-${CROSS}g++}
|
||||||
AR=${AR:-${CROSS}ar}
|
AR=${AR:-${CROSS}ar}
|
||||||
LD=${LD:-${CROSS}${link_with_cc:-ld}}
|
LD=${LD:-${CROSS}${link_with_cc:-ld}}
|
||||||
AS=${AS:-${CROSS}as}
|
AS=${AS:-${CROSS}as}
|
||||||
STRIP=${STRIP:-${CROSS}strip}
|
STRIP=${STRIP:-${CROSS}strip}
|
||||||
NM=${NM:-${CROSS}nm}
|
NM=${NM:-${CROSS}nm}
|
||||||
AS_SFX=.s
|
AS_SFX=.s
|
||||||
|
EXE_SFX=
|
||||||
}
|
}
|
||||||
|
|
||||||
process_common_toolchain() {
|
process_common_toolchain() {
|
||||||
if [ -z "$toolchain" ]; then
|
if [ -z "$toolchain" ]; then
|
||||||
gcctarget="$(gcc -dumpmachine 2> /dev/null)"
|
gcctarget="${CHOST:-$(gcc -dumpmachine 2> /dev/null)}"
|
||||||
|
|
||||||
# detect tgt_isa
|
# detect tgt_isa
|
||||||
case "$gcctarget" in
|
case "$gcctarget" in
|
||||||
|
armv6*)
|
||||||
|
tgt_isa=armv6
|
||||||
|
;;
|
||||||
|
armv7*)
|
||||||
|
tgt_isa=armv7
|
||||||
|
;;
|
||||||
|
armv5te*)
|
||||||
|
tgt_isa=armv5te
|
||||||
|
;;
|
||||||
*x86_64*|*amd64*)
|
*x86_64*|*amd64*)
|
||||||
tgt_isa=x86_64
|
tgt_isa=x86_64
|
||||||
;;
|
;;
|
||||||
@@ -551,6 +633,14 @@ process_common_toolchain() {
|
|||||||
tgt_isa=x86_64
|
tgt_isa=x86_64
|
||||||
tgt_os=darwin10
|
tgt_os=darwin10
|
||||||
;;
|
;;
|
||||||
|
*darwin11*)
|
||||||
|
tgt_isa=x86_64
|
||||||
|
tgt_os=darwin11
|
||||||
|
;;
|
||||||
|
*darwin12*)
|
||||||
|
tgt_isa=x86_64
|
||||||
|
tgt_os=darwin12
|
||||||
|
;;
|
||||||
*mingw32*|*cygwin*)
|
*mingw32*|*cygwin*)
|
||||||
[ -z "$tgt_isa" ] && tgt_isa=x86
|
[ -z "$tgt_isa" ] && tgt_isa=x86
|
||||||
tgt_os=win32
|
tgt_os=win32
|
||||||
@@ -561,6 +651,9 @@ process_common_toolchain() {
|
|||||||
*solaris2.10)
|
*solaris2.10)
|
||||||
tgt_os=solaris
|
tgt_os=solaris
|
||||||
;;
|
;;
|
||||||
|
*os2*)
|
||||||
|
tgt_os=os2
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
if [ -n "$tgt_isa" ] && [ -n "$tgt_os" ]; then
|
if [ -n "$tgt_isa" ] && [ -n "$tgt_os" ]; then
|
||||||
@@ -589,37 +682,68 @@ process_common_toolchain() {
|
|||||||
|
|
||||||
# Enable the architecture family
|
# Enable the architecture family
|
||||||
case ${tgt_isa} in
|
case ${tgt_isa} in
|
||||||
arm*|iwmmxt*) enable arm;;
|
arm*) enable arm;;
|
||||||
mips*) enable mips;;
|
mips*) enable mips;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
# PIC is probably what we want when building shared libs
|
# PIC is probably what we want when building shared libs
|
||||||
enabled shared && soft_enable pic
|
enabled shared && soft_enable pic
|
||||||
|
|
||||||
# Handle darwin variants
|
# Handle darwin variants. Newer SDKs allow targeting older
|
||||||
|
# platforms, so find the newest SDK available.
|
||||||
|
case ${toolchain} in
|
||||||
|
*-darwin*)
|
||||||
|
if [ -z "${DEVELOPER_DIR}" ]; then
|
||||||
|
DEVELOPER_DIR=`xcode-select -print-path 2> /dev/null`
|
||||||
|
[ $? -ne 0 ] && OSX_SKIP_DIR_CHECK=1
|
||||||
|
fi
|
||||||
|
if [ -z "${OSX_SKIP_DIR_CHECK}" ]; then
|
||||||
|
OSX_SDK_ROOTS="${DEVELOPER_DIR}/SDKs"
|
||||||
|
OSX_SDK_VERSIONS="MacOSX10.4u.sdk MacOSX10.5.sdk MacOSX10.6.sdk"
|
||||||
|
OSX_SDK_VERSIONS="${OSX_SDK_VERSIONS} MacOSX10.7.sdk"
|
||||||
|
for v in ${OSX_SDK_VERSIONS}; do
|
||||||
|
if [ -d "${OSX_SDK_ROOTS}/${v}" ]; then
|
||||||
|
osx_sdk_dir="${OSX_SDK_ROOTS}/${v}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if [ -d "${osx_sdk_dir}" ]; then
|
||||||
|
add_cflags "-isysroot ${osx_sdk_dir}"
|
||||||
|
add_ldflags "-isysroot ${osx_sdk_dir}"
|
||||||
|
fi
|
||||||
|
|
||||||
case ${toolchain} in
|
case ${toolchain} in
|
||||||
*-darwin8-*)
|
*-darwin8-*)
|
||||||
add_cflags "-isysroot /Developer/SDKs/MacOSX10.4u.sdk"
|
|
||||||
add_cflags "-mmacosx-version-min=10.4"
|
add_cflags "-mmacosx-version-min=10.4"
|
||||||
add_ldflags "-isysroot /Developer/SDKs/MacOSX10.4u.sdk"
|
|
||||||
add_ldflags "-mmacosx-version-min=10.4"
|
add_ldflags "-mmacosx-version-min=10.4"
|
||||||
;;
|
;;
|
||||||
*-darwin9-*)
|
*-darwin9-*)
|
||||||
add_cflags "-isysroot /Developer/SDKs/MacOSX10.5.sdk"
|
|
||||||
add_cflags "-mmacosx-version-min=10.5"
|
add_cflags "-mmacosx-version-min=10.5"
|
||||||
add_ldflags "-isysroot /Developer/SDKs/MacOSX10.5.sdk"
|
|
||||||
add_ldflags "-mmacosx-version-min=10.5"
|
add_ldflags "-mmacosx-version-min=10.5"
|
||||||
;;
|
;;
|
||||||
*-darwin10-*)
|
*-darwin10-*)
|
||||||
add_cflags "-isysroot /Developer/SDKs/MacOSX10.6.sdk"
|
|
||||||
add_cflags "-mmacosx-version-min=10.6"
|
add_cflags "-mmacosx-version-min=10.6"
|
||||||
add_ldflags "-isysroot /Developer/SDKs/MacOSX10.6.sdk"
|
|
||||||
add_ldflags "-mmacosx-version-min=10.6"
|
add_ldflags "-mmacosx-version-min=10.6"
|
||||||
;;
|
;;
|
||||||
|
*-darwin11-*)
|
||||||
|
add_cflags "-mmacosx-version-min=10.7"
|
||||||
|
add_ldflags "-mmacosx-version-min=10.7"
|
||||||
|
;;
|
||||||
|
*-darwin12-*)
|
||||||
|
add_cflags "-mmacosx-version-min=10.8"
|
||||||
|
add_ldflags "-mmacosx-version-min=10.8"
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
# Handle Solaris variants. Solaris 10 needs -lposix4
|
# Handle Solaris variants. Solaris 10 needs -lposix4
|
||||||
case ${toolchain} in
|
case ${toolchain} in
|
||||||
|
sparc-solaris-*)
|
||||||
|
add_extralibs -lposix4
|
||||||
|
disable fast_unaligned
|
||||||
|
;;
|
||||||
*-solaris-*)
|
*-solaris-*)
|
||||||
add_extralibs -lposix4
|
add_extralibs -lposix4
|
||||||
;;
|
;;
|
||||||
@@ -627,45 +751,56 @@ process_common_toolchain() {
|
|||||||
|
|
||||||
# Process ARM architecture variants
|
# Process ARM architecture variants
|
||||||
case ${toolchain} in
|
case ${toolchain} in
|
||||||
arm*|iwmmxt*)
|
arm*)
|
||||||
# on arm, isa versions are supersets
|
# on arm, isa versions are supersets
|
||||||
enabled armv7a && soft_enable armv7 ### DEBUG
|
case ${tgt_isa} in
|
||||||
enabled armv7 && soft_enable armv6
|
armv7)
|
||||||
enabled armv6 && soft_enable armv5te
|
soft_enable neon
|
||||||
enabled armv6 && soft_enable fast_unaligned
|
soft_enable media
|
||||||
enabled iwmmxt2 && soft_enable iwmmxt
|
soft_enable edsp
|
||||||
enabled iwmmxt && soft_enable armv5te
|
soft_enable fast_unaligned
|
||||||
|
;;
|
||||||
|
armv6)
|
||||||
|
soft_enable media
|
||||||
|
soft_enable edsp
|
||||||
|
soft_enable fast_unaligned
|
||||||
|
;;
|
||||||
|
armv5te)
|
||||||
|
soft_enable edsp
|
||||||
|
disable fast_unaligned
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
asm_conversion_cmd="cat"
|
asm_conversion_cmd="cat"
|
||||||
|
|
||||||
case ${tgt_cc} in
|
case ${tgt_cc} in
|
||||||
gcc)
|
gcc)
|
||||||
if enabled iwmmxt || enabled iwmmxt2
|
|
||||||
then
|
|
||||||
CROSS=${CROSS:-arm-iwmmxt-linux-gnueabi-}
|
|
||||||
elif enabled symbian; then
|
|
||||||
CROSS=${CROSS:-arm-none-symbianelf-}
|
|
||||||
else
|
|
||||||
CROSS=${CROSS:-arm-none-linux-gnueabi-}
|
CROSS=${CROSS:-arm-none-linux-gnueabi-}
|
||||||
fi
|
|
||||||
link_with_cc=gcc
|
link_with_cc=gcc
|
||||||
setup_gnu_toolchain
|
setup_gnu_toolchain
|
||||||
arch_int=${tgt_isa##armv}
|
arch_int=${tgt_isa##armv}
|
||||||
arch_int=${arch_int%%te}
|
arch_int=${arch_int%%te}
|
||||||
check_add_asflags --defsym ARCHITECTURE=${arch_int}
|
check_add_asflags --defsym ARCHITECTURE=${arch_int}
|
||||||
tune_cflags="-mtune="
|
tune_cflags="-mtune="
|
||||||
if enabled iwmmxt || enabled iwmmxt2
|
if [ ${tgt_isa} == "armv7" ]; then
|
||||||
|
check_add_cflags -march=armv7-a -mfloat-abi=softfp
|
||||||
|
check_add_asflags -march=armv7-a -mfloat-abi=softfp
|
||||||
|
|
||||||
|
if enabled neon
|
||||||
then
|
then
|
||||||
check_add_asflags -mcpu=${tgt_isa}
|
check_add_cflags -mfpu=neon #-ftree-vectorize
|
||||||
elif enabled armv7
|
check_add_asflags -mfpu=neon
|
||||||
then
|
fi
|
||||||
check_add_cflags -march=armv7-a -mcpu=cortex-a8 -mfpu=neon -mfloat-abi=softfp #-ftree-vectorize
|
|
||||||
check_add_asflags -mcpu=cortex-a8 -mfpu=neon -mfloat-abi=softfp #-march=armv7-a
|
if [ -z "${tune_cpu}" ]; then
|
||||||
|
tune_cpu=cortex-a8
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
check_add_cflags -march=${tgt_isa}
|
check_add_cflags -march=${tgt_isa}
|
||||||
check_add_asflags -march=${tgt_isa}
|
check_add_asflags -march=${tgt_isa}
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
enabled debug && add_asflags -g
|
||||||
asm_conversion_cmd="${source_path}/build/make/ads2gas.pl"
|
asm_conversion_cmd="${source_path}/build/make/ads2gas.pl"
|
||||||
;;
|
;;
|
||||||
rvct)
|
rvct)
|
||||||
@@ -678,10 +813,14 @@ process_common_toolchain() {
|
|||||||
tune_cflags="--cpu="
|
tune_cflags="--cpu="
|
||||||
tune_asflags="--cpu="
|
tune_asflags="--cpu="
|
||||||
if [ -z "${tune_cpu}" ]; then
|
if [ -z "${tune_cpu}" ]; then
|
||||||
if enabled armv7
|
if [ ${tgt_isa} == "armv7" ]; then
|
||||||
|
if enabled neon
|
||||||
then
|
then
|
||||||
check_add_cflags --cpu=Cortex-A8 --fpu=softvfp+vfpv3
|
check_add_cflags --fpu=softvfp+vfpv3
|
||||||
check_add_asflags --cpu=Cortex-A8 --fpu=none
|
check_add_asflags --fpu=softvfp+vfpv3
|
||||||
|
fi
|
||||||
|
check_add_cflags --cpu=Cortex-A8
|
||||||
|
check_add_asflags --cpu=Cortex-A8
|
||||||
else
|
else
|
||||||
check_add_cflags --cpu=${tgt_isa##armv}
|
check_add_cflags --cpu=${tgt_isa##armv}
|
||||||
check_add_asflags --cpu=${tgt_isa##armv}
|
check_add_asflags --cpu=${tgt_isa##armv}
|
||||||
@@ -690,16 +829,70 @@ process_common_toolchain() {
|
|||||||
arch_int=${tgt_isa##armv}
|
arch_int=${tgt_isa##armv}
|
||||||
arch_int=${arch_int%%te}
|
arch_int=${arch_int%%te}
|
||||||
check_add_asflags --pd "\"ARCHITECTURE SETA ${arch_int}\""
|
check_add_asflags --pd "\"ARCHITECTURE SETA ${arch_int}\""
|
||||||
|
enabled debug && add_asflags -g
|
||||||
|
add_cflags --gnu
|
||||||
|
add_cflags --enum_is_int
|
||||||
|
add_cflags --wchar32
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
case ${tgt_os} in
|
case ${tgt_os} in
|
||||||
|
none*)
|
||||||
|
disable multithread
|
||||||
|
disable os_support
|
||||||
|
;;
|
||||||
|
|
||||||
|
android*)
|
||||||
|
SDK_PATH=${sdk_path}
|
||||||
|
COMPILER_LOCATION=`find "${SDK_PATH}" \
|
||||||
|
-name "arm-linux-androideabi-gcc*" -print -quit`
|
||||||
|
TOOLCHAIN_PATH=${COMPILER_LOCATION%/*}/arm-linux-androideabi-
|
||||||
|
CC=${TOOLCHAIN_PATH}gcc
|
||||||
|
CXX=${TOOLCHAIN_PATH}g++
|
||||||
|
AR=${TOOLCHAIN_PATH}ar
|
||||||
|
LD=${TOOLCHAIN_PATH}gcc
|
||||||
|
AS=${TOOLCHAIN_PATH}as
|
||||||
|
STRIP=${TOOLCHAIN_PATH}strip
|
||||||
|
NM=${TOOLCHAIN_PATH}nm
|
||||||
|
|
||||||
|
if [ -z "${alt_libc}" ]; then
|
||||||
|
alt_libc=`find "${SDK_PATH}" -name arch-arm -print | \
|
||||||
|
awk '{n = split($0,a,"/"); \
|
||||||
|
split(a[n-1],b,"-"); \
|
||||||
|
print $0 " " b[2]}' | \
|
||||||
|
sort -g -k 2 | \
|
||||||
|
awk '{ print $1 }' | tail -1`
|
||||||
|
fi
|
||||||
|
|
||||||
|
add_cflags "--sysroot=${alt_libc}"
|
||||||
|
add_ldflags "--sysroot=${alt_libc}"
|
||||||
|
|
||||||
|
# linker flag that routes around a CPU bug in some
|
||||||
|
# Cortex-A8 implementations (NDK Dev Guide)
|
||||||
|
add_ldflags "-Wl,--fix-cortex-a8"
|
||||||
|
|
||||||
|
enable pic
|
||||||
|
soft_enable realtime_only
|
||||||
|
if [ ${tgt_isa} == "armv7" ]; then
|
||||||
|
soft_enable runtime_cpu_detect
|
||||||
|
fi
|
||||||
|
if enabled runtime_cpu_detect; then
|
||||||
|
add_cflags "-I${SDK_PATH}/sources/android/cpufeatures"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
darwin*)
|
darwin*)
|
||||||
SDK_PATH=/Developer/Platforms/iPhoneOS.platform/Developer
|
if [ -z "${sdk_path}" ]; then
|
||||||
|
SDK_PATH=`xcode-select -print-path 2> /dev/null`
|
||||||
|
SDK_PATH=${SDK_PATH}/Platforms/iPhoneOS.platform/Developer
|
||||||
|
else
|
||||||
|
SDK_PATH=${sdk_path}
|
||||||
|
fi
|
||||||
TOOLCHAIN_PATH=${SDK_PATH}/usr/bin
|
TOOLCHAIN_PATH=${SDK_PATH}/usr/bin
|
||||||
|
CXX=${TOOLCHAIN_PATH}/g++
|
||||||
CC=${TOOLCHAIN_PATH}/gcc
|
CC=${TOOLCHAIN_PATH}/gcc
|
||||||
AR=${TOOLCHAIN_PATH}/ar
|
AR=${TOOLCHAIN_PATH}/ar
|
||||||
LD=${TOOLCHAIN_PATH}/arm-apple-darwin9-gcc-4.2.1
|
LD=${TOOLCHAIN_PATH}/arm-apple-darwin10-llvm-gcc-4.2
|
||||||
AS=${TOOLCHAIN_PATH}/as
|
AS=${TOOLCHAIN_PATH}/as
|
||||||
STRIP=${TOOLCHAIN_PATH}/strip
|
STRIP=${TOOLCHAIN_PATH}/strip
|
||||||
NM=${TOOLCHAIN_PATH}/nm
|
NM=${TOOLCHAIN_PATH}/nm
|
||||||
@@ -713,19 +906,19 @@ process_common_toolchain() {
|
|||||||
add_cflags -arch ${tgt_isa}
|
add_cflags -arch ${tgt_isa}
|
||||||
add_ldflags -arch_only ${tgt_isa}
|
add_ldflags -arch_only ${tgt_isa}
|
||||||
|
|
||||||
add_cflags "-isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.sdk"
|
if [ -z "${alt_libc}" ]; then
|
||||||
|
alt_libc=${SDK_PATH}/SDKs/iPhoneOS5.1.sdk
|
||||||
|
fi
|
||||||
|
|
||||||
# This should be overridable
|
add_cflags "-isysroot ${alt_libc}"
|
||||||
alt_libc=${SDK_PATH}/SDKs/iPhoneOS3.1.sdk
|
|
||||||
|
|
||||||
# Add the paths for the alternate libc
|
# Add the paths for the alternate libc
|
||||||
# for d in usr/include usr/include/gcc/darwin/4.0/; do
|
for d in usr/include; do
|
||||||
for d in usr/include usr/include/gcc/darwin/4.0/ usr/lib/gcc/arm-apple-darwin9/4.0.1/include/; do
|
|
||||||
try_dir="${alt_libc}/${d}"
|
try_dir="${alt_libc}/${d}"
|
||||||
[ -d "${try_dir}" ] && add_cflags -I"${try_dir}"
|
[ -d "${try_dir}" ] && add_cflags -I"${try_dir}"
|
||||||
done
|
done
|
||||||
|
|
||||||
for d in lib usr/lib; do
|
for d in lib usr/lib usr/lib/system; do
|
||||||
try_dir="${alt_libc}/${d}"
|
try_dir="${alt_libc}/${d}"
|
||||||
[ -d "${try_dir}" ] && add_ldflags -L"${try_dir}"
|
[ -d "${try_dir}" ] && add_ldflags -L"${try_dir}"
|
||||||
done
|
done
|
||||||
@@ -736,68 +929,37 @@ process_common_toolchain() {
|
|||||||
linux*)
|
linux*)
|
||||||
enable linux
|
enable linux
|
||||||
if enabled rvct; then
|
if enabled rvct; then
|
||||||
# Compiling with RVCT requires an alternate libc (glibc) when
|
# Check if we have CodeSourcery GCC in PATH. Needed for
|
||||||
# targetting linux.
|
# libraries
|
||||||
disabled builtin_libc \
|
hash arm-none-linux-gnueabi-gcc 2>&- || \
|
||||||
|| die "Must supply --libc when targetting *-linux-rvct"
|
die "Couldn't find CodeSourcery GCC from PATH"
|
||||||
|
|
||||||
# Set up compiler
|
# Use armcc as a linker to enable translation of
|
||||||
add_cflags --gnu
|
# some gcc specific options such as -lm and -lpthread.
|
||||||
add_cflags --enum_is_int
|
LD="armcc --translate_gcc"
|
||||||
add_cflags --library_interface=aeabi_glibc
|
|
||||||
add_cflags --no_hide_all
|
|
||||||
add_cflags --wchar32
|
|
||||||
add_cflags --dwarf2
|
|
||||||
add_cflags --gnu
|
|
||||||
|
|
||||||
# Set up linker
|
# create configuration file (uses path to CodeSourcery GCC)
|
||||||
add_ldflags --sysv --no_startup --no_ref_cpp_init
|
armcc --arm_linux_configure --arm_linux_config_file=arm_linux.cfg
|
||||||
add_ldflags --entry=_start
|
|
||||||
add_ldflags --keep '"*(.init)"' --keep '"*(.fini)"'
|
|
||||||
add_ldflags --keep '"*(.init_array)"' --keep '"*(.fini_array)"'
|
|
||||||
add_ldflags --dynamiclinker=/lib/ld-linux.so.3
|
|
||||||
add_extralibs libc.so.6 -lc_nonshared crt1.o crti.o crtn.o
|
|
||||||
|
|
||||||
# Add the paths for the alternate libc
|
add_cflags --arm_linux_paths --arm_linux_config_file=arm_linux.cfg
|
||||||
for d in usr/include; do
|
add_asflags --no_hide_all --apcs=/interwork
|
||||||
try_dir="${alt_libc}/${d}"
|
add_ldflags --arm_linux_paths --arm_linux_config_file=arm_linux.cfg
|
||||||
[ -d "${try_dir}" ] && add_cflags -J"${try_dir}"
|
enabled pic && add_cflags --apcs=/fpic
|
||||||
done
|
enabled pic && add_asflags --apcs=/fpic
|
||||||
add_cflags -J"${RVCT31INC}"
|
enabled shared && add_cflags --shared
|
||||||
for d in lib usr/lib; do
|
|
||||||
try_dir="${alt_libc}/${d}"
|
|
||||||
[ -d "${try_dir}" ] && add_ldflags -L"${try_dir}"
|
|
||||||
done
|
|
||||||
|
|
||||||
|
|
||||||
# glibc has some struct members named __align, which is a
|
|
||||||
# storage modifier in RVCT. If we need to use this modifier,
|
|
||||||
# we'll have to #undef it in our code. Note that this must
|
|
||||||
# happen AFTER all libc inclues.
|
|
||||||
add_cflags -D__align=x_align_x
|
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
|
|
||||||
symbian*)
|
|
||||||
enable symbian
|
|
||||||
# Add the paths for the alternate libc
|
|
||||||
for d in include/libc; do
|
|
||||||
try_dir="${alt_libc}/${d}"
|
|
||||||
[ -d "${try_dir}" ] && add_cflags -I"${try_dir}"
|
|
||||||
done
|
|
||||||
for d in release/armv5/urel; do
|
|
||||||
try_dir="${alt_libc}/${d}"
|
|
||||||
[ -d "${try_dir}" ] && add_ldflags -L"${try_dir}"
|
|
||||||
done
|
|
||||||
add_cflags -DIMPORT_C=
|
|
||||||
|
|
||||||
esac
|
esac
|
||||||
;;
|
;;
|
||||||
mips*)
|
mips*)
|
||||||
CROSS=${CROSS:-mipsel-linux-uclibc-}
|
|
||||||
link_with_cc=gcc
|
link_with_cc=gcc
|
||||||
setup_gnu_toolchain
|
setup_gnu_toolchain
|
||||||
tune_cflags="-mtune="
|
tune_cflags="-mtune="
|
||||||
|
if enabled dspr2; then
|
||||||
|
check_add_cflags -mips32r2 -mdspr2
|
||||||
|
disable fast_unaligned
|
||||||
|
fi
|
||||||
check_add_cflags -march=${tgt_isa}
|
check_add_cflags -march=${tgt_isa}
|
||||||
check_add_asflags -march=${tgt_isa}
|
check_add_asflags -march=${tgt_isa}
|
||||||
check_add_asflags -KPIC
|
check_add_asflags -KPIC
|
||||||
@@ -828,6 +990,11 @@ process_common_toolchain() {
|
|||||||
x86*)
|
x86*)
|
||||||
bits=32
|
bits=32
|
||||||
enabled x86_64 && bits=64
|
enabled x86_64 && bits=64
|
||||||
|
check_cpp <<EOF && bits=x32
|
||||||
|
#ifndef __ILP32__
|
||||||
|
#error "not x32"
|
||||||
|
#endif
|
||||||
|
EOF
|
||||||
soft_enable runtime_cpu_detect
|
soft_enable runtime_cpu_detect
|
||||||
soft_enable mmx
|
soft_enable mmx
|
||||||
soft_enable sse
|
soft_enable sse
|
||||||
@@ -842,9 +1009,13 @@ process_common_toolchain() {
|
|||||||
;;
|
;;
|
||||||
solaris*)
|
solaris*)
|
||||||
CC=${CC:-${CROSS}gcc}
|
CC=${CC:-${CROSS}gcc}
|
||||||
|
CXX=${CXX:-${CROSS}g++}
|
||||||
LD=${LD:-${CROSS}gcc}
|
LD=${LD:-${CROSS}gcc}
|
||||||
CROSS=${CROSS:-g}
|
CROSS=${CROSS:-g}
|
||||||
;;
|
;;
|
||||||
|
os2)
|
||||||
|
AS=${AS:-nasm}
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
AS="${alt_as:-${AS:-auto}}"
|
AS="${alt_as:-${AS:-auto}}"
|
||||||
@@ -855,7 +1026,7 @@ process_common_toolchain() {
|
|||||||
setup_gnu_toolchain
|
setup_gnu_toolchain
|
||||||
add_cflags -use-msasm -use-asm
|
add_cflags -use-msasm -use-asm
|
||||||
add_ldflags -i-static
|
add_ldflags -i-static
|
||||||
enabled x86_64 && add_cflags -ipo -no-prec-div -static -xSSE3 -axSSE3
|
enabled x86_64 && add_cflags -ipo -no-prec-div -static -xSSE2 -axSSE2
|
||||||
enabled x86_64 && AR=xiar
|
enabled x86_64 && AR=xiar
|
||||||
case ${tune_cpu} in
|
case ${tune_cpu} in
|
||||||
atom*)
|
atom*)
|
||||||
@@ -873,6 +1044,14 @@ process_common_toolchain() {
|
|||||||
link_with_cc=gcc
|
link_with_cc=gcc
|
||||||
tune_cflags="-march="
|
tune_cflags="-march="
|
||||||
setup_gnu_toolchain
|
setup_gnu_toolchain
|
||||||
|
#for 32 bit x86 builds, -O3 did not turn on this flag
|
||||||
|
enabled optimizations && check_add_cflags -fomit-frame-pointer
|
||||||
|
;;
|
||||||
|
vs*)
|
||||||
|
# When building with Microsoft Visual Studio the assembler is
|
||||||
|
# invoked directly. Checking at configure time is unnecessary.
|
||||||
|
# Skip the check by setting AS arbitrarily
|
||||||
|
AS=msvs
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
@@ -888,8 +1067,12 @@ process_common_toolchain() {
|
|||||||
[ "${AS##*/}" = nasm ] && add_asflags -Ox
|
[ "${AS##*/}" = nasm ] && add_asflags -Ox
|
||||||
AS_SFX=.asm
|
AS_SFX=.asm
|
||||||
case ${tgt_os} in
|
case ${tgt_os} in
|
||||||
win*)
|
win32)
|
||||||
add_asflags -f win${bits}
|
add_asflags -f win32
|
||||||
|
enabled debug && add_asflags -g cv8
|
||||||
|
;;
|
||||||
|
win64)
|
||||||
|
add_asflags -f x64
|
||||||
enabled debug && add_asflags -g cv8
|
enabled debug && add_asflags -g cv8
|
||||||
;;
|
;;
|
||||||
linux*|solaris*)
|
linux*|solaris*)
|
||||||
@@ -909,6 +1092,11 @@ process_common_toolchain() {
|
|||||||
# enabled icc && ! enabled pic && add_cflags -fno-pic -mdynamic-no-pic
|
# enabled icc && ! enabled pic && add_cflags -fno-pic -mdynamic-no-pic
|
||||||
enabled icc && ! enabled pic && add_cflags -fno-pic
|
enabled icc && ! enabled pic && add_cflags -fno-pic
|
||||||
;;
|
;;
|
||||||
|
os2)
|
||||||
|
add_asflags -f aout
|
||||||
|
enabled debug && add_asflags -g
|
||||||
|
EXE_SFX=.exe
|
||||||
|
;;
|
||||||
*) log "Warning: Unknown os $tgt_os while setting up $AS flags"
|
*) log "Warning: Unknown os $tgt_os while setting up $AS flags"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
@@ -940,15 +1128,23 @@ process_common_toolchain() {
|
|||||||
enabled gcov &&
|
enabled gcov &&
|
||||||
check_add_cflags -fprofile-arcs -ftest-coverage &&
|
check_add_cflags -fprofile-arcs -ftest-coverage &&
|
||||||
check_add_ldflags -fprofile-arcs -ftest-coverage
|
check_add_ldflags -fprofile-arcs -ftest-coverage
|
||||||
|
|
||||||
if enabled optimizations; then
|
if enabled optimizations; then
|
||||||
enabled rvct && check_add_cflags -Otime
|
if enabled rvct; then
|
||||||
|
enabled small && check_add_cflags -Ospace || check_add_cflags -Otime
|
||||||
|
else
|
||||||
enabled small && check_add_cflags -O2 || check_add_cflags -O3
|
enabled small && check_add_cflags -O2 || check_add_cflags -O3
|
||||||
fi
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
# Position Independant Code (PIC) support, for building relocatable
|
# Position Independent Code (PIC) support, for building relocatable
|
||||||
# shared objects
|
# shared objects
|
||||||
enabled gcc && enabled pic && check_add_cflags -fPIC
|
enabled gcc && enabled pic && check_add_cflags -fPIC
|
||||||
|
|
||||||
|
# Work around longjmp interception on glibc >= 2.11, to improve binary
|
||||||
|
# compatibility. See http://code.google.com/p/webm/issues/detail?id=166
|
||||||
|
enabled linux && check_add_cflags -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0
|
||||||
|
|
||||||
# Check for strip utility variant
|
# Check for strip utility variant
|
||||||
${STRIP} -V 2>/dev/null | grep GNU >/dev/null && enable gnu_strip
|
${STRIP} -V 2>/dev/null | grep GNU >/dev/null && enable gnu_strip
|
||||||
|
|
||||||
@@ -962,16 +1158,38 @@ EOF
|
|||||||
# Almost every platform uses pthreads.
|
# Almost every platform uses pthreads.
|
||||||
if enabled multithread; then
|
if enabled multithread; then
|
||||||
case ${toolchain} in
|
case ${toolchain} in
|
||||||
*-win*);;
|
*-win*-vs*);;
|
||||||
|
*-android-gcc);;
|
||||||
*) check_header pthread.h && add_extralibs -lpthread
|
*) check_header pthread.h && add_extralibs -lpthread
|
||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# only for MIPS platforms
|
||||||
|
case ${toolchain} in
|
||||||
|
mips*)
|
||||||
|
if enabled dspr2; then
|
||||||
|
if enabled big_endian; then
|
||||||
|
echo "dspr2 optimizations are available only for little endian platforms"
|
||||||
|
disable dspr2
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# for sysconf(3) and friends.
|
||||||
|
check_header unistd.h
|
||||||
|
|
||||||
# glibc needs these
|
# glibc needs these
|
||||||
if enabled linux; then
|
if enabled linux; then
|
||||||
add_cflags -D_LARGEFILE_SOURCE
|
add_cflags -D_LARGEFILE_SOURCE
|
||||||
add_cflags -D_FILE_OFFSET_BITS=64
|
add_cflags -D_FILE_OFFSET_BITS=64
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# append any user defined extra cflags
|
||||||
|
if [ -n "${extra_cflags}" ] ; then
|
||||||
|
check_add_cflags ${extra_cflags} || \
|
||||||
|
die "Requested extra CFLAGS '${extra_cflags}' not supported by compiler"
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
process_toolchain() {
|
process_toolchain() {
|
||||||
@@ -1004,6 +1222,22 @@ print_config_h() {
|
|||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
|
print_webm_license() {
|
||||||
|
local destination=$1
|
||||||
|
local prefix=$2
|
||||||
|
local suffix=$3
|
||||||
|
shift 3
|
||||||
|
cat <<EOF > ${destination}
|
||||||
|
${prefix} Copyright (c) 2011 The WebM project authors. All Rights Reserved.${suffix}
|
||||||
|
${prefix} ${suffix}
|
||||||
|
${prefix} Use of this source code is governed by a BSD-style license${suffix}
|
||||||
|
${prefix} that can be found in the LICENSE file in the root of the source${suffix}
|
||||||
|
${prefix} tree. An additional intellectual property rights grant can be found${suffix}
|
||||||
|
${prefix} in the file PATENTS. All contributing project authors may${suffix}
|
||||||
|
${prefix} be found in the AUTHORS file in the root of the source tree.${suffix}
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
process_targets() {
|
process_targets() {
|
||||||
true;
|
true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ done
|
|||||||
|
|
||||||
[ -n "$srcfile" ] || show_help
|
[ -n "$srcfile" ] || show_help
|
||||||
sfx=${sfx:-asm}
|
sfx=${sfx:-asm}
|
||||||
includes=$(egrep -i "include +\"?+[a-z0-9_/]+\.${sfx}" $srcfile |
|
includes=$(LC_ALL=C egrep -i "include +\"?[a-z0-9_/]+\.${sfx}" $srcfile |
|
||||||
perl -p -e "s;.*?([a-z0-9_/]+.${sfx}).*;\1;")
|
perl -p -e "s;.*?([a-z0-9_/]+.${sfx}).*;\1;")
|
||||||
#" restore editor state
|
#" restore editor state
|
||||||
for inc in ${includes}; do
|
for inc in ${includes}; do
|
||||||
|
|||||||
@@ -32,7 +32,8 @@ Options:
|
|||||||
--name=project_name Name of the project (required)
|
--name=project_name Name of the project (required)
|
||||||
--proj-guid=GUID GUID to use for the project
|
--proj-guid=GUID GUID to use for the project
|
||||||
--module-def=filename File containing export definitions (for DLLs)
|
--module-def=filename File containing export definitions (for DLLs)
|
||||||
--ver=version Version (7,8) of visual studio to generate for
|
--ver=version Version (7,8,9) of visual studio to generate for
|
||||||
|
--src-path-bare=dir Path to root of source tree
|
||||||
-Ipath/to/include Additional include directories
|
-Ipath/to/include Additional include directories
|
||||||
-DFLAG[=value] Preprocessor macros to define
|
-DFLAG[=value] Preprocessor macros to define
|
||||||
-Lpath/to/lib Additional library search paths
|
-Lpath/to/lib Additional library search paths
|
||||||
@@ -132,7 +133,7 @@ generate_filter() {
|
|||||||
open_tag Filter \
|
open_tag Filter \
|
||||||
Name=$name \
|
Name=$name \
|
||||||
Filter=$pats \
|
Filter=$pats \
|
||||||
UniqueIdentifier=`generate_uuid`
|
UniqueIdentifier=`generate_uuid` \
|
||||||
|
|
||||||
file_list_sz=${#file_list[@]}
|
file_list_sz=${#file_list[@]}
|
||||||
for i in ${!file_list[@]}; do
|
for i in ${!file_list[@]}; do
|
||||||
@@ -146,29 +147,19 @@ generate_filter() {
|
|||||||
for plat in "${platforms[@]}"; do
|
for plat in "${platforms[@]}"; do
|
||||||
for cfg in Debug Release; do
|
for cfg in Debug Release; do
|
||||||
open_tag FileConfiguration \
|
open_tag FileConfiguration \
|
||||||
Name="${cfg}|${plat}"
|
Name="${cfg}|${plat}" \
|
||||||
|
|
||||||
tag Tool \
|
tag Tool \
|
||||||
Name="VCCustomBuildTool" \
|
Name="VCCustomBuildTool" \
|
||||||
Description="Assembling \$(InputFileName)" \
|
Description="Assembling \$(InputFileName)" \
|
||||||
CommandLine="$(eval echo \$asm_${cfg}_cmdline)" \
|
CommandLine="$(eval echo \$asm_${cfg}_cmdline)" \
|
||||||
Outputs="\$(InputName).obj"
|
Outputs="\$(InputName).obj" \
|
||||||
|
|
||||||
close_tag FileConfiguration
|
close_tag FileConfiguration
|
||||||
done
|
done
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "${f##*.}" == "cpp" ]; then
|
|
||||||
for plat in "${platforms[@]}"; do
|
|
||||||
for cfg in Debug Release; do
|
|
||||||
open_tag FileConfiguration \
|
|
||||||
Name="${cfg}|${plat}"
|
|
||||||
tag Tool \
|
|
||||||
Name="VCCLCompilerTool" \
|
|
||||||
CompileAs="2"
|
|
||||||
close_tag FileConfiguration
|
|
||||||
done
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
close_tag File
|
close_tag File
|
||||||
|
|
||||||
break
|
break
|
||||||
@@ -195,24 +186,27 @@ for opt in "$@"; do
|
|||||||
;;
|
;;
|
||||||
--proj-guid=*) guid="${optval}"
|
--proj-guid=*) guid="${optval}"
|
||||||
;;
|
;;
|
||||||
--module-def=*)
|
--module-def=*) link_opts="${link_opts} ModuleDefinitionFile=${optval}"
|
||||||
link_opts="${link_opts} ModuleDefinitionFile=${optval}"
|
|
||||||
;;
|
;;
|
||||||
--exe) proj_kind="exe"
|
--exe) proj_kind="exe"
|
||||||
;;
|
;;
|
||||||
--lib) proj_kind="lib"
|
--lib) proj_kind="lib"
|
||||||
;;
|
;;
|
||||||
|
--src-path-bare=*) src_path_bare="$optval"
|
||||||
|
;;
|
||||||
--static-crt) use_static_runtime=true
|
--static-crt) use_static_runtime=true
|
||||||
;;
|
;;
|
||||||
--ver=*) vs_ver="$optval"
|
--ver=*)
|
||||||
case $optval in
|
vs_ver="$optval"
|
||||||
|
case "$optval" in
|
||||||
[789])
|
[789])
|
||||||
;;
|
;;
|
||||||
*) die Unrecognized Visual Studio Version in $opt
|
*) die Unrecognized Visual Studio Version in $opt
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
;;
|
;;
|
||||||
-I*) opt="${opt%/}"
|
-I*)
|
||||||
|
opt="${opt%/}"
|
||||||
incs="${incs}${incs:+;}"${opt##-I}""
|
incs="${incs}${incs:+;}"${opt##-I}""
|
||||||
yasmincs="${yasmincs} ${opt}"
|
yasmincs="${yasmincs} ${opt}"
|
||||||
;;
|
;;
|
||||||
@@ -232,10 +226,13 @@ for opt in "$@"; do
|
|||||||
;;
|
;;
|
||||||
-*) die_unknown $opt
|
-*) die_unknown $opt
|
||||||
;;
|
;;
|
||||||
*) file_list[${#file_list[@]}]="$opt"
|
*)
|
||||||
|
file_list[${#file_list[@]}]="$opt"
|
||||||
case "$opt" in
|
case "$opt" in
|
||||||
*.asm) uses_asm=true;;
|
*.asm) uses_asm=true
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
outfile=${outfile:-/dev/stdout}
|
outfile=${outfile:-/dev/stdout}
|
||||||
@@ -278,11 +275,7 @@ done
|
|||||||
|
|
||||||
# List Keyword for this target
|
# List Keyword for this target
|
||||||
case "$target" in
|
case "$target" in
|
||||||
x86*)
|
x86*) keyword="ManagedCProj"
|
||||||
keyword="ManagedCProj"
|
|
||||||
;;
|
|
||||||
arm*|iwmmx*)
|
|
||||||
keyword="Win32Proj"
|
|
||||||
;;
|
;;
|
||||||
*) die "Unsupported target $target!"
|
*) die "Unsupported target $target!"
|
||||||
esac
|
esac
|
||||||
@@ -298,26 +291,7 @@ case "$target" in
|
|||||||
asm_Debug_cmdline="yasm -Xvc -g cv8 -f \$(PlatformName) ${yasmincs} "\$(InputPath)""
|
asm_Debug_cmdline="yasm -Xvc -g cv8 -f \$(PlatformName) ${yasmincs} "\$(InputPath)""
|
||||||
asm_Release_cmdline="yasm -Xvc -f \$(PlatformName) ${yasmincs} "\$(InputPath)""
|
asm_Release_cmdline="yasm -Xvc -f \$(PlatformName) ${yasmincs} "\$(InputPath)""
|
||||||
;;
|
;;
|
||||||
arm*|iwmmx*)
|
|
||||||
case "${name}" in
|
|
||||||
obj_int_extract) platforms[0]="Win32"
|
|
||||||
;;
|
|
||||||
*) platforms[0]="Pocket PC 2003 (ARMV4)"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
*) die "Unsupported target $target!"
|
*) die "Unsupported target $target!"
|
||||||
esac
|
|
||||||
|
|
||||||
# List Command-line Arguments for this target
|
|
||||||
case "$target" in
|
|
||||||
arm*|iwmmx*)
|
|
||||||
if [ "$name" == "example" ];then
|
|
||||||
ARGU="--codec vp6 --flipuv --progress _bnd.vp6"
|
|
||||||
fi
|
|
||||||
if [ "$name" == "xma" ];then
|
|
||||||
ARGU="--codec vp6 -h 240 -w 320 -v"
|
|
||||||
fi
|
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
@@ -336,7 +310,7 @@ generate_vcproj() {
|
|||||||
Name="${name}" \
|
Name="${name}" \
|
||||||
ProjectGUID="{${guid}}" \
|
ProjectGUID="{${guid}}" \
|
||||||
RootNamespace="${name}" \
|
RootNamespace="${name}" \
|
||||||
Keyword="${keyword}"
|
Keyword="${keyword}" \
|
||||||
|
|
||||||
open_tag Platforms
|
open_tag Platforms
|
||||||
for plat in "${platforms[@]}"; do
|
for plat in "${platforms[@]}"; do
|
||||||
@@ -348,21 +322,6 @@ generate_vcproj() {
|
|||||||
case "$target" in
|
case "$target" in
|
||||||
x86*) $uses_asm && tag ToolFile RelativePath="$self_dirname/../x86-msvs/yasm.rules"
|
x86*) $uses_asm && tag ToolFile RelativePath="$self_dirname/../x86-msvs/yasm.rules"
|
||||||
;;
|
;;
|
||||||
arm*|iwmmx*)
|
|
||||||
if [ "$name" == "vpx" ];then
|
|
||||||
case "$target" in
|
|
||||||
armv5*)
|
|
||||||
tag ToolFile RelativePath="$self_dirname/../arm-wince-vs8/armasmv5.rules"
|
|
||||||
;;
|
|
||||||
armv6*)
|
|
||||||
tag ToolFile RelativePath="$self_dirname/../arm-wince-vs8/armasmv6.rules"
|
|
||||||
;;
|
|
||||||
iwmmxt*)
|
|
||||||
tag ToolFile RelativePath="$self_dirname/../arm-wince-vs8/armasmxscale.rules"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
esac
|
||||||
close_tag ToolFiles
|
close_tag ToolFiles
|
||||||
|
|
||||||
@@ -374,68 +333,28 @@ generate_vcproj() {
|
|||||||
OutputDirectory="\$(SolutionDir)$plat_no_ws/\$(ConfigurationName)" \
|
OutputDirectory="\$(SolutionDir)$plat_no_ws/\$(ConfigurationName)" \
|
||||||
IntermediateDirectory="$plat_no_ws/\$(ConfigurationName)/${name}" \
|
IntermediateDirectory="$plat_no_ws/\$(ConfigurationName)/${name}" \
|
||||||
ConfigurationType="$vs_ConfigurationType" \
|
ConfigurationType="$vs_ConfigurationType" \
|
||||||
CharacterSet="1"
|
CharacterSet="1" \
|
||||||
|
|
||||||
if [ "$target" == "armv6-wince-vs8" ] || [ "$target" == "armv5te-wince-vs8" ] || [ "$target" == "iwmmxt-wince-vs8" ] || [ "$target" == "iwmmxt2-wince-vs8" ];then
|
|
||||||
case "$name" in
|
|
||||||
vpx) tag Tool \
|
|
||||||
Name="VCPreBuildEventTool" \
|
|
||||||
CommandLine="call obj_int_extract.bat \$(ConfigurationName)"
|
|
||||||
tag Tool \
|
|
||||||
Name="VCMIDLTool" \
|
|
||||||
TargetEnvironment="1"
|
|
||||||
tag Tool \
|
|
||||||
Name="VCCLCompilerTool" \
|
|
||||||
ExecutionBucket="7" \
|
|
||||||
Optimization="0" \
|
|
||||||
AdditionalIncludeDirectories="$incs" \
|
|
||||||
PreprocessorDefinitions="_DEBUG;_WIN32_WCE=\$(CEVER);UNDER_CE;\$(PLATFORMDEFINES);WINCE;DEBUG;_LIB;\$(ARCHFAM);\$(_ARCHFAM_);_UNICODE;UNICODE;" \
|
|
||||||
MinimalRebuild="true" \
|
|
||||||
RuntimeLibrary="1" \
|
|
||||||
BufferSecurityCheck="false" \
|
|
||||||
UsePrecompiledHeader="0" \
|
|
||||||
WarningLevel="3" \
|
|
||||||
DebugInformationFormat="1" \
|
|
||||||
CompileAs="1"
|
|
||||||
tag Tool \
|
|
||||||
Name="VCResourceCompilerTool" \
|
|
||||||
PreprocessorDefinitions="_DEBUG;_WIN32_WCE=\$(CEVER);UNDER_CE;\$(PLATFORMDEFINES)" \
|
|
||||||
Culture="1033" \
|
|
||||||
AdditionalIncludeDirectories="\$(IntDir)" \
|
|
||||||
;;
|
|
||||||
example|xma) tag Tool \
|
|
||||||
Name="VCCLCompilerTool" \
|
|
||||||
ExecutionBucket="7" \
|
|
||||||
Optimization="0" \
|
|
||||||
AdditionalIncludeDirectories="$incs" \
|
|
||||||
PreprocessorDefinitions="_DEBUG;_WIN32_WCE=\$(CEVER);UNDER_CE;\$(PLATFORMDEFINES);WINCE;DEBUG;_CONSOLE;\$(ARCHFAM);\$(_ARCHFAM_);_UNICODE;UNICODE;" \
|
|
||||||
MinimalRebuild="true" \
|
|
||||||
RuntimeLibrary="1" \
|
|
||||||
BufferSecurityCheck="false" \
|
|
||||||
UsePrecompiledHeader="0" \
|
|
||||||
WarningLevel="3" \
|
|
||||||
DebugInformationFormat="1" \
|
|
||||||
CompileAs="1"
|
|
||||||
tag Tool \
|
|
||||||
Name="VCResourceCompilerTool" \
|
|
||||||
PreprocessorDefinitions="_DEBUG;_WIN32_WCE=\$(CEVER);UNDER_CE;\$(PLATFORMDEFINES)" \
|
|
||||||
Culture="1033" \
|
|
||||||
AdditionalIncludeDirectories="\$(IntDir)" \
|
|
||||||
;;
|
|
||||||
obj_int_extract) tag Tool \
|
|
||||||
Name="VCCLCompilerTool" \
|
|
||||||
Optimization="0" \
|
|
||||||
AdditionalIncludeDirectories="$incs" \
|
|
||||||
PreprocessorDefinitions="WIN32;DEBUG;_CONSOLE" \
|
|
||||||
RuntimeLibrary="1" \
|
|
||||||
WarningLevel="3" \
|
|
||||||
DebugInformationFormat="1" \
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
|
|
||||||
case "$target" in
|
case "$target" in
|
||||||
x86*) tag Tool \
|
x86*)
|
||||||
|
case "$name" in
|
||||||
|
obj_int_extract)
|
||||||
|
tag Tool \
|
||||||
|
Name="VCCLCompilerTool" \
|
||||||
|
Optimization="0" \
|
||||||
|
AdditionalIncludeDirectories="$incs" \
|
||||||
|
PreprocessorDefinitions="WIN32;DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE" \
|
||||||
|
RuntimeLibrary="$debug_runtime" \
|
||||||
|
WarningLevel="3" \
|
||||||
|
Detect64BitPortabilityProblems="true" \
|
||||||
|
DebugInformationFormat="1" \
|
||||||
|
;;
|
||||||
|
vpx)
|
||||||
|
tag Tool \
|
||||||
|
Name="VCPreBuildEventTool" \
|
||||||
|
CommandLine="call obj_int_extract.bat $src_path_bare" \
|
||||||
|
|
||||||
|
tag Tool \
|
||||||
Name="VCCLCompilerTool" \
|
Name="VCCLCompilerTool" \
|
||||||
Optimization="0" \
|
Optimization="0" \
|
||||||
AdditionalIncludeDirectories="$incs" \
|
AdditionalIncludeDirectories="$incs" \
|
||||||
@@ -446,42 +365,44 @@ generate_vcproj() {
|
|||||||
DebugInformationFormat="1" \
|
DebugInformationFormat="1" \
|
||||||
Detect64BitPortabilityProblems="true" \
|
Detect64BitPortabilityProblems="true" \
|
||||||
|
|
||||||
$uses_asm && tag Tool Name="YASM" IncludePaths="$incs" Debug="1"
|
$uses_asm && tag Tool Name="YASM" IncludePaths="$incs" Debug="true"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
tag Tool \
|
||||||
|
Name="VCCLCompilerTool" \
|
||||||
|
Optimization="0" \
|
||||||
|
AdditionalIncludeDirectories="$incs" \
|
||||||
|
PreprocessorDefinitions="WIN32;_DEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;$defines" \
|
||||||
|
RuntimeLibrary="$debug_runtime" \
|
||||||
|
UsePrecompiledHeader="0" \
|
||||||
|
WarningLevel="3" \
|
||||||
|
DebugInformationFormat="1" \
|
||||||
|
Detect64BitPortabilityProblems="true" \
|
||||||
|
|
||||||
|
$uses_asm && tag Tool Name="YASM" IncludePaths="$incs" Debug="true"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
case "$proj_kind" in
|
case "$proj_kind" in
|
||||||
exe)
|
exe)
|
||||||
case "$target" in
|
case "$target" in
|
||||||
x86*) tag Tool \
|
x86*)
|
||||||
|
case "$name" in
|
||||||
|
obj_int_extract)
|
||||||
|
tag Tool \
|
||||||
|
Name="VCLinkerTool" \
|
||||||
|
OutputFile="${name}.exe" \
|
||||||
|
GenerateDebugInformation="true" \
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
tag Tool \
|
||||||
Name="VCLinkerTool" \
|
Name="VCLinkerTool" \
|
||||||
AdditionalDependencies="$debug_libs \$(NoInherit)" \
|
AdditionalDependencies="$debug_libs \$(NoInherit)" \
|
||||||
AdditionalLibraryDirectories="$libdirs" \
|
AdditionalLibraryDirectories="$libdirs" \
|
||||||
GenerateDebugInformation="true" \
|
GenerateDebugInformation="true" \
|
||||||
ProgramDatabaseFile="\$(OutDir)/${name}.pdb" \
|
ProgramDatabaseFile="\$(OutDir)/${name}.pdb" \
|
||||||
|
|
||||||
;;
|
|
||||||
arm*|iwmmx*)
|
|
||||||
case "$name" in
|
|
||||||
obj_int_extract) tag Tool \
|
|
||||||
Name="VCLinkerTool" \
|
|
||||||
OutputFile="${name}.exe" \
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
;;
|
|
||||||
*) tag Tool \
|
|
||||||
Name="VCLinkerTool" \
|
|
||||||
AdditionalDependencies="$debug_libs" \
|
|
||||||
OutputFile="\$(OutDir)/${name}.exe" \
|
|
||||||
LinkIncremental="2" \
|
|
||||||
AdditionalLibraryDirectories="${libdirs};"..\lib/$plat_no_ws"" \
|
|
||||||
DelayLoadDLLs="\$(NOINHERIT)" \
|
|
||||||
GenerateDebugInformation="true" \
|
|
||||||
ProgramDatabaseFile="\$(OutDir)/${name}.pdb" \
|
|
||||||
SubSystem="9" \
|
|
||||||
StackReserveSize="65536" \
|
|
||||||
StackCommitSize="4096" \
|
|
||||||
EntryPointSymbol="mainWCRTStartup" \
|
|
||||||
TargetMachine="3"
|
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
;;
|
;;
|
||||||
@@ -489,41 +410,27 @@ generate_vcproj() {
|
|||||||
;;
|
;;
|
||||||
lib)
|
lib)
|
||||||
case "$target" in
|
case "$target" in
|
||||||
arm*|iwmmx*) tag Tool \
|
x86*)
|
||||||
Name="VCLibrarianTool" \
|
tag Tool \
|
||||||
AdditionalOptions=" /subsystem:windowsce,4.20 /machine:ARM" \
|
|
||||||
OutputFile="\$(OutDir)/${name}.lib" \
|
|
||||||
;;
|
|
||||||
*) tag Tool \
|
|
||||||
Name="VCLibrarianTool" \
|
Name="VCLibrarianTool" \
|
||||||
OutputFile="\$(OutDir)/${name}${lib_sfx}d.lib" \
|
OutputFile="\$(OutDir)/${name}${lib_sfx}d.lib" \
|
||||||
|
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
;;
|
;;
|
||||||
dll) tag Tool \
|
dll)
|
||||||
|
tag Tool \
|
||||||
Name="VCLinkerTool" \
|
Name="VCLinkerTool" \
|
||||||
AdditionalDependencies="\$(NoInherit)" \
|
AdditionalDependencies="\$(NoInherit)" \
|
||||||
LinkIncremental="2" \
|
LinkIncremental="2" \
|
||||||
GenerateDebugInformation="true" \
|
GenerateDebugInformation="true" \
|
||||||
AssemblyDebug="1" \
|
AssemblyDebug="1" \
|
||||||
TargetMachine="1" \
|
TargetMachine="1" \
|
||||||
$link_opts
|
$link_opts \
|
||||||
|
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
if [ "$target" == "armv6-wince-vs8" ] || [ "$target" == "armv5te-wince-vs8" ] || [ "$target" == "iwmmxt-wince-vs8" ] || [ "$target" == "iwmmxt2-wince-vs8" ];then
|
|
||||||
case "$name" in
|
|
||||||
vpx) tag DeploymentTool \
|
|
||||||
ForceDirty="-1" \
|
|
||||||
RegisterOutput="0"
|
|
||||||
;;
|
|
||||||
example|xma) tag DeploymentTool \
|
|
||||||
ForceDirty="-1" \
|
|
||||||
RegisterOutput="0"
|
|
||||||
tag DebuggerTool \
|
|
||||||
Arguments="${ARGU}"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
close_tag Configuration
|
close_tag Configuration
|
||||||
|
|
||||||
open_tag Configuration \
|
open_tag Configuration \
|
||||||
@@ -532,118 +439,79 @@ generate_vcproj() {
|
|||||||
IntermediateDirectory="$plat_no_ws/\$(ConfigurationName)/${name}" \
|
IntermediateDirectory="$plat_no_ws/\$(ConfigurationName)/${name}" \
|
||||||
ConfigurationType="$vs_ConfigurationType" \
|
ConfigurationType="$vs_ConfigurationType" \
|
||||||
CharacterSet="1" \
|
CharacterSet="1" \
|
||||||
WholeProgramOptimization="0"
|
WholeProgramOptimization="0" \
|
||||||
|
|
||||||
if [ "$target" == "armv6-wince-vs8" ] || [ "$target" == "armv5te-wince-vs8" ] || [ "$target" == "iwmmxt-wince-vs8" ] || [ "$target" == "iwmmxt2-wince-vs8" ];then
|
case "$target" in
|
||||||
|
x86*)
|
||||||
case "$name" in
|
case "$name" in
|
||||||
vpx) tag Tool \
|
obj_int_extract)
|
||||||
Name="VCPreBuildEventTool" \
|
|
||||||
CommandLine="call obj_int_extract.bat \$(ConfigurationName)"
|
|
||||||
tag Tool \
|
|
||||||
Name="VCMIDLTool" \
|
|
||||||
TargetEnvironment="1"
|
|
||||||
tag Tool \
|
tag Tool \
|
||||||
Name="VCCLCompilerTool" \
|
Name="VCCLCompilerTool" \
|
||||||
ExecutionBucket="7" \
|
|
||||||
Optimization="2" \
|
Optimization="2" \
|
||||||
FavorSizeOrSpeed="1" \
|
FavorSizeorSpeed="1" \
|
||||||
AdditionalIncludeDirectories="$incs" \
|
AdditionalIncludeDirectories="$incs" \
|
||||||
PreprocessorDefinitions="NDEBUG;_WIN32_WCE=\$(CEVER);UNDER_CE;\$(PLATFORMDEFINES);WINCE;_LIB;\$(ARCHFAM);\$(_ARCHFAM_);_UNICODE;UNICODE;" \
|
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE" \
|
||||||
RuntimeLibrary="0" \
|
RuntimeLibrary="$release_runtime" \
|
||||||
BufferSecurityCheck="false" \
|
|
||||||
UsePrecompiledHeader="0" \
|
|
||||||
WarningLevel="3" \
|
|
||||||
DebugInformationFormat="0" \
|
|
||||||
CompileAs="1"
|
|
||||||
tag Tool \
|
|
||||||
Name="VCResourceCompilerTool" \
|
|
||||||
PreprocessorDefinitions="NDEBUG;_WIN32_WCE=\$(CEVER);UNDER_CE;\$(PLATFORMDEFINES)" \
|
|
||||||
Culture="1033" \
|
|
||||||
AdditionalIncludeDirectories="\$(IntDir)" \
|
|
||||||
;;
|
|
||||||
example|xma) tag Tool \
|
|
||||||
Name="VCCLCompilerTool" \
|
|
||||||
ExecutionBucket="7" \
|
|
||||||
Optimization="2" \
|
|
||||||
FavorSizeOrSpeed="1" \
|
|
||||||
AdditionalIncludeDirectories="$incs" \
|
|
||||||
PreprocessorDefinitions="NDEBUG;_WIN32_WCE=\$(CEVER);UNDER_CE;\$(PLATFORMDEFINES);WINCE;_CONSOLE;\$(ARCHFAM);\$(_ARCHFAM_);_UNICODE;UNICODE;" \
|
|
||||||
RuntimeLibrary="0" \
|
|
||||||
BufferSecurityCheck="false" \
|
|
||||||
UsePrecompiledHeader="0" \
|
|
||||||
WarningLevel="3" \
|
|
||||||
DebugInformationFormat="0" \
|
|
||||||
CompileAs="1"
|
|
||||||
tag Tool \
|
|
||||||
Name="VCResourceCompilerTool" \
|
|
||||||
PreprocessorDefinitions="NDEBUG;_WIN32_WCE=\$(CEVER);UNDER_CE;\$(PLATFORMDEFINES)" \
|
|
||||||
Culture="1033" \
|
|
||||||
AdditionalIncludeDirectories="\$(IntDir)" \
|
|
||||||
;;
|
|
||||||
obj_int_extract) tag Tool \
|
|
||||||
Name="VCCLCompilerTool" \
|
|
||||||
AdditionalIncludeDirectories="$incs" \
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE" \
|
|
||||||
RuntimeLibrary="0" \
|
|
||||||
UsePrecompiledHeader="0" \
|
UsePrecompiledHeader="0" \
|
||||||
WarningLevel="3" \
|
WarningLevel="3" \
|
||||||
Detect64BitPortabilityProblems="true" \
|
Detect64BitPortabilityProblems="true" \
|
||||||
DebugInformationFormat="0" \
|
DebugInformationFormat="0" \
|
||||||
;;
|
;;
|
||||||
esac
|
vpx)
|
||||||
fi
|
tag Tool \
|
||||||
|
Name="VCPreBuildEventTool" \
|
||||||
|
CommandLine="call obj_int_extract.bat $src_path_bare" \
|
||||||
|
|
||||||
case "$target" in
|
tag Tool \
|
||||||
x86*) tag Tool \
|
|
||||||
Name="VCCLCompilerTool" \
|
Name="VCCLCompilerTool" \
|
||||||
|
Optimization="2" \
|
||||||
|
FavorSizeorSpeed="1" \
|
||||||
AdditionalIncludeDirectories="$incs" \
|
AdditionalIncludeDirectories="$incs" \
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;$defines" \
|
PreprocessorDefinitions="WIN32;NDEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;$defines" \
|
||||||
RuntimeLibrary="$release_runtime" \
|
RuntimeLibrary="$release_runtime" \
|
||||||
UsePrecompiledHeader="0" \
|
UsePrecompiledHeader="0" \
|
||||||
WarningLevel="3" \
|
WarningLevel="3" \
|
||||||
DebugInformationFormat="0" \
|
DebugInformationFormat="0" \
|
||||||
Detect64BitPortabilityProblems="true"
|
Detect64BitPortabilityProblems="true" \
|
||||||
|
|
||||||
$uses_asm && tag Tool Name="YASM" IncludePaths="$incs"
|
$uses_asm && tag Tool Name="YASM" IncludePaths="$incs"
|
||||||
;;
|
;;
|
||||||
|
*)
|
||||||
|
tag Tool \
|
||||||
|
Name="VCCLCompilerTool" \
|
||||||
|
AdditionalIncludeDirectories="$incs" \
|
||||||
|
Optimization="2" \
|
||||||
|
FavorSizeorSpeed="1" \
|
||||||
|
PreprocessorDefinitions="WIN32;NDEBUG;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;$defines" \
|
||||||
|
RuntimeLibrary="$release_runtime" \
|
||||||
|
UsePrecompiledHeader="0" \
|
||||||
|
WarningLevel="3" \
|
||||||
|
DebugInformationFormat="0" \
|
||||||
|
Detect64BitPortabilityProblems="true" \
|
||||||
|
|
||||||
|
$uses_asm && tag Tool Name="YASM" IncludePaths="$incs"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
case "$proj_kind" in
|
case "$proj_kind" in
|
||||||
exe)
|
exe)
|
||||||
case "$target" in
|
case "$target" in
|
||||||
x86*) tag Tool \
|
x86*)
|
||||||
|
case "$name" in
|
||||||
|
obj_int_extract)
|
||||||
|
tag Tool \
|
||||||
|
Name="VCLinkerTool" \
|
||||||
|
OutputFile="${name}.exe" \
|
||||||
|
GenerateDebugInformation="true" \
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
tag Tool \
|
||||||
Name="VCLinkerTool" \
|
Name="VCLinkerTool" \
|
||||||
AdditionalDependencies="$libs \$(NoInherit)" \
|
AdditionalDependencies="$libs \$(NoInherit)" \
|
||||||
AdditionalLibraryDirectories="$libdirs" \
|
AdditionalLibraryDirectories="$libdirs" \
|
||||||
;;
|
|
||||||
arm*|iwmmx*)
|
|
||||||
case "$name" in
|
|
||||||
obj_int_extract) tag Tool \
|
|
||||||
Name="VCLinkerTool" \
|
|
||||||
OutputFile="${name}.exe" \
|
|
||||||
LinkIncremental="1" \
|
|
||||||
GenerateDebugInformation="false" \
|
|
||||||
SubSystem="0" \
|
|
||||||
OptimizeReferences="0" \
|
|
||||||
EnableCOMDATFolding="0" \
|
|
||||||
TargetMachine="0"
|
|
||||||
;;
|
|
||||||
*) tag Tool \
|
|
||||||
Name="VCLinkerTool" \
|
|
||||||
AdditionalDependencies="$libs" \
|
|
||||||
OutputFile="\$(OutDir)/${name}.exe" \
|
|
||||||
LinkIncremental="1" \
|
|
||||||
AdditionalLibraryDirectories="${libdirs};"..\lib/$plat_no_ws"" \
|
|
||||||
DelayLoadDLLs="\$(NOINHERIT)" \
|
|
||||||
GenerateDebugInformation="true" \
|
|
||||||
ProgramDatabaseFile="\$(OutDir)/${name}.pdb" \
|
|
||||||
SubSystem="9" \
|
|
||||||
StackReserveSize="65536" \
|
|
||||||
StackCommitSize="4096" \
|
|
||||||
OptimizeReferences="2" \
|
|
||||||
EnableCOMDATFolding="2" \
|
|
||||||
EntryPointSymbol="mainWCRTStartup" \
|
|
||||||
TargetMachine="3"
|
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
;;
|
;;
|
||||||
@@ -651,14 +519,11 @@ generate_vcproj() {
|
|||||||
;;
|
;;
|
||||||
lib)
|
lib)
|
||||||
case "$target" in
|
case "$target" in
|
||||||
arm*|iwmmx*) tag Tool \
|
x86*)
|
||||||
Name="VCLibrarianTool" \
|
tag Tool \
|
||||||
AdditionalOptions=" /subsystem:windowsce,4.20 /machine:ARM" \
|
|
||||||
OutputFile="\$(OutDir)/${name}.lib" \
|
|
||||||
;;
|
|
||||||
*) tag Tool \
|
|
||||||
Name="VCLibrarianTool" \
|
Name="VCLibrarianTool" \
|
||||||
OutputFile="\$(OutDir)/${name}${lib_sfx}.lib" \
|
OutputFile="\$(OutDir)/${name}${lib_sfx}.lib" \
|
||||||
|
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
;;
|
;;
|
||||||
@@ -669,31 +534,18 @@ generate_vcproj() {
|
|||||||
LinkIncremental="1" \
|
LinkIncremental="1" \
|
||||||
GenerateDebugInformation="true" \
|
GenerateDebugInformation="true" \
|
||||||
TargetMachine="1" \
|
TargetMachine="1" \
|
||||||
$link_opts
|
$link_opts \
|
||||||
esac
|
|
||||||
|
|
||||||
if [ "$target" == "armv6-wince-vs8" ] || [ "$target" == "armv5te-wince-vs8" ] || [ "$target" == "iwmmxt-wince-vs8" ] || [ "$target" == "iwmmxt2-wince-vs8" ];then
|
|
||||||
case "$name" in
|
|
||||||
vpx) tag DeploymentTool \
|
|
||||||
ForceDirty="-1" \
|
|
||||||
RegisterOutput="0"
|
|
||||||
;;
|
|
||||||
example|xma) tag DeploymentTool \
|
|
||||||
ForceDirty="-1" \
|
|
||||||
RegisterOutput="0"
|
|
||||||
tag DebuggerTool \
|
|
||||||
Arguments="${ARGU}"
|
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
fi
|
|
||||||
|
|
||||||
close_tag Configuration
|
close_tag Configuration
|
||||||
done
|
done
|
||||||
close_tag Configurations
|
close_tag Configurations
|
||||||
|
|
||||||
open_tag Files
|
open_tag Files
|
||||||
generate_filter srcs "Source Files" "cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
generate_filter srcs "Source Files" "c;cc;def;odl;idl;hpj;bat;asm;asmx"
|
||||||
generate_filter hdrs "Header Files" "h;hpp;hxx;hm;inl;inc;xsd"
|
generate_filter hdrs "Header Files" "h;hm;inl;inc;xsd"
|
||||||
generate_filter resrcs "Resource Files" "rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
|
generate_filter resrcs "Resource Files" "rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
|
||||||
generate_filter resrcs "Build Files" "mk"
|
generate_filter resrcs "Build Files" "mk"
|
||||||
close_tag Files
|
close_tag Files
|
||||||
|
|||||||
@@ -139,9 +139,6 @@ process_global() {
|
|||||||
echo "${indent}${proj_guid}.${config}.ActiveCfg = ${config}"
|
echo "${indent}${proj_guid}.${config}.ActiveCfg = ${config}"
|
||||||
echo "${indent}${proj_guid}.${config}.Build.0 = ${config}"
|
echo "${indent}${proj_guid}.${config}.Build.0 = ${config}"
|
||||||
|
|
||||||
if [ "$target" == "armv6-wince-vs8" ] || [ "$target" == "armv5te-wince-vs8" ] || [ "$target" == "iwmmxt-wince-vs8" ] || [ "$target" == "iwmmxt2-wince-vs8" ];then
|
|
||||||
echo "${indent}${proj_guid}.${config}.Deploy.0 = ${config}"
|
|
||||||
fi
|
|
||||||
done
|
done
|
||||||
IFS=${IFS_bak}
|
IFS=${IFS_bak}
|
||||||
done
|
done
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
356
build/make/rtcd.sh
Executable file
356
build/make/rtcd.sh
Executable file
@@ -0,0 +1,356 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
self=$0
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
cat <<EOF >&2
|
||||||
|
Usage: $self [options] FILE
|
||||||
|
|
||||||
|
Reads the Run Time CPU Detections definitions from FILE and generates a
|
||||||
|
C header file on stdout.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
--arch=ARCH Architecture to generate defs for (required)
|
||||||
|
--disable-EXT Disable support for EXT extensions
|
||||||
|
--require-EXT Require support for EXT extensions
|
||||||
|
--sym=SYMBOL Unique symbol to use for RTCD initialization function
|
||||||
|
--config=FILE File with CONFIG_FOO=yes lines to parse
|
||||||
|
EOF
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
die() {
|
||||||
|
echo "$@" >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
die_argument_required() {
|
||||||
|
die "Option $opt requires argument"
|
||||||
|
}
|
||||||
|
|
||||||
|
for opt; do
|
||||||
|
optval="${opt#*=}"
|
||||||
|
case "$opt" in
|
||||||
|
--arch) die_argument_required;;
|
||||||
|
--arch=*) arch=${optval};;
|
||||||
|
--disable-*) eval "disable_${opt#--disable-}=true";;
|
||||||
|
--require-*) REQUIRES="${REQUIRES}${opt#--require-} ";;
|
||||||
|
--sym) die_argument_required;;
|
||||||
|
--sym=*) symbol=${optval};;
|
||||||
|
--config=*) config_file=${optval};;
|
||||||
|
-h|--help)
|
||||||
|
usage
|
||||||
|
;;
|
||||||
|
-*)
|
||||||
|
die "Unrecognized option: ${opt%%=*}"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
defs_file="$defs_file $opt"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
for f in $defs_file; do [ -f "$f" ] || usage; done
|
||||||
|
[ -n "$arch" ] || usage
|
||||||
|
|
||||||
|
# Import the configuration
|
||||||
|
[ -f "$config_file" ] && eval $(grep CONFIG_ "$config_file")
|
||||||
|
|
||||||
|
#
|
||||||
|
# Routines for the RTCD DSL to call
|
||||||
|
#
|
||||||
|
prototype() {
|
||||||
|
local rtyp
|
||||||
|
case "$1" in
|
||||||
|
unsigned) rtyp="$1 "; shift;;
|
||||||
|
esac
|
||||||
|
rtyp="${rtyp}$1"
|
||||||
|
local fn="$2"
|
||||||
|
local args="$3"
|
||||||
|
|
||||||
|
eval "${2}_rtyp='$rtyp'"
|
||||||
|
eval "${2}_args='$3'"
|
||||||
|
ALL_FUNCS="$ALL_FUNCS $fn"
|
||||||
|
specialize $fn c
|
||||||
|
}
|
||||||
|
|
||||||
|
specialize() {
|
||||||
|
local fn="$1"
|
||||||
|
shift
|
||||||
|
for opt in "$@"; do
|
||||||
|
eval "${fn}_${opt}=${fn}_${opt}"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
require() {
|
||||||
|
for fn in $ALL_FUNCS; do
|
||||||
|
for opt in "$@"; do
|
||||||
|
local ofn=$(eval "echo \$${fn}_${opt}")
|
||||||
|
[ -z "$ofn" ] && continue
|
||||||
|
|
||||||
|
# if we already have a default, then we can disable it, as we know
|
||||||
|
# we can do better.
|
||||||
|
local best=$(eval "echo \$${fn}_default")
|
||||||
|
local best_ofn=$(eval "echo \$${best}")
|
||||||
|
[ -n "$best" ] && [ "$best_ofn" != "$ofn" ] && eval "${best}_link=false"
|
||||||
|
eval "${fn}_default=${fn}_${opt}"
|
||||||
|
eval "${fn}_${opt}_link=true"
|
||||||
|
done
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
forward_decls() {
|
||||||
|
ALL_FORWARD_DECLS="$ALL_FORWARD_DECLS $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Include the user's directives
|
||||||
|
#
|
||||||
|
for f in $defs_file; do
|
||||||
|
. $f
|
||||||
|
done
|
||||||
|
|
||||||
|
#
|
||||||
|
# Process the directives according to the command line
|
||||||
|
#
|
||||||
|
process_forward_decls() {
|
||||||
|
for fn in $ALL_FORWARD_DECLS; do
|
||||||
|
eval $fn
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
determine_indirection() {
|
||||||
|
[ "$CONFIG_RUNTIME_CPU_DETECT" = "yes" ] || require $ALL_ARCHS
|
||||||
|
for fn in $ALL_FUNCS; do
|
||||||
|
local n=""
|
||||||
|
local rtyp="$(eval "echo \$${fn}_rtyp")"
|
||||||
|
local args="$(eval "echo \"\$${fn}_args\"")"
|
||||||
|
local dfn="$(eval "echo \$${fn}_default")"
|
||||||
|
dfn=$(eval "echo \$${dfn}")
|
||||||
|
for opt in "$@"; do
|
||||||
|
local ofn=$(eval "echo \$${fn}_${opt}")
|
||||||
|
[ -z "$ofn" ] && continue
|
||||||
|
local link=$(eval "echo \$${fn}_${opt}_link")
|
||||||
|
[ "$link" = "false" ] && continue
|
||||||
|
n="${n}x"
|
||||||
|
done
|
||||||
|
if [ "$n" = "x" ]; then
|
||||||
|
eval "${fn}_indirect=false"
|
||||||
|
else
|
||||||
|
eval "${fn}_indirect=true"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
declare_function_pointers() {
|
||||||
|
for fn in $ALL_FUNCS; do
|
||||||
|
local rtyp="$(eval "echo \$${fn}_rtyp")"
|
||||||
|
local args="$(eval "echo \"\$${fn}_args\"")"
|
||||||
|
local dfn="$(eval "echo \$${fn}_default")"
|
||||||
|
dfn=$(eval "echo \$${dfn}")
|
||||||
|
for opt in "$@"; do
|
||||||
|
local ofn=$(eval "echo \$${fn}_${opt}")
|
||||||
|
[ -z "$ofn" ] && continue
|
||||||
|
echo "$rtyp ${ofn}($args);"
|
||||||
|
done
|
||||||
|
if [ "$(eval "echo \$${fn}_indirect")" = "false" ]; then
|
||||||
|
echo "#define ${fn} ${dfn}"
|
||||||
|
else
|
||||||
|
echo "RTCD_EXTERN $rtyp (*${fn})($args);"
|
||||||
|
fi
|
||||||
|
echo
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
set_function_pointers() {
|
||||||
|
for fn in $ALL_FUNCS; do
|
||||||
|
local n=""
|
||||||
|
local rtyp="$(eval "echo \$${fn}_rtyp")"
|
||||||
|
local args="$(eval "echo \"\$${fn}_args\"")"
|
||||||
|
local dfn="$(eval "echo \$${fn}_default")"
|
||||||
|
dfn=$(eval "echo \$${dfn}")
|
||||||
|
if $(eval "echo \$${fn}_indirect"); then
|
||||||
|
echo " $fn = $dfn;"
|
||||||
|
for opt in "$@"; do
|
||||||
|
local ofn=$(eval "echo \$${fn}_${opt}")
|
||||||
|
[ -z "$ofn" ] && continue
|
||||||
|
[ "$ofn" = "$dfn" ] && continue;
|
||||||
|
local link=$(eval "echo \$${fn}_${opt}_link")
|
||||||
|
[ "$link" = "false" ] && continue
|
||||||
|
local cond="$(eval "echo \$have_${opt}")"
|
||||||
|
echo " if (${cond}) $fn = $ofn;"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
echo
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
filter() {
|
||||||
|
local filtered
|
||||||
|
for opt in "$@"; do
|
||||||
|
[ -z $(eval "echo \$disable_${opt}") ] && filtered="$filtered $opt"
|
||||||
|
done
|
||||||
|
echo $filtered
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Helper functions for generating the arch specific RTCD files
|
||||||
|
#
|
||||||
|
common_top() {
|
||||||
|
local outfile_basename=$(basename ${symbol:-rtcd.h})
|
||||||
|
local include_guard=$(echo $outfile_basename | tr '[a-z]' '[A-Z]' | tr -c '[A-Z]' _)
|
||||||
|
cat <<EOF
|
||||||
|
#ifndef ${include_guard}
|
||||||
|
#define ${include_guard}
|
||||||
|
|
||||||
|
#ifdef RTCD_C
|
||||||
|
#define RTCD_EXTERN
|
||||||
|
#else
|
||||||
|
#define RTCD_EXTERN extern
|
||||||
|
#endif
|
||||||
|
|
||||||
|
$(process_forward_decls)
|
||||||
|
|
||||||
|
$(declare_function_pointers c $ALL_ARCHS)
|
||||||
|
|
||||||
|
void ${symbol:-rtcd}(void);
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
common_bottom() {
|
||||||
|
cat <<EOF
|
||||||
|
#endif
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
x86() {
|
||||||
|
determine_indirection c $ALL_ARCHS
|
||||||
|
|
||||||
|
# Assign the helper variable for each enabled extension
|
||||||
|
for opt in $ALL_ARCHS; do
|
||||||
|
local uc=$(echo $opt | tr '[a-z]' '[A-Z]')
|
||||||
|
eval "have_${opt}=\"flags & HAS_${uc}\""
|
||||||
|
done
|
||||||
|
|
||||||
|
cat <<EOF
|
||||||
|
$(common_top)
|
||||||
|
|
||||||
|
#ifdef RTCD_C
|
||||||
|
#include "vpx_ports/x86.h"
|
||||||
|
static void setup_rtcd_internal(void)
|
||||||
|
{
|
||||||
|
int flags = x86_simd_caps();
|
||||||
|
|
||||||
|
(void)flags;
|
||||||
|
|
||||||
|
$(set_function_pointers c $ALL_ARCHS)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
$(common_bottom)
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
arm() {
|
||||||
|
determine_indirection c $ALL_ARCHS
|
||||||
|
|
||||||
|
# Assign the helper variable for each enabled extension
|
||||||
|
for opt in $ALL_ARCHS; do
|
||||||
|
local uc=$(echo $opt | tr '[a-z]' '[A-Z]')
|
||||||
|
eval "have_${opt}=\"flags & HAS_${uc}\""
|
||||||
|
done
|
||||||
|
|
||||||
|
cat <<EOF
|
||||||
|
$(common_top)
|
||||||
|
#include "vpx_config.h"
|
||||||
|
|
||||||
|
#ifdef RTCD_C
|
||||||
|
#include "vpx_ports/arm.h"
|
||||||
|
static void setup_rtcd_internal(void)
|
||||||
|
{
|
||||||
|
int flags = arm_cpu_caps();
|
||||||
|
|
||||||
|
(void)flags;
|
||||||
|
|
||||||
|
$(set_function_pointers c $ALL_ARCHS)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
$(common_bottom)
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
mips() {
|
||||||
|
determine_indirection c $ALL_ARCHS
|
||||||
|
cat <<EOF
|
||||||
|
$(common_top)
|
||||||
|
#include "vpx_config.h"
|
||||||
|
|
||||||
|
#ifdef RTCD_C
|
||||||
|
static void setup_rtcd_internal(void)
|
||||||
|
{
|
||||||
|
$(set_function_pointers c $ALL_ARCHS)
|
||||||
|
#if HAVE_DSPR2
|
||||||
|
void dsputil_static_init();
|
||||||
|
dsputil_static_init();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
$(common_bottom)
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
unoptimized() {
|
||||||
|
determine_indirection c
|
||||||
|
cat <<EOF
|
||||||
|
$(common_top)
|
||||||
|
#include "vpx_config.h"
|
||||||
|
|
||||||
|
#ifdef RTCD_C
|
||||||
|
static void setup_rtcd_internal(void)
|
||||||
|
{
|
||||||
|
$(set_function_pointers c)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
$(common_bottom)
|
||||||
|
EOF
|
||||||
|
|
||||||
|
}
|
||||||
|
#
|
||||||
|
# Main Driver
|
||||||
|
#
|
||||||
|
require c
|
||||||
|
case $arch in
|
||||||
|
x86)
|
||||||
|
ALL_ARCHS=$(filter mmx sse sse2 sse3 ssse3 sse4_1)
|
||||||
|
x86
|
||||||
|
;;
|
||||||
|
x86_64)
|
||||||
|
ALL_ARCHS=$(filter mmx sse sse2 sse3 ssse3 sse4_1)
|
||||||
|
REQUIRES=${REQUIRES:-mmx sse sse2}
|
||||||
|
require $(filter $REQUIRES)
|
||||||
|
x86
|
||||||
|
;;
|
||||||
|
mips32)
|
||||||
|
ALL_ARCHS=$(filter mips32)
|
||||||
|
dspr2=$([ -f "$config_file" ] && eval echo $(grep HAVE_DSPR2 "$config_file"))
|
||||||
|
HAVE_DSPR2="${dspr2#*=}"
|
||||||
|
if [ "$HAVE_DSPR2" = "yes" ]; then
|
||||||
|
ALL_ARCHS=$(filter mips32 dspr2)
|
||||||
|
fi
|
||||||
|
mips
|
||||||
|
;;
|
||||||
|
armv5te)
|
||||||
|
ALL_ARCHS=$(filter edsp)
|
||||||
|
arm
|
||||||
|
;;
|
||||||
|
armv6)
|
||||||
|
ALL_ARCHS=$(filter edsp media)
|
||||||
|
arm
|
||||||
|
;;
|
||||||
|
armv7)
|
||||||
|
ALL_ARCHS=$(filter edsp media neon)
|
||||||
|
arm
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
unoptimized
|
||||||
|
;;
|
||||||
|
esac
|
||||||
15
build/x86-msvs/obj_int_extract.bat
Normal file
15
build/x86-msvs/obj_int_extract.bat
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
REM Copyright (c) 2011 The WebM project authors. All Rights Reserved.
|
||||||
|
REM
|
||||||
|
REM Use of this source code is governed by a BSD-style license
|
||||||
|
REM that can be found in the LICENSE file in the root of the source
|
||||||
|
REM tree. An additional intellectual property rights grant can be found
|
||||||
|
REM in the file PATENTS. All contributing project authors may
|
||||||
|
REM be found in the AUTHORS file in the root of the source tree.
|
||||||
|
echo on
|
||||||
|
|
||||||
|
cl /I "./" /I "%1" /nologo /c "%1/vp8/common/asm_com_offsets.c"
|
||||||
|
cl /I "./" /I "%1" /nologo /c "%1/vp8/decoder/asm_dec_offsets.c"
|
||||||
|
cl /I "./" /I "%1" /nologo /c "%1/vp8/encoder/asm_enc_offsets.c"
|
||||||
|
obj_int_extract.exe rvds "asm_com_offsets.obj" > "asm_com_offsets.asm"
|
||||||
|
obj_int_extract.exe rvds "asm_dec_offsets.obj" > "asm_dec_offsets.asm"
|
||||||
|
obj_int_extract.exe rvds "asm_enc_offsets.obj" > "asm_enc_offsets.asm"
|
||||||
135
configure
vendored
135
configure
vendored
@@ -20,10 +20,13 @@ show_help(){
|
|||||||
show_help_pre
|
show_help_pre
|
||||||
cat << EOF
|
cat << EOF
|
||||||
Advanced options:
|
Advanced options:
|
||||||
${toggle_libs} don't build libraries
|
${toggle_libs} libraries
|
||||||
${toggle_examples} don't build examples
|
${toggle_examples} examples
|
||||||
|
${toggle_docs} documentation
|
||||||
|
${toggle_unit_tests} unit tests
|
||||||
--libc=PATH path to alternate libc
|
--libc=PATH path to alternate libc
|
||||||
--as={yasm|nasm|auto} use specified assembler [auto, yasm preferred]
|
--as={yasm|nasm|auto} use specified assembler [auto, yasm preferred]
|
||||||
|
--sdk-path=PATH path to root of sdk (iOS, android builds only)
|
||||||
${toggle_fast_unaligned} don't use unaligned accesses, even when
|
${toggle_fast_unaligned} don't use unaligned accesses, even when
|
||||||
supported by hardware [auto]
|
supported by hardware [auto]
|
||||||
${toggle_codec_srcs} in/exclude codec library source code
|
${toggle_codec_srcs} in/exclude codec library source code
|
||||||
@@ -31,17 +34,21 @@ Advanced options:
|
|||||||
${toggle_md5} support for output of checksum data
|
${toggle_md5} support for output of checksum data
|
||||||
${toggle_static_msvcrt} use static MSVCRT (VS builds only)
|
${toggle_static_msvcrt} use static MSVCRT (VS builds only)
|
||||||
${toggle_vp8} VP8 codec support
|
${toggle_vp8} VP8 codec support
|
||||||
${toggle_psnr} output of PSNR data, if supported (encoders)
|
${toggle_internal_stats} output of encoder internal stats for debug, if supported (encoders)
|
||||||
${toggle_mem_tracker} track memory usage
|
${toggle_mem_tracker} track memory usage
|
||||||
${toggle_postproc} postprocessing
|
${toggle_postproc} postprocessing
|
||||||
${toggle_multithread} multithreaded encoding and decoding.
|
${toggle_multithread} multithreaded encoding and decoding
|
||||||
${toggle_spatial_resampling} spatial sampling (scaling) support
|
${toggle_spatial_resampling} spatial sampling (scaling) support
|
||||||
${toggle_realtime_only} enable this option while building for real-time encoding
|
${toggle_realtime_only} enable this option while building for real-time encoding
|
||||||
|
${toggle_onthefly_bitpacking} enable on-the-fly bitpacking in real-time encoding
|
||||||
|
${toggle_error_concealment} enable this option to get a decoder which is able to conceal losses
|
||||||
${toggle_runtime_cpu_detect} runtime cpu detection
|
${toggle_runtime_cpu_detect} runtime cpu detection
|
||||||
${toggle_shared} shared library support
|
${toggle_shared} shared library support
|
||||||
|
${toggle_static} static library support
|
||||||
${toggle_small} favor smaller size over speed
|
${toggle_small} favor smaller size over speed
|
||||||
${toggle_arm_asm_detok} assembly version of the detokenizer (ARM platforms only)
|
|
||||||
${toggle_postproc_visualizer} macro block / block level visualizers
|
${toggle_postproc_visualizer} macro block / block level visualizers
|
||||||
|
${toggle_multi_res_encoding} enable multiple-resolution encoding
|
||||||
|
${toggle_temporal_denoising} enable temporal denoising and disable the spatial denoiser
|
||||||
|
|
||||||
Codecs:
|
Codecs:
|
||||||
Codecs can be selectively enabled or disabled individually, or by family:
|
Codecs can be selectively enabled or disabled individually, or by family:
|
||||||
@@ -77,24 +84,19 @@ EOF
|
|||||||
|
|
||||||
# all_platforms is a list of all supported target platforms. Maintain
|
# all_platforms is a list of all supported target platforms. Maintain
|
||||||
# alphabetically by architecture, generic-gnu last.
|
# alphabetically by architecture, generic-gnu last.
|
||||||
|
all_platforms="${all_platforms} armv5te-android-gcc"
|
||||||
all_platforms="${all_platforms} armv5te-linux-rvct"
|
all_platforms="${all_platforms} armv5te-linux-rvct"
|
||||||
all_platforms="${all_platforms} armv5te-linux-gcc"
|
all_platforms="${all_platforms} armv5te-linux-gcc"
|
||||||
all_platforms="${all_platforms} armv5te-symbian-gcc"
|
all_platforms="${all_platforms} armv5te-none-rvct"
|
||||||
all_platforms="${all_platforms} armv5te-wince-vs8"
|
|
||||||
all_platforms="${all_platforms} armv6-darwin-gcc"
|
all_platforms="${all_platforms} armv6-darwin-gcc"
|
||||||
all_platforms="${all_platforms} armv6-linux-rvct"
|
all_platforms="${all_platforms} armv6-linux-rvct"
|
||||||
all_platforms="${all_platforms} armv6-linux-gcc"
|
all_platforms="${all_platforms} armv6-linux-gcc"
|
||||||
all_platforms="${all_platforms} armv6-symbian-gcc"
|
all_platforms="${all_platforms} armv6-none-rvct"
|
||||||
all_platforms="${all_platforms} armv6-wince-vs8"
|
all_platforms="${all_platforms} armv7-android-gcc" #neon Cortex-A8
|
||||||
all_platforms="${all_platforms} iwmmxt-linux-rvct"
|
|
||||||
all_platforms="${all_platforms} iwmmxt-linux-gcc"
|
|
||||||
all_platforms="${all_platforms} iwmmxt-wince-vs8"
|
|
||||||
all_platforms="${all_platforms} iwmmxt2-linux-rvct"
|
|
||||||
all_platforms="${all_platforms} iwmmxt2-linux-gcc"
|
|
||||||
all_platforms="${all_platforms} iwmmxt2-wince-vs8"
|
|
||||||
all_platforms="${all_platforms} armv7-darwin-gcc" #neon Cortex-A8
|
all_platforms="${all_platforms} armv7-darwin-gcc" #neon Cortex-A8
|
||||||
all_platforms="${all_platforms} armv7-linux-rvct" #neon Cortex-A8
|
all_platforms="${all_platforms} armv7-linux-rvct" #neon Cortex-A8
|
||||||
all_platforms="${all_platforms} armv7-linux-gcc" #neon Cortex-A8
|
all_platforms="${all_platforms} armv7-linux-gcc" #neon Cortex-A8
|
||||||
|
all_platforms="${all_platforms} armv7-none-rvct" #neon Cortex-A8
|
||||||
all_platforms="${all_platforms} mips32-linux-gcc"
|
all_platforms="${all_platforms} mips32-linux-gcc"
|
||||||
all_platforms="${all_platforms} ppc32-darwin8-gcc"
|
all_platforms="${all_platforms} ppc32-darwin8-gcc"
|
||||||
all_platforms="${all_platforms} ppc32-darwin9-gcc"
|
all_platforms="${all_platforms} ppc32-darwin9-gcc"
|
||||||
@@ -107,8 +109,12 @@ all_platforms="${all_platforms} x86-darwin8-gcc"
|
|||||||
all_platforms="${all_platforms} x86-darwin8-icc"
|
all_platforms="${all_platforms} x86-darwin8-icc"
|
||||||
all_platforms="${all_platforms} x86-darwin9-gcc"
|
all_platforms="${all_platforms} x86-darwin9-gcc"
|
||||||
all_platforms="${all_platforms} x86-darwin9-icc"
|
all_platforms="${all_platforms} x86-darwin9-icc"
|
||||||
|
all_platforms="${all_platforms} x86-darwin10-gcc"
|
||||||
|
all_platforms="${all_platforms} x86-darwin11-gcc"
|
||||||
|
all_platforms="${all_platforms} x86-darwin12-gcc"
|
||||||
all_platforms="${all_platforms} x86-linux-gcc"
|
all_platforms="${all_platforms} x86-linux-gcc"
|
||||||
all_platforms="${all_platforms} x86-linux-icc"
|
all_platforms="${all_platforms} x86-linux-icc"
|
||||||
|
all_platforms="${all_platforms} x86-os2-gcc"
|
||||||
all_platforms="${all_platforms} x86-solaris-gcc"
|
all_platforms="${all_platforms} x86-solaris-gcc"
|
||||||
all_platforms="${all_platforms} x86-win32-gcc"
|
all_platforms="${all_platforms} x86-win32-gcc"
|
||||||
all_platforms="${all_platforms} x86-win32-vs7"
|
all_platforms="${all_platforms} x86-win32-vs7"
|
||||||
@@ -116,13 +122,19 @@ all_platforms="${all_platforms} x86-win32-vs8"
|
|||||||
all_platforms="${all_platforms} x86-win32-vs9"
|
all_platforms="${all_platforms} x86-win32-vs9"
|
||||||
all_platforms="${all_platforms} x86_64-darwin9-gcc"
|
all_platforms="${all_platforms} x86_64-darwin9-gcc"
|
||||||
all_platforms="${all_platforms} x86_64-darwin10-gcc"
|
all_platforms="${all_platforms} x86_64-darwin10-gcc"
|
||||||
|
all_platforms="${all_platforms} x86_64-darwin11-gcc"
|
||||||
|
all_platforms="${all_platforms} x86_64-darwin12-gcc"
|
||||||
all_platforms="${all_platforms} x86_64-linux-gcc"
|
all_platforms="${all_platforms} x86_64-linux-gcc"
|
||||||
all_platforms="${all_platforms} x86_64-linux-icc"
|
all_platforms="${all_platforms} x86_64-linux-icc"
|
||||||
all_platforms="${all_platforms} x86_64-solaris-gcc"
|
all_platforms="${all_platforms} x86_64-solaris-gcc"
|
||||||
|
all_platforms="${all_platforms} x86_64-win64-gcc"
|
||||||
all_platforms="${all_platforms} x86_64-win64-vs8"
|
all_platforms="${all_platforms} x86_64-win64-vs8"
|
||||||
all_platforms="${all_platforms} x86_64-win64-vs9"
|
all_platforms="${all_platforms} x86_64-win64-vs9"
|
||||||
all_platforms="${all_platforms} universal-darwin8-gcc"
|
all_platforms="${all_platforms} universal-darwin8-gcc"
|
||||||
all_platforms="${all_platforms} universal-darwin9-gcc"
|
all_platforms="${all_platforms} universal-darwin9-gcc"
|
||||||
|
all_platforms="${all_platforms} universal-darwin10-gcc"
|
||||||
|
all_platforms="${all_platforms} universal-darwin11-gcc"
|
||||||
|
all_platforms="${all_platforms} universal-darwin12-gcc"
|
||||||
all_platforms="${all_platforms} generic-gnu"
|
all_platforms="${all_platforms} generic-gnu"
|
||||||
|
|
||||||
# all_targets is a list of all targets that can be configured
|
# all_targets is a list of all targets that can be configured
|
||||||
@@ -154,11 +166,14 @@ enabled doxygen && php -v >/dev/null 2>&1 && enable install_docs
|
|||||||
enable install_bins
|
enable install_bins
|
||||||
enable install_libs
|
enable install_libs
|
||||||
|
|
||||||
|
enable static
|
||||||
enable optimizations
|
enable optimizations
|
||||||
enable fast_unaligned #allow unaligned accesses, if supported by hw
|
enable fast_unaligned #allow unaligned accesses, if supported by hw
|
||||||
enable md5
|
enable md5
|
||||||
enable spatial_resampling
|
enable spatial_resampling
|
||||||
enable multithread
|
enable multithread
|
||||||
|
enable os_support
|
||||||
|
enable temporal_denoising
|
||||||
|
|
||||||
[ -d ${source_path}/../include ] && enable alt_tree_layout
|
[ -d ${source_path}/../include ] && enable alt_tree_layout
|
||||||
for d in vp8; do
|
for d in vp8; do
|
||||||
@@ -172,6 +187,8 @@ else
|
|||||||
# customer environment
|
# customer environment
|
||||||
[ -f ${source_path}/../include/vpx/vp8cx.h ] && CODECS="${CODECS} vp8_encoder"
|
[ -f ${source_path}/../include/vpx/vp8cx.h ] && CODECS="${CODECS} vp8_encoder"
|
||||||
[ -f ${source_path}/../include/vpx/vp8dx.h ] && CODECS="${CODECS} vp8_decoder"
|
[ -f ${source_path}/../include/vpx/vp8dx.h ] && CODECS="${CODECS} vp8_decoder"
|
||||||
|
[ -f ${source_path}/../include/vpx/vp8cx.h ] || disable vp8_encoder
|
||||||
|
[ -f ${source_path}/../include/vpx/vp8dx.h ] || disable vp8_decoder
|
||||||
|
|
||||||
[ -f ${source_path}/../lib/*/*mt.lib ] && soft_enable static_msvcrt
|
[ -f ${source_path}/../lib/*/*mt.lib ] && soft_enable static_msvcrt
|
||||||
fi
|
fi
|
||||||
@@ -188,13 +205,12 @@ ARCH_LIST="
|
|||||||
ppc64
|
ppc64
|
||||||
"
|
"
|
||||||
ARCH_EXT_LIST="
|
ARCH_EXT_LIST="
|
||||||
armv5te
|
edsp
|
||||||
armv6
|
media
|
||||||
armv7
|
neon
|
||||||
iwmmxt
|
|
||||||
iwmmxt2
|
|
||||||
|
|
||||||
mips32
|
mips32
|
||||||
|
dspr2
|
||||||
|
|
||||||
mmx
|
mmx
|
||||||
sse
|
sse
|
||||||
@@ -212,6 +228,7 @@ HAVE_LIST="
|
|||||||
alt_tree_layout
|
alt_tree_layout
|
||||||
pthread_h
|
pthread_h
|
||||||
sys_mman_h
|
sys_mman_h
|
||||||
|
unistd_h
|
||||||
"
|
"
|
||||||
CONFIG_LIST="
|
CONFIG_LIST="
|
||||||
external_build
|
external_build
|
||||||
@@ -241,7 +258,7 @@ CONFIG_LIST="
|
|||||||
runtime_cpu_detect
|
runtime_cpu_detect
|
||||||
postproc
|
postproc
|
||||||
multithread
|
multithread
|
||||||
psnr
|
internal_stats
|
||||||
${CODECS}
|
${CODECS}
|
||||||
${CODEC_FAMILIES}
|
${CODEC_FAMILIES}
|
||||||
encoders
|
encoders
|
||||||
@@ -249,10 +266,16 @@ CONFIG_LIST="
|
|||||||
static_msvcrt
|
static_msvcrt
|
||||||
spatial_resampling
|
spatial_resampling
|
||||||
realtime_only
|
realtime_only
|
||||||
|
onthefly_bitpacking
|
||||||
|
error_concealment
|
||||||
shared
|
shared
|
||||||
|
static
|
||||||
small
|
small
|
||||||
arm_asm_detok
|
|
||||||
postproc_visualizer
|
postproc_visualizer
|
||||||
|
os_support
|
||||||
|
unit_tests
|
||||||
|
multi_res_encoding
|
||||||
|
temporal_denoising
|
||||||
"
|
"
|
||||||
CMDLINE_SELECT="
|
CMDLINE_SELECT="
|
||||||
extra_warnings
|
extra_warnings
|
||||||
@@ -271,6 +294,7 @@ CMDLINE_SELECT="
|
|||||||
|
|
||||||
libs
|
libs
|
||||||
examples
|
examples
|
||||||
|
docs
|
||||||
libc
|
libc
|
||||||
as
|
as
|
||||||
fast_unaligned
|
fast_unaligned
|
||||||
@@ -282,17 +306,22 @@ CMDLINE_SELECT="
|
|||||||
dc_recon
|
dc_recon
|
||||||
postproc
|
postproc
|
||||||
multithread
|
multithread
|
||||||
psnr
|
internal_stats
|
||||||
${CODECS}
|
${CODECS}
|
||||||
${CODEC_FAMILIES}
|
${CODEC_FAMILIES}
|
||||||
static_msvcrt
|
static_msvcrt
|
||||||
mem_tracker
|
mem_tracker
|
||||||
spatial_resampling
|
spatial_resampling
|
||||||
realtime_only
|
realtime_only
|
||||||
|
onthefly_bitpacking
|
||||||
|
error_concealment
|
||||||
shared
|
shared
|
||||||
|
static
|
||||||
small
|
small
|
||||||
arm_asm_detok
|
|
||||||
postproc_visualizer
|
postproc_visualizer
|
||||||
|
unit_tests
|
||||||
|
multi_res_encoding
|
||||||
|
temporal_denoising
|
||||||
"
|
"
|
||||||
|
|
||||||
process_cmdline() {
|
process_cmdline() {
|
||||||
@@ -300,7 +329,7 @@ process_cmdline() {
|
|||||||
optval="${opt#*=}"
|
optval="${opt#*=}"
|
||||||
case "$opt" in
|
case "$opt" in
|
||||||
--disable-codecs) for c in ${CODECS}; do disable $c; done ;;
|
--disable-codecs) for c in ${CODECS}; do disable $c; done ;;
|
||||||
*) process_common_cmdline $opt
|
*) process_common_cmdline "$opt"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
@@ -379,6 +408,7 @@ process_targets() {
|
|||||||
if [ -f "${source_path}/build/make/version.sh" ]; then
|
if [ -f "${source_path}/build/make/version.sh" ]; then
|
||||||
local ver=`"$source_path/build/make/version.sh" --bare $source_path`
|
local ver=`"$source_path/build/make/version.sh" --bare $source_path`
|
||||||
DIST_DIR="${DIST_DIR}-${ver}"
|
DIST_DIR="${DIST_DIR}-${ver}"
|
||||||
|
VERSION_STRING=${ver}
|
||||||
ver=${ver%%-*}
|
ver=${ver%%-*}
|
||||||
VERSION_PATCH=${ver##*.}
|
VERSION_PATCH=${ver##*.}
|
||||||
ver=${ver%.*}
|
ver=${ver%.*}
|
||||||
@@ -387,6 +417,8 @@ process_targets() {
|
|||||||
VERSION_MAJOR=${ver%.*}
|
VERSION_MAJOR=${ver%.*}
|
||||||
fi
|
fi
|
||||||
enabled child || cat <<EOF >> config.mk
|
enabled child || cat <<EOF >> config.mk
|
||||||
|
|
||||||
|
PREFIX=${prefix}
|
||||||
ifeq (\$(MAKECMDGOALS),dist)
|
ifeq (\$(MAKECMDGOALS),dist)
|
||||||
DIST_DIR?=${DIST_DIR}
|
DIST_DIR?=${DIST_DIR}
|
||||||
else
|
else
|
||||||
@@ -394,6 +426,8 @@ DIST_DIR?=\$(DESTDIR)${prefix}
|
|||||||
endif
|
endif
|
||||||
LIBSUBDIR=${libdir##${prefix}/}
|
LIBSUBDIR=${libdir##${prefix}/}
|
||||||
|
|
||||||
|
VERSION_STRING=${VERSION_STRING}
|
||||||
|
|
||||||
VERSION_MAJOR=${VERSION_MAJOR}
|
VERSION_MAJOR=${VERSION_MAJOR}
|
||||||
VERSION_MINOR=${VERSION_MINOR}
|
VERSION_MINOR=${VERSION_MINOR}
|
||||||
VERSION_PATCH=${VERSION_PATCH}
|
VERSION_PATCH=${VERSION_PATCH}
|
||||||
@@ -422,7 +456,13 @@ process_detect() {
|
|||||||
# Can only build shared libs on a subset of platforms. Doing this check
|
# Can only build shared libs on a subset of platforms. Doing this check
|
||||||
# here rather than at option parse time because the target auto-detect
|
# here rather than at option parse time because the target auto-detect
|
||||||
# magic happens after the command line has been parsed.
|
# magic happens after the command line has been parsed.
|
||||||
enabled linux || die "--enable-shared only supported on ELF for now"
|
if ! enabled linux; then
|
||||||
|
if enabled gnu; then
|
||||||
|
echo "--enable-shared is only supported on ELF; assuming this is OK"
|
||||||
|
else
|
||||||
|
die "--enable-shared only supported on ELF for now"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
if [ -z "$CC" ]; then
|
if [ -z "$CC" ]; then
|
||||||
echo "Bypassing toolchain for environment detection."
|
echo "Bypassing toolchain for environment detection."
|
||||||
@@ -468,11 +508,20 @@ process_toolchain() {
|
|||||||
case $toolchain in
|
case $toolchain in
|
||||||
universal-darwin*)
|
universal-darwin*)
|
||||||
local darwin_ver=${tgt_os##darwin}
|
local darwin_ver=${tgt_os##darwin}
|
||||||
fat_bin_archs="$fat_bin_archs ppc32-${tgt_os}-gcc"
|
|
||||||
|
|
||||||
# Intel
|
# Snow Leopard (10.6/darwin10) dropped support for PPC
|
||||||
|
# Include PPC support for all prior versions
|
||||||
|
if [ $darwin_ver -lt 10 ]; then
|
||||||
|
fat_bin_archs="$fat_bin_archs ppc32-${tgt_os}-gcc"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Tiger (10.4/darwin8) brought support for x86
|
||||||
|
if [ $darwin_ver -ge 8 ]; then
|
||||||
fat_bin_archs="$fat_bin_archs x86-${tgt_os}-${tgt_cc}"
|
fat_bin_archs="$fat_bin_archs x86-${tgt_os}-${tgt_cc}"
|
||||||
if [ $darwin_ver -gt 8 ]; then
|
fi
|
||||||
|
|
||||||
|
# Leopard (10.5/darwin9) brought 64 bit support
|
||||||
|
if [ $darwin_ver -ge 9 ]; then
|
||||||
fat_bin_archs="$fat_bin_archs x86_64-${tgt_os}-${tgt_cc}"
|
fat_bin_archs="$fat_bin_archs x86_64-${tgt_os}-${tgt_cc}"
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
@@ -488,7 +537,11 @@ process_toolchain() {
|
|||||||
check_add_cflags -Wpointer-arith
|
check_add_cflags -Wpointer-arith
|
||||||
check_add_cflags -Wtype-limits
|
check_add_cflags -Wtype-limits
|
||||||
check_add_cflags -Wcast-qual
|
check_add_cflags -Wcast-qual
|
||||||
enabled extra_warnings || check_add_cflags -Wno-unused
|
check_add_cflags -Wimplicit-function-declaration
|
||||||
|
check_add_cflags -Wuninitialized
|
||||||
|
check_add_cflags -Wunused-variable
|
||||||
|
check_add_cflags -Wunused-but-set-variable
|
||||||
|
enabled extra_warnings || check_add_cflags -Wno-unused-function
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if enabled icc; then
|
if enabled icc; then
|
||||||
@@ -542,6 +595,25 @@ process_toolchain() {
|
|||||||
if enabled postproc_visualizer; then
|
if enabled postproc_visualizer; then
|
||||||
enabled postproc || die "postproc_visualizer requires postproc to be enabled"
|
enabled postproc || die "postproc_visualizer requires postproc to be enabled"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Enable unit tests if we have a working C++ compiler
|
||||||
|
case "$toolchain" in
|
||||||
|
*-vs*)
|
||||||
|
soft_enable unit_tests
|
||||||
|
;;
|
||||||
|
*-android-*)
|
||||||
|
# GTestLog must be modified to use Android logging utilities.
|
||||||
|
;;
|
||||||
|
*-darwin-*)
|
||||||
|
# iOS/ARM builds do not work with gtest. This does not match
|
||||||
|
# x86 targets.
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
check_cxx "$@" <<EOF && soft_enable unit_tests
|
||||||
|
int z;
|
||||||
|
EOF
|
||||||
|
;;
|
||||||
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -550,7 +622,8 @@ process_toolchain() {
|
|||||||
##
|
##
|
||||||
CONFIGURE_ARGS="$@"
|
CONFIGURE_ARGS="$@"
|
||||||
process "$@"
|
process "$@"
|
||||||
cat <<EOF > ${BUILD_PFX}vpx_config.c
|
print_webm_license ${BUILD_PFX}vpx_config.c "/*" " */"
|
||||||
|
cat <<EOF >> ${BUILD_PFX}vpx_config.c
|
||||||
static const char* const cfg = "$CONFIGURE_ARGS";
|
static const char* const cfg = "$CONFIGURE_ARGS";
|
||||||
const char *vpx_codec_build_config(void) {return cfg;}
|
const char *vpx_codec_build_config(void) {return cfg;}
|
||||||
EOF
|
EOF
|
||||||
|
|||||||
6
docs.mk
6
docs.mk
@@ -21,9 +21,6 @@ CODEC_DOX := mainpage.dox \
|
|||||||
usage_dx.dox \
|
usage_dx.dox \
|
||||||
|
|
||||||
# Other doxy files sourced in Markdown
|
# Other doxy files sourced in Markdown
|
||||||
TXT_DOX-$(CONFIG_VP8) += vp8_api1_migration.dox
|
|
||||||
vp8_api1_migration.dox.DESC = VP8 API 1.x Migration
|
|
||||||
|
|
||||||
TXT_DOX = $(call enabled,TXT_DOX)
|
TXT_DOX = $(call enabled,TXT_DOX)
|
||||||
|
|
||||||
%.dox: %.txt
|
%.dox: %.txt
|
||||||
@@ -34,7 +31,8 @@ TXT_DOX = $(call enabled,TXT_DOX)
|
|||||||
|
|
||||||
EXAMPLE_PATH += $(SRC_PATH_BARE) #for CHANGELOG, README, etc
|
EXAMPLE_PATH += $(SRC_PATH_BARE) #for CHANGELOG, README, etc
|
||||||
|
|
||||||
doxyfile: libs.doxy_template libs.doxy examples.doxy
|
doxyfile: $(if $(findstring examples, $(ALL_TARGETS)),examples.doxy)
|
||||||
|
doxyfile: libs.doxy_template libs.doxy
|
||||||
@echo " [CREATE] $@"
|
@echo " [CREATE] $@"
|
||||||
@cat $^ > $@
|
@cat $^ > $@
|
||||||
@echo "STRIP_FROM_PATH += $(SRC_PATH_BARE) $(BUILD_ROOT)" >> $@
|
@echo "STRIP_FROM_PATH += $(SRC_PATH_BARE) $(BUILD_ROOT)" >> $@
|
||||||
|
|||||||
56
examples.mk
56
examples.mk
@@ -16,7 +16,7 @@ UTILS-$(CONFIG_DECODERS) += vpxdec.c
|
|||||||
vpxdec.SRCS += md5_utils.c md5_utils.h
|
vpxdec.SRCS += md5_utils.c md5_utils.h
|
||||||
vpxdec.SRCS += vpx_ports/vpx_timer.h
|
vpxdec.SRCS += vpx_ports/vpx_timer.h
|
||||||
vpxdec.SRCS += vpx/vpx_integer.h
|
vpxdec.SRCS += vpx/vpx_integer.h
|
||||||
vpxdec.SRCS += args.c args.h vpx_ports/config.h
|
vpxdec.SRCS += args.c args.h
|
||||||
vpxdec.SRCS += tools_common.c tools_common.h
|
vpxdec.SRCS += tools_common.c tools_common.h
|
||||||
vpxdec.SRCS += nestegg/halloc/halloc.h
|
vpxdec.SRCS += nestegg/halloc/halloc.h
|
||||||
vpxdec.SRCS += nestegg/halloc/src/align.h
|
vpxdec.SRCS += nestegg/halloc/src/align.h
|
||||||
@@ -30,13 +30,17 @@ vpxdec.DESCRIPTION = Full featured decoder
|
|||||||
UTILS-$(CONFIG_ENCODERS) += vpxenc.c
|
UTILS-$(CONFIG_ENCODERS) += vpxenc.c
|
||||||
vpxenc.SRCS += args.c args.h y4minput.c y4minput.h
|
vpxenc.SRCS += args.c args.h y4minput.c y4minput.h
|
||||||
vpxenc.SRCS += tools_common.c tools_common.h
|
vpxenc.SRCS += tools_common.c tools_common.h
|
||||||
vpxenc.SRCS += vpx_ports/config.h vpx_ports/mem_ops.h
|
vpxenc.SRCS += vpx_ports/mem_ops.h
|
||||||
vpxenc.SRCS += vpx_ports/mem_ops_aligned.h
|
vpxenc.SRCS += vpx_ports/mem_ops_aligned.h
|
||||||
|
vpxenc.SRCS += vpx_ports/vpx_timer.h
|
||||||
vpxenc.SRCS += libmkv/EbmlIDs.h
|
vpxenc.SRCS += libmkv/EbmlIDs.h
|
||||||
vpxenc.SRCS += libmkv/EbmlWriter.c
|
vpxenc.SRCS += libmkv/EbmlWriter.c
|
||||||
vpxenc.SRCS += libmkv/EbmlWriter.h
|
vpxenc.SRCS += libmkv/EbmlWriter.h
|
||||||
vpxenc.GUID = 548DEC74-7A15-4B2B-AFC3-AA102E7C25C1
|
vpxenc.GUID = 548DEC74-7A15-4B2B-AFC3-AA102E7C25C1
|
||||||
vpxenc.DESCRIPTION = Full featured encoder
|
vpxenc.DESCRIPTION = Full featured encoder
|
||||||
|
UTILS-$(CONFIG_ENCODERS) += vp8_scalable_patterns.c
|
||||||
|
vp8_scalable_patterns.GUID = 0D6A210B-F482-4D6F-8570-4A9C01ACC88C
|
||||||
|
vp8_scalable_patterns.DESCRIPTION = Temporal Scalability Encoder
|
||||||
|
|
||||||
# Clean up old ivfenc, ivfdec binaries.
|
# Clean up old ivfenc, ivfdec binaries.
|
||||||
ifeq ($(CONFIG_MSVS),yes)
|
ifeq ($(CONFIG_MSVS),yes)
|
||||||
@@ -77,13 +81,15 @@ GEN_EXAMPLES-$(CONFIG_ENCODERS) += decode_with_drops.c
|
|||||||
endif
|
endif
|
||||||
decode_with_drops.GUID = CE5C53C4-8DDA-438A-86ED-0DDD3CDB8D26
|
decode_with_drops.GUID = CE5C53C4-8DDA-438A-86ED-0DDD3CDB8D26
|
||||||
decode_with_drops.DESCRIPTION = Drops frames while decoding
|
decode_with_drops.DESCRIPTION = Drops frames while decoding
|
||||||
|
ifeq ($(CONFIG_DECODERS),yes)
|
||||||
|
GEN_EXAMPLES-$(CONFIG_ERROR_CONCEALMENT) += decode_with_partial_drops.c
|
||||||
|
endif
|
||||||
|
decode_with_partial_drops.GUID = 61C2D026-5754-46AC-916F-1343ECC5537E
|
||||||
|
decode_with_partial_drops.DESCRIPTION = Drops parts of frames while decoding
|
||||||
GEN_EXAMPLES-$(CONFIG_ENCODERS) += error_resilient.c
|
GEN_EXAMPLES-$(CONFIG_ENCODERS) += error_resilient.c
|
||||||
error_resilient.GUID = DF5837B9-4145-4F92-A031-44E4F832E00C
|
error_resilient.GUID = DF5837B9-4145-4F92-A031-44E4F832E00C
|
||||||
error_resilient.DESCRIPTION = Error Resiliency Feature
|
error_resilient.DESCRIPTION = Error Resiliency Feature
|
||||||
|
|
||||||
GEN_EXAMPLES-$(CONFIG_VP8_ENCODER) += vp8_scalable_patterns.c
|
|
||||||
vp8_scalable_patterns.GUID = 0D6A210B-F482-4D6F-8570-4A9C01ACC88C
|
|
||||||
vp8_scalable_patterns.DESCRIPTION = VP8 Scalable Bitstream Patterns
|
|
||||||
GEN_EXAMPLES-$(CONFIG_VP8_ENCODER) += vp8_set_maps.c
|
GEN_EXAMPLES-$(CONFIG_VP8_ENCODER) += vp8_set_maps.c
|
||||||
vp8_set_maps.GUID = ECB2D24D-98B8-4015-A465-A4AF3DCC145F
|
vp8_set_maps.GUID = ECB2D24D-98B8-4015-A465-A4AF3DCC145F
|
||||||
vp8_set_maps.DESCRIPTION = VP8 set active and ROI maps
|
vp8_set_maps.DESCRIPTION = VP8 set active and ROI maps
|
||||||
@@ -91,10 +97,29 @@ GEN_EXAMPLES-$(CONFIG_VP8_ENCODER) += vp8cx_set_ref.c
|
|||||||
vp8cx_set_ref.GUID = C5E31F7F-96F6-48BD-BD3E-10EBF6E8057A
|
vp8cx_set_ref.GUID = C5E31F7F-96F6-48BD-BD3E-10EBF6E8057A
|
||||||
vp8cx_set_ref.DESCRIPTION = VP8 set encoder reference frame
|
vp8cx_set_ref.DESCRIPTION = VP8 set encoder reference frame
|
||||||
|
|
||||||
|
# C file is provided, not generated automatically.
|
||||||
|
UTILS-$(CONFIG_MULTI_RES_ENCODING) += vp8_multi_resolution_encoder.c
|
||||||
|
vp8_multi_resolution_encoder.SRCS \
|
||||||
|
+= third_party/libyuv/include/libyuv/basic_types.h \
|
||||||
|
third_party/libyuv/include/libyuv/cpu_id.h \
|
||||||
|
third_party/libyuv/include/libyuv/scale.h \
|
||||||
|
third_party/libyuv/source/row.h \
|
||||||
|
third_party/libyuv/source/scale.c \
|
||||||
|
third_party/libyuv/source/cpu_id.c
|
||||||
|
vp8_multi_resolution_encoder.GUID = 04f8738e-63c8-423b-90fa-7c2703a374de
|
||||||
|
vp8_multi_resolution_encoder.DESCRIPTION = VP8 Multiple-resolution Encoding
|
||||||
|
|
||||||
# Handle extra library flags depending on codec configuration
|
# Handle extra library flags depending on codec configuration
|
||||||
CODEC_EXTRA_LIBS-$(CONFIG_VP8) += m
|
|
||||||
|
|
||||||
|
# We should not link to math library (libm) on RVCT
|
||||||
|
# when building for bare-metal targets
|
||||||
|
ifeq ($(CONFIG_OS_SUPPORT), yes)
|
||||||
|
CODEC_EXTRA_LIBS-$(CONFIG_VP8) += m
|
||||||
|
else
|
||||||
|
ifeq ($(CONFIG_GCC), yes)
|
||||||
|
CODEC_EXTRA_LIBS-$(CONFIG_VP8) += m
|
||||||
|
endif
|
||||||
|
endif
|
||||||
#
|
#
|
||||||
# End of specified files. The rest of the build rules should happen
|
# End of specified files. The rest of the build rules should happen
|
||||||
# automagically from here.
|
# automagically from here.
|
||||||
@@ -114,8 +139,8 @@ else
|
|||||||
LIB_PATH := $(call enabled,LIB_PATH)
|
LIB_PATH := $(call enabled,LIB_PATH)
|
||||||
INC_PATH := $(call enabled,INC_PATH)
|
INC_PATH := $(call enabled,INC_PATH)
|
||||||
endif
|
endif
|
||||||
CFLAGS += $(addprefix -I,$(INC_PATH))
|
INTERNAL_CFLAGS = $(addprefix -I,$(INC_PATH))
|
||||||
LDFLAGS += $(addprefix -L,$(LIB_PATH))
|
INTERNAL_LDFLAGS += $(addprefix -L,$(LIB_PATH))
|
||||||
|
|
||||||
|
|
||||||
# Expand list of selected examples to build (as specified above)
|
# Expand list of selected examples to build (as specified above)
|
||||||
@@ -144,20 +169,22 @@ $(eval $(if $(filter universal%,$(TOOLCHAIN)),LIPO_OBJS,BUILD_OBJS):=yes)
|
|||||||
# Create build/install dependencies for all examples. The common case
|
# Create build/install dependencies for all examples. The common case
|
||||||
# is handled here. The MSVS case is handled below.
|
# is handled here. The MSVS case is handled below.
|
||||||
NOT_MSVS = $(if $(CONFIG_MSVS),,yes)
|
NOT_MSVS = $(if $(CONFIG_MSVS),,yes)
|
||||||
DIST-BINS-$(NOT_MSVS) += $(addprefix bin/,$(ALL_EXAMPLES:.c=))
|
DIST-BINS-$(NOT_MSVS) += $(addprefix bin/,$(ALL_EXAMPLES:.c=$(EXE_SFX)))
|
||||||
INSTALL-BINS-$(NOT_MSVS) += $(addprefix bin/,$(UTILS:.c=))
|
INSTALL-BINS-$(NOT_MSVS) += $(addprefix bin/,$(UTILS:.c=$(EXE_SFX)))
|
||||||
DIST-SRCS-yes += $(ALL_SRCS)
|
DIST-SRCS-yes += $(ALL_SRCS)
|
||||||
INSTALL-SRCS-yes += $(UTIL_SRCS)
|
INSTALL-SRCS-yes += $(UTIL_SRCS)
|
||||||
OBJS-$(NOT_MSVS) += $(if $(BUILD_OBJS),$(call objs,$(ALL_SRCS)))
|
OBJS-$(NOT_MSVS) += $(if $(BUILD_OBJS),$(call objs,$(ALL_SRCS)))
|
||||||
BINS-$(NOT_MSVS) += $(addprefix $(BUILD_PFX),$(ALL_EXAMPLES:.c=))
|
BINS-$(NOT_MSVS) += $(addprefix $(BUILD_PFX),$(ALL_EXAMPLES:.c=$(EXE_SFX)))
|
||||||
|
|
||||||
|
|
||||||
# Instantiate linker template for all examples.
|
# Instantiate linker template for all examples.
|
||||||
CODEC_LIB=$(if $(CONFIG_DEBUG_LIBS),vpx_g,vpx)
|
CODEC_LIB=$(if $(CONFIG_DEBUG_LIBS),vpx_g,vpx)
|
||||||
|
CODEC_LIB_SUF=$(if $(CONFIG_SHARED),.so,.a)
|
||||||
$(foreach bin,$(BINS-yes),\
|
$(foreach bin,$(BINS-yes),\
|
||||||
$(if $(BUILD_OBJS),$(eval $(bin): $(LIB_PATH)/lib$(CODEC_LIB).a))\
|
$(if $(BUILD_OBJS),$(eval $(bin):\
|
||||||
|
$(LIB_PATH)/lib$(CODEC_LIB)$(CODEC_LIB_SUF)))\
|
||||||
$(if $(BUILD_OBJS),$(eval $(call linker_template,$(bin),\
|
$(if $(BUILD_OBJS),$(eval $(call linker_template,$(bin),\
|
||||||
$(call objs,$($(notdir $(bin)).SRCS)) \
|
$(call objs,$($(notdir $(bin:$(EXE_SFX)=)).SRCS)) \
|
||||||
-l$(CODEC_LIB) $(addprefix -l,$(CODEC_EXTRA_LIBS))\
|
-l$(CODEC_LIB) $(addprefix -l,$(CODEC_EXTRA_LIBS))\
|
||||||
)))\
|
)))\
|
||||||
$(if $(LIPO_OBJS),$(eval $(call lipo_bin_template,$(bin))))\
|
$(if $(LIPO_OBJS),$(eval $(call lipo_bin_template,$(bin))))\
|
||||||
@@ -206,7 +233,8 @@ $(1): $($(1:.vcproj=).SRCS)
|
|||||||
--ver=$$(CONFIG_VS_VERSION)\
|
--ver=$$(CONFIG_VS_VERSION)\
|
||||||
--proj-guid=$$($$(@:.vcproj=).GUID)\
|
--proj-guid=$$($$(@:.vcproj=).GUID)\
|
||||||
$$(if $$(CONFIG_STATIC_MSVCRT),--static-crt) \
|
$$(if $$(CONFIG_STATIC_MSVCRT),--static-crt) \
|
||||||
--out=$$@ $$(CFLAGS) $$(LDFLAGS) -l$$(CODEC_LIB) -lwinmm $$^
|
--out=$$@ $$(INTERNAL_CFLAGS) $$(CFLAGS) \
|
||||||
|
$$(INTERNAL_LDFLAGS) $$(LDFLAGS) -l$$(CODEC_LIB) -lwinmm $$^
|
||||||
endef
|
endef
|
||||||
PROJECTS-$(CONFIG_MSVS) += $(ALL_EXAMPLES:.c=.vcproj)
|
PROJECTS-$(CONFIG_MSVS) += $(ALL_EXAMPLES:.c=.vcproj)
|
||||||
INSTALL-BINS-$(CONFIG_MSVS) += $(foreach p,$(VS_PLATFORMS),\
|
INSTALL-BINS-$(CONFIG_MSVS) += $(foreach p,$(VS_PLATFORMS),\
|
||||||
|
|||||||
@@ -34,8 +34,8 @@ MD5Init(&md5);
|
|||||||
for(plane=0; plane < 3; plane++) {
|
for(plane=0; plane < 3; plane++) {
|
||||||
unsigned char *buf =img->planes[plane];
|
unsigned char *buf =img->planes[plane];
|
||||||
|
|
||||||
for(y=0; y<img->d_h >> (plane?1:0); y++) {
|
for(y=0; y < (plane ? (img->d_h + 1) >> 1 : img->d_h); y++) {
|
||||||
MD5Update(&md5, buf, img->d_w >> (plane?1:0));
|
MD5Update(&md5, buf, (plane ? (img->d_w + 1) >> 1 : img->d_w));
|
||||||
buf += img->stride[plane];
|
buf += img->stride[plane];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
238
examples/decode_with_partial_drops.txt
Normal file
238
examples/decode_with_partial_drops.txt
Normal file
@@ -0,0 +1,238 @@
|
|||||||
|
@TEMPLATE decoder_tmpl.c
|
||||||
|
Decode With Partial Drops Example
|
||||||
|
=========================
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ INTRODUCTION
|
||||||
|
This is an example utility which drops a series of frames (or parts of frames),
|
||||||
|
as specified on the command line. This is useful for observing the error
|
||||||
|
recovery features of the codec.
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ INTRODUCTION
|
||||||
|
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ EXTRA_INCLUDES
|
||||||
|
#include <time.h>
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ EXTRA_INCLUDES
|
||||||
|
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ HELPERS
|
||||||
|
struct parsed_header
|
||||||
|
{
|
||||||
|
char key_frame;
|
||||||
|
int version;
|
||||||
|
char show_frame;
|
||||||
|
int first_part_size;
|
||||||
|
};
|
||||||
|
|
||||||
|
int next_packet(struct parsed_header* hdr, int pos, int length, int mtu)
|
||||||
|
{
|
||||||
|
int size = 0;
|
||||||
|
int remaining = length - pos;
|
||||||
|
/* Uncompressed part is 3 bytes for P frames and 10 bytes for I frames */
|
||||||
|
int uncomp_part_size = (hdr->key_frame ? 10 : 3);
|
||||||
|
/* number of bytes yet to send from header and the first partition */
|
||||||
|
int remainFirst = uncomp_part_size + hdr->first_part_size - pos;
|
||||||
|
if (remainFirst > 0)
|
||||||
|
{
|
||||||
|
if (remainFirst <= mtu)
|
||||||
|
{
|
||||||
|
size = remainFirst;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
size = mtu;
|
||||||
|
}
|
||||||
|
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* second partition; just slot it up according to MTU */
|
||||||
|
if (remaining <= mtu)
|
||||||
|
{
|
||||||
|
size = remaining;
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
return mtu;
|
||||||
|
}
|
||||||
|
|
||||||
|
void throw_packets(unsigned char* frame, int* size, int loss_rate,
|
||||||
|
int* thrown, int* kept)
|
||||||
|
{
|
||||||
|
unsigned char loss_frame[256*1024];
|
||||||
|
int pkg_size = 1;
|
||||||
|
int pos = 0;
|
||||||
|
int loss_pos = 0;
|
||||||
|
struct parsed_header hdr;
|
||||||
|
unsigned int tmp;
|
||||||
|
int mtu = 1500;
|
||||||
|
|
||||||
|
if (*size < 3)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
putc('|', stdout);
|
||||||
|
/* parse uncompressed 3 bytes */
|
||||||
|
tmp = (frame[2] << 16) | (frame[1] << 8) | frame[0];
|
||||||
|
hdr.key_frame = !(tmp & 0x1); /* inverse logic */
|
||||||
|
hdr.version = (tmp >> 1) & 0x7;
|
||||||
|
hdr.show_frame = (tmp >> 4) & 0x1;
|
||||||
|
hdr.first_part_size = (tmp >> 5) & 0x7FFFF;
|
||||||
|
|
||||||
|
/* don't drop key frames */
|
||||||
|
if (hdr.key_frame)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
*kept = *size/mtu + ((*size % mtu > 0) ? 1 : 0); /* approximate */
|
||||||
|
for (i=0; i < *kept; i++)
|
||||||
|
putc('.', stdout);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((pkg_size = next_packet(&hdr, pos, *size, mtu)) > 0)
|
||||||
|
{
|
||||||
|
int loss_event = ((rand() + 1.0)/(RAND_MAX + 1.0) < loss_rate/100.0);
|
||||||
|
if (*thrown == 0 && !loss_event)
|
||||||
|
{
|
||||||
|
memcpy(loss_frame + loss_pos, frame + pos, pkg_size);
|
||||||
|
loss_pos += pkg_size;
|
||||||
|
(*kept)++;
|
||||||
|
putc('.', stdout);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
(*thrown)++;
|
||||||
|
putc('X', stdout);
|
||||||
|
}
|
||||||
|
pos += pkg_size;
|
||||||
|
}
|
||||||
|
memcpy(frame, loss_frame, loss_pos);
|
||||||
|
memset(frame + loss_pos, 0, *size - loss_pos);
|
||||||
|
*size = loss_pos;
|
||||||
|
}
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ HELPERS
|
||||||
|
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DEC_INIT
|
||||||
|
/* Initialize codec */
|
||||||
|
flags = VPX_CODEC_USE_ERROR_CONCEALMENT;
|
||||||
|
res = vpx_codec_dec_init(&codec, interface, &dec_cfg, flags);
|
||||||
|
if(res)
|
||||||
|
die_codec(&codec, "Failed to initialize decoder");
|
||||||
|
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DEC_INIT
|
||||||
|
|
||||||
|
Usage
|
||||||
|
-----
|
||||||
|
This example adds a single argument to the `simple_decoder` example,
|
||||||
|
which specifies the range or pattern of frames to drop. The parameter is
|
||||||
|
parsed as follows:
|
||||||
|
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ USAGE
|
||||||
|
if(argc < 4 || argc > 6)
|
||||||
|
die("Usage: %s <infile> <outfile> [-t <num threads>] <N-M|N/M|L,S>\n",
|
||||||
|
argv[0]);
|
||||||
|
{
|
||||||
|
char *nptr;
|
||||||
|
int arg_num = 3;
|
||||||
|
if (argc == 6 && strncmp(argv[arg_num++], "-t", 2) == 0)
|
||||||
|
dec_cfg.threads = strtol(argv[arg_num++], NULL, 0);
|
||||||
|
n = strtol(argv[arg_num], &nptr, 0);
|
||||||
|
mode = (*nptr == '\0' || *nptr == ',') ? 2 : (*nptr == '-') ? 1 : 0;
|
||||||
|
|
||||||
|
m = strtol(nptr+1, NULL, 0);
|
||||||
|
if((!n && !m) || (*nptr != '-' && *nptr != '/' &&
|
||||||
|
*nptr != '\0' && *nptr != ','))
|
||||||
|
die("Couldn't parse pattern %s\n", argv[3]);
|
||||||
|
}
|
||||||
|
seed = (m > 0) ? m : (unsigned int)time(NULL);
|
||||||
|
srand(seed);thrown_frame = 0;
|
||||||
|
printf("Seed: %u\n", seed);
|
||||||
|
printf("Threads: %d\n", dec_cfg.threads);
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ USAGE
|
||||||
|
|
||||||
|
|
||||||
|
Dropping A Range Of Frames
|
||||||
|
--------------------------
|
||||||
|
To drop a range of frames, specify the starting frame and the ending
|
||||||
|
frame to drop, separated by a dash. The following command will drop
|
||||||
|
frames 5 through 10 (base 1).
|
||||||
|
|
||||||
|
$ ./decode_with_partial_drops in.ivf out.i420 5-10
|
||||||
|
|
||||||
|
|
||||||
|
Dropping A Pattern Of Frames
|
||||||
|
----------------------------
|
||||||
|
To drop a pattern of frames, specify the number of frames to drop and
|
||||||
|
the number of frames after which to repeat the pattern, separated by
|
||||||
|
a forward-slash. The following command will drop 3 of 7 frames.
|
||||||
|
Specifically, it will decode 4 frames, then drop 3 frames, and then
|
||||||
|
repeat.
|
||||||
|
|
||||||
|
$ ./decode_with_partial_drops in.ivf out.i420 3/7
|
||||||
|
|
||||||
|
Dropping Random Parts Of Frames
|
||||||
|
-------------------------------
|
||||||
|
A third argument tuple is available to split the frame into 1500 bytes pieces
|
||||||
|
and randomly drop pieces rather than frames. The frame will be split at
|
||||||
|
partition boundaries where possible. The following example will seed the RNG
|
||||||
|
with the seed 123 and drop approximately 5% of the pieces. Pieces which
|
||||||
|
are depending on an already dropped piece will also be dropped.
|
||||||
|
|
||||||
|
$ ./decode_with_partial_drops in.ivf out.i420 5,123
|
||||||
|
|
||||||
|
|
||||||
|
Extra Variables
|
||||||
|
---------------
|
||||||
|
This example maintains the pattern passed on the command line in the
|
||||||
|
`n`, `m`, and `is_range` variables:
|
||||||
|
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ EXTRA_VARS
|
||||||
|
int n, m, mode;
|
||||||
|
unsigned int seed;
|
||||||
|
int thrown=0, kept=0;
|
||||||
|
int thrown_frame=0, kept_frame=0;
|
||||||
|
vpx_codec_dec_cfg_t dec_cfg = {0};
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ EXTRA_VARS
|
||||||
|
|
||||||
|
|
||||||
|
Making The Drop Decision
|
||||||
|
------------------------
|
||||||
|
The example decides whether to drop the frame based on the current
|
||||||
|
frame number, immediately before decoding the frame.
|
||||||
|
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PRE_DECODE
|
||||||
|
/* Decide whether to throw parts of the frame or the whole frame
|
||||||
|
depending on the drop mode */
|
||||||
|
thrown_frame = 0;
|
||||||
|
kept_frame = 0;
|
||||||
|
switch (mode)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
if (m - (frame_cnt-1)%m <= n)
|
||||||
|
{
|
||||||
|
frame_sz = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
if (frame_cnt >= n && frame_cnt <= m)
|
||||||
|
{
|
||||||
|
frame_sz = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
throw_packets(frame, &frame_sz, n, &thrown_frame, &kept_frame);
|
||||||
|
break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
if (mode < 2)
|
||||||
|
{
|
||||||
|
if (frame_sz == 0)
|
||||||
|
{
|
||||||
|
putc('X', stdout);
|
||||||
|
thrown_frame++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
putc('.', stdout);
|
||||||
|
kept_frame++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
thrown += thrown_frame;
|
||||||
|
kept += kept_frame;
|
||||||
|
fflush(stdout);
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PRE_DECODE
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
#define VPX_CODEC_DISABLE_COMPAT 1
|
#define VPX_CODEC_DISABLE_COMPAT 1
|
||||||
#include "vpx/vpx_decoder.h"
|
#include "vpx/vpx_decoder.h"
|
||||||
#include "vpx/vp8dx.h"
|
#include "vpx/vp8dx.h"
|
||||||
#define interface (&vpx_codec_vp8_dx_algo)
|
#define interface (vpx_codec_vp8_dx())
|
||||||
@EXTRA_INCLUDES
|
@EXTRA_INCLUDES
|
||||||
|
|
||||||
|
|
||||||
@@ -42,6 +42,8 @@ static void die(const char *fmt, ...) {
|
|||||||
|
|
||||||
@DIE_CODEC
|
@DIE_CODEC
|
||||||
|
|
||||||
|
@HELPERS
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
FILE *infile, *outfile;
|
FILE *infile, *outfile;
|
||||||
vpx_codec_ctx_t codec;
|
vpx_codec_ctx_t codec;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#define VPX_CODEC_DISABLE_COMPAT 1
|
#define VPX_CODEC_DISABLE_COMPAT 1
|
||||||
#include "vpx/vpx_decoder.h"
|
#include "vpx/vpx_decoder.h"
|
||||||
#include "vpx/vp8dx.h"
|
#include "vpx/vp8dx.h"
|
||||||
#define interface (&vpx_codec_vp8_dx_algo)
|
#define interface (vpx_codec_vp8_dx())
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DEC_INCLUDES
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DEC_INCLUDES
|
||||||
|
|
||||||
|
|
||||||
@@ -47,8 +47,9 @@ while((img = vpx_codec_get_frame(&codec, &iter))) {
|
|||||||
for(plane=0; plane < 3; plane++) {
|
for(plane=0; plane < 3; plane++) {
|
||||||
unsigned char *buf =img->planes[plane];
|
unsigned char *buf =img->planes[plane];
|
||||||
|
|
||||||
for(y=0; y<img->d_h >> (plane?1:0); y++) {
|
for(y=0; y < (plane ? (img->d_h + 1) >> 1 : img->d_h); y++) {
|
||||||
if(fwrite(buf, 1, img->d_w >> (plane?1:0), outfile));
|
(void) fwrite(buf, 1, (plane ? (img->d_w + 1) >> 1 : img->d_w),
|
||||||
|
outfile);
|
||||||
buf += img->stride[plane];
|
buf += img->stride[plane];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
#define VPX_CODEC_DISABLE_COMPAT 1
|
#define VPX_CODEC_DISABLE_COMPAT 1
|
||||||
#include "vpx/vpx_encoder.h"
|
#include "vpx/vpx_encoder.h"
|
||||||
#include "vpx/vp8cx.h"
|
#include "vpx/vp8cx.h"
|
||||||
#define interface (&vpx_codec_vp8_cx_algo)
|
#define interface (vpx_codec_vp8_cx())
|
||||||
#define fourcc 0x30385056
|
#define fourcc 0x30385056
|
||||||
@EXTRA_INCLUDES
|
@EXTRA_INCLUDES
|
||||||
|
|
||||||
@@ -85,7 +85,7 @@ static void write_ivf_file_header(FILE *outfile,
|
|||||||
mem_put_le32(header+24, frame_cnt); /* length */
|
mem_put_le32(header+24, frame_cnt); /* length */
|
||||||
mem_put_le32(header+28, 0); /* unused */
|
mem_put_le32(header+28, 0); /* unused */
|
||||||
|
|
||||||
if(fwrite(header, 1, 32, outfile));
|
(void) fwrite(header, 1, 32, outfile);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -103,7 +103,7 @@ static void write_ivf_frame_header(FILE *outfile,
|
|||||||
mem_put_le32(header+4, pts&0xFFFFFFFF);
|
mem_put_le32(header+4, pts&0xFFFFFFFF);
|
||||||
mem_put_le32(header+8, pts >> 32);
|
mem_put_le32(header+8, pts >> 32);
|
||||||
|
|
||||||
if(fwrite(header, 1, 12, outfile));
|
(void) fwrite(header, 1, 12, outfile);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
@@ -111,8 +111,6 @@ int main(int argc, char **argv) {
|
|||||||
vpx_codec_ctx_t codec;
|
vpx_codec_ctx_t codec;
|
||||||
vpx_codec_enc_cfg_t cfg;
|
vpx_codec_enc_cfg_t cfg;
|
||||||
int frame_cnt = 0;
|
int frame_cnt = 0;
|
||||||
unsigned char file_hdr[IVF_FILE_HDR_SZ];
|
|
||||||
unsigned char frame_hdr[IVF_FRAME_HDR_SZ];
|
|
||||||
vpx_image_t raw;
|
vpx_image_t raw;
|
||||||
vpx_codec_err_t res;
|
vpx_codec_err_t res;
|
||||||
long width;
|
long width;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#define VPX_CODEC_DISABLE_COMPAT 1
|
#define VPX_CODEC_DISABLE_COMPAT 1
|
||||||
#include "vpx/vpx_encoder.h"
|
#include "vpx/vpx_encoder.h"
|
||||||
#include "vpx/vp8cx.h"
|
#include "vpx/vp8cx.h"
|
||||||
#define interface (&vpx_codec_vp8_cx_algo)
|
#define interface (vpx_codec_vp8_cx())
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_INCLUDES
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_INCLUDES
|
||||||
|
|
||||||
|
|
||||||
@@ -61,13 +61,14 @@ if(vpx_codec_encode(&codec, frame_avail? &raw : NULL, frame_cnt,
|
|||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PROCESS_FRAME
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PROCESS_FRAME
|
||||||
case VPX_CODEC_CX_FRAME_PKT:
|
case VPX_CODEC_CX_FRAME_PKT:
|
||||||
write_ivf_frame_header(outfile, pkt);
|
write_ivf_frame_header(outfile, pkt);
|
||||||
if(fwrite(pkt->data.frame.buf, 1, pkt->data.frame.sz,
|
(void) fwrite(pkt->data.frame.buf, 1, pkt->data.frame.sz,
|
||||||
outfile));
|
outfile);
|
||||||
break;
|
break;
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PROCESS_FRAME
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PROCESS_FRAME
|
||||||
|
|
||||||
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DESTROY
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DESTROY
|
||||||
|
vpx_img_free(&raw);
|
||||||
if(vpx_codec_destroy(&codec))
|
if(vpx_codec_destroy(&codec))
|
||||||
die_codec(&codec, "Failed to destroy codec");
|
die_codec(&codec, "Failed to destroy codec");
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DESTROY
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DESTROY
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ res = vpx_codec_dec_init(&codec, interface, NULL,
|
|||||||
if(res == VPX_CODEC_INCAPABLE) {
|
if(res == VPX_CODEC_INCAPABLE) {
|
||||||
printf("NOTICE: Postproc not supported by %s\n",
|
printf("NOTICE: Postproc not supported by %s\n",
|
||||||
vpx_codec_iface_name(interface));
|
vpx_codec_iface_name(interface));
|
||||||
res = vpx_codec_dec_init(&codec, interface, NULL, 0);
|
res = vpx_codec_dec_init(&codec, interface, NULL, flags);
|
||||||
}
|
}
|
||||||
if(res)
|
if(res)
|
||||||
die_codec(&codec, "Failed to initialize decoder");
|
die_codec(&codec, "Failed to initialize decoder");
|
||||||
@@ -58,7 +58,7 @@ if(frame_cnt%30 == 1) {
|
|||||||
if(vpx_codec_control(&codec, VP8_SET_POSTPROC, &pp))
|
if(vpx_codec_control(&codec, VP8_SET_POSTPROC, &pp))
|
||||||
die_codec(&codec, "Failed to turn off postproc");
|
die_codec(&codec, "Failed to turn off postproc");
|
||||||
} else if(frame_cnt%30 == 16) {
|
} else if(frame_cnt%30 == 16) {
|
||||||
vp8_postproc_cfg_t pp = {VP8_DEBLOCK | VP8_DEMACROBLOCK, 4, 0};
|
vp8_postproc_cfg_t pp = {VP8_DEBLOCK | VP8_DEMACROBLOCK | VP8_MFQE, 4, 0};
|
||||||
|
|
||||||
if(vpx_codec_control(&codec, VP8_SET_POSTPROC, &pp))
|
if(vpx_codec_control(&codec, VP8_SET_POSTPROC, &pp))
|
||||||
die_codec(&codec, "Failed to turn on postproc");
|
die_codec(&codec, "Failed to turn on postproc");
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ Initializing The Codec
|
|||||||
----------------------
|
----------------------
|
||||||
The decoder is initialized by the following code. This is an example for
|
The decoder is initialized by the following code. This is an example for
|
||||||
the VP8 decoder, but the code is analogous for all algorithms. Replace
|
the VP8 decoder, but the code is analogous for all algorithms. Replace
|
||||||
`&vpx_codec_vp8_dx_algo` with a pointer to the interface exposed by the
|
`vpx_codec_vp8_dx()` with a pointer to the interface exposed by the
|
||||||
algorithm you want to use. The `cfg` argument is left as NULL in this
|
algorithm you want to use. The `cfg` argument is left as NULL in this
|
||||||
example, because we want the algorithm to determine the stream
|
example, because we want the algorithm to determine the stream
|
||||||
configuration (width/height) and allocate memory automatically. This
|
configuration (width/height) and allocate memory automatically. This
|
||||||
|
|||||||
@@ -71,5 +71,17 @@ Pass Progress Reporting
|
|||||||
It's sometimes helpful to see when each pass completes.
|
It's sometimes helpful to see when each pass completes.
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ TWOPASS_LOOP_END
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ TWOPASS_LOOP_END
|
||||||
printf("Pass %d complete.\n", pass+1);
|
printf("Pass %d complete.\n", pass+1);
|
||||||
|
if(vpx_codec_destroy(&codec))
|
||||||
|
die_codec(&codec, "Failed to destroy codec");
|
||||||
}
|
}
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ TWOPASS_LOOP_END
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ TWOPASS_LOOP_END
|
||||||
|
|
||||||
|
|
||||||
|
Clean-up
|
||||||
|
-----------------------------
|
||||||
|
Destruction of the encoder instance must be done on each pass. The
|
||||||
|
raw image should be destroyed at the end as usual.
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DESTROY
|
||||||
|
vpx_img_free(&raw);
|
||||||
|
free(stats.buf);
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DESTROY
|
||||||
|
|||||||
@@ -1,143 +0,0 @@
|
|||||||
@TEMPLATE encoder_tmpl.c
|
|
||||||
VP8 Scalable Frame Patterns
|
|
||||||
===========================
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ INTRODUCTION
|
|
||||||
This is an example demonstrating how to control the VP8 encoder's
|
|
||||||
reference frame selection and update mechanism for video applications
|
|
||||||
that benefit from a scalable bitstream.
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ INTRODUCTION
|
|
||||||
|
|
||||||
|
|
||||||
Configuration
|
|
||||||
-------------
|
|
||||||
Scalable frame patterns are most useful in an error resilient context,
|
|
||||||
so error resiliency mode is enabled, as in the `error_resilient.c`
|
|
||||||
example. In addition, we want to disable automatic keyframe selection,
|
|
||||||
so we force an interval of 1000 frames.
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_SET_CFG2
|
|
||||||
|
|
||||||
/* Enable error resilient mode */
|
|
||||||
cfg.g_error_resilient = 1;
|
|
||||||
cfg.g_lag_in_frames = 0;
|
|
||||||
cfg.kf_mode = VPX_KF_FIXED;
|
|
||||||
|
|
||||||
/* Disable automatic keyframe placement */
|
|
||||||
cfg.kf_min_dist = cfg.kf_max_dist = 1000;
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_SET_CFG2
|
|
||||||
|
|
||||||
This example uses the following frame pattern (L->last_frame,
|
|
||||||
G->golden_frame, A->alt_ref_frame):
|
|
||||||
|
|
||||||
* Frame 0 Intra, use none, update L&G&A
|
|
||||||
* Frame 1 Inter, use LGA, update none
|
|
||||||
* Frame 2 Inter, use LGA, update L
|
|
||||||
* Frame 3 Inter, use LGA, update none
|
|
||||||
* Frame 4 Inter, use GA, update L&G
|
|
||||||
* Frame 5 Inter, use LGA, update none
|
|
||||||
* Frame 6 Inter, use LGA, update L
|
|
||||||
* Frame 7 Inter, use LGA, update none
|
|
||||||
* Frame 8 Inter, use A, update L&G&A
|
|
||||||
* Frame 9 Inter, use LGA, update none
|
|
||||||
* Frame 10 Inter, use LGA, update L
|
|
||||||
* Frame 11 Inter, use LGA, update none
|
|
||||||
* Frame 12 Inter, use GA, update L&G
|
|
||||||
* Frame 13 Inter, use LGA, update none
|
|
||||||
* Frame 14 Inter, use LGA, update L
|
|
||||||
* Frame 15 Inter, use LGA, update none
|
|
||||||
* ...Repeats the pattern from frame 0
|
|
||||||
|
|
||||||
Change this variable to test the 3 decodable streams case.
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ TWOPASS_VARS
|
|
||||||
int num_streams = 5;
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ TWOPASS_VARS
|
|
||||||
|
|
||||||
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PER_FRAME_CFG
|
|
||||||
flags = 0;
|
|
||||||
if(num_streams == 5)
|
|
||||||
{
|
|
||||||
switch(frame_cnt % 16) {
|
|
||||||
case 0:
|
|
||||||
flags |= VPX_EFLAG_FORCE_KF;
|
|
||||||
flags |= VP8_EFLAG_FORCE_GF;
|
|
||||||
flags |= VP8_EFLAG_FORCE_ARF;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
case 3:
|
|
||||||
case 5:
|
|
||||||
case 7:
|
|
||||||
case 9:
|
|
||||||
case 11:
|
|
||||||
case 13:
|
|
||||||
case 15:
|
|
||||||
flags |= VP8_EFLAG_NO_UPD_LAST;
|
|
||||||
flags |= VP8_EFLAG_NO_UPD_GF;
|
|
||||||
flags |= VP8_EFLAG_NO_UPD_ARF;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
case 6:
|
|
||||||
case 10:
|
|
||||||
case 14:
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
flags |= VP8_EFLAG_NO_REF_LAST;
|
|
||||||
flags |= VP8_EFLAG_FORCE_GF;
|
|
||||||
break;
|
|
||||||
case 8:
|
|
||||||
flags |= VP8_EFLAG_NO_REF_LAST;
|
|
||||||
flags |= VP8_EFLAG_NO_REF_GF;
|
|
||||||
flags |= VP8_EFLAG_FORCE_GF;
|
|
||||||
flags |= VP8_EFLAG_FORCE_ARF;
|
|
||||||
break;
|
|
||||||
case 12:
|
|
||||||
flags |= VP8_EFLAG_NO_REF_LAST;
|
|
||||||
flags |= VP8_EFLAG_FORCE_GF;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
switch(frame_cnt % 9) {
|
|
||||||
case 0:
|
|
||||||
if(frame_cnt==0)
|
|
||||||
{
|
|
||||||
flags |= VPX_EFLAG_FORCE_KF;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
cfg.rc_max_quantizer = 26;
|
|
||||||
cfg.rc_min_quantizer = 0;
|
|
||||||
cfg.rc_target_bitrate = 300;
|
|
||||||
flags |= VP8_EFLAG_NO_REF_LAST;
|
|
||||||
flags |= VP8_EFLAG_NO_REF_ARF;
|
|
||||||
}
|
|
||||||
flags |= VP8_EFLAG_FORCE_GF;
|
|
||||||
flags |= VP8_EFLAG_FORCE_ARF;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
case 2:
|
|
||||||
case 4:
|
|
||||||
case 5:
|
|
||||||
case 7:
|
|
||||||
case 8:
|
|
||||||
cfg.rc_max_quantizer = 45;
|
|
||||||
cfg.rc_min_quantizer = 0;
|
|
||||||
cfg.rc_target_bitrate = 230;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
case 6:
|
|
||||||
cfg.rc_max_quantizer = 45;
|
|
||||||
cfg.rc_min_quantizer = 0;
|
|
||||||
cfg.rc_target_bitrate = 215;
|
|
||||||
flags |= VP8_EFLAG_NO_REF_LAST;
|
|
||||||
flags |= VP8_EFLAG_FORCE_ARF;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PER_FRAME_CFG
|
|
||||||
|
|
||||||
Observing The Effects
|
|
||||||
---------------------
|
|
||||||
Use the `decode_with_drops` example to decode with various dropped frame
|
|
||||||
patterns. Good patterns to start with are 1/2, 3/4, 7/8, and 15/16
|
|
||||||
drops.
|
|
||||||
294
libmkv/EbmlIDs.h
294
libmkv/EbmlIDs.h
@@ -1,16 +1,16 @@
|
|||||||
// Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
/*
|
||||||
//
|
* Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
||||||
// Use of this source code is governed by a BSD-style license
|
*
|
||||||
// that can be found in the LICENSE file in the root of the source
|
* Use of this source code is governed by a BSD-style license
|
||||||
// tree. An additional intellectual property rights grant can be found
|
* that can be found in the LICENSE file in the root of the source
|
||||||
// in the file PATENTS. All contributing project authors may
|
* tree. An additional intellectual property rights grant can be found
|
||||||
// be found in the AUTHORS file in the root of the source tree.
|
* in the file PATENTS. All contributing project authors may
|
||||||
|
* be found in the AUTHORS file in the root of the source tree.
|
||||||
|
*/
|
||||||
#ifndef MKV_DEFS_HPP
|
#ifndef MKV_DEFS_HPP
|
||||||
#define MKV_DEFS_HPP 1
|
#define MKV_DEFS_HPP 1
|
||||||
|
|
||||||
//Commenting out values not available in webm, but available in matroska
|
/* Commenting out values not available in webm, but available in matroska */
|
||||||
|
|
||||||
enum mkv
|
enum mkv
|
||||||
{
|
{
|
||||||
@@ -22,7 +22,7 @@ enum mkv
|
|||||||
DocType = 0x4282,
|
DocType = 0x4282,
|
||||||
DocTypeVersion = 0x4287,
|
DocTypeVersion = 0x4287,
|
||||||
DocTypeReadVersion = 0x4285,
|
DocTypeReadVersion = 0x4285,
|
||||||
// CRC_32 = 0xBF,
|
/* CRC_32 = 0xBF, */
|
||||||
Void = 0xEC,
|
Void = 0xEC,
|
||||||
SignatureSlot = 0x1B538667,
|
SignatureSlot = 0x1B538667,
|
||||||
SignatureAlgo = 0x7E8A,
|
SignatureAlgo = 0x7E8A,
|
||||||
@@ -32,61 +32,61 @@ enum mkv
|
|||||||
SignatureElements = 0x7E5B,
|
SignatureElements = 0x7E5B,
|
||||||
SignatureElementList = 0x7E7B,
|
SignatureElementList = 0x7E7B,
|
||||||
SignedElement = 0x6532,
|
SignedElement = 0x6532,
|
||||||
//segment
|
/* segment */
|
||||||
Segment = 0x18538067,
|
Segment = 0x18538067,
|
||||||
//Meta Seek Information
|
/* Meta Seek Information */
|
||||||
SeekHead = 0x114D9B74,
|
SeekHead = 0x114D9B74,
|
||||||
Seek = 0x4DBB,
|
Seek = 0x4DBB,
|
||||||
SeekID = 0x53AB,
|
SeekID = 0x53AB,
|
||||||
SeekPosition = 0x53AC,
|
SeekPosition = 0x53AC,
|
||||||
//Segment Information
|
/* Segment Information */
|
||||||
Info = 0x1549A966,
|
Info = 0x1549A966,
|
||||||
// SegmentUID = 0x73A4,
|
/* SegmentUID = 0x73A4, */
|
||||||
// SegmentFilename = 0x7384,
|
/* SegmentFilename = 0x7384, */
|
||||||
// PrevUID = 0x3CB923,
|
/* PrevUID = 0x3CB923, */
|
||||||
// PrevFilename = 0x3C83AB,
|
/* PrevFilename = 0x3C83AB, */
|
||||||
// NextUID = 0x3EB923,
|
/* NextUID = 0x3EB923, */
|
||||||
// NextFilename = 0x3E83BB,
|
/* NextFilename = 0x3E83BB, */
|
||||||
// SegmentFamily = 0x4444,
|
/* SegmentFamily = 0x4444, */
|
||||||
// ChapterTranslate = 0x6924,
|
/* ChapterTranslate = 0x6924, */
|
||||||
// ChapterTranslateEditionUID = 0x69FC,
|
/* ChapterTranslateEditionUID = 0x69FC, */
|
||||||
// ChapterTranslateCodec = 0x69BF,
|
/* ChapterTranslateCodec = 0x69BF, */
|
||||||
// ChapterTranslateID = 0x69A5,
|
/* ChapterTranslateID = 0x69A5, */
|
||||||
TimecodeScale = 0x2AD7B1,
|
TimecodeScale = 0x2AD7B1,
|
||||||
Segment_Duration = 0x4489,
|
Segment_Duration = 0x4489,
|
||||||
DateUTC = 0x4461,
|
DateUTC = 0x4461,
|
||||||
// Title = 0x7BA9,
|
/* Title = 0x7BA9, */
|
||||||
MuxingApp = 0x4D80,
|
MuxingApp = 0x4D80,
|
||||||
WritingApp = 0x5741,
|
WritingApp = 0x5741,
|
||||||
//Cluster
|
/* Cluster */
|
||||||
Cluster = 0x1F43B675,
|
Cluster = 0x1F43B675,
|
||||||
Timecode = 0xE7,
|
Timecode = 0xE7,
|
||||||
// SilentTracks = 0x5854,
|
/* SilentTracks = 0x5854, */
|
||||||
// SilentTrackNumber = 0x58D7,
|
/* SilentTrackNumber = 0x58D7, */
|
||||||
// Position = 0xA7,
|
/* Position = 0xA7, */
|
||||||
PrevSize = 0xAB,
|
PrevSize = 0xAB,
|
||||||
BlockGroup = 0xA0,
|
BlockGroup = 0xA0,
|
||||||
Block = 0xA1,
|
Block = 0xA1,
|
||||||
// BlockVirtual = 0xA2,
|
/* BlockVirtual = 0xA2, */
|
||||||
// BlockAdditions = 0x75A1,
|
/* BlockAdditions = 0x75A1, */
|
||||||
// BlockMore = 0xA6,
|
/* BlockMore = 0xA6, */
|
||||||
// BlockAddID = 0xEE,
|
/* BlockAddID = 0xEE, */
|
||||||
// BlockAdditional = 0xA5,
|
/* BlockAdditional = 0xA5, */
|
||||||
BlockDuration = 0x9B,
|
BlockDuration = 0x9B,
|
||||||
// ReferencePriority = 0xFA,
|
/* ReferencePriority = 0xFA, */
|
||||||
ReferenceBlock = 0xFB,
|
ReferenceBlock = 0xFB,
|
||||||
// ReferenceVirtual = 0xFD,
|
/* ReferenceVirtual = 0xFD, */
|
||||||
// CodecState = 0xA4,
|
/* CodecState = 0xA4, */
|
||||||
// Slices = 0x8E,
|
/* Slices = 0x8E, */
|
||||||
// TimeSlice = 0xE8,
|
/* TimeSlice = 0xE8, */
|
||||||
LaceNumber = 0xCC,
|
LaceNumber = 0xCC,
|
||||||
// FrameNumber = 0xCD,
|
/* FrameNumber = 0xCD, */
|
||||||
// BlockAdditionID = 0xCB,
|
/* BlockAdditionID = 0xCB, */
|
||||||
// MkvDelay = 0xCE,
|
/* MkvDelay = 0xCE, */
|
||||||
// Cluster_Duration = 0xCF,
|
/* Cluster_Duration = 0xCF, */
|
||||||
SimpleBlock = 0xA3,
|
SimpleBlock = 0xA3,
|
||||||
// EncryptedBlock = 0xAF,
|
/* EncryptedBlock = 0xAF, */
|
||||||
//Track
|
/* Track */
|
||||||
Tracks = 0x1654AE6B,
|
Tracks = 0x1654AE6B,
|
||||||
TrackEntry = 0xAE,
|
TrackEntry = 0xAE,
|
||||||
TrackNumber = 0xD7,
|
TrackNumber = 0xD7,
|
||||||
@@ -96,31 +96,31 @@ enum mkv
|
|||||||
FlagDefault = 0x88,
|
FlagDefault = 0x88,
|
||||||
FlagForced = 0x55AA,
|
FlagForced = 0x55AA,
|
||||||
FlagLacing = 0x9C,
|
FlagLacing = 0x9C,
|
||||||
// MinCache = 0x6DE7,
|
/* MinCache = 0x6DE7, */
|
||||||
// MaxCache = 0x6DF8,
|
/* MaxCache = 0x6DF8, */
|
||||||
DefaultDuration = 0x23E383,
|
DefaultDuration = 0x23E383,
|
||||||
// TrackTimecodeScale = 0x23314F,
|
/* TrackTimecodeScale = 0x23314F, */
|
||||||
// TrackOffset = 0x537F,
|
/* TrackOffset = 0x537F, */
|
||||||
// MaxBlockAdditionID = 0x55EE,
|
/* MaxBlockAdditionID = 0x55EE, */
|
||||||
Name = 0x536E,
|
Name = 0x536E,
|
||||||
Language = 0x22B59C,
|
Language = 0x22B59C,
|
||||||
CodecID = 0x86,
|
CodecID = 0x86,
|
||||||
CodecPrivate = 0x63A2,
|
CodecPrivate = 0x63A2,
|
||||||
CodecName = 0x258688,
|
CodecName = 0x258688,
|
||||||
// AttachmentLink = 0x7446,
|
/* AttachmentLink = 0x7446, */
|
||||||
// CodecSettings = 0x3A9697,
|
/* CodecSettings = 0x3A9697, */
|
||||||
// CodecInfoURL = 0x3B4040,
|
/* CodecInfoURL = 0x3B4040, */
|
||||||
// CodecDownloadURL = 0x26B240,
|
/* CodecDownloadURL = 0x26B240, */
|
||||||
// CodecDecodeAll = 0xAA,
|
/* CodecDecodeAll = 0xAA, */
|
||||||
// TrackOverlay = 0x6FAB,
|
/* TrackOverlay = 0x6FAB, */
|
||||||
// TrackTranslate = 0x6624,
|
/* TrackTranslate = 0x6624, */
|
||||||
// TrackTranslateEditionUID = 0x66FC,
|
/* TrackTranslateEditionUID = 0x66FC, */
|
||||||
// TrackTranslateCodec = 0x66BF,
|
/* TrackTranslateCodec = 0x66BF, */
|
||||||
// TrackTranslateTrackID = 0x66A5,
|
/* TrackTranslateTrackID = 0x66A5, */
|
||||||
//video
|
/* video */
|
||||||
Video = 0xE0,
|
Video = 0xE0,
|
||||||
FlagInterlaced = 0x9A,
|
FlagInterlaced = 0x9A,
|
||||||
// StereoMode = 0x53B8,
|
StereoMode = 0x53B8,
|
||||||
PixelWidth = 0xB0,
|
PixelWidth = 0xB0,
|
||||||
PixelHeight = 0xBA,
|
PixelHeight = 0xBA,
|
||||||
PixelCropBottom = 0x54AA,
|
PixelCropBottom = 0x54AA,
|
||||||
@@ -131,101 +131,101 @@ enum mkv
|
|||||||
DisplayHeight = 0x54BA,
|
DisplayHeight = 0x54BA,
|
||||||
DisplayUnit = 0x54B2,
|
DisplayUnit = 0x54B2,
|
||||||
AspectRatioType = 0x54B3,
|
AspectRatioType = 0x54B3,
|
||||||
// ColourSpace = 0x2EB524,
|
/* ColourSpace = 0x2EB524, */
|
||||||
// GammaValue = 0x2FB523,
|
/* GammaValue = 0x2FB523, */
|
||||||
FrameRate = 0x2383E3,
|
FrameRate = 0x2383E3,
|
||||||
//end video
|
/* end video */
|
||||||
//audio
|
/* audio */
|
||||||
Audio = 0xE1,
|
Audio = 0xE1,
|
||||||
SamplingFrequency = 0xB5,
|
SamplingFrequency = 0xB5,
|
||||||
OutputSamplingFrequency = 0x78B5,
|
OutputSamplingFrequency = 0x78B5,
|
||||||
Channels = 0x9F,
|
Channels = 0x9F,
|
||||||
// ChannelPositions = 0x7D7B,
|
/* ChannelPositions = 0x7D7B, */
|
||||||
BitDepth = 0x6264,
|
BitDepth = 0x6264,
|
||||||
//end audio
|
/* end audio */
|
||||||
//content encoding
|
/* content encoding */
|
||||||
// ContentEncodings = 0x6d80,
|
/* ContentEncodings = 0x6d80, */
|
||||||
// ContentEncoding = 0x6240,
|
/* ContentEncoding = 0x6240, */
|
||||||
// ContentEncodingOrder = 0x5031,
|
/* ContentEncodingOrder = 0x5031, */
|
||||||
// ContentEncodingScope = 0x5032,
|
/* ContentEncodingScope = 0x5032, */
|
||||||
// ContentEncodingType = 0x5033,
|
/* ContentEncodingType = 0x5033, */
|
||||||
// ContentCompression = 0x5034,
|
/* ContentCompression = 0x5034, */
|
||||||
// ContentCompAlgo = 0x4254,
|
/* ContentCompAlgo = 0x4254, */
|
||||||
// ContentCompSettings = 0x4255,
|
/* ContentCompSettings = 0x4255, */
|
||||||
// ContentEncryption = 0x5035,
|
/* ContentEncryption = 0x5035, */
|
||||||
// ContentEncAlgo = 0x47e1,
|
/* ContentEncAlgo = 0x47e1, */
|
||||||
// ContentEncKeyID = 0x47e2,
|
/* ContentEncKeyID = 0x47e2, */
|
||||||
// ContentSignature = 0x47e3,
|
/* ContentSignature = 0x47e3, */
|
||||||
// ContentSigKeyID = 0x47e4,
|
/* ContentSigKeyID = 0x47e4, */
|
||||||
// ContentSigAlgo = 0x47e5,
|
/* ContentSigAlgo = 0x47e5, */
|
||||||
// ContentSigHashAlgo = 0x47e6,
|
/* ContentSigHashAlgo = 0x47e6, */
|
||||||
//end content encoding
|
/* end content encoding */
|
||||||
//Cueing Data
|
/* Cueing Data */
|
||||||
Cues = 0x1C53BB6B,
|
Cues = 0x1C53BB6B,
|
||||||
CuePoint = 0xBB,
|
CuePoint = 0xBB,
|
||||||
CueTime = 0xB3,
|
CueTime = 0xB3,
|
||||||
CueTrackPositions = 0xB7,
|
CueTrackPositions = 0xB7,
|
||||||
CueTrack = 0xF7,
|
CueTrack = 0xF7,
|
||||||
CueClusterPosition = 0xF1,
|
CueClusterPosition = 0xF1,
|
||||||
CueBlockNumber = 0x5378,
|
CueBlockNumber = 0x5378
|
||||||
// CueCodecState = 0xEA,
|
/* CueCodecState = 0xEA, */
|
||||||
// CueReference = 0xDB,
|
/* CueReference = 0xDB, */
|
||||||
// CueRefTime = 0x96,
|
/* CueRefTime = 0x96, */
|
||||||
// CueRefCluster = 0x97,
|
/* CueRefCluster = 0x97, */
|
||||||
// CueRefNumber = 0x535F,
|
/* CueRefNumber = 0x535F, */
|
||||||
// CueRefCodecState = 0xEB,
|
/* CueRefCodecState = 0xEB, */
|
||||||
//Attachment
|
/* Attachment */
|
||||||
// Attachments = 0x1941A469,
|
/* Attachments = 0x1941A469, */
|
||||||
// AttachedFile = 0x61A7,
|
/* AttachedFile = 0x61A7, */
|
||||||
// FileDescription = 0x467E,
|
/* FileDescription = 0x467E, */
|
||||||
// FileName = 0x466E,
|
/* FileName = 0x466E, */
|
||||||
// FileMimeType = 0x4660,
|
/* FileMimeType = 0x4660, */
|
||||||
// FileData = 0x465C,
|
/* FileData = 0x465C, */
|
||||||
// FileUID = 0x46AE,
|
/* FileUID = 0x46AE, */
|
||||||
// FileReferral = 0x4675,
|
/* FileReferral = 0x4675, */
|
||||||
//Chapters
|
/* Chapters */
|
||||||
// Chapters = 0x1043A770,
|
/* Chapters = 0x1043A770, */
|
||||||
// EditionEntry = 0x45B9,
|
/* EditionEntry = 0x45B9, */
|
||||||
// EditionUID = 0x45BC,
|
/* EditionUID = 0x45BC, */
|
||||||
// EditionFlagHidden = 0x45BD,
|
/* EditionFlagHidden = 0x45BD, */
|
||||||
// EditionFlagDefault = 0x45DB,
|
/* EditionFlagDefault = 0x45DB, */
|
||||||
// EditionFlagOrdered = 0x45DD,
|
/* EditionFlagOrdered = 0x45DD, */
|
||||||
// ChapterAtom = 0xB6,
|
/* ChapterAtom = 0xB6, */
|
||||||
// ChapterUID = 0x73C4,
|
/* ChapterUID = 0x73C4, */
|
||||||
// ChapterTimeStart = 0x91,
|
/* ChapterTimeStart = 0x91, */
|
||||||
// ChapterTimeEnd = 0x92,
|
/* ChapterTimeEnd = 0x92, */
|
||||||
// ChapterFlagHidden = 0x98,
|
/* ChapterFlagHidden = 0x98, */
|
||||||
// ChapterFlagEnabled = 0x4598,
|
/* ChapterFlagEnabled = 0x4598, */
|
||||||
// ChapterSegmentUID = 0x6E67,
|
/* ChapterSegmentUID = 0x6E67, */
|
||||||
// ChapterSegmentEditionUID = 0x6EBC,
|
/* ChapterSegmentEditionUID = 0x6EBC, */
|
||||||
// ChapterPhysicalEquiv = 0x63C3,
|
/* ChapterPhysicalEquiv = 0x63C3, */
|
||||||
// ChapterTrack = 0x8F,
|
/* ChapterTrack = 0x8F, */
|
||||||
// ChapterTrackNumber = 0x89,
|
/* ChapterTrackNumber = 0x89, */
|
||||||
// ChapterDisplay = 0x80,
|
/* ChapterDisplay = 0x80, */
|
||||||
// ChapString = 0x85,
|
/* ChapString = 0x85, */
|
||||||
// ChapLanguage = 0x437C,
|
/* ChapLanguage = 0x437C, */
|
||||||
// ChapCountry = 0x437E,
|
/* ChapCountry = 0x437E, */
|
||||||
// ChapProcess = 0x6944,
|
/* ChapProcess = 0x6944, */
|
||||||
// ChapProcessCodecID = 0x6955,
|
/* ChapProcessCodecID = 0x6955, */
|
||||||
// ChapProcessPrivate = 0x450D,
|
/* ChapProcessPrivate = 0x450D, */
|
||||||
// ChapProcessCommand = 0x6911,
|
/* ChapProcessCommand = 0x6911, */
|
||||||
// ChapProcessTime = 0x6922,
|
/* ChapProcessTime = 0x6922, */
|
||||||
// ChapProcessData = 0x6933,
|
/* ChapProcessData = 0x6933, */
|
||||||
//Tagging
|
/* Tagging */
|
||||||
// Tags = 0x1254C367,
|
/* Tags = 0x1254C367, */
|
||||||
// Tag = 0x7373,
|
/* Tag = 0x7373, */
|
||||||
// Targets = 0x63C0,
|
/* Targets = 0x63C0, */
|
||||||
// TargetTypeValue = 0x68CA,
|
/* TargetTypeValue = 0x68CA, */
|
||||||
// TargetType = 0x63CA,
|
/* TargetType = 0x63CA, */
|
||||||
// Tagging_TrackUID = 0x63C5,
|
/* Tagging_TrackUID = 0x63C5, */
|
||||||
// Tagging_EditionUID = 0x63C9,
|
/* Tagging_EditionUID = 0x63C9, */
|
||||||
// Tagging_ChapterUID = 0x63C4,
|
/* Tagging_ChapterUID = 0x63C4, */
|
||||||
// AttachmentUID = 0x63C6,
|
/* AttachmentUID = 0x63C6, */
|
||||||
// SimpleTag = 0x67C8,
|
/* SimpleTag = 0x67C8, */
|
||||||
// TagName = 0x45A3,
|
/* TagName = 0x45A3, */
|
||||||
// TagLanguage = 0x447A,
|
/* TagLanguage = 0x447A, */
|
||||||
// TagDefault = 0x4484,
|
/* TagDefault = 0x4484, */
|
||||||
// TagString = 0x4487,
|
/* TagString = 0x4487, */
|
||||||
// TagBinary = 0x4485,
|
/* TagBinary = 0x4485, */
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,27 +1,30 @@
|
|||||||
// Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
/*
|
||||||
//
|
* Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
||||||
// Use of this source code is governed by a BSD-style license
|
*
|
||||||
// that can be found in the LICENSE file in the root of the source
|
* Use of this source code is governed by a BSD-style license
|
||||||
// tree. An additional intellectual property rights grant can be found
|
* that can be found in the LICENSE file in the root of the source
|
||||||
// in the file PATENTS. All contributing project authors may
|
* tree. An additional intellectual property rights grant can be found
|
||||||
// be found in the AUTHORS file in the root of the source tree.
|
* in the file PATENTS. All contributing project authors may
|
||||||
|
* be found in the AUTHORS file in the root of the source tree.
|
||||||
|
*/
|
||||||
#include "EbmlWriter.h"
|
#include "EbmlWriter.h"
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <wchar.h>
|
#include <wchar.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <limits.h>
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER)
|
||||||
#define LITERALU64(n) n
|
#define LITERALU64(n) n
|
||||||
#else
|
#else
|
||||||
#define LITERALU64(n) n##LLU
|
#define LITERALU64(n) n##LLU
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void Ebml_WriteLen(EbmlGlobal *glob, long long val)
|
void Ebml_WriteLen(EbmlGlobal *glob, int64_t val)
|
||||||
{
|
{
|
||||||
//TODO check and make sure we are not > than 0x0100000000000000LLU
|
/* TODO check and make sure we are not > than 0x0100000000000000LLU */
|
||||||
unsigned char size = 8; //size in bytes to output
|
unsigned char size = 8; /* size in bytes to output */
|
||||||
unsigned long long minVal = LITERALU64(0x00000000000000ff); //mask to compare for byte size
|
|
||||||
|
/* mask to compare for byte size */
|
||||||
|
int64_t minVal = 0xff;
|
||||||
|
|
||||||
for (size = 1; size < 8; size ++)
|
for (size = 1; size < 8; size ++)
|
||||||
{
|
{
|
||||||
@@ -31,60 +34,67 @@ void Ebml_WriteLen(EbmlGlobal *glob, long long val)
|
|||||||
minVal = (minVal << 7);
|
minVal = (minVal << 7);
|
||||||
}
|
}
|
||||||
|
|
||||||
val |= (LITERALU64(0x000000000000080) << ((size - 1) * 7));
|
val |= (((uint64_t)0x80) << ((size - 1) * 7));
|
||||||
|
|
||||||
Ebml_Serialize(glob, (void *) &val, size);
|
Ebml_Serialize(glob, (void *) &val, sizeof(val), size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Ebml_WriteString(EbmlGlobal *glob, const char *str)
|
void Ebml_WriteString(EbmlGlobal *glob, const char *str)
|
||||||
{
|
{
|
||||||
const size_t size_ = strlen(str);
|
const size_t size_ = strlen(str);
|
||||||
const unsigned long long size = size_;
|
const uint64_t size = size_;
|
||||||
Ebml_WriteLen(glob, size);
|
Ebml_WriteLen(glob, size);
|
||||||
//TODO: it's not clear from the spec whether the nul terminator
|
/* TODO: it's not clear from the spec whether the nul terminator
|
||||||
//should be serialized too. For now we omit the null terminator.
|
* should be serialized too. For now we omit the null terminator.
|
||||||
Ebml_Write(glob, str, size);
|
*/
|
||||||
|
Ebml_Write(glob, str, (unsigned long)size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Ebml_WriteUTF8(EbmlGlobal *glob, const wchar_t *wstr)
|
void Ebml_WriteUTF8(EbmlGlobal *glob, const wchar_t *wstr)
|
||||||
{
|
{
|
||||||
const size_t strlen = wcslen(wstr);
|
const size_t strlen = wcslen(wstr);
|
||||||
|
|
||||||
//TODO: it's not clear from the spec whether the nul terminator
|
/* TODO: it's not clear from the spec whether the nul terminator
|
||||||
//should be serialized too. For now we include it.
|
* should be serialized too. For now we include it.
|
||||||
const unsigned long long size = strlen;
|
*/
|
||||||
|
const uint64_t size = strlen;
|
||||||
|
|
||||||
Ebml_WriteLen(glob, size);
|
Ebml_WriteLen(glob, size);
|
||||||
Ebml_Write(glob, wstr, size);
|
Ebml_Write(glob, wstr, (unsigned long)size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Ebml_WriteID(EbmlGlobal *glob, unsigned long class_id)
|
void Ebml_WriteID(EbmlGlobal *glob, unsigned long class_id)
|
||||||
{
|
{
|
||||||
|
int len;
|
||||||
|
|
||||||
if (class_id >= 0x01000000)
|
if (class_id >= 0x01000000)
|
||||||
Ebml_Serialize(glob, (void *)&class_id, 4);
|
len = 4;
|
||||||
else if (class_id >= 0x00010000)
|
else if (class_id >= 0x00010000)
|
||||||
Ebml_Serialize(glob, (void *)&class_id, 3);
|
len = 3;
|
||||||
else if (class_id >= 0x00000100)
|
else if (class_id >= 0x00000100)
|
||||||
Ebml_Serialize(glob, (void *)&class_id, 2);
|
len = 2;
|
||||||
else
|
else
|
||||||
Ebml_Serialize(glob, (void *)&class_id, 1);
|
len = 1;
|
||||||
|
|
||||||
|
Ebml_Serialize(glob, (void *)&class_id, sizeof(class_id), len);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Ebml_SerializeUnsigned64(EbmlGlobal *glob, unsigned long class_id, uint64_t ui)
|
void Ebml_SerializeUnsigned64(EbmlGlobal *glob, unsigned long class_id, uint64_t ui)
|
||||||
{
|
{
|
||||||
unsigned char sizeSerialized = 8 | 0x80;
|
unsigned char sizeSerialized = 8 | 0x80;
|
||||||
Ebml_WriteID(glob, class_id);
|
Ebml_WriteID(glob, class_id);
|
||||||
Ebml_Serialize(glob, &sizeSerialized, 1);
|
Ebml_Serialize(glob, &sizeSerialized, sizeof(sizeSerialized), 1);
|
||||||
Ebml_Serialize(glob, &ui, 8);
|
Ebml_Serialize(glob, &ui, sizeof(ui), 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Ebml_SerializeUnsigned(EbmlGlobal *glob, unsigned long class_id, unsigned long ui)
|
void Ebml_SerializeUnsigned(EbmlGlobal *glob, unsigned long class_id, unsigned long ui)
|
||||||
{
|
{
|
||||||
unsigned char size = 8; //size in bytes to output
|
unsigned char size = 8; /* size in bytes to output */
|
||||||
unsigned char sizeSerialized = 0;
|
unsigned char sizeSerialized = 0;
|
||||||
unsigned long minVal;
|
unsigned long minVal;
|
||||||
|
|
||||||
Ebml_WriteID(glob, class_id);
|
Ebml_WriteID(glob, class_id);
|
||||||
minVal = 0x7fLU; //mask to compare for byte size
|
minVal = 0x7fLU; /* mask to compare for byte size */
|
||||||
|
|
||||||
for (size = 1; size < 4; size ++)
|
for (size = 1; size < 4; size ++)
|
||||||
{
|
{
|
||||||
@@ -97,10 +107,10 @@ void Ebml_SerializeUnsigned(EbmlGlobal *glob, unsigned long class_id, unsigned l
|
|||||||
}
|
}
|
||||||
|
|
||||||
sizeSerialized = 0x80 | size;
|
sizeSerialized = 0x80 | size;
|
||||||
Ebml_Serialize(glob, &sizeSerialized, 1);
|
Ebml_Serialize(glob, &sizeSerialized, sizeof(sizeSerialized), 1);
|
||||||
Ebml_Serialize(glob, &ui, size);
|
Ebml_Serialize(glob, &ui, sizeof(ui), size);
|
||||||
}
|
}
|
||||||
//TODO: perhaps this is a poor name for this id serializer helper function
|
/* TODO: perhaps this is a poor name for this id serializer helper function */
|
||||||
void Ebml_SerializeBinary(EbmlGlobal *glob, unsigned long class_id, unsigned long bin)
|
void Ebml_SerializeBinary(EbmlGlobal *glob, unsigned long class_id, unsigned long bin)
|
||||||
{
|
{
|
||||||
int size;
|
int size;
|
||||||
@@ -119,14 +129,14 @@ void Ebml_SerializeFloat(EbmlGlobal *glob, unsigned long class_id, double d)
|
|||||||
unsigned char len = 0x88;
|
unsigned char len = 0x88;
|
||||||
|
|
||||||
Ebml_WriteID(glob, class_id);
|
Ebml_WriteID(glob, class_id);
|
||||||
Ebml_Serialize(glob, &len, 1);
|
Ebml_Serialize(glob, &len, sizeof(len), 1);
|
||||||
Ebml_Serialize(glob, &d, 8);
|
Ebml_Serialize(glob, &d, sizeof(d), 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Ebml_WriteSigned16(EbmlGlobal *glob, short val)
|
void Ebml_WriteSigned16(EbmlGlobal *glob, short val)
|
||||||
{
|
{
|
||||||
signed long out = ((val & 0x003FFFFF) | 0x00200000) << 8;
|
signed long out = ((val & 0x003FFFFF) | 0x00200000) << 8;
|
||||||
Ebml_Serialize(glob, &out, 3);
|
Ebml_Serialize(glob, &out, sizeof(out), 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Ebml_SerializeString(EbmlGlobal *glob, unsigned long class_id, const char *s)
|
void Ebml_SerializeString(EbmlGlobal *glob, unsigned long class_id, const char *s)
|
||||||
@@ -143,7 +153,6 @@ void Ebml_SerializeUTF8(EbmlGlobal *glob, unsigned long class_id, wchar_t *s)
|
|||||||
|
|
||||||
void Ebml_SerializeData(EbmlGlobal *glob, unsigned long class_id, unsigned char *data, unsigned long data_length)
|
void Ebml_SerializeData(EbmlGlobal *glob, unsigned long class_id, unsigned char *data, unsigned long data_length)
|
||||||
{
|
{
|
||||||
unsigned char size = 4;
|
|
||||||
Ebml_WriteID(glob, class_id);
|
Ebml_WriteID(glob, class_id);
|
||||||
Ebml_WriteLen(glob, data_length);
|
Ebml_WriteLen(glob, data_length);
|
||||||
Ebml_Write(glob, data, data_length);
|
Ebml_Write(glob, data, data_length);
|
||||||
@@ -163,4 +172,4 @@ void Ebml_WriteVoid(EbmlGlobal *glob, unsigned long vSize)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO Serialize Date
|
/* TODO Serialize Date */
|
||||||
|
|||||||
@@ -1,26 +1,30 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by a BSD-style license
|
||||||
|
* that can be found in the LICENSE file in the root of the source
|
||||||
|
* tree. An additional intellectual property rights grant can be found
|
||||||
|
* in the file PATENTS. All contributing project authors may
|
||||||
|
* be found in the AUTHORS file in the root of the source tree.
|
||||||
|
*/
|
||||||
#ifndef EBMLWRITER_HPP
|
#ifndef EBMLWRITER_HPP
|
||||||
#define EBMLWRITER_HPP
|
#define EBMLWRITER_HPP
|
||||||
|
|
||||||
// Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
|
||||||
//
|
|
||||||
// Use of this source code is governed by a BSD-style license
|
|
||||||
// that can be found in the LICENSE file in the root of the source
|
|
||||||
// tree. An additional intellectual property rights grant can be found
|
|
||||||
// in the file PATENTS. All contributing project authors may
|
|
||||||
// be found in the AUTHORS file in the root of the source tree.
|
|
||||||
|
|
||||||
//note: you must define write and serialize functions as well as your own EBML_GLOBAL
|
|
||||||
//These functions MUST be implemented
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include "vpx/vpx_integer.h"
|
#include "vpx/vpx_integer.h"
|
||||||
|
|
||||||
|
/* note: you must define write and serialize functions as well as your own
|
||||||
|
* EBML_GLOBAL
|
||||||
|
*
|
||||||
|
* These functions MUST be implemented
|
||||||
|
*/
|
||||||
|
|
||||||
typedef struct EbmlGlobal EbmlGlobal;
|
typedef struct EbmlGlobal EbmlGlobal;
|
||||||
void Ebml_Serialize(EbmlGlobal *glob, const void *, unsigned long);
|
void Ebml_Serialize(EbmlGlobal *glob, const void *, int, unsigned long);
|
||||||
void Ebml_Write(EbmlGlobal *glob, const void *, unsigned long);
|
void Ebml_Write(EbmlGlobal *glob, const void *, unsigned long);
|
||||||
/////
|
|
||||||
|
|
||||||
|
/*****/
|
||||||
|
|
||||||
void Ebml_WriteLen(EbmlGlobal *glob, long long val);
|
void Ebml_WriteLen(EbmlGlobal *glob, int64_t val);
|
||||||
void Ebml_WriteString(EbmlGlobal *glob, const char *str);
|
void Ebml_WriteString(EbmlGlobal *glob, const char *str);
|
||||||
void Ebml_WriteUTF8(EbmlGlobal *glob, const wchar_t *wstr);
|
void Ebml_WriteUTF8(EbmlGlobal *glob, const wchar_t *wstr);
|
||||||
void Ebml_WriteID(EbmlGlobal *glob, unsigned long class_id);
|
void Ebml_WriteID(EbmlGlobal *glob, unsigned long class_id);
|
||||||
@@ -28,11 +32,11 @@ void Ebml_SerializeUnsigned64(EbmlGlobal *glob, unsigned long class_id, uint64_t
|
|||||||
void Ebml_SerializeUnsigned(EbmlGlobal *glob, unsigned long class_id, unsigned long ui);
|
void Ebml_SerializeUnsigned(EbmlGlobal *glob, unsigned long class_id, unsigned long ui);
|
||||||
void Ebml_SerializeBinary(EbmlGlobal *glob, unsigned long class_id, unsigned long ui);
|
void Ebml_SerializeBinary(EbmlGlobal *glob, unsigned long class_id, unsigned long ui);
|
||||||
void Ebml_SerializeFloat(EbmlGlobal *glob, unsigned long class_id, double d);
|
void Ebml_SerializeFloat(EbmlGlobal *glob, unsigned long class_id, double d);
|
||||||
//TODO make this more generic to signed
|
/* TODO make this more generic to signed */
|
||||||
void Ebml_WriteSigned16(EbmlGlobal *glob, short val);
|
void Ebml_WriteSigned16(EbmlGlobal *glob, short val);
|
||||||
void Ebml_SerializeString(EbmlGlobal *glob, unsigned long class_id, const char *s);
|
void Ebml_SerializeString(EbmlGlobal *glob, unsigned long class_id, const char *s);
|
||||||
void Ebml_SerializeUTF8(EbmlGlobal *glob, unsigned long class_id, wchar_t *s);
|
void Ebml_SerializeUTF8(EbmlGlobal *glob, unsigned long class_id, wchar_t *s);
|
||||||
void Ebml_SerializeData(EbmlGlobal *glob, unsigned long class_id, unsigned char *data, unsigned long data_length);
|
void Ebml_SerializeData(EbmlGlobal *glob, unsigned long class_id, unsigned char *data, unsigned long data_length);
|
||||||
void Ebml_WriteVoid(EbmlGlobal *glob, unsigned long vSize);
|
void Ebml_WriteVoid(EbmlGlobal *glob, unsigned long vSize);
|
||||||
//TODO need date function
|
/* TODO need date function */
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -35,11 +35,11 @@ void writeSimpleBlock(EbmlGlobal *glob, unsigned char trackNumber, short timeCod
|
|||||||
Ebml_WriteID(glob, SimpleBlock);
|
Ebml_WriteID(glob, SimpleBlock);
|
||||||
unsigned long blockLength = 4 + dataLength;
|
unsigned long blockLength = 4 + dataLength;
|
||||||
blockLength |= 0x10000000; //TODO check length < 0x0FFFFFFFF
|
blockLength |= 0x10000000; //TODO check length < 0x0FFFFFFFF
|
||||||
Ebml_Serialize(glob, &blockLength, 4);
|
Ebml_Serialize(glob, &blockLength, sizeof(blockLength), 4);
|
||||||
trackNumber |= 0x80; //TODO check track nubmer < 128
|
trackNumber |= 0x80; //TODO check track nubmer < 128
|
||||||
Ebml_Write(glob, &trackNumber, 1);
|
Ebml_Write(glob, &trackNumber, 1);
|
||||||
//Ebml_WriteSigned16(glob, timeCode,2); //this is 3 bytes
|
//Ebml_WriteSigned16(glob, timeCode,2); //this is 3 bytes
|
||||||
Ebml_Serialize(glob, &timeCode, 2);
|
Ebml_Serialize(glob, &timeCode, sizeof(timeCode), 2);
|
||||||
unsigned char flags = 0x00 | (isKeyframe ? 0x80 : 0x00) | (lacingFlag << 1) | discardable;
|
unsigned char flags = 0x00 | (isKeyframe ? 0x80 : 0x00) | (lacingFlag << 1) | discardable;
|
||||||
Ebml_Write(glob, &flags, 1);
|
Ebml_Write(glob, &flags, 1);
|
||||||
Ebml_Write(glob, data, dataLength);
|
Ebml_Write(glob, data, dataLength);
|
||||||
|
|||||||
305
libs.mk
305
libs.mk
@@ -9,12 +9,27 @@
|
|||||||
##
|
##
|
||||||
|
|
||||||
|
|
||||||
|
# ARM assembly files are written in RVCT-style. We use some make magic to
|
||||||
|
# filter those files to allow GCC compilation
|
||||||
|
ifeq ($(ARCH_ARM),yes)
|
||||||
ASM:=$(if $(filter yes,$(CONFIG_GCC)),.asm.s,.asm)
|
ASM:=$(if $(filter yes,$(CONFIG_GCC)),.asm.s,.asm)
|
||||||
|
else
|
||||||
|
ASM:=.asm
|
||||||
|
endif
|
||||||
|
|
||||||
|
CODEC_SRCS-yes += CHANGELOG
|
||||||
CODEC_SRCS-yes += libs.mk
|
CODEC_SRCS-yes += libs.mk
|
||||||
|
|
||||||
|
# If this is a universal (fat) binary, then all the subarchitectures have
|
||||||
|
# already been built and our job is to stitch them together. The
|
||||||
|
# BUILD_LIBVPX variable indicates whether we should be building
|
||||||
|
# (compiling, linking) the library. The LIPO_LIBVPX variable indicates
|
||||||
|
# that we're stitching.
|
||||||
|
$(eval $(if $(filter universal%,$(TOOLCHAIN)),LIPO_LIBVPX,BUILD_LIBVPX):=yes)
|
||||||
|
|
||||||
include $(SRC_PATH_BARE)/vpx/vpx_codec.mk
|
include $(SRC_PATH_BARE)/vpx/vpx_codec.mk
|
||||||
CODEC_SRCS-yes += $(addprefix vpx/,$(call enabled,API_SRCS))
|
CODEC_SRCS-yes += $(addprefix vpx/,$(call enabled,API_SRCS))
|
||||||
|
CODEC_DOC_SRCS += $(addprefix vpx/,$(call enabled,API_DOC_SRCS))
|
||||||
|
|
||||||
include $(SRC_PATH_BARE)/vpx_mem/vpx_mem.mk
|
include $(SRC_PATH_BARE)/vpx_mem/vpx_mem.mk
|
||||||
CODEC_SRCS-yes += $(addprefix vpx_mem/,$(call enabled,MEM_SRCS))
|
CODEC_SRCS-yes += $(addprefix vpx_mem/,$(call enabled,MEM_SRCS))
|
||||||
@@ -22,16 +37,17 @@ CODEC_SRCS-yes += $(addprefix vpx_mem/,$(call enabled,MEM_SRCS))
|
|||||||
include $(SRC_PATH_BARE)/vpx_scale/vpx_scale.mk
|
include $(SRC_PATH_BARE)/vpx_scale/vpx_scale.mk
|
||||||
CODEC_SRCS-yes += $(addprefix vpx_scale/,$(call enabled,SCALE_SRCS))
|
CODEC_SRCS-yes += $(addprefix vpx_scale/,$(call enabled,SCALE_SRCS))
|
||||||
|
|
||||||
|
include $(SRC_PATH_BARE)/vpx_ports/vpx_ports.mk
|
||||||
|
CODEC_SRCS-yes += $(addprefix vpx_ports/,$(call enabled,PORTS_SRCS))
|
||||||
|
|
||||||
|
|
||||||
ifeq ($(CONFIG_VP8_ENCODER),yes)
|
ifeq ($(CONFIG_VP8_ENCODER),yes)
|
||||||
VP8_PREFIX=vp8/
|
VP8_PREFIX=vp8/
|
||||||
include $(SRC_PATH_BARE)/$(VP8_PREFIX)vp8cx.mk
|
include $(SRC_PATH_BARE)/$(VP8_PREFIX)vp8cx.mk
|
||||||
CODEC_SRCS-yes += $(addprefix $(VP8_PREFIX),$(call enabled,VP8_CX_SRCS))
|
CODEC_SRCS-yes += $(addprefix $(VP8_PREFIX),$(call enabled,VP8_CX_SRCS))
|
||||||
CODEC_EXPORTS-yes += $(addprefix $(VP8_PREFIX),$(VP8_CX_EXPORTS))
|
CODEC_EXPORTS-yes += $(addprefix $(VP8_PREFIX),$(VP8_CX_EXPORTS))
|
||||||
CODEC_SRCS-yes += $(VP8_PREFIX)vp8cx.mk vpx/vp8.h vpx/vp8cx.h vpx/vp8e.h
|
INSTALL-LIBS-yes += include/vpx/vp8.h include/vpx/vp8cx.h
|
||||||
INSTALL-LIBS-yes += include/vpx/vp8.h include/vpx/vp8e.h include/vpx/vp8cx.h
|
|
||||||
INSTALL_MAPS += include/vpx/% $(SRC_PATH_BARE)/$(VP8_PREFIX)/%
|
INSTALL_MAPS += include/vpx/% $(SRC_PATH_BARE)/$(VP8_PREFIX)/%
|
||||||
CODEC_DOC_SRCS += vpx/vp8.h vpx/vp8cx.h
|
|
||||||
CODEC_DOC_SECTIONS += vp8 vp8_encoder
|
CODEC_DOC_SECTIONS += vp8 vp8_encoder
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@@ -40,10 +56,8 @@ ifeq ($(CONFIG_VP8_DECODER),yes)
|
|||||||
include $(SRC_PATH_BARE)/$(VP8_PREFIX)vp8dx.mk
|
include $(SRC_PATH_BARE)/$(VP8_PREFIX)vp8dx.mk
|
||||||
CODEC_SRCS-yes += $(addprefix $(VP8_PREFIX),$(call enabled,VP8_DX_SRCS))
|
CODEC_SRCS-yes += $(addprefix $(VP8_PREFIX),$(call enabled,VP8_DX_SRCS))
|
||||||
CODEC_EXPORTS-yes += $(addprefix $(VP8_PREFIX),$(VP8_DX_EXPORTS))
|
CODEC_EXPORTS-yes += $(addprefix $(VP8_PREFIX),$(VP8_DX_EXPORTS))
|
||||||
CODEC_SRCS-yes += $(VP8_PREFIX)vp8dx.mk vpx/vp8.h vpx/vp8dx.h
|
|
||||||
INSTALL-LIBS-yes += include/vpx/vp8.h include/vpx/vp8dx.h
|
INSTALL-LIBS-yes += include/vpx/vp8.h include/vpx/vp8dx.h
|
||||||
INSTALL_MAPS += include/vpx/% $(SRC_PATH_BARE)/$(VP8_PREFIX)/%
|
INSTALL_MAPS += include/vpx/% $(SRC_PATH_BARE)/$(VP8_PREFIX)/%
|
||||||
CODEC_DOC_SRCS += vpx/vp8.h vpx/vp8dx.h
|
|
||||||
CODEC_DOC_SECTIONS += vp8 vp8_decoder
|
CODEC_DOC_SECTIONS += vp8 vp8_decoder
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@@ -58,6 +72,7 @@ endif
|
|||||||
|
|
||||||
ifeq ($(CONFIG_MSVS),yes)
|
ifeq ($(CONFIG_MSVS),yes)
|
||||||
CODEC_LIB=$(if $(CONFIG_STATIC_MSVCRT),vpxmt,vpxmd)
|
CODEC_LIB=$(if $(CONFIG_STATIC_MSVCRT),vpxmt,vpxmd)
|
||||||
|
GTEST_LIB=$(if $(CONFIG_STATIC_MSVCRT),gtestmt,gtestmd)
|
||||||
# This variable uses deferred expansion intentionally, since the results of
|
# This variable uses deferred expansion intentionally, since the results of
|
||||||
# $(wildcard) may change during the course of the Make.
|
# $(wildcard) may change during the course of the Make.
|
||||||
VS_PLATFORMS = $(foreach d,$(wildcard */Release/$(CODEC_LIB).lib),$(word 1,$(subst /, ,$(d))))
|
VS_PLATFORMS = $(foreach d,$(wildcard */Release/$(CODEC_LIB).lib),$(word 1,$(subst /, ,$(d))))
|
||||||
@@ -74,27 +89,10 @@ INSTALL_MAPS += $(foreach p,$(VS_PLATFORMS),$(LIBSUBDIR)/$(p)/% $(p)/Release/%)
|
|||||||
INSTALL_MAPS += $(foreach p,$(VS_PLATFORMS),$(LIBSUBDIR)/$(p)/% $(p)/Debug/%)
|
INSTALL_MAPS += $(foreach p,$(VS_PLATFORMS),$(LIBSUBDIR)/$(p)/% $(p)/Debug/%)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# If this is a universal (fat) binary, then all the subarchitectures have
|
|
||||||
# already been built and our job is to stitch them together. The
|
|
||||||
# BUILD_LIBVPX variable indicates whether we should be building
|
|
||||||
# (compiling, linking) the library. The LIPO_LIBVPX variable indicates
|
|
||||||
# that we're stitching.
|
|
||||||
$(eval $(if $(filter universal%,$(TOOLCHAIN)),LIPO_LIBVPX,BUILD_LIBVPX):=yes)
|
|
||||||
|
|
||||||
CODEC_SRCS-$(BUILD_LIBVPX) += build/make/version.sh
|
CODEC_SRCS-$(BUILD_LIBVPX) += build/make/version.sh
|
||||||
CODEC_SRCS-$(BUILD_LIBVPX) += vpx/vpx_integer.h
|
CODEC_SRCS-$(BUILD_LIBVPX) += build/make/rtcd.sh
|
||||||
CODEC_SRCS-$(BUILD_LIBVPX) += vpx_ports/vpx_timer.h
|
|
||||||
CODEC_SRCS-$(BUILD_LIBVPX) += vpx_ports/mem.h
|
|
||||||
CODEC_SRCS-$(BUILD_LIBVPX) += $(BUILD_PFX)vpx_config.c
|
CODEC_SRCS-$(BUILD_LIBVPX) += $(BUILD_PFX)vpx_config.c
|
||||||
INSTALL-SRCS-no += $(BUILD_PFX)vpx_config.c
|
INSTALL-SRCS-no += $(BUILD_PFX)vpx_config.c
|
||||||
ifeq ($(ARCH_X86)$(ARCH_X86_64),yes)
|
|
||||||
CODEC_SRCS-$(BUILD_LIBVPX) += vpx_ports/emms.asm
|
|
||||||
CODEC_SRCS-$(BUILD_LIBVPX) += vpx_ports/x86.h
|
|
||||||
CODEC_SRCS-$(BUILD_LIBVPX) += vpx_ports/x86_abi_support.asm
|
|
||||||
CODEC_SRCS-$(BUILD_LIBVPX) += vpx_ports/x86_cpuid.c
|
|
||||||
endif
|
|
||||||
CODEC_SRCS-$(ARCH_ARM) += vpx_ports/arm_cpudetect.c
|
|
||||||
CODEC_SRCS-$(ARCH_ARM) += $(BUILD_PFX)vpx_config.asm
|
|
||||||
CODEC_EXPORTS-$(BUILD_LIBVPX) += vpx/exports_com
|
CODEC_EXPORTS-$(BUILD_LIBVPX) += vpx/exports_com
|
||||||
CODEC_EXPORTS-$(CONFIG_ENCODERS) += vpx/exports_enc
|
CODEC_EXPORTS-$(CONFIG_ENCODERS) += vpx/exports_enc
|
||||||
CODEC_EXPORTS-$(CONFIG_DECODERS) += vpx/exports_dec
|
CODEC_EXPORTS-$(CONFIG_DECODERS) += vpx/exports_dec
|
||||||
@@ -105,7 +103,6 @@ INSTALL-LIBS-yes += include/vpx/vpx_integer.h
|
|||||||
INSTALL-LIBS-yes += include/vpx/vpx_codec_impl_top.h
|
INSTALL-LIBS-yes += include/vpx/vpx_codec_impl_top.h
|
||||||
INSTALL-LIBS-yes += include/vpx/vpx_codec_impl_bottom.h
|
INSTALL-LIBS-yes += include/vpx/vpx_codec_impl_bottom.h
|
||||||
INSTALL-LIBS-$(CONFIG_DECODERS) += include/vpx/vpx_decoder.h
|
INSTALL-LIBS-$(CONFIG_DECODERS) += include/vpx/vpx_decoder.h
|
||||||
INSTALL-LIBS-$(CONFIG_DECODERS) += include/vpx/vpx_decoder_compat.h
|
|
||||||
INSTALL-LIBS-$(CONFIG_ENCODERS) += include/vpx/vpx_encoder.h
|
INSTALL-LIBS-$(CONFIG_ENCODERS) += include/vpx/vpx_encoder.h
|
||||||
ifeq ($(CONFIG_EXTERNAL_BUILD),yes)
|
ifeq ($(CONFIG_EXTERNAL_BUILD),yes)
|
||||||
ifeq ($(CONFIG_MSVS),yes)
|
ifeq ($(CONFIG_MSVS),yes)
|
||||||
@@ -115,50 +112,52 @@ INSTALL-LIBS-$(CONFIG_SHARED) += $(foreach p,$(VS_PLATFORMS),$(LIBSUBDIR)/$(p)/v
|
|||||||
INSTALL-LIBS-$(CONFIG_SHARED) += $(foreach p,$(VS_PLATFORMS),$(LIBSUBDIR)/$(p)/vpx.exp)
|
INSTALL-LIBS-$(CONFIG_SHARED) += $(foreach p,$(VS_PLATFORMS),$(LIBSUBDIR)/$(p)/vpx.exp)
|
||||||
endif
|
endif
|
||||||
else
|
else
|
||||||
INSTALL-LIBS-yes += $(LIBSUBDIR)/libvpx.a
|
INSTALL-LIBS-$(CONFIG_STATIC) += $(LIBSUBDIR)/libvpx.a
|
||||||
INSTALL-LIBS-$(CONFIG_DEBUG_LIBS) += $(LIBSUBDIR)/libvpx_g.a
|
INSTALL-LIBS-$(CONFIG_DEBUG_LIBS) += $(LIBSUBDIR)/libvpx_g.a
|
||||||
endif
|
endif
|
||||||
|
|
||||||
CODEC_SRCS=$(call enabled,CODEC_SRCS)
|
CODEC_SRCS=$(filter-out %_test.cc,$(call enabled,CODEC_SRCS))
|
||||||
INSTALL-SRCS-$(CONFIG_CODEC_SRCS) += $(CODEC_SRCS)
|
INSTALL-SRCS-$(CONFIG_CODEC_SRCS) += $(CODEC_SRCS)
|
||||||
INSTALL-SRCS-$(CONFIG_CODEC_SRCS) += $(call enabled,CODEC_EXPORTS)
|
INSTALL-SRCS-$(CONFIG_CODEC_SRCS) += $(call enabled,CODEC_EXPORTS)
|
||||||
|
|
||||||
|
|
||||||
|
# Generate a list of all enabled sources, in particular for exporting to gyp
|
||||||
|
# based build systems.
|
||||||
|
libvpx_srcs.txt:
|
||||||
|
@echo " [CREATE] $@"
|
||||||
|
@echo $(CODEC_SRCS) | xargs -n1 echo | sort -u > $@
|
||||||
|
|
||||||
|
|
||||||
ifeq ($(CONFIG_EXTERNAL_BUILD),yes)
|
ifeq ($(CONFIG_EXTERNAL_BUILD),yes)
|
||||||
ifeq ($(CONFIG_MSVS),yes)
|
ifeq ($(CONFIG_MSVS),yes)
|
||||||
|
|
||||||
ifeq ($(ARCH_ARM),yes)
|
|
||||||
ifeq ($(HAVE_ARMV5TE),yes)
|
|
||||||
ARM_ARCH=v5
|
|
||||||
endif
|
|
||||||
ifeq ($(HAVE_ARMV6),yes)
|
|
||||||
ARM_ARCH=v6
|
|
||||||
endif
|
|
||||||
obj_int_extract.vcproj: $(SRC_PATH_BARE)/build/make/obj_int_extract.c
|
obj_int_extract.vcproj: $(SRC_PATH_BARE)/build/make/obj_int_extract.c
|
||||||
@cp $(SRC_PATH_BARE)/build/arm-wince-vs8/obj_int_extract.bat .
|
@cp $(SRC_PATH_BARE)/build/x86-msvs/obj_int_extract.bat .
|
||||||
@echo " [CREATE] $@"
|
@echo " [CREATE] $@"
|
||||||
$(SRC_PATH_BARE)/build/make/gen_msvs_proj.sh\
|
$(qexec)$(SRC_PATH_BARE)/build/make/gen_msvs_proj.sh \
|
||||||
--exe \
|
--exe \
|
||||||
--target=$(TOOLCHAIN) \
|
--target=$(TOOLCHAIN) \
|
||||||
$(if $(CONFIG_STATIC_MSVCRT),--static-crt) \
|
|
||||||
--name=obj_int_extract \
|
--name=obj_int_extract \
|
||||||
|
--ver=$(CONFIG_VS_VERSION) \
|
||||||
--proj-guid=E1360C65-D375-4335-8057-7ED99CC3F9B2 \
|
--proj-guid=E1360C65-D375-4335-8057-7ED99CC3F9B2 \
|
||||||
|
$(if $(CONFIG_STATIC_MSVCRT),--static-crt) \
|
||||||
--out=$@ $^ \
|
--out=$@ $^ \
|
||||||
-I".";"$(SRC_PATH_BARE)"
|
-I. \
|
||||||
|
-I"$(SRC_PATH_BARE)" \
|
||||||
|
|
||||||
PROJECTS-$(BUILD_LIBVPX) += obj_int_extract.vcproj
|
PROJECTS-$(BUILD_LIBVPX) += obj_int_extract.vcproj
|
||||||
PROJECTS-$(BUILD_LIBVPX) += obj_int_extract.bat
|
PROJECTS-$(BUILD_LIBVPX) += obj_int_extract.bat
|
||||||
endif
|
|
||||||
|
|
||||||
vpx.def: $(call enabled,CODEC_EXPORTS)
|
vpx.def: $(call enabled,CODEC_EXPORTS)
|
||||||
@echo " [CREATE] $@"
|
@echo " [CREATE] $@"
|
||||||
$(SRC_PATH_BARE)/build/make/gen_msvs_def.sh\
|
$(qexec)$(SRC_PATH_BARE)/build/make/gen_msvs_def.sh\
|
||||||
--name=vpx\
|
--name=vpx\
|
||||||
--out=$@ $^
|
--out=$@ $^
|
||||||
CLEAN-OBJS += vpx.def
|
CLEAN-OBJS += vpx.def
|
||||||
|
|
||||||
vpx.vcproj: $(CODEC_SRCS) vpx.def
|
vpx.vcproj: $(CODEC_SRCS) vpx.def
|
||||||
@echo " [CREATE] $@"
|
@echo " [CREATE] $@"
|
||||||
$(SRC_PATH_BARE)/build/make/gen_msvs_proj.sh\
|
$(qexec)$(SRC_PATH_BARE)/build/make/gen_msvs_proj.sh \
|
||||||
--lib \
|
--lib \
|
||||||
--target=$(TOOLCHAIN) \
|
--target=$(TOOLCHAIN) \
|
||||||
$(if $(CONFIG_STATIC_MSVCRT),--static-crt) \
|
$(if $(CONFIG_STATIC_MSVCRT),--static-crt) \
|
||||||
@@ -167,23 +166,26 @@ vpx.vcproj: $(CODEC_SRCS) vpx.def
|
|||||||
--module-def=vpx.def \
|
--module-def=vpx.def \
|
||||||
--ver=$(CONFIG_VS_VERSION) \
|
--ver=$(CONFIG_VS_VERSION) \
|
||||||
--out=$@ $(CFLAGS) $^ \
|
--out=$@ $(CFLAGS) $^ \
|
||||||
|
--src-path-bare="$(SRC_PATH_BARE)" \
|
||||||
|
|
||||||
PROJECTS-$(BUILD_LIBVPX) += vpx.vcproj
|
PROJECTS-$(BUILD_LIBVPX) += vpx.vcproj
|
||||||
|
|
||||||
vpx.vcproj: vpx_config.asm
|
vpx.vcproj: vpx_config.asm
|
||||||
|
vpx.vcproj: vpx_rtcd.h
|
||||||
|
|
||||||
endif
|
endif
|
||||||
else
|
else
|
||||||
LIBVPX_OBJS=$(call objs,$(CODEC_SRCS))
|
LIBVPX_OBJS=$(call objs,$(CODEC_SRCS))
|
||||||
OBJS-$(BUILD_LIBVPX) += $(LIBVPX_OBJS)
|
OBJS-$(BUILD_LIBVPX) += $(LIBVPX_OBJS)
|
||||||
LIBS-$(BUILD_LIBVPX) += $(BUILD_PFX)libvpx.a $(BUILD_PFX)libvpx_g.a
|
LIBS-$(if $(BUILD_LIBVPX),$(CONFIG_STATIC)) += $(BUILD_PFX)libvpx.a $(BUILD_PFX)libvpx_g.a
|
||||||
$(BUILD_PFX)libvpx_g.a: $(LIBVPX_OBJS)
|
$(BUILD_PFX)libvpx_g.a: $(LIBVPX_OBJS)
|
||||||
|
|
||||||
BUILD_LIBVPX_SO := $(if $(BUILD_LIBVPX),$(CONFIG_SHARED))
|
BUILD_LIBVPX_SO := $(if $(BUILD_LIBVPX),$(CONFIG_SHARED))
|
||||||
LIBVPX_SO := libvpx.so.$(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_PATCH)
|
LIBVPX_SO := libvpx.so.$(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_PATCH)
|
||||||
LIBS-$(BUILD_LIBVPX_SO) += $(BUILD_PFX)$(LIBVPX_SO)
|
LIBS-$(BUILD_LIBVPX_SO) += $(BUILD_PFX)$(LIBVPX_SO)\
|
||||||
|
$(notdir $(LIBVPX_SO_SYMLINKS))
|
||||||
$(BUILD_PFX)$(LIBVPX_SO): $(LIBVPX_OBJS) libvpx.ver
|
$(BUILD_PFX)$(LIBVPX_SO): $(LIBVPX_OBJS) libvpx.ver
|
||||||
$(BUILD_PFX)$(LIBVPX_SO): extralibs += -lm -pthread
|
$(BUILD_PFX)$(LIBVPX_SO): extralibs += -lm
|
||||||
$(BUILD_PFX)$(LIBVPX_SO): SONAME = libvpx.so.$(VERSION_MAJOR)
|
$(BUILD_PFX)$(LIBVPX_SO): SONAME = libvpx.so.$(VERSION_MAJOR)
|
||||||
$(BUILD_PFX)$(LIBVPX_SO): SO_VERSION_SCRIPT = libvpx.ver
|
$(BUILD_PFX)$(LIBVPX_SO): SO_VERSION_SCRIPT = libvpx.ver
|
||||||
LIBVPX_SO_SYMLINKS := $(addprefix $(LIBSUBDIR)/, \
|
LIBVPX_SO_SYMLINKS := $(addprefix $(LIBSUBDIR)/, \
|
||||||
@@ -197,12 +199,42 @@ libvpx.ver: $(call enabled,CODEC_EXPORTS)
|
|||||||
$(qexec)echo "local: *; };" >> $@
|
$(qexec)echo "local: *; };" >> $@
|
||||||
CLEAN-OBJS += libvpx.ver
|
CLEAN-OBJS += libvpx.ver
|
||||||
|
|
||||||
$(addprefix $(DIST_DIR)/,$(LIBVPX_SO_SYMLINKS)):
|
define libvpx_symlink_template
|
||||||
@echo " [LN] $@"
|
$(1): $(2)
|
||||||
$(qexec)ln -sf $(LIBVPX_SO) $@
|
@echo " [LN] $$@"
|
||||||
|
$(qexec)ln -sf $(LIBVPX_SO) $$@
|
||||||
|
endef
|
||||||
|
|
||||||
|
$(eval $(call libvpx_symlink_template,\
|
||||||
|
$(addprefix $(BUILD_PFX),$(notdir $(LIBVPX_SO_SYMLINKS))),\
|
||||||
|
$(BUILD_PFX)$(LIBVPX_SO)))
|
||||||
|
$(eval $(call libvpx_symlink_template,\
|
||||||
|
$(addprefix $(DIST_DIR)/,$(LIBVPX_SO_SYMLINKS)),\
|
||||||
|
$(DIST_DIR)/$(LIBSUBDIR)/$(LIBVPX_SO)))
|
||||||
|
|
||||||
INSTALL-LIBS-$(CONFIG_SHARED) += $(LIBVPX_SO_SYMLINKS)
|
INSTALL-LIBS-$(CONFIG_SHARED) += $(LIBVPX_SO_SYMLINKS)
|
||||||
INSTALL-LIBS-$(CONFIG_SHARED) += $(LIBSUBDIR)/$(LIBVPX_SO)
|
INSTALL-LIBS-$(CONFIG_SHARED) += $(LIBSUBDIR)/$(LIBVPX_SO)
|
||||||
|
|
||||||
|
LIBS-$(BUILD_LIBVPX) += vpx.pc
|
||||||
|
vpx.pc: config.mk libs.mk
|
||||||
|
@echo " [CREATE] $@"
|
||||||
|
$(qexec)echo '# pkg-config file from libvpx $(VERSION_STRING)' > $@
|
||||||
|
$(qexec)echo 'prefix=$(PREFIX)' >> $@
|
||||||
|
$(qexec)echo 'exec_prefix=$${prefix}' >> $@
|
||||||
|
$(qexec)echo 'libdir=$${prefix}/$(LIBSUBDIR)' >> $@
|
||||||
|
$(qexec)echo 'includedir=$${prefix}/include' >> $@
|
||||||
|
$(qexec)echo '' >> $@
|
||||||
|
$(qexec)echo 'Name: vpx' >> $@
|
||||||
|
$(qexec)echo 'Description: WebM Project VPx codec implementation' >> $@
|
||||||
|
$(qexec)echo 'Version: $(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_PATCH)' >> $@
|
||||||
|
$(qexec)echo 'Requires:' >> $@
|
||||||
|
$(qexec)echo 'Conflicts:' >> $@
|
||||||
|
$(qexec)echo 'Libs: -L$${libdir} -lvpx' >> $@
|
||||||
|
$(qexec)echo 'Libs.private: -lm -lpthread' >> $@
|
||||||
|
$(qexec)echo 'Cflags: -I$${includedir}' >> $@
|
||||||
|
INSTALL-LIBS-yes += $(LIBSUBDIR)/pkgconfig/vpx.pc
|
||||||
|
INSTALL_MAPS += $(LIBSUBDIR)/pkgconfig/%.pc %.pc
|
||||||
|
CLEAN-OBJS += vpx.pc
|
||||||
endif
|
endif
|
||||||
|
|
||||||
LIBS-$(LIPO_LIBVPX) += libvpx.a
|
LIBS-$(LIPO_LIBVPX) += libvpx.a
|
||||||
@@ -230,18 +262,184 @@ endif
|
|||||||
#
|
#
|
||||||
# Add assembler dependencies for configuration and offsets
|
# Add assembler dependencies for configuration and offsets
|
||||||
#
|
#
|
||||||
#$(filter %$(ASM).o,$(OBJS-yes)): $(BUILD_PFX)vpx_config.asm $(BUILD_PFX)vpx_asm_offsets.asm
|
|
||||||
$(filter %.s.o,$(OBJS-yes)): $(BUILD_PFX)vpx_config.asm
|
$(filter %.s.o,$(OBJS-yes)): $(BUILD_PFX)vpx_config.asm
|
||||||
$(filter %.asm.o,$(OBJS-yes)): $(BUILD_PFX)vpx_config.asm
|
$(filter %$(ASM).o,$(OBJS-yes)): $(BUILD_PFX)vpx_config.asm
|
||||||
|
|
||||||
|
#
|
||||||
|
# Calculate platform- and compiler-specific offsets for hand coded assembly
|
||||||
|
#
|
||||||
|
|
||||||
|
OFFSET_PATTERN:='^[a-zA-Z0-9_]* EQU'
|
||||||
|
|
||||||
|
ifeq ($(filter icc gcc,$(TGT_CC)), $(TGT_CC))
|
||||||
|
$(BUILD_PFX)asm_com_offsets.asm: $(BUILD_PFX)$(VP8_PREFIX)common/asm_com_offsets.c.S
|
||||||
|
@echo " [CREATE] $@"
|
||||||
|
$(qexec)LC_ALL=C grep $(OFFSET_PATTERN) $< | tr -d '$$\#' $(ADS2GAS) > $@
|
||||||
|
$(BUILD_PFX)$(VP8_PREFIX)common/asm_com_offsets.c.S: $(VP8_PREFIX)common/asm_com_offsets.c
|
||||||
|
CLEAN-OBJS += $(BUILD_PFX)asm_com_offsets.asm $(BUILD_PFX)$(VP8_PREFIX)common/asm_com_offsets.c.S
|
||||||
|
|
||||||
|
$(BUILD_PFX)asm_enc_offsets.asm: $(BUILD_PFX)$(VP8_PREFIX)encoder/asm_enc_offsets.c.S
|
||||||
|
@echo " [CREATE] $@"
|
||||||
|
$(qexec)LC_ALL=C grep $(OFFSET_PATTERN) $< | tr -d '$$\#' $(ADS2GAS) > $@
|
||||||
|
$(BUILD_PFX)$(VP8_PREFIX)encoder/asm_enc_offsets.c.S: $(VP8_PREFIX)encoder/asm_enc_offsets.c
|
||||||
|
CLEAN-OBJS += $(BUILD_PFX)asm_enc_offsets.asm $(BUILD_PFX)$(VP8_PREFIX)encoder/asm_enc_offsets.c.S
|
||||||
|
|
||||||
|
$(BUILD_PFX)asm_dec_offsets.asm: $(BUILD_PFX)$(VP8_PREFIX)decoder/asm_dec_offsets.c.S
|
||||||
|
@echo " [CREATE] $@"
|
||||||
|
$(qexec)LC_ALL=C grep $(OFFSET_PATTERN) $< | tr -d '$$\#' $(ADS2GAS) > $@
|
||||||
|
$(BUILD_PFX)$(VP8_PREFIX)decoder/asm_dec_offsets.c.S: $(VP8_PREFIX)decoder/asm_dec_offsets.c
|
||||||
|
CLEAN-OBJS += $(BUILD_PFX)asm_dec_offsets.asm $(BUILD_PFX)$(VP8_PREFIX)decoder/asm_dec_offsets.c.S
|
||||||
|
else
|
||||||
|
ifeq ($(filter rvct,$(TGT_CC)), $(TGT_CC))
|
||||||
|
asm_com_offsets.asm: obj_int_extract
|
||||||
|
asm_com_offsets.asm: $(VP8_PREFIX)common/asm_com_offsets.c.o
|
||||||
|
@echo " [CREATE] $@"
|
||||||
|
$(qexec)./obj_int_extract rvds $< $(ADS2GAS) > $@
|
||||||
|
OBJS-yes += $(VP8_PREFIX)common/asm_com_offsets.c.o
|
||||||
|
CLEAN-OBJS += asm_com_offsets.asm
|
||||||
|
$(filter %$(ASM).o,$(OBJS-yes)): $(BUILD_PFX)asm_com_offsets.asm
|
||||||
|
|
||||||
|
asm_enc_offsets.asm: obj_int_extract
|
||||||
|
asm_enc_offsets.asm: $(VP8_PREFIX)encoder/asm_enc_offsets.c.o
|
||||||
|
@echo " [CREATE] $@"
|
||||||
|
$(qexec)./obj_int_extract rvds $< $(ADS2GAS) > $@
|
||||||
|
OBJS-yes += $(VP8_PREFIX)encoder/asm_enc_offsets.c.o
|
||||||
|
CLEAN-OBJS += asm_enc_offsets.asm
|
||||||
|
$(filter %$(ASM).o,$(OBJS-yes)): $(BUILD_PFX)asm_enc_offsets.asm
|
||||||
|
|
||||||
|
asm_dec_offsets.asm: obj_int_extract
|
||||||
|
asm_dec_offsets.asm: $(VP8_PREFIX)decoder/asm_dec_offsets.c.o
|
||||||
|
@echo " [CREATE] $@"
|
||||||
|
$(qexec)./obj_int_extract rvds $< $(ADS2GAS) > $@
|
||||||
|
OBJS-yes += $(VP8_PREFIX)decoder/asm_dec_offsets.c.o
|
||||||
|
CLEAN-OBJS += asm_dec_offsets.asm
|
||||||
|
$(filter %$(ASM).o,$(OBJS-yes)): $(BUILD_PFX)asm_dec_offsets.asm
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
$(shell $(SRC_PATH_BARE)/build/make/version.sh "$(SRC_PATH_BARE)" $(BUILD_PFX)vpx_version.h)
|
$(shell $(SRC_PATH_BARE)/build/make/version.sh "$(SRC_PATH_BARE)" $(BUILD_PFX)vpx_version.h)
|
||||||
CLEAN-OBJS += $(BUILD_PFX)vpx_version.h
|
CLEAN-OBJS += $(BUILD_PFX)vpx_version.h
|
||||||
|
|
||||||
CODEC_DOC_SRCS += vpx/vpx_codec.h \
|
#
|
||||||
vpx/vpx_decoder.h \
|
# Rule to generate runtime cpu detection files
|
||||||
vpx/vpx_encoder.h \
|
#
|
||||||
vpx/vpx_image.h
|
$(BUILD_PFX)vpx_rtcd.h: $(SRC_PATH_BARE)/$(sort $(filter %rtcd_defs.sh,$(CODEC_SRCS)))
|
||||||
|
@echo " [CREATE] $@"
|
||||||
|
$(qexec)$(SRC_PATH_BARE)/build/make/rtcd.sh --arch=$(TGT_ISA) \
|
||||||
|
--sym=vpx_rtcd \
|
||||||
|
--config=$(target)$(if $(FAT_ARCHS),,-$(TOOLCHAIN)).mk \
|
||||||
|
$(RTCD_OPTIONS) $^ > $@
|
||||||
|
CLEAN-OBJS += $(BUILD_PFX)vpx_rtcd.h
|
||||||
|
|
||||||
|
##
|
||||||
|
## libvpx test directives
|
||||||
|
##
|
||||||
|
ifeq ($(CONFIG_UNIT_TESTS),yes)
|
||||||
|
LIBVPX_TEST_DATA_PATH ?= .
|
||||||
|
|
||||||
|
include $(SRC_PATH_BARE)/test/test.mk
|
||||||
|
LIBVPX_TEST_SRCS=$(addprefix test/,$(call enabled,LIBVPX_TEST_SRCS))
|
||||||
|
LIBVPX_TEST_BINS=./test_libvpx
|
||||||
|
LIBVPX_TEST_DATA=$(addprefix $(LIBVPX_TEST_DATA_PATH)/,\
|
||||||
|
$(call enabled,LIBVPX_TEST_DATA))
|
||||||
|
libvpx_test_data_url=http://downloads.webmproject.org/test_data/libvpx/$(1)
|
||||||
|
|
||||||
|
$(LIBVPX_TEST_DATA):
|
||||||
|
@echo " [DOWNLOAD] $@"
|
||||||
|
$(qexec)trap 'rm -f $@' INT TERM &&\
|
||||||
|
curl -L -o $@ $(call libvpx_test_data_url,$(@F))
|
||||||
|
|
||||||
|
testdata:: $(LIBVPX_TEST_DATA)
|
||||||
|
$(qexec)if [ -x "$$(which sha1sum)" ]; then\
|
||||||
|
echo "Checking test data:";\
|
||||||
|
if [ -n "$(LIBVPX_TEST_DATA)" ]; then\
|
||||||
|
for f in $(call enabled,LIBVPX_TEST_DATA); do\
|
||||||
|
grep $$f $(SRC_PATH_BARE)/test/test-data.sha1 |\
|
||||||
|
(cd $(LIBVPX_TEST_DATA_PATH); sha1sum -c);\
|
||||||
|
done; \
|
||||||
|
fi; \
|
||||||
|
else\
|
||||||
|
echo "Skipping test data integrity check, sha1sum not found.";\
|
||||||
|
fi
|
||||||
|
|
||||||
|
ifeq ($(CONFIG_EXTERNAL_BUILD),yes)
|
||||||
|
ifeq ($(CONFIG_MSVS),yes)
|
||||||
|
|
||||||
|
gtest.vcproj: $(SRC_PATH_BARE)/third_party/googletest/src/src/gtest-all.cc
|
||||||
|
@echo " [CREATE] $@"
|
||||||
|
$(qexec)$(SRC_PATH_BARE)/build/make/gen_msvs_proj.sh \
|
||||||
|
--lib \
|
||||||
|
--target=$(TOOLCHAIN) \
|
||||||
|
$(if $(CONFIG_STATIC_MSVCRT),--static-crt) \
|
||||||
|
--name=gtest \
|
||||||
|
--proj-guid=EC00E1EC-AF68-4D92-A255-181690D1C9B1 \
|
||||||
|
--ver=$(CONFIG_VS_VERSION) \
|
||||||
|
--src-path-bare="$(SRC_PATH_BARE)" \
|
||||||
|
--out=gtest.vcproj $(SRC_PATH_BARE)/third_party/googletest/src/src/gtest-all.cc \
|
||||||
|
-I. -I"$(SRC_PATH_BARE)/third_party/googletest/src/include" -I"$(SRC_PATH_BARE)/third_party/googletest/src"
|
||||||
|
|
||||||
|
PROJECTS-$(CONFIG_MSVS) += gtest.vcproj
|
||||||
|
|
||||||
|
test_libvpx.vcproj: $(LIBVPX_TEST_SRCS)
|
||||||
|
@echo " [CREATE] $@"
|
||||||
|
$(qexec)$(SRC_PATH_BARE)/build/make/gen_msvs_proj.sh \
|
||||||
|
--exe \
|
||||||
|
--target=$(TOOLCHAIN) \
|
||||||
|
--name=test_libvpx \
|
||||||
|
--proj-guid=CD837F5F-52D8-4314-A370-895D614166A7 \
|
||||||
|
--ver=$(CONFIG_VS_VERSION) \
|
||||||
|
$(if $(CONFIG_STATIC_MSVCRT),--static-crt) \
|
||||||
|
--out=$@ $(INTERNAL_CFLAGS) $(CFLAGS) \
|
||||||
|
-I. -I"$(SRC_PATH_BARE)/third_party/googletest/src/include" \
|
||||||
|
-L. -l$(CODEC_LIB) -lwinmm -l$(GTEST_LIB) $^
|
||||||
|
|
||||||
|
PROJECTS-$(CONFIG_MSVS) += test_libvpx.vcproj
|
||||||
|
|
||||||
|
test:: testdata
|
||||||
|
@set -e; for t in $(addprefix Win32/Release/,$(notdir $(LIBVPX_TEST_BINS:.cc=.exe))); do $$t; done
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
|
||||||
|
include $(SRC_PATH_BARE)/third_party/googletest/gtest.mk
|
||||||
|
GTEST_SRCS := $(addprefix third_party/googletest/src/,$(call enabled,GTEST_SRCS))
|
||||||
|
GTEST_OBJS=$(call objs,$(GTEST_SRCS))
|
||||||
|
$(GTEST_OBJS) $(GTEST_OBJS:.o=.d): CXXFLAGS += -I$(SRC_PATH_BARE)/third_party/googletest/src
|
||||||
|
$(GTEST_OBJS) $(GTEST_OBJS:.o=.d): CXXFLAGS += -I$(SRC_PATH_BARE)/third_party/googletest/src/include
|
||||||
|
OBJS-$(BUILD_LIBVPX) += $(GTEST_OBJS)
|
||||||
|
LIBS-$(BUILD_LIBVPX) += $(BUILD_PFX)libgtest.a $(BUILD_PFX)libgtest_g.a
|
||||||
|
$(BUILD_PFX)libgtest_g.a: $(GTEST_OBJS)
|
||||||
|
|
||||||
|
LIBVPX_TEST_OBJS=$(sort $(call objs,$(LIBVPX_TEST_SRCS)))
|
||||||
|
$(LIBVPX_TEST_OBJS) $(LIBVPX_TEST_OBJS:.o=.d): CXXFLAGS += -I$(SRC_PATH_BARE)/third_party/googletest/src
|
||||||
|
$(LIBVPX_TEST_OBJS) $(LIBVPX_TEST_OBJS:.o=.d): CXXFLAGS += -I$(SRC_PATH_BARE)/third_party/googletest/src/include
|
||||||
|
OBJS-$(BUILD_LIBVPX) += $(LIBVPX_TEST_OBJS)
|
||||||
|
BINS-$(BUILD_LIBVPX) += $(LIBVPX_TEST_BINS)
|
||||||
|
|
||||||
|
# Install test sources only if codec source is included
|
||||||
|
INSTALL-SRCS-$(CONFIG_CODEC_SRCS) += $(patsubst $(SRC_PATH_BARE)/%,%,\
|
||||||
|
$(shell find $(SRC_PATH_BARE)/third_party/googletest -type f))
|
||||||
|
INSTALL-SRCS-$(CONFIG_CODEC_SRCS) += $(LIBVPX_TEST_SRCS)
|
||||||
|
|
||||||
|
CODEC_LIB=$(if $(CONFIG_DEBUG_LIBS),vpx_g,vpx)
|
||||||
|
CODEC_LIB_SUF=$(if $(CONFIG_SHARED),.so,.a)
|
||||||
|
$(foreach bin,$(LIBVPX_TEST_BINS),\
|
||||||
|
$(if $(BUILD_LIBVPX),$(eval $(bin): \
|
||||||
|
lib$(CODEC_LIB)$(CODEC_LIB_SUF) libgtest.a ))\
|
||||||
|
$(if $(BUILD_LIBVPX),$(eval $(call linkerxx_template,$(bin),\
|
||||||
|
$(LIBVPX_TEST_OBJS) \
|
||||||
|
-L. -lvpx -lgtest -lpthread -lm)\
|
||||||
|
)))\
|
||||||
|
$(if $(LIPO_LIBS),$(eval $(call lipo_bin_template,$(bin))))\
|
||||||
|
|
||||||
|
test:: $(LIBVPX_TEST_BINS) testdata
|
||||||
|
@set -e; for t in $(LIBVPX_TEST_BINS); do $$t; done
|
||||||
|
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
##
|
||||||
|
## documentation directives
|
||||||
|
##
|
||||||
CLEAN-OBJS += libs.doxy
|
CLEAN-OBJS += libs.doxy
|
||||||
DOCS-yes += libs.doxy
|
DOCS-yes += libs.doxy
|
||||||
libs.doxy: $(CODEC_DOC_SRCS)
|
libs.doxy: $(CODEC_DOC_SRCS)
|
||||||
@@ -251,3 +449,6 @@ libs.doxy: $(CODEC_DOC_SRCS)
|
|||||||
@echo "PREDEFINED = VPX_CODEC_DISABLE_COMPAT" >> $@
|
@echo "PREDEFINED = VPX_CODEC_DISABLE_COMPAT" >> $@
|
||||||
@echo "INCLUDE_PATH += ." >> $@;
|
@echo "INCLUDE_PATH += ." >> $@;
|
||||||
@echo "ENABLED_SECTIONS += $(sort $(CODEC_DOC_SECTIONS))" >> $@
|
@echo "ENABLED_SECTIONS += $(sort $(CODEC_DOC_SECTIONS))" >> $@
|
||||||
|
|
||||||
|
## Generate vpx_rtcd.h for all objects
|
||||||
|
$(OBJS-yes:.o=.d): $(BUILD_PFX)vpx_rtcd.h
|
||||||
|
|||||||
18
mainpage.dox
18
mainpage.dox
@@ -12,8 +12,12 @@
|
|||||||
|
|
||||||
This distribution of the WebM VP8 Codec SDK includes the following support:
|
This distribution of the WebM VP8 Codec SDK includes the following support:
|
||||||
|
|
||||||
\if vp8_encoder - \ref vp8_encoder \endif
|
\if vp8_encoder
|
||||||
\if vp8_decoder - \ref vp8_decoder \endif
|
- \ref vp8_encoder
|
||||||
|
\endif
|
||||||
|
\if vp8_decoder
|
||||||
|
- \ref vp8_decoder
|
||||||
|
\endif
|
||||||
|
|
||||||
|
|
||||||
\section main_startpoints Starting Points
|
\section main_startpoints Starting Points
|
||||||
@@ -24,14 +28,18 @@
|
|||||||
- Read the \ref samples "sample code" for examples of how to interact with the
|
- Read the \ref samples "sample code" for examples of how to interact with the
|
||||||
codec.
|
codec.
|
||||||
- \ref codec reference
|
- \ref codec reference
|
||||||
\if encoder - \ref encoder reference \endif
|
\if encoder
|
||||||
\if decoder - \ref decoder reference \endif
|
- \ref encoder reference
|
||||||
|
\endif
|
||||||
|
\if decoder
|
||||||
|
- \ref decoder reference
|
||||||
|
\endif
|
||||||
|
|
||||||
\section main_support Support Options & FAQ
|
\section main_support Support Options & FAQ
|
||||||
The WebM project is an open source project supported by its community. For
|
The WebM project is an open source project supported by its community. For
|
||||||
questions about this SDK, please mail the apps-devel@webmproject.org list.
|
questions about this SDK, please mail the apps-devel@webmproject.org list.
|
||||||
To contribute, see http://www.webmproject.org/code/contribute and mail
|
To contribute, see http://www.webmproject.org/code/contribute and mail
|
||||||
vpx-devel@webmproject.org.
|
codec-devel@webmproject.org.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*!\page changelog CHANGELOG
|
/*!\page changelog CHANGELOG
|
||||||
|
|||||||
@@ -20,8 +20,6 @@
|
|||||||
* Still in the public domain.
|
* Still in the public domain.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/types.h> /* for stupid systems */
|
|
||||||
|
|
||||||
#include <string.h> /* for memcpy() */
|
#include <string.h> /* for memcpy() */
|
||||||
|
|
||||||
#include "md5_utils.h"
|
#include "md5_utils.h"
|
||||||
|
|||||||
@@ -1272,7 +1272,7 @@ ne_read_block(nestegg * ctx, uint64_t block_id, uint64_t block_size, nestegg_pac
|
|||||||
if (total > block_size)
|
if (total > block_size)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
entry = ne_find_track_entry(ctx, track - 1);
|
entry = ne_find_track_entry(ctx, (unsigned int)(track - 1));
|
||||||
if (!entry)
|
if (!entry)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
@@ -1291,7 +1291,7 @@ ne_read_block(nestegg * ctx, uint64_t block_id, uint64_t block_size, nestegg_pac
|
|||||||
|
|
||||||
pkt = ne_alloc(sizeof(*pkt));
|
pkt = ne_alloc(sizeof(*pkt));
|
||||||
pkt->track = track - 1;
|
pkt->track = track - 1;
|
||||||
pkt->timecode = abs_timecode * tc_scale * track_scale;
|
pkt->timecode = (uint64_t)(abs_timecode * tc_scale * track_scale);
|
||||||
|
|
||||||
ctx->log(ctx, NESTEGG_LOG_DEBUG, "%sblock t %lld pts %f f %llx frames: %llu",
|
ctx->log(ctx, NESTEGG_LOG_DEBUG, "%sblock t %lld pts %f f %llx frames: %llu",
|
||||||
block_id == ID_BLOCK ? "" : "simple", pkt->track, pkt->timecode / 1e9, flags, frames);
|
block_id == ID_BLOCK ? "" : "simple", pkt->track, pkt->timecode / 1e9, flags, frames);
|
||||||
@@ -1774,35 +1774,35 @@ nestegg_track_video_params(nestegg * ctx, unsigned int track,
|
|||||||
|
|
||||||
if (ne_get_uint(entry->video.pixel_width, &value) != 0)
|
if (ne_get_uint(entry->video.pixel_width, &value) != 0)
|
||||||
return -1;
|
return -1;
|
||||||
params->width = value;
|
params->width = (unsigned int)value;
|
||||||
|
|
||||||
if (ne_get_uint(entry->video.pixel_height, &value) != 0)
|
if (ne_get_uint(entry->video.pixel_height, &value) != 0)
|
||||||
return -1;
|
return -1;
|
||||||
params->height = value;
|
params->height = (unsigned int)value;
|
||||||
|
|
||||||
value = 0;
|
value = 0;
|
||||||
ne_get_uint(entry->video.pixel_crop_bottom, &value);
|
ne_get_uint(entry->video.pixel_crop_bottom, &value);
|
||||||
params->crop_bottom = value;
|
params->crop_bottom = (unsigned int)value;
|
||||||
|
|
||||||
value = 0;
|
value = 0;
|
||||||
ne_get_uint(entry->video.pixel_crop_top, &value);
|
ne_get_uint(entry->video.pixel_crop_top, &value);
|
||||||
params->crop_top = value;
|
params->crop_top = (unsigned int)value;
|
||||||
|
|
||||||
value = 0;
|
value = 0;
|
||||||
ne_get_uint(entry->video.pixel_crop_left, &value);
|
ne_get_uint(entry->video.pixel_crop_left, &value);
|
||||||
params->crop_left = value;
|
params->crop_left = (unsigned int)value;
|
||||||
|
|
||||||
value = 0;
|
value = 0;
|
||||||
ne_get_uint(entry->video.pixel_crop_right, &value);
|
ne_get_uint(entry->video.pixel_crop_right, &value);
|
||||||
params->crop_right = value;
|
params->crop_right = (unsigned int)value;
|
||||||
|
|
||||||
value = params->width;
|
value = params->width;
|
||||||
ne_get_uint(entry->video.display_width, &value);
|
ne_get_uint(entry->video.display_width, &value);
|
||||||
params->display_width = value;
|
params->display_width = (unsigned int)value;
|
||||||
|
|
||||||
value = params->height;
|
value = params->height;
|
||||||
ne_get_uint(entry->video.display_height, &value);
|
ne_get_uint(entry->video.display_height, &value);
|
||||||
params->display_height = value;
|
params->display_height = (unsigned int)value;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -1828,11 +1828,11 @@ nestegg_track_audio_params(nestegg * ctx, unsigned int track,
|
|||||||
|
|
||||||
value = 1;
|
value = 1;
|
||||||
ne_get_uint(entry->audio.channels, &value);
|
ne_get_uint(entry->audio.channels, &value);
|
||||||
params->channels = value;
|
params->channels = (unsigned int)value;
|
||||||
|
|
||||||
value = 16;
|
value = 16;
|
||||||
ne_get_uint(entry->audio.bit_depth, &value);
|
ne_get_uint(entry->audio.bit_depth, &value);
|
||||||
params->depth = value;
|
params->depth = (unsigned int)value;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -1888,7 +1888,7 @@ nestegg_free_packet(nestegg_packet * pkt)
|
|||||||
int
|
int
|
||||||
nestegg_packet_track(nestegg_packet * pkt, unsigned int * track)
|
nestegg_packet_track(nestegg_packet * pkt, unsigned int * track)
|
||||||
{
|
{
|
||||||
*track = pkt->track;
|
*track = (unsigned int)pkt->track;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
37
solution.mk
37
solution.mk
@@ -8,39 +8,17 @@
|
|||||||
## be found in the AUTHORS file in the root of the source tree.
|
## be found in the AUTHORS file in the root of the source tree.
|
||||||
##
|
##
|
||||||
|
|
||||||
|
# libvpx reverse dependencies (targets that depend on libvpx)
|
||||||
|
VPX_NONDEPS=$(addsuffix .vcproj,vpx gtest obj_int_extract)
|
||||||
|
VPX_RDEPS=$(foreach vcp,\
|
||||||
|
$(filter-out $(VPX_NONDEPS),$^), --dep=$(vcp:.vcproj=):vpx)
|
||||||
|
|
||||||
ifeq ($(ARCH_ARM),yes)
|
|
||||||
ARM_DEVELOP=no
|
|
||||||
ARM_DEVELOP:=$(if $(filter %vpx.vcproj,$(wildcard *.vcproj)),yes)
|
|
||||||
|
|
||||||
ifeq ($(ARM_DEVELOP),yes)
|
|
||||||
vpx.sln:
|
|
||||||
@echo " [COPY] $@"
|
|
||||||
@cp $(SRC_PATH_BARE)/build/arm-wince-vs8/vpx.sln .
|
|
||||||
PROJECTS-yes += vpx.sln
|
|
||||||
else
|
|
||||||
vpx.sln: $(wildcard *.vcproj)
|
vpx.sln: $(wildcard *.vcproj)
|
||||||
@echo " [CREATE] $@"
|
@echo " [CREATE] $@"
|
||||||
$(SRC_PATH_BARE)/build/make/gen_msvs_sln.sh \
|
$(SRC_PATH_BARE)/build/make/gen_msvs_sln.sh \
|
||||||
$(if $(filter %vpx.vcproj,$^),--dep=vpxdec:vpx) \
|
$(if $(filter vpx.vcproj,$^),$(VPX_RDEPS)) \
|
||||||
$(if $(filter %vpx.vcproj,$^),--dep=xma:vpx) \
|
--dep=vpx:obj_int_extract \
|
||||||
--ver=$(CONFIG_VS_VERSION)\
|
--dep=test_libvpx:gtest \
|
||||||
--target=$(TOOLCHAIN)\
|
|
||||||
--out=$@ $^
|
|
||||||
vpx.sln.mk: vpx.sln
|
|
||||||
@true
|
|
||||||
|
|
||||||
PROJECTS-yes += vpx.sln vpx.sln.mk
|
|
||||||
-include vpx.sln.mk
|
|
||||||
endif
|
|
||||||
|
|
||||||
else
|
|
||||||
vpx.sln: $(wildcard *.vcproj)
|
|
||||||
@echo " [CREATE] $@"
|
|
||||||
$(SRC_PATH_BARE)/build/make/gen_msvs_sln.sh \
|
|
||||||
$(if $(filter %vpx.vcproj,$^),\
|
|
||||||
$(foreach vcp,$(filter-out %vpx.vcproj,$^),\
|
|
||||||
--dep=$(vcp:.vcproj=):vpx)) \
|
|
||||||
--ver=$(CONFIG_VS_VERSION)\
|
--ver=$(CONFIG_VS_VERSION)\
|
||||||
--out=$@ $^
|
--out=$@ $^
|
||||||
vpx.sln.mk: vpx.sln
|
vpx.sln.mk: vpx.sln
|
||||||
@@ -48,7 +26,6 @@ vpx.sln.mk: vpx.sln
|
|||||||
|
|
||||||
PROJECTS-yes += vpx.sln vpx.sln.mk
|
PROJECTS-yes += vpx.sln vpx.sln.mk
|
||||||
-include vpx.sln.mk
|
-include vpx.sln.mk
|
||||||
endif
|
|
||||||
|
|
||||||
# Always install this file, as it is an unconditional post-build rule.
|
# Always install this file, as it is an unconditional post-build rule.
|
||||||
INSTALL_MAPS += src/% $(SRC_PATH_BARE)/%
|
INSTALL_MAPS += src/% $(SRC_PATH_BARE)/%
|
||||||
|
|||||||
53
test/acm_random.h
Normal file
53
test/acm_random.h
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2012 The WebM project authors. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by a BSD-style license
|
||||||
|
* that can be found in the LICENSE file in the root of the source
|
||||||
|
* tree. An additional intellectual property rights grant can be found
|
||||||
|
* in the file PATENTS. All contributing project authors may
|
||||||
|
* be found in the AUTHORS file in the root of the source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef LIBVPX_TEST_ACM_RANDOM_H_
|
||||||
|
#define LIBVPX_TEST_ACM_RANDOM_H_
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "vpx/vpx_integer.h"
|
||||||
|
|
||||||
|
namespace libvpx_test {
|
||||||
|
|
||||||
|
class ACMRandom {
|
||||||
|
public:
|
||||||
|
ACMRandom() {
|
||||||
|
Reset(DeterministicSeed());
|
||||||
|
}
|
||||||
|
|
||||||
|
explicit ACMRandom(int seed) {
|
||||||
|
Reset(seed);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Reset(int seed) {
|
||||||
|
srand(seed);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t Rand8(void) {
|
||||||
|
return (rand() >> 8) & 0xff;
|
||||||
|
}
|
||||||
|
|
||||||
|
int PseudoUniform(int range) {
|
||||||
|
return (rand() >> 8) % range;
|
||||||
|
}
|
||||||
|
|
||||||
|
int operator()(int n) {
|
||||||
|
return PseudoUniform(n);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int DeterministicSeed(void) {
|
||||||
|
return 0xbaba;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace libvpx_test
|
||||||
|
|
||||||
|
#endif // LIBVPX_TEST_ACM_RANDOM_H_
|
||||||
71
test/altref_test.cc
Normal file
71
test/altref_test.cc
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2012 The WebM project authors. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by a BSD-style license
|
||||||
|
* that can be found in the LICENSE file in the root of the source
|
||||||
|
* tree. An additional intellectual property rights grant can be found
|
||||||
|
* in the file PATENTS. All contributing project authors may
|
||||||
|
* be found in the AUTHORS file in the root of the source tree.
|
||||||
|
*/
|
||||||
|
#include "third_party/googletest/src/include/gtest/gtest.h"
|
||||||
|
#include "test/encode_test_driver.h"
|
||||||
|
#include "test/i420_video_source.h"
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
// lookahead range: [kLookAheadMin, kLookAheadMax).
|
||||||
|
const int kLookAheadMin = 5;
|
||||||
|
const int kLookAheadMax = 26;
|
||||||
|
|
||||||
|
class AltRefTest : public libvpx_test::EncoderTest,
|
||||||
|
public ::testing::TestWithParam<int> {
|
||||||
|
protected:
|
||||||
|
AltRefTest() : altref_count_(0) {}
|
||||||
|
virtual ~AltRefTest() {}
|
||||||
|
|
||||||
|
virtual void SetUp() {
|
||||||
|
InitializeConfig();
|
||||||
|
SetMode(libvpx_test::kTwoPassGood);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void BeginPassHook(unsigned int pass) {
|
||||||
|
altref_count_ = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool Continue() const {
|
||||||
|
return !HasFatalFailure() && !abort_;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void PreEncodeFrameHook(libvpx_test::VideoSource *video,
|
||||||
|
libvpx_test::Encoder *encoder) {
|
||||||
|
if (video->frame() == 1) {
|
||||||
|
encoder->Control(VP8E_SET_ENABLEAUTOALTREF, 1);
|
||||||
|
encoder->Control(VP8E_SET_CPUUSED, 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void FramePktHook(const vpx_codec_cx_pkt_t *pkt) {
|
||||||
|
if (pkt->data.frame.flags & VPX_FRAME_IS_INVISIBLE) ++altref_count_;
|
||||||
|
}
|
||||||
|
|
||||||
|
int altref_count() const { return altref_count_; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
int altref_count_;
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST_P(AltRefTest, MonotonicTimestamps) {
|
||||||
|
const vpx_rational timebase = { 33333333, 1000000000 };
|
||||||
|
cfg_.g_timebase = timebase;
|
||||||
|
cfg_.rc_target_bitrate = 1000;
|
||||||
|
cfg_.g_lag_in_frames = GetParam();
|
||||||
|
|
||||||
|
libvpx_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288,
|
||||||
|
timebase.den, timebase.num, 0, 30);
|
||||||
|
ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
|
||||||
|
EXPECT_GE(altref_count(), 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
INSTANTIATE_TEST_CASE_P(NonZeroLag, AltRefTest,
|
||||||
|
::testing::Range(kLookAheadMin, kLookAheadMax));
|
||||||
|
} // namespace
|
||||||
90
test/boolcoder_test.cc
Normal file
90
test/boolcoder_test.cc
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2012 The WebM project authors. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by a BSD-style license
|
||||||
|
* that can be found in the LICENSE file in the root of the source
|
||||||
|
* tree. An additional intellectual property rights grant can be found
|
||||||
|
* in the file PATENTS. All contributing project authors may
|
||||||
|
* be found in the AUTHORS file in the root of the source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
#include "vp8/encoder/boolhuff.h"
|
||||||
|
#include "vp8/decoder/dboolhuff.h"
|
||||||
|
}
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#include "test/acm_random.h"
|
||||||
|
#include "third_party/googletest/src/include/gtest/gtest.h"
|
||||||
|
#include "vpx/vpx_integer.h"
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
const int num_tests = 10;
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
using libvpx_test::ACMRandom;
|
||||||
|
|
||||||
|
TEST(VP8, TestBitIO) {
|
||||||
|
ACMRandom rnd(ACMRandom::DeterministicSeed());
|
||||||
|
for (int n = 0; n < num_tests; ++n) {
|
||||||
|
for (int method = 0; method <= 7; ++method) { // we generate various proba
|
||||||
|
const int bits_to_test = 1000;
|
||||||
|
uint8_t probas[bits_to_test];
|
||||||
|
|
||||||
|
for (int i = 0; i < bits_to_test; ++i) {
|
||||||
|
const int parity = i & 1;
|
||||||
|
probas[i] =
|
||||||
|
(method == 0) ? 0 : (method == 1) ? 255 :
|
||||||
|
(method == 2) ? 128 :
|
||||||
|
(method == 3) ? rnd.Rand8() :
|
||||||
|
(method == 4) ? (parity ? 0 : 255) :
|
||||||
|
// alternate between low and high proba:
|
||||||
|
(method == 5) ? (parity ? rnd(128) : 255 - rnd(128)) :
|
||||||
|
(method == 6) ?
|
||||||
|
(parity ? rnd(64) : 255 - rnd(64)) :
|
||||||
|
(parity ? rnd(32) : 255 - rnd(32));
|
||||||
|
}
|
||||||
|
for (int bit_method = 0; bit_method <= 3; ++bit_method) {
|
||||||
|
const int random_seed = 6432;
|
||||||
|
const int buffer_size = 10000;
|
||||||
|
ACMRandom bit_rnd(random_seed);
|
||||||
|
BOOL_CODER bw;
|
||||||
|
uint8_t bw_buffer[buffer_size];
|
||||||
|
vp8_start_encode(&bw, bw_buffer, bw_buffer + buffer_size);
|
||||||
|
|
||||||
|
int bit = (bit_method == 0) ? 0 : (bit_method == 1) ? 1 : 0;
|
||||||
|
for (int i = 0; i < bits_to_test; ++i) {
|
||||||
|
if (bit_method == 2) {
|
||||||
|
bit = (i & 1);
|
||||||
|
} else if (bit_method == 3) {
|
||||||
|
bit = bit_rnd(2);
|
||||||
|
}
|
||||||
|
vp8_encode_bool(&bw, bit, static_cast<int>(probas[i]));
|
||||||
|
}
|
||||||
|
|
||||||
|
vp8_stop_encode(&bw);
|
||||||
|
|
||||||
|
BOOL_DECODER br;
|
||||||
|
vp8dx_start_decode(&br, bw_buffer, buffer_size);
|
||||||
|
bit_rnd.Reset(random_seed);
|
||||||
|
for (int i = 0; i < bits_to_test; ++i) {
|
||||||
|
if (bit_method == 2) {
|
||||||
|
bit = (i & 1);
|
||||||
|
} else if (bit_method == 3) {
|
||||||
|
bit = bit_rnd(2);
|
||||||
|
}
|
||||||
|
GTEST_ASSERT_EQ(vp8dx_decode_bool(&br, probas[i]), bit)
|
||||||
|
<< "pos: "<< i << " / " << bits_to_test
|
||||||
|
<< " bit_method: " << bit_method
|
||||||
|
<< " method: " << method;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
61
test/config_test.cc
Normal file
61
test/config_test.cc
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2012 The WebM project authors. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by a BSD-style license
|
||||||
|
* that can be found in the LICENSE file in the root of the source
|
||||||
|
* tree. An additional intellectual property rights grant can be found
|
||||||
|
* in the file PATENTS. All contributing project authors may
|
||||||
|
* be found in the AUTHORS file in the root of the source tree.
|
||||||
|
*/
|
||||||
|
#include "third_party/googletest/src/include/gtest/gtest.h"
|
||||||
|
#include "test/encode_test_driver.h"
|
||||||
|
#include "test/video_source.h"
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
class ConfigTest : public ::libvpx_test::EncoderTest,
|
||||||
|
public ::testing::TestWithParam<enum libvpx_test::TestMode> {
|
||||||
|
public:
|
||||||
|
ConfigTest() : frame_count_in_(0), frame_count_out_(0), frame_count_max_(0) {}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void SetUp() {
|
||||||
|
InitializeConfig();
|
||||||
|
SetMode(GetParam());
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void BeginPassHook(unsigned int /*pass*/) {
|
||||||
|
frame_count_in_ = 0;
|
||||||
|
frame_count_out_ = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void PreEncodeFrameHook(libvpx_test::VideoSource* /*video*/) {
|
||||||
|
++frame_count_in_;
|
||||||
|
abort_ |= (frame_count_in_ >= frame_count_max_);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void FramePktHook(const vpx_codec_cx_pkt_t* /*pkt*/) {
|
||||||
|
++frame_count_out_;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool Continue() const {
|
||||||
|
return !HasFatalFailure() && !abort_;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int frame_count_in_;
|
||||||
|
unsigned int frame_count_out_;
|
||||||
|
unsigned int frame_count_max_;
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST_P(ConfigTest, LagIsDisabled) {
|
||||||
|
frame_count_max_ = 2;
|
||||||
|
cfg_.g_lag_in_frames = 15;
|
||||||
|
|
||||||
|
libvpx_test::DummyVideoSource video;
|
||||||
|
ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
|
||||||
|
|
||||||
|
EXPECT_EQ(frame_count_in_, frame_count_out_);
|
||||||
|
}
|
||||||
|
|
||||||
|
INSTANTIATE_TEST_CASE_P(OnePassModes, ConfigTest, ONE_PASS_TEST_MODES);
|
||||||
|
} // namespace
|
||||||
106
test/cq_test.cc
Normal file
106
test/cq_test.cc
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2012 The WebM project authors. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by a BSD-style license
|
||||||
|
* that can be found in the LICENSE file in the root of the source
|
||||||
|
* tree. An additional intellectual property rights grant can be found
|
||||||
|
* in the file PATENTS. All contributing project authors may
|
||||||
|
* be found in the AUTHORS file in the root of the source tree.
|
||||||
|
*/
|
||||||
|
#include <cmath>
|
||||||
|
#include "third_party/googletest/src/include/gtest/gtest.h"
|
||||||
|
#include "test/encode_test_driver.h"
|
||||||
|
#include "test/i420_video_source.h"
|
||||||
|
|
||||||
|
// CQ level range: [kCQLevelMin, kCQLevelMax).
|
||||||
|
const int kCQLevelMin = 4;
|
||||||
|
const int kCQLevelMax = 63;
|
||||||
|
const int kCQLevelStep = 8;
|
||||||
|
const int kCQTargetBitrate = 2000;
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
class CQTest : public libvpx_test::EncoderTest,
|
||||||
|
public ::testing::TestWithParam<int> {
|
||||||
|
protected:
|
||||||
|
CQTest() : cq_level_(GetParam()) { init_flags_ = VPX_CODEC_USE_PSNR; }
|
||||||
|
virtual ~CQTest() {}
|
||||||
|
|
||||||
|
virtual void SetUp() {
|
||||||
|
InitializeConfig();
|
||||||
|
SetMode(libvpx_test::kTwoPassGood);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void BeginPassHook(unsigned int /*pass*/) {
|
||||||
|
file_size_ = 0;
|
||||||
|
psnr_ = 0.0;
|
||||||
|
n_frames_ = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool Continue() const {
|
||||||
|
return !HasFatalFailure() && !abort_;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void PreEncodeFrameHook(libvpx_test::VideoSource *video,
|
||||||
|
libvpx_test::Encoder *encoder) {
|
||||||
|
if (video->frame() == 1) {
|
||||||
|
if (cfg_.rc_end_usage == VPX_CQ) {
|
||||||
|
encoder->Control(VP8E_SET_CQ_LEVEL, cq_level_);
|
||||||
|
}
|
||||||
|
encoder->Control(VP8E_SET_CPUUSED, 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void PSNRPktHook(const vpx_codec_cx_pkt_t *pkt) {
|
||||||
|
psnr_ += pow(10.0, pkt->data.psnr.psnr[0] / 10.0);
|
||||||
|
n_frames_++;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void FramePktHook(const vpx_codec_cx_pkt_t *pkt) {
|
||||||
|
file_size_ += pkt->data.frame.sz;
|
||||||
|
}
|
||||||
|
|
||||||
|
double GetLinearPSNROverBitrate() const {
|
||||||
|
double avg_psnr = log10(psnr_ / n_frames_) * 10.0;
|
||||||
|
return pow(10.0, avg_psnr / 10.0) / file_size_;
|
||||||
|
}
|
||||||
|
|
||||||
|
int file_size() const { return file_size_; }
|
||||||
|
int n_frames() const { return n_frames_; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
int cq_level_;
|
||||||
|
int file_size_;
|
||||||
|
double psnr_;
|
||||||
|
int n_frames_;
|
||||||
|
};
|
||||||
|
|
||||||
|
int prev_actual_bitrate = kCQTargetBitrate;
|
||||||
|
TEST_P(CQTest, LinearPSNRIsHigherForCQLevel) {
|
||||||
|
const vpx_rational timebase = { 33333333, 1000000000 };
|
||||||
|
cfg_.g_timebase = timebase;
|
||||||
|
cfg_.rc_target_bitrate = kCQTargetBitrate;
|
||||||
|
cfg_.g_lag_in_frames = 25;
|
||||||
|
|
||||||
|
cfg_.rc_end_usage = VPX_CQ;
|
||||||
|
libvpx_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288,
|
||||||
|
timebase.den, timebase.num, 0, 30);
|
||||||
|
ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
|
||||||
|
const double cq_psnr_lin = GetLinearPSNROverBitrate();
|
||||||
|
const int cq_actual_bitrate = file_size() * 8 * 30 / (n_frames() * 1000);
|
||||||
|
EXPECT_LE(cq_actual_bitrate, kCQTargetBitrate);
|
||||||
|
EXPECT_LE(cq_actual_bitrate, prev_actual_bitrate);
|
||||||
|
prev_actual_bitrate = cq_actual_bitrate;
|
||||||
|
|
||||||
|
// try targeting the approximate same bitrate with VBR mode
|
||||||
|
cfg_.rc_end_usage = VPX_VBR;
|
||||||
|
cfg_.rc_target_bitrate = cq_actual_bitrate;
|
||||||
|
ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
|
||||||
|
const double vbr_psnr_lin = GetLinearPSNROverBitrate();
|
||||||
|
EXPECT_GE(cq_psnr_lin, vbr_psnr_lin);
|
||||||
|
}
|
||||||
|
|
||||||
|
INSTANTIATE_TEST_CASE_P(CQLevelRange, CQTest,
|
||||||
|
::testing::Range(kCQLevelMin, kCQLevelMax,
|
||||||
|
kCQLevelStep));
|
||||||
|
} // namespace
|
||||||
178
test/datarate_test.cc
Normal file
178
test/datarate_test.cc
Normal file
@@ -0,0 +1,178 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2012 The WebM project authors. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by a BSD-style license
|
||||||
|
* that can be found in the LICENSE file in the root of the source
|
||||||
|
* tree. An additional intellectual property rights grant can be found
|
||||||
|
* in the file PATENTS. All contributing project authors may
|
||||||
|
* be found in the AUTHORS file in the root of the source tree.
|
||||||
|
*/
|
||||||
|
#include "test/encode_test_driver.h"
|
||||||
|
#include "test/i420_video_source.h"
|
||||||
|
#include "third_party/googletest/src/include/gtest/gtest.h"
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
class DatarateTest : public ::libvpx_test::EncoderTest,
|
||||||
|
public ::testing::TestWithParam<enum libvpx_test::TestMode> {
|
||||||
|
protected:
|
||||||
|
virtual void SetUp() {
|
||||||
|
InitializeConfig();
|
||||||
|
SetMode(GetParam());
|
||||||
|
ResetModel();
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void ResetModel() {
|
||||||
|
last_pts_ = 0;
|
||||||
|
bits_in_buffer_model_ = cfg_.rc_target_bitrate * cfg_.rc_buf_initial_sz;
|
||||||
|
frame_number_ = 0;
|
||||||
|
first_drop_ = 0;
|
||||||
|
bits_total_ = 0;
|
||||||
|
duration_ = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool Continue() const {
|
||||||
|
return !HasFatalFailure() && !abort_;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void PreEncodeFrameHook(::libvpx_test::VideoSource *video,
|
||||||
|
::libvpx_test::Encoder *encoder) {
|
||||||
|
const vpx_rational_t tb = video->timebase();
|
||||||
|
timebase_ = static_cast<double>(tb.num) / tb.den;
|
||||||
|
duration_ = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void FramePktHook(const vpx_codec_cx_pkt_t *pkt) {
|
||||||
|
// Time since last timestamp = duration.
|
||||||
|
vpx_codec_pts_t duration = pkt->data.frame.pts - last_pts_;
|
||||||
|
|
||||||
|
// TODO(jimbankoski): Remove these lines when the issue:
|
||||||
|
// http://code.google.com/p/webm/issues/detail?id=496 is fixed.
|
||||||
|
// For now the codec assumes buffer starts at starting buffer rate
|
||||||
|
// plus one frame's time.
|
||||||
|
if (last_pts_ == 0)
|
||||||
|
duration = 1;
|
||||||
|
|
||||||
|
// Add to the buffer the bits we'd expect from a constant bitrate server.
|
||||||
|
bits_in_buffer_model_ += duration * timebase_ * cfg_.rc_target_bitrate
|
||||||
|
* 1000;
|
||||||
|
|
||||||
|
/* Test the buffer model here before subtracting the frame. Do so because
|
||||||
|
* the way the leaky bucket model works in libvpx is to allow the buffer to
|
||||||
|
* empty - and then stop showing frames until we've got enough bits to
|
||||||
|
* show one. As noted in comment below (issue 495), this does not currently
|
||||||
|
* apply to key frames. For now exclude key frames in condition below. */
|
||||||
|
bool key_frame = (pkt->data.frame.flags & VPX_FRAME_IS_KEY) ? true: false;
|
||||||
|
if (!key_frame) {
|
||||||
|
ASSERT_GE(bits_in_buffer_model_, 0) << "Buffer Underrun at frame "
|
||||||
|
<< pkt->data.frame.pts;
|
||||||
|
}
|
||||||
|
|
||||||
|
const int frame_size_in_bits = pkt->data.frame.sz * 8;
|
||||||
|
|
||||||
|
// Subtract from the buffer the bits associated with a played back frame.
|
||||||
|
bits_in_buffer_model_ -= frame_size_in_bits;
|
||||||
|
|
||||||
|
// Update the running total of bits for end of test datarate checks.
|
||||||
|
bits_total_ += frame_size_in_bits ;
|
||||||
|
|
||||||
|
// If first drop not set and we have a drop set it to this time.
|
||||||
|
if (!first_drop_ && duration > 1)
|
||||||
|
first_drop_ = last_pts_ + 1;
|
||||||
|
|
||||||
|
// Update the most recent pts.
|
||||||
|
last_pts_ = pkt->data.frame.pts;
|
||||||
|
|
||||||
|
// We update this so that we can calculate the datarate minus the last
|
||||||
|
// frame encoded in the file.
|
||||||
|
bits_in_last_frame_ = frame_size_in_bits;
|
||||||
|
|
||||||
|
++frame_number_;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void EndPassHook(void) {
|
||||||
|
if (bits_total_) {
|
||||||
|
const double file_size_in_kb = bits_total_ / 1000; /* bits per kilobit */
|
||||||
|
|
||||||
|
duration_ = (last_pts_ + 1) * timebase_;
|
||||||
|
|
||||||
|
// Effective file datarate includes the time spent prebuffering.
|
||||||
|
effective_datarate_ = (bits_total_ - bits_in_last_frame_) / 1000.0
|
||||||
|
/ (cfg_.rc_buf_initial_sz / 1000.0 + duration_);
|
||||||
|
|
||||||
|
file_datarate_ = file_size_in_kb / duration_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
vpx_codec_pts_t last_pts_;
|
||||||
|
int bits_in_buffer_model_;
|
||||||
|
double timebase_;
|
||||||
|
int frame_number_;
|
||||||
|
vpx_codec_pts_t first_drop_;
|
||||||
|
int64_t bits_total_;
|
||||||
|
double duration_;
|
||||||
|
double file_datarate_;
|
||||||
|
double effective_datarate_;
|
||||||
|
int bits_in_last_frame_;
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST_P(DatarateTest, BasicBufferModel) {
|
||||||
|
cfg_.rc_buf_initial_sz = 500;
|
||||||
|
cfg_.rc_dropframe_thresh = 1;
|
||||||
|
cfg_.rc_max_quantizer = 56;
|
||||||
|
cfg_.rc_end_usage = VPX_CBR;
|
||||||
|
// 2 pass cbr datarate control has a bug hidden by the small # of
|
||||||
|
// frames selected in this encode. The problem is that even if the buffer is
|
||||||
|
// negative we produce a keyframe on a cutscene. Ignoring datarate
|
||||||
|
// constraints
|
||||||
|
// TODO(jimbankoski): ( Fix when issue
|
||||||
|
// http://code.google.com/p/webm/issues/detail?id=495 is addressed. )
|
||||||
|
::libvpx_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288,
|
||||||
|
30, 1, 0, 140);
|
||||||
|
|
||||||
|
// There is an issue for low bitrates in real-time mode, where the
|
||||||
|
// effective_datarate slightly overshoots the target bitrate.
|
||||||
|
// This is same the issue as noted about (#495).
|
||||||
|
// TODO(jimbankoski/marpan): Update test to run for lower bitrates (< 100),
|
||||||
|
// when the issue is resolved.
|
||||||
|
for (int i = 100; i < 800; i += 200) {
|
||||||
|
cfg_.rc_target_bitrate = i;
|
||||||
|
ResetModel();
|
||||||
|
ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
|
||||||
|
ASSERT_GE(cfg_.rc_target_bitrate, effective_datarate_)
|
||||||
|
<< " The datarate for the file exceeds the target!";
|
||||||
|
|
||||||
|
ASSERT_LE(cfg_.rc_target_bitrate, file_datarate_ * 1.3)
|
||||||
|
<< " The datarate for the file missed the target!";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_P(DatarateTest, ChangingDropFrameThresh) {
|
||||||
|
cfg_.rc_buf_initial_sz = 500;
|
||||||
|
cfg_.rc_max_quantizer = 36;
|
||||||
|
cfg_.rc_end_usage = VPX_CBR;
|
||||||
|
cfg_.rc_target_bitrate = 200;
|
||||||
|
cfg_.kf_mode = VPX_KF_DISABLED;
|
||||||
|
|
||||||
|
const int frame_count = 40;
|
||||||
|
::libvpx_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288,
|
||||||
|
30, 1, 0, frame_count);
|
||||||
|
|
||||||
|
// Here we check that the first dropped frame gets earlier and earlier
|
||||||
|
// as the drop frame threshold is increased.
|
||||||
|
|
||||||
|
const int kDropFrameThreshTestStep = 30;
|
||||||
|
vpx_codec_pts_t last_drop = frame_count;
|
||||||
|
for (int i = 1; i < 91; i += kDropFrameThreshTestStep) {
|
||||||
|
cfg_.rc_dropframe_thresh = i;
|
||||||
|
ResetModel();
|
||||||
|
ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
|
||||||
|
ASSERT_LE(first_drop_, last_drop)
|
||||||
|
<< " The first dropped frame for drop_thresh " << i
|
||||||
|
<< " > first dropped frame for drop_thresh "
|
||||||
|
<< i - kDropFrameThreshTestStep;
|
||||||
|
last_drop = first_drop_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
INSTANTIATE_TEST_CASE_P(AllModes, DatarateTest, ALL_TEST_MODES);
|
||||||
|
} // namespace
|
||||||
48
test/decode_test_driver.cc
Normal file
48
test/decode_test_driver.cc
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2012 The WebM project authors. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by a BSD-style license
|
||||||
|
* that can be found in the LICENSE file in the root of the source
|
||||||
|
* tree. An additional intellectual property rights grant can be found
|
||||||
|
* in the file PATENTS. All contributing project authors may
|
||||||
|
* be found in the AUTHORS file in the root of the source tree.
|
||||||
|
*/
|
||||||
|
#include "test/decode_test_driver.h"
|
||||||
|
#include "third_party/googletest/src/include/gtest/gtest.h"
|
||||||
|
#include "test/register_state_check.h"
|
||||||
|
#include "test/video_source.h"
|
||||||
|
|
||||||
|
namespace libvpx_test {
|
||||||
|
#if CONFIG_VP8_DECODER
|
||||||
|
void Decoder::DecodeFrame(const uint8_t *cxdata, int size) {
|
||||||
|
if (!decoder_.priv) {
|
||||||
|
const vpx_codec_err_t res_init = vpx_codec_dec_init(&decoder_,
|
||||||
|
&vpx_codec_vp8_dx_algo,
|
||||||
|
&cfg_, 0);
|
||||||
|
ASSERT_EQ(VPX_CODEC_OK, res_init) << DecodeError();
|
||||||
|
}
|
||||||
|
|
||||||
|
vpx_codec_err_t res_dec;
|
||||||
|
REGISTER_STATE_CHECK(res_dec = vpx_codec_decode(&decoder_,
|
||||||
|
cxdata, size, NULL, 0));
|
||||||
|
ASSERT_EQ(VPX_CODEC_OK, res_dec) << DecodeError();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DecoderTest::RunLoop(CompressedVideoSource *video) {
|
||||||
|
vpx_codec_dec_cfg_t dec_cfg = {0};
|
||||||
|
Decoder decoder(dec_cfg, 0);
|
||||||
|
|
||||||
|
// Decode frames.
|
||||||
|
for (video->Begin(); video->cxdata(); video->Next()) {
|
||||||
|
decoder.DecodeFrame(video->cxdata(), video->frame_size());
|
||||||
|
|
||||||
|
DxDataIterator dec_iter = decoder.GetDxData();
|
||||||
|
const vpx_image_t *img = NULL;
|
||||||
|
|
||||||
|
// Get decompressed data
|
||||||
|
while ((img = dec_iter.Next()))
|
||||||
|
DecompressedFrameHook(*img, video->frame_number());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
} // namespace libvpx_test
|
||||||
97
test/decode_test_driver.h
Normal file
97
test/decode_test_driver.h
Normal file
@@ -0,0 +1,97 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2012 The WebM project authors. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by a BSD-style license
|
||||||
|
* that can be found in the LICENSE file in the root of the source
|
||||||
|
* tree. An additional intellectual property rights grant can be found
|
||||||
|
* in the file PATENTS. All contributing project authors may
|
||||||
|
* be found in the AUTHORS file in the root of the source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TEST_DECODE_TEST_DRIVER_H_
|
||||||
|
#define TEST_DECODE_TEST_DRIVER_H_
|
||||||
|
#include <cstring>
|
||||||
|
#include "third_party/googletest/src/include/gtest/gtest.h"
|
||||||
|
#include "vpx_config.h"
|
||||||
|
#include "vpx/vpx_decoder.h"
|
||||||
|
#include "vpx/vp8dx.h"
|
||||||
|
|
||||||
|
namespace libvpx_test {
|
||||||
|
|
||||||
|
class CompressedVideoSource;
|
||||||
|
|
||||||
|
// Provides an object to handle decoding output
|
||||||
|
class DxDataIterator {
|
||||||
|
public:
|
||||||
|
explicit DxDataIterator(vpx_codec_ctx_t *decoder)
|
||||||
|
: decoder_(decoder), iter_(NULL) {}
|
||||||
|
|
||||||
|
const vpx_image_t *Next() {
|
||||||
|
return vpx_codec_get_frame(decoder_, &iter_);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
vpx_codec_ctx_t *decoder_;
|
||||||
|
vpx_codec_iter_t iter_;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Provides a simplified interface to manage one video decoding.
|
||||||
|
//
|
||||||
|
// TODO: similar to Encoder class, the exact services should be
|
||||||
|
// added as more tests are added.
|
||||||
|
class Decoder {
|
||||||
|
public:
|
||||||
|
Decoder(vpx_codec_dec_cfg_t cfg, unsigned long deadline)
|
||||||
|
: cfg_(cfg), deadline_(deadline) {
|
||||||
|
memset(&decoder_, 0, sizeof(decoder_));
|
||||||
|
}
|
||||||
|
|
||||||
|
~Decoder() {
|
||||||
|
vpx_codec_destroy(&decoder_);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DecodeFrame(const uint8_t *cxdata, int size);
|
||||||
|
|
||||||
|
DxDataIterator GetDxData() {
|
||||||
|
return DxDataIterator(&decoder_);
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_deadline(unsigned long deadline) {
|
||||||
|
deadline_ = deadline;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Control(int ctrl_id, int arg) {
|
||||||
|
const vpx_codec_err_t res = vpx_codec_control_(&decoder_, ctrl_id, arg);
|
||||||
|
ASSERT_EQ(VPX_CODEC_OK, res) << DecodeError();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
const char *DecodeError() {
|
||||||
|
const char *detail = vpx_codec_error_detail(&decoder_);
|
||||||
|
return detail ? detail : vpx_codec_error(&decoder_);
|
||||||
|
}
|
||||||
|
|
||||||
|
vpx_codec_ctx_t decoder_;
|
||||||
|
vpx_codec_dec_cfg_t cfg_;
|
||||||
|
unsigned int deadline_;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Common test functionality for all Decoder tests.
|
||||||
|
class DecoderTest {
|
||||||
|
public:
|
||||||
|
// Main loop.
|
||||||
|
virtual void RunLoop(CompressedVideoSource *video);
|
||||||
|
|
||||||
|
// Hook to be called on every decompressed frame.
|
||||||
|
virtual void DecompressedFrameHook(const vpx_image_t& img,
|
||||||
|
const unsigned int frame_number) {}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
DecoderTest() {}
|
||||||
|
|
||||||
|
virtual ~DecoderTest() {}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace libvpx_test
|
||||||
|
|
||||||
|
#endif // TEST_DECODE_TEST_DRIVER_H_
|
||||||
206
test/encode_test_driver.cc
Normal file
206
test/encode_test_driver.cc
Normal file
@@ -0,0 +1,206 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2012 The WebM project authors. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by a BSD-style license
|
||||||
|
* that can be found in the LICENSE file in the root of the source
|
||||||
|
* tree. An additional intellectual property rights grant can be found
|
||||||
|
* in the file PATENTS. All contributing project authors may
|
||||||
|
* be found in the AUTHORS file in the root of the source tree.
|
||||||
|
*/
|
||||||
|
#include "vpx_config.h"
|
||||||
|
#include "test/encode_test_driver.h"
|
||||||
|
#if CONFIG_VP8_DECODER
|
||||||
|
#include "test/decode_test_driver.h"
|
||||||
|
#endif
|
||||||
|
#include "test/register_state_check.h"
|
||||||
|
#include "test/video_source.h"
|
||||||
|
#include "third_party/googletest/src/include/gtest/gtest.h"
|
||||||
|
|
||||||
|
namespace libvpx_test {
|
||||||
|
void Encoder::EncodeFrame(VideoSource *video, const unsigned long frame_flags) {
|
||||||
|
if (video->img())
|
||||||
|
EncodeFrameInternal(*video, frame_flags);
|
||||||
|
else
|
||||||
|
Flush();
|
||||||
|
|
||||||
|
// Handle twopass stats
|
||||||
|
CxDataIterator iter = GetCxData();
|
||||||
|
|
||||||
|
while (const vpx_codec_cx_pkt_t *pkt = iter.Next()) {
|
||||||
|
if (pkt->kind != VPX_CODEC_STATS_PKT)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
stats_->Append(*pkt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Encoder::EncodeFrameInternal(const VideoSource &video,
|
||||||
|
const unsigned long frame_flags) {
|
||||||
|
vpx_codec_err_t res;
|
||||||
|
const vpx_image_t *img = video.img();
|
||||||
|
|
||||||
|
// Handle first frame initialization
|
||||||
|
if (!encoder_.priv) {
|
||||||
|
cfg_.g_w = img->d_w;
|
||||||
|
cfg_.g_h = img->d_h;
|
||||||
|
cfg_.g_timebase = video.timebase();
|
||||||
|
cfg_.rc_twopass_stats_in = stats_->buf();
|
||||||
|
res = vpx_codec_enc_init(&encoder_, &vpx_codec_vp8_cx_algo, &cfg_,
|
||||||
|
init_flags_);
|
||||||
|
ASSERT_EQ(VPX_CODEC_OK, res) << EncoderError();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle frame resizing
|
||||||
|
if (cfg_.g_w != img->d_w || cfg_.g_h != img->d_h) {
|
||||||
|
cfg_.g_w = img->d_w;
|
||||||
|
cfg_.g_h = img->d_h;
|
||||||
|
res = vpx_codec_enc_config_set(&encoder_, &cfg_);
|
||||||
|
ASSERT_EQ(VPX_CODEC_OK, res) << EncoderError();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Encode the frame
|
||||||
|
REGISTER_STATE_CHECK(
|
||||||
|
res = vpx_codec_encode(&encoder_,
|
||||||
|
video.img(), video.pts(), video.duration(),
|
||||||
|
frame_flags, deadline_));
|
||||||
|
ASSERT_EQ(VPX_CODEC_OK, res) << EncoderError();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Encoder::Flush() {
|
||||||
|
const vpx_codec_err_t res = vpx_codec_encode(&encoder_, NULL, 0, 0, 0,
|
||||||
|
deadline_);
|
||||||
|
ASSERT_EQ(VPX_CODEC_OK, res) << EncoderError();
|
||||||
|
}
|
||||||
|
|
||||||
|
void EncoderTest::SetMode(TestMode mode) {
|
||||||
|
switch (mode) {
|
||||||
|
case kRealTime:
|
||||||
|
deadline_ = VPX_DL_REALTIME;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case kOnePassGood:
|
||||||
|
case kTwoPassGood:
|
||||||
|
deadline_ = VPX_DL_GOOD_QUALITY;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case kOnePassBest:
|
||||||
|
case kTwoPassBest:
|
||||||
|
deadline_ = VPX_DL_BEST_QUALITY;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
ASSERT_TRUE(false) << "Unexpected mode " << mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mode == kTwoPassGood || mode == kTwoPassBest)
|
||||||
|
passes_ = 2;
|
||||||
|
else
|
||||||
|
passes_ = 1;
|
||||||
|
}
|
||||||
|
// The function should return "true" most of the time, therefore no early
|
||||||
|
// break-out is implemented within the match checking process.
|
||||||
|
static bool compare_img(const vpx_image_t *img1,
|
||||||
|
const vpx_image_t *img2) {
|
||||||
|
bool match = (img1->fmt == img2->fmt) &&
|
||||||
|
(img1->d_w == img2->d_w) &&
|
||||||
|
(img1->d_h == img2->d_h);
|
||||||
|
|
||||||
|
const unsigned int width_y = img1->d_w;
|
||||||
|
const unsigned int height_y = img1->d_h;
|
||||||
|
unsigned int i;
|
||||||
|
for (i = 0; i < height_y; ++i)
|
||||||
|
match = ( memcmp(img1->planes[VPX_PLANE_Y] + i * img1->stride[VPX_PLANE_Y],
|
||||||
|
img2->planes[VPX_PLANE_Y] + i * img2->stride[VPX_PLANE_Y],
|
||||||
|
width_y) == 0) && match;
|
||||||
|
const unsigned int width_uv = (img1->d_w + 1) >> 1;
|
||||||
|
const unsigned int height_uv = (img1->d_h + 1) >> 1;
|
||||||
|
for (i = 0; i < height_uv; ++i)
|
||||||
|
match = ( memcmp(img1->planes[VPX_PLANE_U] + i * img1->stride[VPX_PLANE_U],
|
||||||
|
img2->planes[VPX_PLANE_U] + i * img2->stride[VPX_PLANE_U],
|
||||||
|
width_uv) == 0) && match;
|
||||||
|
for (i = 0; i < height_uv; ++i)
|
||||||
|
match = ( memcmp(img1->planes[VPX_PLANE_V] + i * img1->stride[VPX_PLANE_V],
|
||||||
|
img2->planes[VPX_PLANE_V] + i * img2->stride[VPX_PLANE_V],
|
||||||
|
width_uv) == 0) && match;
|
||||||
|
return match;
|
||||||
|
}
|
||||||
|
|
||||||
|
void EncoderTest::RunLoop(VideoSource *video) {
|
||||||
|
#if CONFIG_VP8_DECODER
|
||||||
|
vpx_codec_dec_cfg_t dec_cfg = {0};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
stats_.Reset();
|
||||||
|
|
||||||
|
for (unsigned int pass = 0; pass < passes_; pass++) {
|
||||||
|
last_pts_ = 0;
|
||||||
|
|
||||||
|
if (passes_ == 1)
|
||||||
|
cfg_.g_pass = VPX_RC_ONE_PASS;
|
||||||
|
else if (pass == 0)
|
||||||
|
cfg_.g_pass = VPX_RC_FIRST_PASS;
|
||||||
|
else
|
||||||
|
cfg_.g_pass = VPX_RC_LAST_PASS;
|
||||||
|
|
||||||
|
BeginPassHook(pass);
|
||||||
|
Encoder encoder(cfg_, deadline_, init_flags_, &stats_);
|
||||||
|
#if CONFIG_VP8_DECODER
|
||||||
|
Decoder decoder(dec_cfg, 0);
|
||||||
|
bool has_cxdata = false;
|
||||||
|
#endif
|
||||||
|
bool again;
|
||||||
|
for (again = true, video->Begin(); again; video->Next()) {
|
||||||
|
again = video->img() != NULL;
|
||||||
|
|
||||||
|
PreEncodeFrameHook(video);
|
||||||
|
PreEncodeFrameHook(video, &encoder);
|
||||||
|
encoder.EncodeFrame(video, frame_flags_);
|
||||||
|
|
||||||
|
CxDataIterator iter = encoder.GetCxData();
|
||||||
|
|
||||||
|
while (const vpx_codec_cx_pkt_t *pkt = iter.Next()) {
|
||||||
|
again = true;
|
||||||
|
|
||||||
|
switch (pkt->kind) {
|
||||||
|
case VPX_CODEC_CX_FRAME_PKT:
|
||||||
|
#if CONFIG_VP8_DECODER
|
||||||
|
has_cxdata = true;
|
||||||
|
decoder.DecodeFrame((const uint8_t*)pkt->data.frame.buf,
|
||||||
|
pkt->data.frame.sz);
|
||||||
|
#endif
|
||||||
|
ASSERT_GE(pkt->data.frame.pts, last_pts_);
|
||||||
|
last_pts_ = pkt->data.frame.pts;
|
||||||
|
FramePktHook(pkt);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VPX_CODEC_PSNR_PKT:
|
||||||
|
PSNRPktHook(pkt);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#if CONFIG_VP8_DECODER
|
||||||
|
if (has_cxdata) {
|
||||||
|
const vpx_image_t *img_enc = encoder.GetPreviewFrame();
|
||||||
|
DxDataIterator dec_iter = decoder.GetDxData();
|
||||||
|
const vpx_image_t *img_dec = dec_iter.Next();
|
||||||
|
if(img_enc && img_dec) {
|
||||||
|
const bool res = compare_img(img_enc, img_dec);
|
||||||
|
ASSERT_TRUE(res)<< "Encoder/Decoder mismatch found.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (!Continue())
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
EndPassHook();
|
||||||
|
|
||||||
|
if (!Continue())
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} // namespace libvpx_test
|
||||||
197
test/encode_test_driver.h
Normal file
197
test/encode_test_driver.h
Normal file
@@ -0,0 +1,197 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2012 The WebM project authors. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by a BSD-style license
|
||||||
|
* that can be found in the LICENSE file in the root of the source
|
||||||
|
* tree. An additional intellectual property rights grant can be found
|
||||||
|
* in the file PATENTS. All contributing project authors may
|
||||||
|
* be found in the AUTHORS file in the root of the source tree.
|
||||||
|
*/
|
||||||
|
#ifndef TEST_ENCODE_TEST_DRIVER_H_
|
||||||
|
#define TEST_ENCODE_TEST_DRIVER_H_
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
#include "third_party/googletest/src/include/gtest/gtest.h"
|
||||||
|
#include "vpx/vpx_encoder.h"
|
||||||
|
#include "vpx/vp8cx.h"
|
||||||
|
|
||||||
|
namespace libvpx_test {
|
||||||
|
|
||||||
|
class VideoSource;
|
||||||
|
|
||||||
|
enum TestMode {
|
||||||
|
kRealTime,
|
||||||
|
kOnePassGood,
|
||||||
|
kOnePassBest,
|
||||||
|
kTwoPassGood,
|
||||||
|
kTwoPassBest
|
||||||
|
};
|
||||||
|
#define ALL_TEST_MODES ::testing::Values(::libvpx_test::kRealTime, \
|
||||||
|
::libvpx_test::kOnePassGood, \
|
||||||
|
::libvpx_test::kOnePassBest, \
|
||||||
|
::libvpx_test::kTwoPassGood, \
|
||||||
|
::libvpx_test::kTwoPassBest)
|
||||||
|
|
||||||
|
#define ONE_PASS_TEST_MODES ::testing::Values(::libvpx_test::kRealTime, \
|
||||||
|
::libvpx_test::kOnePassGood, \
|
||||||
|
::libvpx_test::kOnePassBest)
|
||||||
|
|
||||||
|
|
||||||
|
// Provides an object to handle the libvpx get_cx_data() iteration pattern
|
||||||
|
class CxDataIterator {
|
||||||
|
public:
|
||||||
|
explicit CxDataIterator(vpx_codec_ctx_t *encoder)
|
||||||
|
: encoder_(encoder), iter_(NULL) {}
|
||||||
|
|
||||||
|
const vpx_codec_cx_pkt_t *Next() {
|
||||||
|
return vpx_codec_get_cx_data(encoder_, &iter_);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
vpx_codec_ctx_t *encoder_;
|
||||||
|
vpx_codec_iter_t iter_;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Implements an in-memory store for libvpx twopass statistics
|
||||||
|
class TwopassStatsStore {
|
||||||
|
public:
|
||||||
|
void Append(const vpx_codec_cx_pkt_t &pkt) {
|
||||||
|
buffer_.append(reinterpret_cast<char *>(pkt.data.twopass_stats.buf),
|
||||||
|
pkt.data.twopass_stats.sz);
|
||||||
|
}
|
||||||
|
|
||||||
|
vpx_fixed_buf_t buf() {
|
||||||
|
const vpx_fixed_buf_t buf = { &buffer_[0], buffer_.size() };
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Reset() {
|
||||||
|
buffer_.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
std::string buffer_;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// Provides a simplified interface to manage one video encoding pass, given
|
||||||
|
// a configuration and video source.
|
||||||
|
//
|
||||||
|
// TODO(jkoleszar): The exact services it provides and the appropriate
|
||||||
|
// level of abstraction will be fleshed out as more tests are written.
|
||||||
|
class Encoder {
|
||||||
|
public:
|
||||||
|
Encoder(vpx_codec_enc_cfg_t cfg, unsigned long deadline,
|
||||||
|
const unsigned long init_flags, TwopassStatsStore *stats)
|
||||||
|
: cfg_(cfg), deadline_(deadline), init_flags_(init_flags), stats_(stats) {
|
||||||
|
memset(&encoder_, 0, sizeof(encoder_));
|
||||||
|
}
|
||||||
|
|
||||||
|
~Encoder() {
|
||||||
|
vpx_codec_destroy(&encoder_);
|
||||||
|
}
|
||||||
|
|
||||||
|
CxDataIterator GetCxData() {
|
||||||
|
return CxDataIterator(&encoder_);
|
||||||
|
}
|
||||||
|
|
||||||
|
const vpx_image_t *GetPreviewFrame() {
|
||||||
|
return vpx_codec_get_preview_frame(&encoder_);
|
||||||
|
}
|
||||||
|
// This is a thin wrapper around vpx_codec_encode(), so refer to
|
||||||
|
// vpx_encoder.h for its semantics.
|
||||||
|
void EncodeFrame(VideoSource *video, const unsigned long frame_flags);
|
||||||
|
|
||||||
|
// Convenience wrapper for EncodeFrame()
|
||||||
|
void EncodeFrame(VideoSource *video) {
|
||||||
|
EncodeFrame(video, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Control(int ctrl_id, int arg) {
|
||||||
|
const vpx_codec_err_t res = vpx_codec_control_(&encoder_, ctrl_id, arg);
|
||||||
|
ASSERT_EQ(VPX_CODEC_OK, res) << EncoderError();
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_deadline(unsigned long deadline) {
|
||||||
|
deadline_ = deadline;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
const char *EncoderError() {
|
||||||
|
const char *detail = vpx_codec_error_detail(&encoder_);
|
||||||
|
return detail ? detail : vpx_codec_error(&encoder_);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Encode an image
|
||||||
|
void EncodeFrameInternal(const VideoSource &video,
|
||||||
|
const unsigned long frame_flags);
|
||||||
|
|
||||||
|
// Flush the encoder on EOS
|
||||||
|
void Flush();
|
||||||
|
|
||||||
|
vpx_codec_ctx_t encoder_;
|
||||||
|
vpx_codec_enc_cfg_t cfg_;
|
||||||
|
unsigned long deadline_;
|
||||||
|
unsigned long init_flags_;
|
||||||
|
TwopassStatsStore *stats_;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Common test functionality for all Encoder tests.
|
||||||
|
//
|
||||||
|
// This class is a mixin which provides the main loop common to all
|
||||||
|
// encoder tests. It provides hooks which can be overridden by subclasses
|
||||||
|
// to implement each test's specific behavior, while centralizing the bulk
|
||||||
|
// of the boilerplate. Note that it doesn't inherit the gtest testing
|
||||||
|
// classes directly, so that tests can be parameterized differently.
|
||||||
|
class EncoderTest {
|
||||||
|
protected:
|
||||||
|
EncoderTest() : abort_(false), init_flags_(0), frame_flags_(0),
|
||||||
|
last_pts_(0) {}
|
||||||
|
|
||||||
|
virtual ~EncoderTest() {}
|
||||||
|
|
||||||
|
// Initialize the cfg_ member with the default configuration.
|
||||||
|
void InitializeConfig() {
|
||||||
|
const vpx_codec_err_t res = vpx_codec_enc_config_default(
|
||||||
|
&vpx_codec_vp8_cx_algo, &cfg_, 0);
|
||||||
|
ASSERT_EQ(VPX_CODEC_OK, res);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Map the TestMode enum to the deadline_ and passes_ variables.
|
||||||
|
void SetMode(TestMode mode);
|
||||||
|
|
||||||
|
// Main loop.
|
||||||
|
virtual void RunLoop(VideoSource *video);
|
||||||
|
|
||||||
|
// Hook to be called at the beginning of a pass.
|
||||||
|
virtual void BeginPassHook(unsigned int pass) {}
|
||||||
|
|
||||||
|
// Hook to be called at the end of a pass.
|
||||||
|
virtual void EndPassHook() {}
|
||||||
|
|
||||||
|
// Hook to be called before encoding a frame.
|
||||||
|
virtual void PreEncodeFrameHook(VideoSource *video) {}
|
||||||
|
virtual void PreEncodeFrameHook(VideoSource *video, Encoder *encoder) {}
|
||||||
|
|
||||||
|
// Hook to be called on every compressed data packet.
|
||||||
|
virtual void FramePktHook(const vpx_codec_cx_pkt_t *pkt) {}
|
||||||
|
|
||||||
|
// Hook to be called on every PSNR packet.
|
||||||
|
virtual void PSNRPktHook(const vpx_codec_cx_pkt_t *pkt) {}
|
||||||
|
|
||||||
|
// Hook to determine whether the encode loop should continue.
|
||||||
|
virtual bool Continue() const { return !abort_; }
|
||||||
|
|
||||||
|
bool abort_;
|
||||||
|
vpx_codec_enc_cfg_t cfg_;
|
||||||
|
unsigned int passes_;
|
||||||
|
unsigned long deadline_;
|
||||||
|
TwopassStatsStore stats_;
|
||||||
|
unsigned long init_flags_;
|
||||||
|
unsigned long frame_flags_;
|
||||||
|
vpx_codec_pts_t last_pts_;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace libvpx_test
|
||||||
|
|
||||||
|
#endif // TEST_ENCODE_TEST_DRIVER_H_
|
||||||
90
test/error_resilience_test.cc
Normal file
90
test/error_resilience_test.cc
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2012 The WebM project authors. All Rights Reserved.
|
||||||
|
|
||||||
|
Use of this source code is governed by a BSD-style license
|
||||||
|
that can be found in the LICENSE file in the root of the source
|
||||||
|
tree. An additional intellectual property rights grant can be found
|
||||||
|
in the file PATENTS. All contributing project authors may
|
||||||
|
be found in the AUTHORS file in the root of the source tree.
|
||||||
|
*/
|
||||||
|
#include "third_party/googletest/src/include/gtest/gtest.h"
|
||||||
|
#include "test/encode_test_driver.h"
|
||||||
|
#include "test/i420_video_source.h"
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
class ErrorResilienceTest : public libvpx_test::EncoderTest,
|
||||||
|
public ::testing::TestWithParam<int> {
|
||||||
|
protected:
|
||||||
|
ErrorResilienceTest() {
|
||||||
|
psnr_ = 0.0;
|
||||||
|
nframes_ = 0;
|
||||||
|
encoding_mode_ = static_cast<libvpx_test::TestMode>(GetParam());
|
||||||
|
}
|
||||||
|
virtual ~ErrorResilienceTest() {}
|
||||||
|
|
||||||
|
virtual void SetUp() {
|
||||||
|
InitializeConfig();
|
||||||
|
SetMode(encoding_mode_);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void BeginPassHook(unsigned int /*pass*/) {
|
||||||
|
psnr_ = 0.0;
|
||||||
|
nframes_ = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool Continue() const {
|
||||||
|
return !HasFatalFailure() && !abort_;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void PSNRPktHook(const vpx_codec_cx_pkt_t *pkt) {
|
||||||
|
psnr_ += pkt->data.psnr.psnr[0];
|
||||||
|
nframes_++;
|
||||||
|
}
|
||||||
|
|
||||||
|
double GetAveragePsnr() const {
|
||||||
|
if (nframes_)
|
||||||
|
return psnr_ / nframes_;
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
double psnr_;
|
||||||
|
unsigned int nframes_;
|
||||||
|
libvpx_test::TestMode encoding_mode_;
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST_P(ErrorResilienceTest, OnVersusOff) {
|
||||||
|
const vpx_rational timebase = { 33333333, 1000000000 };
|
||||||
|
cfg_.g_timebase = timebase;
|
||||||
|
cfg_.rc_target_bitrate = 2000;
|
||||||
|
cfg_.g_lag_in_frames = 25;
|
||||||
|
|
||||||
|
init_flags_ = VPX_CODEC_USE_PSNR;
|
||||||
|
|
||||||
|
libvpx_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288,
|
||||||
|
timebase.den, timebase.num, 0, 30);
|
||||||
|
|
||||||
|
// Error resilient mode OFF.
|
||||||
|
cfg_.g_error_resilient = 0;
|
||||||
|
ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
|
||||||
|
const double psnr_resilience_off = GetAveragePsnr();
|
||||||
|
EXPECT_GT(psnr_resilience_off, 25.0);
|
||||||
|
|
||||||
|
// Error resilient mode ON.
|
||||||
|
cfg_.g_error_resilient = 1;
|
||||||
|
ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
|
||||||
|
const double psnr_resilience_on = GetAveragePsnr();
|
||||||
|
EXPECT_GT(psnr_resilience_on, 25.0);
|
||||||
|
|
||||||
|
// Test that turning on error resilient mode hurts by 10% at most.
|
||||||
|
if (psnr_resilience_off > 0.0) {
|
||||||
|
const double psnr_ratio = psnr_resilience_on / psnr_resilience_off;
|
||||||
|
EXPECT_GE(psnr_ratio, 0.9);
|
||||||
|
EXPECT_LE(psnr_ratio, 1.1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
INSTANTIATE_TEST_CASE_P(OnOffTest, ErrorResilienceTest,
|
||||||
|
ONE_PASS_TEST_MODES);
|
||||||
|
} // namespace
|
||||||
169
test/fdct4x4_test.cc
Normal file
169
test/fdct4x4_test.cc
Normal file
@@ -0,0 +1,169 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2012 The WebM project authors. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by a BSD-style license
|
||||||
|
* that can be found in the LICENSE file in the root of the source
|
||||||
|
* tree. An additional intellectual property rights grant can be found
|
||||||
|
* in the file PATENTS. All contributing project authors may
|
||||||
|
* be found in the AUTHORS file in the root of the source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
#include "vpx_rtcd.h"
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "test/acm_random.h"
|
||||||
|
#include "third_party/googletest/src/include/gtest/gtest.h"
|
||||||
|
#include "vpx/vpx_integer.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
const int cospi8sqrt2minus1 = 20091;
|
||||||
|
const int sinpi8sqrt2 = 35468;
|
||||||
|
|
||||||
|
void reference_idct4x4(const int16_t *input, int16_t *output) {
|
||||||
|
const int16_t *ip = input;
|
||||||
|
int16_t *op = output;
|
||||||
|
|
||||||
|
for (int i = 0; i < 4; ++i) {
|
||||||
|
const int a1 = ip[0] + ip[8];
|
||||||
|
const int b1 = ip[0] - ip[8];
|
||||||
|
const int temp1 = (ip[4] * sinpi8sqrt2) >> 16;
|
||||||
|
const int temp2 = ip[12] + ((ip[12] * cospi8sqrt2minus1) >> 16);
|
||||||
|
const int c1 = temp1 - temp2;
|
||||||
|
const int temp3 = ip[4] + ((ip[4] * cospi8sqrt2minus1) >> 16);
|
||||||
|
const int temp4 = (ip[12] * sinpi8sqrt2) >> 16;
|
||||||
|
const int d1 = temp3 + temp4;
|
||||||
|
op[0] = a1 + d1;
|
||||||
|
op[12] = a1 - d1;
|
||||||
|
op[4] = b1 + c1;
|
||||||
|
op[8] = b1 - c1;
|
||||||
|
++ip;
|
||||||
|
++op;
|
||||||
|
}
|
||||||
|
ip = output;
|
||||||
|
op = output;
|
||||||
|
for (int i = 0; i < 4; ++i) {
|
||||||
|
const int a1 = ip[0] + ip[2];
|
||||||
|
const int b1 = ip[0] - ip[2];
|
||||||
|
const int temp1 = (ip[1] * sinpi8sqrt2) >> 16;
|
||||||
|
const int temp2 = ip[3] + ((ip[3] * cospi8sqrt2minus1) >> 16);
|
||||||
|
const int c1 = temp1 - temp2;
|
||||||
|
const int temp3 = ip[1] + ((ip[1] * cospi8sqrt2minus1) >> 16);
|
||||||
|
const int temp4 = (ip[3] * sinpi8sqrt2) >> 16;
|
||||||
|
const int d1 = temp3 + temp4;
|
||||||
|
op[0] = (a1 + d1 + 4) >> 3;
|
||||||
|
op[3] = (a1 - d1 + 4) >> 3;
|
||||||
|
op[1] = (b1 + c1 + 4) >> 3;
|
||||||
|
op[2] = (b1 - c1 + 4) >> 3;
|
||||||
|
ip += 4;
|
||||||
|
op += 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
using libvpx_test::ACMRandom;
|
||||||
|
|
||||||
|
TEST(Vp8FdctTest, SignBiasCheck) {
|
||||||
|
ACMRandom rnd(ACMRandom::DeterministicSeed());
|
||||||
|
int16_t test_input_block[16];
|
||||||
|
int16_t test_output_block[16];
|
||||||
|
const int pitch = 8;
|
||||||
|
int count_sign_block[16][2];
|
||||||
|
const int count_test_block = 1000000;
|
||||||
|
|
||||||
|
memset(count_sign_block, 0, sizeof(count_sign_block));
|
||||||
|
|
||||||
|
for (int i = 0; i < count_test_block; ++i) {
|
||||||
|
// Initialize a test block with input range [-255, 255].
|
||||||
|
for (int j = 0; j < 16; ++j)
|
||||||
|
test_input_block[j] = rnd.Rand8() - rnd.Rand8();
|
||||||
|
|
||||||
|
vp8_short_fdct4x4_c(test_input_block, test_output_block, pitch);
|
||||||
|
|
||||||
|
for (int j = 0; j < 16; ++j) {
|
||||||
|
if (test_output_block[j] < 0)
|
||||||
|
++count_sign_block[j][0];
|
||||||
|
else if (test_output_block[j] > 0)
|
||||||
|
++count_sign_block[j][1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool bias_acceptable = true;
|
||||||
|
for (int j = 0; j < 16; ++j)
|
||||||
|
bias_acceptable = bias_acceptable &&
|
||||||
|
(abs(count_sign_block[j][0] - count_sign_block[j][1]) < 10000);
|
||||||
|
|
||||||
|
EXPECT_EQ(true, bias_acceptable)
|
||||||
|
<< "Error: 4x4 FDCT has a sign bias > 1% for input range [-255, 255]";
|
||||||
|
|
||||||
|
memset(count_sign_block, 0, sizeof(count_sign_block));
|
||||||
|
|
||||||
|
for (int i = 0; i < count_test_block; ++i) {
|
||||||
|
// Initialize a test block with input range [-15, 15].
|
||||||
|
for (int j = 0; j < 16; ++j)
|
||||||
|
test_input_block[j] = (rnd.Rand8() >> 4) - (rnd.Rand8() >> 4);
|
||||||
|
|
||||||
|
vp8_short_fdct4x4_c(test_input_block, test_output_block, pitch);
|
||||||
|
|
||||||
|
for (int j = 0; j < 16; ++j) {
|
||||||
|
if (test_output_block[j] < 0)
|
||||||
|
++count_sign_block[j][0];
|
||||||
|
else if (test_output_block[j] > 0)
|
||||||
|
++count_sign_block[j][1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bias_acceptable = true;
|
||||||
|
for (int j = 0; j < 16; ++j)
|
||||||
|
bias_acceptable = bias_acceptable &&
|
||||||
|
(abs(count_sign_block[j][0] - count_sign_block[j][1]) < 100000);
|
||||||
|
|
||||||
|
EXPECT_EQ(true, bias_acceptable)
|
||||||
|
<< "Error: 4x4 FDCT has a sign bias > 10% for input range [-15, 15]";
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST(Vp8FdctTest, RoundTripErrorCheck) {
|
||||||
|
ACMRandom rnd(ACMRandom::DeterministicSeed());
|
||||||
|
int max_error = 0;
|
||||||
|
double total_error = 0;
|
||||||
|
const int count_test_block = 1000000;
|
||||||
|
for (int i = 0; i < count_test_block; ++i) {
|
||||||
|
int16_t test_input_block[16];
|
||||||
|
int16_t test_temp_block[16];
|
||||||
|
int16_t test_output_block[16];
|
||||||
|
|
||||||
|
// Initialize a test block with input range [-255, 255].
|
||||||
|
for (int j = 0; j < 16; ++j)
|
||||||
|
test_input_block[j] = rnd.Rand8() - rnd.Rand8();
|
||||||
|
|
||||||
|
const int pitch = 8;
|
||||||
|
vp8_short_fdct4x4_c(test_input_block, test_temp_block, pitch);
|
||||||
|
reference_idct4x4(test_temp_block, test_output_block);
|
||||||
|
|
||||||
|
for (int j = 0; j < 16; ++j) {
|
||||||
|
const int diff = test_input_block[j] - test_output_block[j];
|
||||||
|
const int error = diff * diff;
|
||||||
|
if (max_error < error)
|
||||||
|
max_error = error;
|
||||||
|
total_error += error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
EXPECT_GE(1, max_error )
|
||||||
|
<< "Error: FDCT/IDCT has an individual roundtrip error > 1";
|
||||||
|
|
||||||
|
EXPECT_GE(count_test_block, total_error)
|
||||||
|
<< "Error: FDCT/IDCT has average roundtrip error > 1 per block";
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace
|
||||||
117
test/i420_video_source.h
Normal file
117
test/i420_video_source.h
Normal file
@@ -0,0 +1,117 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2012 The WebM project authors. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by a BSD-style license
|
||||||
|
* that can be found in the LICENSE file in the root of the source
|
||||||
|
* tree. An additional intellectual property rights grant can be found
|
||||||
|
* in the file PATENTS. All contributing project authors may
|
||||||
|
* be found in the AUTHORS file in the root of the source tree.
|
||||||
|
*/
|
||||||
|
#ifndef TEST_I420_VIDEO_SOURCE_H_
|
||||||
|
#define TEST_I420_VIDEO_SOURCE_H_
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstdlib>
|
||||||
|
|
||||||
|
#include "test/video_source.h"
|
||||||
|
|
||||||
|
namespace libvpx_test {
|
||||||
|
|
||||||
|
// This class extends VideoSource to allow parsing of raw yv12
|
||||||
|
// so that we can do actual file encodes.
|
||||||
|
class I420VideoSource : public VideoSource {
|
||||||
|
public:
|
||||||
|
I420VideoSource(const std::string &file_name,
|
||||||
|
unsigned int width, unsigned int height,
|
||||||
|
int rate_numerator, int rate_denominator,
|
||||||
|
unsigned int start, int limit)
|
||||||
|
: file_name_(file_name),
|
||||||
|
input_file_(NULL),
|
||||||
|
img_(NULL),
|
||||||
|
start_(start),
|
||||||
|
limit_(limit),
|
||||||
|
frame_(0),
|
||||||
|
width_(0),
|
||||||
|
height_(0),
|
||||||
|
framerate_numerator_(rate_numerator),
|
||||||
|
framerate_denominator_(rate_denominator) {
|
||||||
|
|
||||||
|
// This initializes raw_sz_, width_, height_ and allocates an img.
|
||||||
|
SetSize(width, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual ~I420VideoSource() {
|
||||||
|
vpx_img_free(img_);
|
||||||
|
if (input_file_)
|
||||||
|
fclose(input_file_);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void Begin() {
|
||||||
|
if (input_file_)
|
||||||
|
fclose(input_file_);
|
||||||
|
input_file_ = OpenTestDataFile(file_name_);
|
||||||
|
ASSERT_TRUE(input_file_) << "Input file open failed. Filename: "
|
||||||
|
<< file_name_;
|
||||||
|
if (start_) {
|
||||||
|
fseek(input_file_, raw_sz_ * start_, SEEK_SET);
|
||||||
|
}
|
||||||
|
|
||||||
|
frame_ = start_;
|
||||||
|
FillFrame();
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void Next() {
|
||||||
|
++frame_;
|
||||||
|
FillFrame();
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual vpx_image_t *img() const { return (frame_ < limit_) ? img_ : NULL; }
|
||||||
|
|
||||||
|
// Models a stream where Timebase = 1/FPS, so pts == frame.
|
||||||
|
virtual vpx_codec_pts_t pts() const { return frame_; }
|
||||||
|
|
||||||
|
virtual unsigned long duration() const { return 1; }
|
||||||
|
|
||||||
|
virtual vpx_rational_t timebase() const {
|
||||||
|
const vpx_rational_t t = { framerate_denominator_, framerate_numerator_ };
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual unsigned int frame() const { return frame_; }
|
||||||
|
|
||||||
|
virtual unsigned int limit() const { return limit_; }
|
||||||
|
|
||||||
|
void SetSize(unsigned int width, unsigned int height) {
|
||||||
|
if (width != width_ || height != height_) {
|
||||||
|
vpx_img_free(img_);
|
||||||
|
img_ = vpx_img_alloc(NULL, VPX_IMG_FMT_VPXI420, width, height, 1);
|
||||||
|
ASSERT_TRUE(img_ != NULL);
|
||||||
|
width_ = width;
|
||||||
|
height_ = height;
|
||||||
|
raw_sz_ = width * height * 3 / 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void FillFrame() {
|
||||||
|
// Read a frame from input_file.
|
||||||
|
if (fread(img_->img_data, raw_sz_, 1, input_file_) == 0) {
|
||||||
|
limit_ = frame_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
std::string file_name_;
|
||||||
|
FILE *input_file_;
|
||||||
|
vpx_image_t *img_;
|
||||||
|
size_t raw_sz_;
|
||||||
|
unsigned int start_;
|
||||||
|
unsigned int limit_;
|
||||||
|
unsigned int frame_;
|
||||||
|
unsigned int width_;
|
||||||
|
unsigned int height_;
|
||||||
|
unsigned int framerate_numerator_;
|
||||||
|
unsigned int framerate_denominator_;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace libvpx_test
|
||||||
|
|
||||||
|
#endif // TEST_I420_VIDEO_SOURCE_H_
|
||||||
126
test/idctllm_test.cc
Normal file
126
test/idctllm_test.cc
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by a BSD-style license
|
||||||
|
* that can be found in the LICENSE file in the root of the source
|
||||||
|
* tree. An additional intellectual property rights grant can be found
|
||||||
|
* in the file PATENTS. All contributing project authors may
|
||||||
|
* be found in the AUTHORS file in the root of the source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
#include "vpx_config.h"
|
||||||
|
#include "vpx_rtcd.h"
|
||||||
|
}
|
||||||
|
#include "test/register_state_check.h"
|
||||||
|
#include "third_party/googletest/src/include/gtest/gtest.h"
|
||||||
|
|
||||||
|
typedef void (*idct_fn_t)(short *input, unsigned char *pred_ptr,
|
||||||
|
int pred_stride, unsigned char *dst_ptr,
|
||||||
|
int dst_stride);
|
||||||
|
namespace {
|
||||||
|
class IDCTTest : public ::testing::TestWithParam<idct_fn_t>
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
virtual void SetUp()
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
UUT = GetParam();
|
||||||
|
memset(input, 0, sizeof(input));
|
||||||
|
/* Set up guard blocks */
|
||||||
|
for(i=0; i<256; i++)
|
||||||
|
output[i] = ((i&0xF)<4&&(i<64))?0:-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
idct_fn_t UUT;
|
||||||
|
short input[16];
|
||||||
|
unsigned char output[256];
|
||||||
|
unsigned char predict[256];
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST_P(IDCTTest, TestGuardBlocks)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for(i=0; i<256; i++)
|
||||||
|
if((i&0xF) < 4 && i<64)
|
||||||
|
EXPECT_EQ(0, output[i]) << i;
|
||||||
|
else
|
||||||
|
EXPECT_EQ(255, output[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_P(IDCTTest, TestAllZeros)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
REGISTER_STATE_CHECK(UUT(input, output, 16, output, 16));
|
||||||
|
|
||||||
|
for(i=0; i<256; i++)
|
||||||
|
if((i&0xF) < 4 && i<64)
|
||||||
|
EXPECT_EQ(0, output[i]) << "i==" << i;
|
||||||
|
else
|
||||||
|
EXPECT_EQ(255, output[i]) << "i==" << i;
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_P(IDCTTest, TestAllOnes)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
input[0] = 4;
|
||||||
|
REGISTER_STATE_CHECK(UUT(input, output, 16, output, 16));
|
||||||
|
|
||||||
|
for(i=0; i<256; i++)
|
||||||
|
if((i&0xF) < 4 && i<64)
|
||||||
|
EXPECT_EQ(1, output[i]) << "i==" << i;
|
||||||
|
else
|
||||||
|
EXPECT_EQ(255, output[i]) << "i==" << i;
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_P(IDCTTest, TestAddOne)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for(i=0; i<256; i++)
|
||||||
|
predict[i] = i;
|
||||||
|
|
||||||
|
input[0] = 4;
|
||||||
|
REGISTER_STATE_CHECK(UUT(input, predict, 16, output, 16));
|
||||||
|
|
||||||
|
for(i=0; i<256; i++)
|
||||||
|
if((i&0xF) < 4 && i<64)
|
||||||
|
EXPECT_EQ(i+1, output[i]) << "i==" << i;
|
||||||
|
else
|
||||||
|
EXPECT_EQ(255, output[i]) << "i==" << i;
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_P(IDCTTest, TestWithData)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for(i=0; i<16; i++)
|
||||||
|
input[i] = i;
|
||||||
|
|
||||||
|
REGISTER_STATE_CHECK(UUT(input, output, 16, output, 16));
|
||||||
|
|
||||||
|
for(i=0; i<256; i++)
|
||||||
|
if((i&0xF) > 3 || i>63)
|
||||||
|
EXPECT_EQ(255, output[i]) << "i==" << i;
|
||||||
|
else if(i == 0)
|
||||||
|
EXPECT_EQ(11, output[i]) << "i==" << i;
|
||||||
|
else if(i == 34)
|
||||||
|
EXPECT_EQ(1, output[i]) << "i==" << i;
|
||||||
|
else if(i == 2 || i == 17 || i == 32)
|
||||||
|
EXPECT_EQ(3, output[i]) << "i==" << i;
|
||||||
|
else
|
||||||
|
EXPECT_EQ(0, output[i]) << "i==" << i;
|
||||||
|
}
|
||||||
|
|
||||||
|
INSTANTIATE_TEST_CASE_P(C, IDCTTest,
|
||||||
|
::testing::Values(vp8_short_idct4x4llm_c));
|
||||||
|
#if HAVE_MMX
|
||||||
|
INSTANTIATE_TEST_CASE_P(MMX, IDCTTest,
|
||||||
|
::testing::Values(vp8_short_idct4x4llm_mmx));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
357
test/intrapred_test.cc
Normal file
357
test/intrapred_test.cc
Normal file
@@ -0,0 +1,357 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2012 The WebM project authors. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by a BSD-style license
|
||||||
|
* that can be found in the LICENSE file in the root of the source
|
||||||
|
* tree. An additional intellectual property rights grant can be found
|
||||||
|
* in the file PATENTS. All contributing project authors may
|
||||||
|
* be found in the AUTHORS file in the root of the source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include "test/acm_random.h"
|
||||||
|
#include "test/register_state_check.h"
|
||||||
|
#include "third_party/googletest/src/include/gtest/gtest.h"
|
||||||
|
extern "C" {
|
||||||
|
#include "vpx_config.h"
|
||||||
|
#include "vpx_rtcd.h"
|
||||||
|
#include "vp8/common/blockd.h"
|
||||||
|
#include "vpx_mem/vpx_mem.h"
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
using libvpx_test::ACMRandom;
|
||||||
|
|
||||||
|
class IntraPredBase {
|
||||||
|
protected:
|
||||||
|
void SetupMacroblock(uint8_t *data, int block_size, int stride,
|
||||||
|
int num_planes) {
|
||||||
|
memset(&mb_, 0, sizeof(mb_));
|
||||||
|
memset(&mi_, 0, sizeof(mi_));
|
||||||
|
mb_.up_available = 1;
|
||||||
|
mb_.left_available = 1;
|
||||||
|
mb_.mode_info_context = &mi_;
|
||||||
|
stride_ = stride;
|
||||||
|
block_size_ = block_size;
|
||||||
|
num_planes_ = num_planes;
|
||||||
|
for (int p = 0; p < num_planes; p++)
|
||||||
|
data_ptr_[p] = data + stride * (block_size + 1) * p +
|
||||||
|
stride + block_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FillRandom() {
|
||||||
|
// Fill edges with random data
|
||||||
|
ACMRandom rnd(ACMRandom::DeterministicSeed());
|
||||||
|
for (int p = 0; p < num_planes_; p++) {
|
||||||
|
for (int x = -1 ; x <= block_size_; x++)
|
||||||
|
data_ptr_[p][x - stride_] = rnd.Rand8();
|
||||||
|
for (int y = 0; y < block_size_; y++)
|
||||||
|
data_ptr_[p][y * stride_ - 1] = rnd.Rand8();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void Predict(MB_PREDICTION_MODE mode) = 0;
|
||||||
|
|
||||||
|
void SetLeftUnavailable() {
|
||||||
|
mb_.left_available = 0;
|
||||||
|
for (int p = 0; p < num_planes_; p++)
|
||||||
|
for (int i = -1; i < block_size_; ++i)
|
||||||
|
data_ptr_[p][stride_ * i - 1] = 129;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetTopUnavailable() {
|
||||||
|
mb_.up_available = 0;
|
||||||
|
for (int p = 0; p < num_planes_; p++)
|
||||||
|
memset(&data_ptr_[p][-1 - stride_], 127, block_size_ + 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetTopLeftUnavailable() {
|
||||||
|
SetLeftUnavailable();
|
||||||
|
SetTopUnavailable();
|
||||||
|
}
|
||||||
|
|
||||||
|
int BlockSizeLog2Min1() const {
|
||||||
|
switch (block_size_) {
|
||||||
|
case 16:
|
||||||
|
return 3;
|
||||||
|
case 8:
|
||||||
|
return 2;
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// check DC prediction output against a reference
|
||||||
|
void CheckDCPrediction() const {
|
||||||
|
for (int p = 0; p < num_planes_; p++) {
|
||||||
|
// calculate expected DC
|
||||||
|
int expected;
|
||||||
|
if (mb_.up_available || mb_.left_available) {
|
||||||
|
int sum = 0, shift = BlockSizeLog2Min1() + mb_.up_available +
|
||||||
|
mb_.left_available;
|
||||||
|
if (mb_.up_available)
|
||||||
|
for (int x = 0; x < block_size_; x++)
|
||||||
|
sum += data_ptr_[p][x - stride_];
|
||||||
|
if (mb_.left_available)
|
||||||
|
for (int y = 0; y < block_size_; y++)
|
||||||
|
sum += data_ptr_[p][y * stride_ - 1];
|
||||||
|
expected = (sum + (1 << (shift - 1))) >> shift;
|
||||||
|
} else
|
||||||
|
expected = 0x80;
|
||||||
|
|
||||||
|
// check that all subsequent lines are equal to the first
|
||||||
|
for (int y = 1; y < block_size_; ++y)
|
||||||
|
ASSERT_EQ(0, memcmp(data_ptr_[p], &data_ptr_[p][y * stride_],
|
||||||
|
block_size_));
|
||||||
|
// within the first line, ensure that each pixel has the same value
|
||||||
|
for (int x = 1; x < block_size_; ++x)
|
||||||
|
ASSERT_EQ(data_ptr_[p][0], data_ptr_[p][x]);
|
||||||
|
// now ensure that that pixel has the expected (DC) value
|
||||||
|
ASSERT_EQ(expected, data_ptr_[p][0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// check V prediction output against a reference
|
||||||
|
void CheckVPrediction() const {
|
||||||
|
// check that all lines equal the top border
|
||||||
|
for (int p = 0; p < num_planes_; p++)
|
||||||
|
for (int y = 0; y < block_size_; y++)
|
||||||
|
ASSERT_EQ(0, memcmp(&data_ptr_[p][-stride_],
|
||||||
|
&data_ptr_[p][y * stride_], block_size_));
|
||||||
|
}
|
||||||
|
|
||||||
|
// check H prediction output against a reference
|
||||||
|
void CheckHPrediction() const {
|
||||||
|
// for each line, ensure that each pixel is equal to the left border
|
||||||
|
for (int p = 0; p < num_planes_; p++)
|
||||||
|
for (int y = 0; y < block_size_; y++)
|
||||||
|
for (int x = 0; x < block_size_; x++)
|
||||||
|
ASSERT_EQ(data_ptr_[p][-1 + y * stride_],
|
||||||
|
data_ptr_[p][x + y * stride_]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ClipByte(int value) {
|
||||||
|
if (value > 255)
|
||||||
|
return 255;
|
||||||
|
else if (value < 0)
|
||||||
|
return 0;
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check TM prediction output against a reference
|
||||||
|
void CheckTMPrediction() const {
|
||||||
|
for (int p = 0; p < num_planes_; p++)
|
||||||
|
for (int y = 0; y < block_size_; y++)
|
||||||
|
for (int x = 0; x < block_size_; x++) {
|
||||||
|
const int expected = ClipByte(data_ptr_[p][x - stride_]
|
||||||
|
+ data_ptr_[p][stride_ * y - 1]
|
||||||
|
- data_ptr_[p][-1 - stride_]);
|
||||||
|
ASSERT_EQ(expected, data_ptr_[p][y * stride_ + x]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Actual test
|
||||||
|
void RunTest() {
|
||||||
|
{
|
||||||
|
SCOPED_TRACE("DC_PRED");
|
||||||
|
FillRandom();
|
||||||
|
Predict(DC_PRED);
|
||||||
|
CheckDCPrediction();
|
||||||
|
}
|
||||||
|
{
|
||||||
|
SCOPED_TRACE("DC_PRED LEFT");
|
||||||
|
FillRandom();
|
||||||
|
SetLeftUnavailable();
|
||||||
|
Predict(DC_PRED);
|
||||||
|
CheckDCPrediction();
|
||||||
|
}
|
||||||
|
{
|
||||||
|
SCOPED_TRACE("DC_PRED TOP");
|
||||||
|
FillRandom();
|
||||||
|
SetTopUnavailable();
|
||||||
|
Predict(DC_PRED);
|
||||||
|
CheckDCPrediction();
|
||||||
|
}
|
||||||
|
{
|
||||||
|
SCOPED_TRACE("DC_PRED TOP_LEFT");
|
||||||
|
FillRandom();
|
||||||
|
SetTopLeftUnavailable();
|
||||||
|
Predict(DC_PRED);
|
||||||
|
CheckDCPrediction();
|
||||||
|
}
|
||||||
|
{
|
||||||
|
SCOPED_TRACE("H_PRED");
|
||||||
|
FillRandom();
|
||||||
|
Predict(H_PRED);
|
||||||
|
CheckHPrediction();
|
||||||
|
}
|
||||||
|
{
|
||||||
|
SCOPED_TRACE("V_PRED");
|
||||||
|
FillRandom();
|
||||||
|
Predict(V_PRED);
|
||||||
|
CheckVPrediction();
|
||||||
|
}
|
||||||
|
{
|
||||||
|
SCOPED_TRACE("TM_PRED");
|
||||||
|
FillRandom();
|
||||||
|
Predict(TM_PRED);
|
||||||
|
CheckTMPrediction();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MACROBLOCKD mb_;
|
||||||
|
MODE_INFO mi_;
|
||||||
|
uint8_t *data_ptr_[2]; // in the case of Y, only [0] is used
|
||||||
|
int stride_;
|
||||||
|
int block_size_;
|
||||||
|
int num_planes_;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef void (*intra_pred_y_fn_t)(MACROBLOCKD *x,
|
||||||
|
uint8_t *yabove_row,
|
||||||
|
uint8_t *yleft,
|
||||||
|
int left_stride,
|
||||||
|
uint8_t *ypred_ptr,
|
||||||
|
int y_stride);
|
||||||
|
|
||||||
|
class IntraPredYTest : public ::testing::TestWithParam<intra_pred_y_fn_t>,
|
||||||
|
protected IntraPredBase {
|
||||||
|
public:
|
||||||
|
static void SetUpTestCase() {
|
||||||
|
data_array_ = reinterpret_cast<uint8_t*>(
|
||||||
|
vpx_memalign(kDataAlignment, kDataBufferSize));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void TearDownTestCase() {
|
||||||
|
vpx_free(data_array_);
|
||||||
|
data_array_ = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
static const int kBlockSize = 16;
|
||||||
|
static const int kDataAlignment = 16;
|
||||||
|
static const int kStride = kBlockSize * 3;
|
||||||
|
// We use 48 so that the data pointer of the first pixel in each row of
|
||||||
|
// each macroblock is 16-byte aligned, and this gives us access to the
|
||||||
|
// top-left and top-right corner pixels belonging to the top-left/right
|
||||||
|
// macroblocks.
|
||||||
|
// We use 17 lines so we have one line above us for top-prediction.
|
||||||
|
static const int kDataBufferSize = kStride * (kBlockSize + 1);
|
||||||
|
|
||||||
|
virtual void SetUp() {
|
||||||
|
pred_fn_ = GetParam();
|
||||||
|
SetupMacroblock(data_array_, kBlockSize, kStride, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void Predict(MB_PREDICTION_MODE mode) {
|
||||||
|
mb_.mode_info_context->mbmi.mode = mode;
|
||||||
|
REGISTER_STATE_CHECK(pred_fn_(&mb_,
|
||||||
|
data_ptr_[0] - kStride,
|
||||||
|
data_ptr_[0] - 1, kStride,
|
||||||
|
data_ptr_[0], kStride));
|
||||||
|
}
|
||||||
|
|
||||||
|
intra_pred_y_fn_t pred_fn_;
|
||||||
|
static uint8_t* data_array_;
|
||||||
|
};
|
||||||
|
|
||||||
|
uint8_t* IntraPredYTest::data_array_ = NULL;
|
||||||
|
|
||||||
|
TEST_P(IntraPredYTest, IntraPredTests) {
|
||||||
|
RunTest();
|
||||||
|
}
|
||||||
|
|
||||||
|
INSTANTIATE_TEST_CASE_P(C, IntraPredYTest,
|
||||||
|
::testing::Values(
|
||||||
|
vp8_build_intra_predictors_mby_s_c));
|
||||||
|
#if HAVE_SSE2
|
||||||
|
INSTANTIATE_TEST_CASE_P(SSE2, IntraPredYTest,
|
||||||
|
::testing::Values(
|
||||||
|
vp8_build_intra_predictors_mby_s_sse2));
|
||||||
|
#endif
|
||||||
|
#if HAVE_SSSE3
|
||||||
|
INSTANTIATE_TEST_CASE_P(SSSE3, IntraPredYTest,
|
||||||
|
::testing::Values(
|
||||||
|
vp8_build_intra_predictors_mby_s_ssse3));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef void (*intra_pred_uv_fn_t)(MACROBLOCKD *x,
|
||||||
|
uint8_t *uabove_row,
|
||||||
|
uint8_t *vabove_row,
|
||||||
|
uint8_t *uleft,
|
||||||
|
uint8_t *vleft,
|
||||||
|
int left_stride,
|
||||||
|
uint8_t *upred_ptr,
|
||||||
|
uint8_t *vpred_ptr,
|
||||||
|
int pred_stride);
|
||||||
|
|
||||||
|
class IntraPredUVTest : public ::testing::TestWithParam<intra_pred_uv_fn_t>,
|
||||||
|
protected IntraPredBase {
|
||||||
|
public:
|
||||||
|
static void SetUpTestCase() {
|
||||||
|
data_array_ = reinterpret_cast<uint8_t*>(
|
||||||
|
vpx_memalign(kDataAlignment, kDataBufferSize));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void TearDownTestCase() {
|
||||||
|
vpx_free(data_array_);
|
||||||
|
data_array_ = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
static const int kBlockSize = 8;
|
||||||
|
static const int kDataAlignment = 8;
|
||||||
|
static const int kStride = kBlockSize * 3;
|
||||||
|
// We use 24 so that the data pointer of the first pixel in each row of
|
||||||
|
// each macroblock is 8-byte aligned, and this gives us access to the
|
||||||
|
// top-left and top-right corner pixels belonging to the top-left/right
|
||||||
|
// macroblocks.
|
||||||
|
// We use 9 lines so we have one line above us for top-prediction.
|
||||||
|
// [0] = U, [1] = V
|
||||||
|
static const int kDataBufferSize = 2 * kStride * (kBlockSize + 1);
|
||||||
|
|
||||||
|
virtual void SetUp() {
|
||||||
|
pred_fn_ = GetParam();
|
||||||
|
SetupMacroblock(data_array_, kBlockSize, kStride, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void Predict(MB_PREDICTION_MODE mode) {
|
||||||
|
mb_.mode_info_context->mbmi.uv_mode = mode;
|
||||||
|
pred_fn_(&mb_, data_ptr_[0] - kStride, data_ptr_[1] - kStride,
|
||||||
|
data_ptr_[0] - 1, data_ptr_[1] - 1, kStride,
|
||||||
|
data_ptr_[0], data_ptr_[1], kStride);
|
||||||
|
}
|
||||||
|
|
||||||
|
intra_pred_uv_fn_t pred_fn_;
|
||||||
|
// We use 24 so that the data pointer of the first pixel in each row of
|
||||||
|
// each macroblock is 8-byte aligned, and this gives us access to the
|
||||||
|
// top-left and top-right corner pixels belonging to the top-left/right
|
||||||
|
// macroblocks.
|
||||||
|
// We use 9 lines so we have one line above us for top-prediction.
|
||||||
|
// [0] = U, [1] = V
|
||||||
|
static uint8_t* data_array_;
|
||||||
|
};
|
||||||
|
|
||||||
|
uint8_t* IntraPredUVTest::data_array_ = NULL;
|
||||||
|
|
||||||
|
TEST_P(IntraPredUVTest, IntraPredTests) {
|
||||||
|
RunTest();
|
||||||
|
}
|
||||||
|
|
||||||
|
INSTANTIATE_TEST_CASE_P(C, IntraPredUVTest,
|
||||||
|
::testing::Values(
|
||||||
|
vp8_build_intra_predictors_mbuv_s_c));
|
||||||
|
#if HAVE_SSE2
|
||||||
|
INSTANTIATE_TEST_CASE_P(SSE2, IntraPredUVTest,
|
||||||
|
::testing::Values(
|
||||||
|
vp8_build_intra_predictors_mbuv_s_sse2));
|
||||||
|
#endif
|
||||||
|
#if HAVE_SSSE3
|
||||||
|
INSTANTIATE_TEST_CASE_P(SSSE3, IntraPredUVTest,
|
||||||
|
::testing::Values(
|
||||||
|
vp8_build_intra_predictors_mbuv_s_ssse3));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
} // namespace
|
||||||
109
test/ivf_video_source.h
Normal file
109
test/ivf_video_source.h
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2012 The WebM project authors. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by a BSD-style license
|
||||||
|
* that can be found in the LICENSE file in the root of the source
|
||||||
|
* tree. An additional intellectual property rights grant can be found
|
||||||
|
* in the file PATENTS. All contributing project authors may
|
||||||
|
* be found in the AUTHORS file in the root of the source tree.
|
||||||
|
*/
|
||||||
|
#ifndef TEST_IVF_VIDEO_SOURCE_H_
|
||||||
|
#define TEST_IVF_VIDEO_SOURCE_H_
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <new>
|
||||||
|
#include <string>
|
||||||
|
#include "test/video_source.h"
|
||||||
|
|
||||||
|
namespace libvpx_test {
|
||||||
|
const unsigned int kCodeBufferSize = 256 * 1024;
|
||||||
|
const unsigned int kIvfFileHdrSize = 32;
|
||||||
|
const unsigned int kIvfFrameHdrSize = 12;
|
||||||
|
|
||||||
|
static unsigned int MemGetLe32(const uint8_t *mem) {
|
||||||
|
return (mem[3] << 24) | (mem[2] << 16) | (mem[1] << 8) | (mem[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// This class extends VideoSource to allow parsing of ivf files,
|
||||||
|
// so that we can do actual file decodes.
|
||||||
|
class IVFVideoSource : public CompressedVideoSource {
|
||||||
|
public:
|
||||||
|
IVFVideoSource(const std::string &file_name)
|
||||||
|
: file_name_(file_name),
|
||||||
|
input_file_(NULL),
|
||||||
|
compressed_frame_buf_(NULL),
|
||||||
|
frame_sz_(0),
|
||||||
|
frame_(0),
|
||||||
|
end_of_file_(false) {
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual ~IVFVideoSource() {
|
||||||
|
delete[] compressed_frame_buf_;
|
||||||
|
|
||||||
|
if (input_file_)
|
||||||
|
fclose(input_file_);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void Init() {
|
||||||
|
// Allocate a buffer for read in the compressed video frame.
|
||||||
|
compressed_frame_buf_ = new uint8_t[libvpx_test::kCodeBufferSize];
|
||||||
|
ASSERT_TRUE(compressed_frame_buf_) << "Allocate frame buffer failed";
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void Begin() {
|
||||||
|
input_file_ = OpenTestDataFile(file_name_);
|
||||||
|
ASSERT_TRUE(input_file_) << "Input file open failed. Filename: "
|
||||||
|
<< file_name_;
|
||||||
|
|
||||||
|
// Read file header
|
||||||
|
uint8_t file_hdr[kIvfFileHdrSize];
|
||||||
|
ASSERT_EQ(kIvfFileHdrSize, fread(file_hdr, 1, kIvfFileHdrSize, input_file_))
|
||||||
|
<< "File header read failed.";
|
||||||
|
// Check file header
|
||||||
|
ASSERT_TRUE(file_hdr[0] == 'D' && file_hdr[1] == 'K' && file_hdr[2] == 'I'
|
||||||
|
&& file_hdr[3] == 'F') << "Input is not an IVF file.";
|
||||||
|
|
||||||
|
FillFrame();
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void Next() {
|
||||||
|
++frame_;
|
||||||
|
FillFrame();
|
||||||
|
}
|
||||||
|
|
||||||
|
void FillFrame() {
|
||||||
|
uint8_t frame_hdr[kIvfFrameHdrSize];
|
||||||
|
// Check frame header and read a frame from input_file.
|
||||||
|
if (fread(frame_hdr, 1, kIvfFrameHdrSize, input_file_)
|
||||||
|
!= kIvfFrameHdrSize) {
|
||||||
|
end_of_file_ = true;
|
||||||
|
} else {
|
||||||
|
end_of_file_ = false;
|
||||||
|
|
||||||
|
frame_sz_ = MemGetLe32(frame_hdr);
|
||||||
|
ASSERT_LE(frame_sz_, kCodeBufferSize)
|
||||||
|
<< "Frame is too big for allocated code buffer";
|
||||||
|
ASSERT_EQ(frame_sz_,
|
||||||
|
fread(compressed_frame_buf_, 1, frame_sz_, input_file_))
|
||||||
|
<< "Failed to read complete frame";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual const uint8_t *cxdata() const {
|
||||||
|
return end_of_file_ ? NULL : compressed_frame_buf_;
|
||||||
|
}
|
||||||
|
virtual const unsigned int frame_size() const { return frame_sz_; }
|
||||||
|
virtual const unsigned int frame_number() const { return frame_; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
std::string file_name_;
|
||||||
|
FILE *input_file_;
|
||||||
|
uint8_t *compressed_frame_buf_;
|
||||||
|
unsigned int frame_sz_;
|
||||||
|
unsigned int frame_;
|
||||||
|
bool end_of_file_;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace libvpx_test
|
||||||
|
|
||||||
|
#endif // TEST_IVF_VIDEO_SOURCE_H_
|
||||||
145
test/keyframe_test.cc
Normal file
145
test/keyframe_test.cc
Normal file
@@ -0,0 +1,145 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2012 The WebM project authors. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by a BSD-style license
|
||||||
|
* that can be found in the LICENSE file in the root of the source
|
||||||
|
* tree. An additional intellectual property rights grant can be found
|
||||||
|
* in the file PATENTS. All contributing project authors may
|
||||||
|
* be found in the AUTHORS file in the root of the source tree.
|
||||||
|
*/
|
||||||
|
#include <climits>
|
||||||
|
#include <vector>
|
||||||
|
#include "test/encode_test_driver.h"
|
||||||
|
#include "test/i420_video_source.h"
|
||||||
|
#include "third_party/googletest/src/include/gtest/gtest.h"
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
class KeyframeTest : public ::libvpx_test::EncoderTest,
|
||||||
|
public ::testing::TestWithParam<enum libvpx_test::TestMode> {
|
||||||
|
protected:
|
||||||
|
virtual void SetUp() {
|
||||||
|
InitializeConfig();
|
||||||
|
SetMode(GetParam());
|
||||||
|
kf_count_ = 0;
|
||||||
|
kf_count_max_ = INT_MAX;
|
||||||
|
kf_do_force_kf_ = false;
|
||||||
|
set_cpu_used_ = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool Continue() const {
|
||||||
|
return !HasFatalFailure() && !abort_;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void PreEncodeFrameHook(::libvpx_test::VideoSource *video,
|
||||||
|
::libvpx_test::Encoder *encoder) {
|
||||||
|
if (kf_do_force_kf_)
|
||||||
|
frame_flags_ = (video->frame() % 3) ? 0 : VPX_EFLAG_FORCE_KF;
|
||||||
|
if (set_cpu_used_ && video->frame() == 1)
|
||||||
|
encoder->Control(VP8E_SET_CPUUSED, set_cpu_used_);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void FramePktHook(const vpx_codec_cx_pkt_t *pkt) {
|
||||||
|
if (pkt->data.frame.flags & VPX_FRAME_IS_KEY) {
|
||||||
|
kf_pts_list_.push_back(pkt->data.frame.pts);
|
||||||
|
kf_count_++;
|
||||||
|
abort_ |= kf_count_ > kf_count_max_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool kf_do_force_kf_;
|
||||||
|
int kf_count_;
|
||||||
|
int kf_count_max_;
|
||||||
|
std::vector<vpx_codec_pts_t> kf_pts_list_;
|
||||||
|
int set_cpu_used_;
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST_P(KeyframeTest, TestRandomVideoSource) {
|
||||||
|
// Validate that encoding the RandomVideoSource produces multiple keyframes.
|
||||||
|
// This validates the results of the TestDisableKeyframes test.
|
||||||
|
kf_count_max_ = 2; // early exit successful tests.
|
||||||
|
|
||||||
|
::libvpx_test::RandomVideoSource video;
|
||||||
|
ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
|
||||||
|
|
||||||
|
// In realtime mode - auto placed keyframes are exceedingly rare, don't
|
||||||
|
// bother with this check if(GetParam() > 0)
|
||||||
|
if(GetParam() > 0)
|
||||||
|
EXPECT_GT(kf_count_, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_P(KeyframeTest, TestDisableKeyframes) {
|
||||||
|
cfg_.kf_mode = VPX_KF_DISABLED;
|
||||||
|
kf_count_max_ = 1; // early exit failed tests.
|
||||||
|
|
||||||
|
::libvpx_test::RandomVideoSource video;
|
||||||
|
ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
|
||||||
|
|
||||||
|
EXPECT_EQ(1, kf_count_);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_P(KeyframeTest, TestForceKeyframe) {
|
||||||
|
cfg_.kf_mode = VPX_KF_DISABLED;
|
||||||
|
kf_do_force_kf_ = true;
|
||||||
|
|
||||||
|
::libvpx_test::DummyVideoSource video;
|
||||||
|
ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
|
||||||
|
|
||||||
|
// verify that every third frame is a keyframe.
|
||||||
|
for (std::vector<vpx_codec_pts_t>::const_iterator iter = kf_pts_list_.begin();
|
||||||
|
iter != kf_pts_list_.end(); ++iter) {
|
||||||
|
ASSERT_EQ(0, *iter % 3) << "Unexpected keyframe at frame " << *iter;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_P(KeyframeTest, TestKeyframeMaxDistance) {
|
||||||
|
cfg_.kf_max_dist = 25;
|
||||||
|
|
||||||
|
::libvpx_test::DummyVideoSource video;
|
||||||
|
ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
|
||||||
|
|
||||||
|
// verify that keyframe interval matches kf_max_dist
|
||||||
|
for (std::vector<vpx_codec_pts_t>::const_iterator iter = kf_pts_list_.begin();
|
||||||
|
iter != kf_pts_list_.end(); ++iter) {
|
||||||
|
ASSERT_EQ(0, *iter % 25) << "Unexpected keyframe at frame " << *iter;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_P(KeyframeTest, TestAutoKeyframe) {
|
||||||
|
cfg_.kf_mode = VPX_KF_AUTO;
|
||||||
|
kf_do_force_kf_ = false;
|
||||||
|
|
||||||
|
// Force a deterministic speed step in Real Time mode, as the faster modes
|
||||||
|
// may not produce a keyframe like we expect. This is necessary when running
|
||||||
|
// on very slow environments (like Valgrind). The step -11 was determined
|
||||||
|
// experimentally as the fastest mode that still throws the keyframe.
|
||||||
|
if (deadline_ == VPX_DL_REALTIME)
|
||||||
|
set_cpu_used_ = -11;
|
||||||
|
|
||||||
|
// This clip has a cut scene every 30 frames -> Frame 0, 30, 60, 90, 120.
|
||||||
|
// I check only the first 40 frames to make sure there's a keyframe at frame
|
||||||
|
// 0 and 30.
|
||||||
|
::libvpx_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288,
|
||||||
|
30, 1, 0, 40);
|
||||||
|
|
||||||
|
ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
|
||||||
|
|
||||||
|
// In realtime mode - auto placed keyframes are exceedingly rare, don't
|
||||||
|
// bother with this check
|
||||||
|
if(GetParam() > 0)
|
||||||
|
EXPECT_EQ(2u, kf_pts_list_.size()) << " Not the right number of keyframes ";
|
||||||
|
|
||||||
|
// Verify that keyframes match the file keyframes in the file.
|
||||||
|
for (std::vector<vpx_codec_pts_t>::const_iterator iter = kf_pts_list_.begin();
|
||||||
|
iter != kf_pts_list_.end(); ++iter) {
|
||||||
|
|
||||||
|
if (deadline_ == VPX_DL_REALTIME && *iter > 0)
|
||||||
|
EXPECT_EQ(0, (*iter - 1) % 30) << "Unexpected keyframe at frame "
|
||||||
|
<< *iter;
|
||||||
|
else
|
||||||
|
EXPECT_EQ(0, *iter % 30) << "Unexpected keyframe at frame " << *iter;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
INSTANTIATE_TEST_CASE_P(AllModes, KeyframeTest, ALL_TEST_MODES);
|
||||||
|
} // namespace
|
||||||
107
test/pp_filter_test.cc
Normal file
107
test/pp_filter_test.cc
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2012 The WebM project authors. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by a BSD-style license
|
||||||
|
* that can be found in the LICENSE file in the root of the source
|
||||||
|
* tree. An additional intellectual property rights grant can be found
|
||||||
|
* in the file PATENTS. All contributing project authors may
|
||||||
|
* be found in the AUTHORS file in the root of the source tree.
|
||||||
|
*/
|
||||||
|
#include "test/register_state_check.h"
|
||||||
|
#include "third_party/googletest/src/include/gtest/gtest.h"
|
||||||
|
extern "C" {
|
||||||
|
#include "vpx_config.h"
|
||||||
|
#include "vpx_rtcd.h"
|
||||||
|
#include "vpx/vpx_integer.h"
|
||||||
|
#include "vpx_mem/vpx_mem.h"
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef void (*post_proc_func_t)(unsigned char *src_ptr,
|
||||||
|
unsigned char *dst_ptr,
|
||||||
|
int src_pixels_per_line,
|
||||||
|
int dst_pixels_per_line,
|
||||||
|
int cols,
|
||||||
|
unsigned char *flimit,
|
||||||
|
int size);
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
class Vp8PostProcessingFilterTest
|
||||||
|
: public ::testing::TestWithParam<post_proc_func_t> {};
|
||||||
|
|
||||||
|
// Test routine for the VP8 post-processing function
|
||||||
|
// vp8_post_proc_down_and_across_mb_row_c.
|
||||||
|
|
||||||
|
TEST_P(Vp8PostProcessingFilterTest, FilterOutputCheck) {
|
||||||
|
// Size of the underlying data block that will be filtered.
|
||||||
|
const int block_width = 16;
|
||||||
|
const int block_height = 16;
|
||||||
|
|
||||||
|
// 5-tap filter needs 2 padding rows above and below the block in the input.
|
||||||
|
const int input_width = block_width;
|
||||||
|
const int input_height = block_height + 4;
|
||||||
|
const int input_stride = input_width;
|
||||||
|
const int input_size = input_width * input_height;
|
||||||
|
|
||||||
|
// Filter extends output block by 8 samples at left and right edges.
|
||||||
|
const int output_width = block_width + 16;
|
||||||
|
const int output_height = block_height;
|
||||||
|
const int output_stride = output_width;
|
||||||
|
const int output_size = output_width * output_height;
|
||||||
|
|
||||||
|
uint8_t *const src_image =
|
||||||
|
reinterpret_cast<uint8_t*>(vpx_calloc(input_size, 1));
|
||||||
|
uint8_t *const dst_image =
|
||||||
|
reinterpret_cast<uint8_t*>(vpx_calloc(output_size, 1));
|
||||||
|
|
||||||
|
// Pointers to top-left pixel of block in the input and output images.
|
||||||
|
uint8_t *const src_image_ptr = src_image + (input_stride << 1);
|
||||||
|
uint8_t *const dst_image_ptr = dst_image + 8;
|
||||||
|
uint8_t *const flimits = reinterpret_cast<uint8_t *>(vpx_memalign(16, block_width));
|
||||||
|
(void)vpx_memset(flimits, 255, block_width);
|
||||||
|
|
||||||
|
// Initialize pixels in the input:
|
||||||
|
// block pixels to value 1,
|
||||||
|
// border pixels to value 10.
|
||||||
|
(void)vpx_memset(src_image, 10, input_size);
|
||||||
|
uint8_t *pixel_ptr = src_image_ptr;
|
||||||
|
for (int i = 0; i < block_height; ++i) {
|
||||||
|
for (int j = 0; j < block_width; ++j) {
|
||||||
|
pixel_ptr[j] = 1;
|
||||||
|
}
|
||||||
|
pixel_ptr += input_stride;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialize pixels in the output to 99.
|
||||||
|
(void)vpx_memset(dst_image, 99, output_size);
|
||||||
|
|
||||||
|
REGISTER_STATE_CHECK(GetParam()(src_image_ptr, dst_image_ptr, input_stride,
|
||||||
|
output_stride, block_width, flimits, 16));
|
||||||
|
|
||||||
|
static const uint8_t expected_data[block_height] = {
|
||||||
|
4, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 4
|
||||||
|
};
|
||||||
|
|
||||||
|
pixel_ptr = dst_image_ptr;
|
||||||
|
for (int i = 0; i < block_height; ++i) {
|
||||||
|
for (int j = 0; j < block_width; ++j) {
|
||||||
|
EXPECT_EQ(expected_data[i], pixel_ptr[j])
|
||||||
|
<< "Vp8PostProcessingFilterTest failed with invalid filter output";
|
||||||
|
}
|
||||||
|
pixel_ptr += output_stride;
|
||||||
|
}
|
||||||
|
|
||||||
|
vpx_free(src_image);
|
||||||
|
vpx_free(dst_image);
|
||||||
|
vpx_free(flimits);
|
||||||
|
};
|
||||||
|
|
||||||
|
INSTANTIATE_TEST_CASE_P(C, Vp8PostProcessingFilterTest,
|
||||||
|
::testing::Values(vp8_post_proc_down_and_across_mb_row_c));
|
||||||
|
|
||||||
|
#if HAVE_SSE2
|
||||||
|
INSTANTIATE_TEST_CASE_P(SSE2, Vp8PostProcessingFilterTest,
|
||||||
|
::testing::Values(vp8_post_proc_down_and_across_mb_row_sse2));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
} // namespace
|
||||||
95
test/register_state_check.h
Normal file
95
test/register_state_check.h
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2012 The WebM project authors. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by a BSD-style license
|
||||||
|
* that can be found in the LICENSE file in the root of the source
|
||||||
|
* tree. An additional intellectual property rights grant can be found
|
||||||
|
* in the file PATENTS. All contributing project authors may
|
||||||
|
* be found in the AUTHORS file in the root of the source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef LIBVPX_TEST_REGISTER_STATE_CHECK_H_
|
||||||
|
#define LIBVPX_TEST_REGISTER_STATE_CHECK_H_
|
||||||
|
|
||||||
|
#ifdef _WIN64
|
||||||
|
|
||||||
|
#define _WIN32_LEAN_AND_MEAN
|
||||||
|
#include <windows.h>
|
||||||
|
#include <winnt.h>
|
||||||
|
|
||||||
|
#include "third_party/googletest/src/include/gtest/gtest.h"
|
||||||
|
|
||||||
|
namespace testing {
|
||||||
|
namespace internal {
|
||||||
|
|
||||||
|
inline bool operator==(const M128A& lhs, const M128A& rhs) {
|
||||||
|
return (lhs.Low == rhs.Low && lhs.High == rhs.High);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace internal
|
||||||
|
} // namespace testing
|
||||||
|
|
||||||
|
namespace libvpx_test {
|
||||||
|
|
||||||
|
// Compares the state of xmm[6-15] at construction with their state at
|
||||||
|
// destruction. These registers should be preserved by the callee on
|
||||||
|
// Windows x64.
|
||||||
|
// Usage:
|
||||||
|
// {
|
||||||
|
// RegisterStateCheck reg_check;
|
||||||
|
// FunctionToVerify();
|
||||||
|
// }
|
||||||
|
class RegisterStateCheck {
|
||||||
|
public:
|
||||||
|
RegisterStateCheck() { initialized_ = StoreRegisters(&pre_context_); }
|
||||||
|
~RegisterStateCheck() { EXPECT_TRUE(Check()); }
|
||||||
|
|
||||||
|
private:
|
||||||
|
static bool StoreRegisters(CONTEXT* const context) {
|
||||||
|
const HANDLE this_thread = GetCurrentThread();
|
||||||
|
EXPECT_TRUE(this_thread != NULL);
|
||||||
|
context->ContextFlags = CONTEXT_FLOATING_POINT;
|
||||||
|
const bool context_saved = GetThreadContext(this_thread, context) == TRUE;
|
||||||
|
EXPECT_TRUE(context_saved) << "GetLastError: " << GetLastError();
|
||||||
|
return context_saved;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Compares the register state. Returns true if the states match.
|
||||||
|
bool Check() const {
|
||||||
|
if (!initialized_) return false;
|
||||||
|
CONTEXT post_context;
|
||||||
|
if (!StoreRegisters(&post_context)) return false;
|
||||||
|
|
||||||
|
const M128A* xmm_pre = &pre_context_.Xmm6;
|
||||||
|
const M128A* xmm_post = &post_context.Xmm6;
|
||||||
|
for (int i = 6; i <= 15; ++i) {
|
||||||
|
EXPECT_EQ(*xmm_pre, *xmm_post) << "xmm" << i << " has been modified!";
|
||||||
|
++xmm_pre;
|
||||||
|
++xmm_post;
|
||||||
|
}
|
||||||
|
return !testing::Test::HasNonfatalFailure();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool initialized_;
|
||||||
|
CONTEXT pre_context_;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define REGISTER_STATE_CHECK(statement) do { \
|
||||||
|
libvpx_test::RegisterStateCheck reg_check; \
|
||||||
|
statement; \
|
||||||
|
} while (false)
|
||||||
|
|
||||||
|
} // namespace libvpx_test
|
||||||
|
|
||||||
|
#else // !_WIN64
|
||||||
|
|
||||||
|
namespace libvpx_test {
|
||||||
|
|
||||||
|
class RegisterStateCheck {};
|
||||||
|
#define REGISTER_STATE_CHECK(statement) statement
|
||||||
|
|
||||||
|
} // namespace libvpx_test
|
||||||
|
|
||||||
|
#endif // _WIN64
|
||||||
|
|
||||||
|
#endif // LIBVPX_TEST_REGISTER_STATE_CHECK_H_
|
||||||
104
test/resize_test.cc
Normal file
104
test/resize_test.cc
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2012 The WebM project authors. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by a BSD-style license
|
||||||
|
* that can be found in the LICENSE file in the root of the source
|
||||||
|
* tree. An additional intellectual property rights grant can be found
|
||||||
|
* in the file PATENTS. All contributing project authors may
|
||||||
|
* be found in the AUTHORS file in the root of the source tree.
|
||||||
|
*/
|
||||||
|
#include <climits>
|
||||||
|
#include <vector>
|
||||||
|
#include "test/encode_test_driver.h"
|
||||||
|
#include "test/video_source.h"
|
||||||
|
#include "third_party/googletest/src/include/gtest/gtest.h"
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
const unsigned int kInitialWidth = 320;
|
||||||
|
const unsigned int kInitialHeight = 240;
|
||||||
|
|
||||||
|
unsigned int ScaleForFrameNumber(unsigned int frame, unsigned int val) {
|
||||||
|
if (frame < 10)
|
||||||
|
return val;
|
||||||
|
if (frame < 20)
|
||||||
|
return val / 2;
|
||||||
|
if (frame < 30)
|
||||||
|
return val * 2 / 3;
|
||||||
|
if (frame < 40)
|
||||||
|
return val / 4;
|
||||||
|
if (frame < 50)
|
||||||
|
return val * 7 / 8;
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
class ResizingVideoSource : public ::libvpx_test::DummyVideoSource {
|
||||||
|
public:
|
||||||
|
ResizingVideoSource() {
|
||||||
|
SetSize(kInitialWidth, kInitialHeight);
|
||||||
|
limit_ = 60;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void Next() {
|
||||||
|
++frame_;
|
||||||
|
SetSize(ScaleForFrameNumber(frame_, kInitialWidth),
|
||||||
|
ScaleForFrameNumber(frame_, kInitialHeight));
|
||||||
|
FillFrame();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class ResizeTest : public ::libvpx_test::EncoderTest,
|
||||||
|
public ::testing::TestWithParam<enum libvpx_test::TestMode> {
|
||||||
|
protected:
|
||||||
|
struct FrameInfo {
|
||||||
|
FrameInfo(vpx_codec_pts_t _pts, unsigned int _w, unsigned int _h)
|
||||||
|
: pts(_pts), w(_w), h(_h) {}
|
||||||
|
|
||||||
|
vpx_codec_pts_t pts;
|
||||||
|
unsigned int w;
|
||||||
|
unsigned int h;
|
||||||
|
};
|
||||||
|
|
||||||
|
virtual void SetUp() {
|
||||||
|
InitializeConfig();
|
||||||
|
SetMode(GetParam());
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool Continue() const {
|
||||||
|
return !HasFatalFailure() && !abort_;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void FramePktHook(const vpx_codec_cx_pkt_t *pkt) {
|
||||||
|
if (pkt->data.frame.flags & VPX_FRAME_IS_KEY) {
|
||||||
|
const unsigned char *buf =
|
||||||
|
reinterpret_cast<const unsigned char *>(pkt->data.frame.buf);
|
||||||
|
const unsigned int w = (buf[6] | (buf[7] << 8)) & 0x3fff;
|
||||||
|
const unsigned int h = (buf[8] | (buf[9] << 8)) & 0x3fff;
|
||||||
|
|
||||||
|
frame_info_list_.push_back(FrameInfo(pkt->data.frame.pts, w, h));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector< FrameInfo > frame_info_list_;
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST_P(ResizeTest, TestExternalResizeWorks) {
|
||||||
|
ResizingVideoSource video;
|
||||||
|
ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
|
||||||
|
|
||||||
|
for (std::vector<FrameInfo>::iterator info = frame_info_list_.begin();
|
||||||
|
info != frame_info_list_.end(); ++info) {
|
||||||
|
const vpx_codec_pts_t pts = info->pts;
|
||||||
|
const unsigned int expected_w = ScaleForFrameNumber(pts, kInitialWidth);
|
||||||
|
const unsigned int expected_h = ScaleForFrameNumber(pts, kInitialHeight);
|
||||||
|
|
||||||
|
EXPECT_EQ(expected_w, info->w)
|
||||||
|
<< "Frame " << pts << "had unexpected width";
|
||||||
|
EXPECT_EQ(expected_h, info->h)
|
||||||
|
<< "Frame " << pts << "had unexpected height";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
INSTANTIATE_TEST_CASE_P(OnePass, ResizeTest, ONE_PASS_TEST_MODES);
|
||||||
|
} // namespace
|
||||||
253
test/sad_test.cc
Normal file
253
test/sad_test.cc
Normal file
@@ -0,0 +1,253 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2012 The WebM project authors. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by a BSD-style license
|
||||||
|
* that can be found in the LICENSE file in the root of the source
|
||||||
|
* tree. An additional intellectual property rights grant can be found
|
||||||
|
* in the file PATENTS. All contributing project authors may
|
||||||
|
* be found in the AUTHORS file in the root of the source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
#include "./vpx_config.h"
|
||||||
|
#include "./vpx_rtcd.h"
|
||||||
|
#include "vp8/common/blockd.h"
|
||||||
|
#include "vpx_mem/vpx_mem.h"
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "test/acm_random.h"
|
||||||
|
#include "test/register_state_check.h"
|
||||||
|
#include "test/util.h"
|
||||||
|
#include "third_party/googletest/src/include/gtest/gtest.h"
|
||||||
|
|
||||||
|
|
||||||
|
typedef unsigned int (*sad_m_by_n_fn_t)(const unsigned char *source_ptr,
|
||||||
|
int source_stride,
|
||||||
|
const unsigned char *reference_ptr,
|
||||||
|
int reference_stride,
|
||||||
|
unsigned int max_sad);
|
||||||
|
|
||||||
|
using libvpx_test::ACMRandom;
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
class SADTest : public PARAMS(int, int, sad_m_by_n_fn_t) {
|
||||||
|
public:
|
||||||
|
static void SetUpTestCase() {
|
||||||
|
source_data_ = reinterpret_cast<uint8_t*>(
|
||||||
|
vpx_memalign(kDataAlignment, kDataBufferSize));
|
||||||
|
reference_data_ = reinterpret_cast<uint8_t*>(
|
||||||
|
vpx_memalign(kDataAlignment, kDataBufferSize));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void TearDownTestCase() {
|
||||||
|
vpx_free(source_data_);
|
||||||
|
source_data_ = NULL;
|
||||||
|
vpx_free(reference_data_);
|
||||||
|
reference_data_ = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
static const int kDataAlignment = 16;
|
||||||
|
static const int kDataBufferSize = 16 * 32;
|
||||||
|
|
||||||
|
virtual void SetUp() {
|
||||||
|
sad_fn_ = GET_PARAM(2);
|
||||||
|
height_ = GET_PARAM(1);
|
||||||
|
width_ = GET_PARAM(0);
|
||||||
|
source_stride_ = width_ * 2;
|
||||||
|
reference_stride_ = width_ * 2;
|
||||||
|
rnd_.Reset(ACMRandom::DeterministicSeed());
|
||||||
|
}
|
||||||
|
|
||||||
|
sad_m_by_n_fn_t sad_fn_;
|
||||||
|
virtual unsigned int SAD(unsigned int max_sad) {
|
||||||
|
unsigned int ret;
|
||||||
|
REGISTER_STATE_CHECK(ret = sad_fn_(source_data_, source_stride_,
|
||||||
|
reference_data_, reference_stride_,
|
||||||
|
max_sad));
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sum of Absolute Differences. Given two blocks, calculate the absolute
|
||||||
|
// difference between two pixels in the same relative location; accumulate.
|
||||||
|
unsigned int ReferenceSAD(unsigned int max_sad) {
|
||||||
|
unsigned int sad = 0;
|
||||||
|
|
||||||
|
for (int h = 0; h < height_; ++h) {
|
||||||
|
for (int w = 0; w < width_; ++w) {
|
||||||
|
sad += abs(source_data_[h * source_stride_ + w]
|
||||||
|
- reference_data_[h * reference_stride_ + w]);
|
||||||
|
}
|
||||||
|
if (sad > max_sad) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sad;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FillConstant(uint8_t *data, int stride, uint8_t fill_constant) {
|
||||||
|
for (int h = 0; h < height_; ++h) {
|
||||||
|
for (int w = 0; w < width_; ++w) {
|
||||||
|
data[h * stride + w] = fill_constant;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void FillRandom(uint8_t *data, int stride) {
|
||||||
|
for (int h = 0; h < height_; ++h) {
|
||||||
|
for (int w = 0; w < width_; ++w) {
|
||||||
|
data[h * stride + w] = rnd_.Rand8();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CheckSad(unsigned int max_sad) {
|
||||||
|
unsigned int reference_sad, exp_sad;
|
||||||
|
|
||||||
|
reference_sad = ReferenceSAD(max_sad);
|
||||||
|
exp_sad = SAD(max_sad);
|
||||||
|
|
||||||
|
if (reference_sad <= max_sad) {
|
||||||
|
ASSERT_EQ(exp_sad, reference_sad);
|
||||||
|
} else {
|
||||||
|
// Alternative implementations are not required to check max_sad
|
||||||
|
ASSERT_GE(exp_sad, reference_sad);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle blocks up to 16x16 with stride up to 32
|
||||||
|
int height_, width_;
|
||||||
|
static uint8_t* source_data_;
|
||||||
|
int source_stride_;
|
||||||
|
static uint8_t* reference_data_;
|
||||||
|
int reference_stride_;
|
||||||
|
|
||||||
|
ACMRandom rnd_;
|
||||||
|
};
|
||||||
|
|
||||||
|
uint8_t* SADTest::source_data_ = NULL;
|
||||||
|
uint8_t* SADTest::reference_data_ = NULL;
|
||||||
|
|
||||||
|
TEST_P(SADTest, MaxRef) {
|
||||||
|
FillConstant(source_data_, source_stride_, 0);
|
||||||
|
FillConstant(reference_data_, reference_stride_, 255);
|
||||||
|
CheckSad(UINT_MAX);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_P(SADTest, MaxSrc) {
|
||||||
|
FillConstant(source_data_, source_stride_, 255);
|
||||||
|
FillConstant(reference_data_, reference_stride_, 0);
|
||||||
|
CheckSad(UINT_MAX);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_P(SADTest, ShortRef) {
|
||||||
|
int tmp_stride = reference_stride_;
|
||||||
|
reference_stride_ >>= 1;
|
||||||
|
FillRandom(source_data_, source_stride_);
|
||||||
|
FillRandom(reference_data_, reference_stride_);
|
||||||
|
CheckSad(UINT_MAX);
|
||||||
|
reference_stride_ = tmp_stride;
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_P(SADTest, UnalignedRef) {
|
||||||
|
// The reference frame, but not the source frame, may be unaligned for
|
||||||
|
// certain types of searches.
|
||||||
|
int tmp_stride = reference_stride_;
|
||||||
|
reference_stride_ -= 1;
|
||||||
|
FillRandom(source_data_, source_stride_);
|
||||||
|
FillRandom(reference_data_, reference_stride_);
|
||||||
|
CheckSad(UINT_MAX);
|
||||||
|
reference_stride_ = tmp_stride;
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_P(SADTest, ShortSrc) {
|
||||||
|
int tmp_stride = source_stride_;
|
||||||
|
source_stride_ >>= 1;
|
||||||
|
FillRandom(source_data_, source_stride_);
|
||||||
|
FillRandom(reference_data_, reference_stride_);
|
||||||
|
CheckSad(UINT_MAX);
|
||||||
|
source_stride_ = tmp_stride;
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_P(SADTest, MaxSAD) {
|
||||||
|
// Verify that, when max_sad is set, the implementation does not return a
|
||||||
|
// value lower than the reference.
|
||||||
|
FillConstant(source_data_, source_stride_, 255);
|
||||||
|
FillConstant(reference_data_, reference_stride_, 0);
|
||||||
|
CheckSad(128);
|
||||||
|
}
|
||||||
|
|
||||||
|
using std::tr1::make_tuple;
|
||||||
|
|
||||||
|
const sad_m_by_n_fn_t sad_16x16_c = vp8_sad16x16_c;
|
||||||
|
const sad_m_by_n_fn_t sad_8x16_c = vp8_sad8x16_c;
|
||||||
|
const sad_m_by_n_fn_t sad_16x8_c = vp8_sad16x8_c;
|
||||||
|
const sad_m_by_n_fn_t sad_8x8_c = vp8_sad8x8_c;
|
||||||
|
const sad_m_by_n_fn_t sad_4x4_c = vp8_sad4x4_c;
|
||||||
|
INSTANTIATE_TEST_CASE_P(C, SADTest, ::testing::Values(
|
||||||
|
make_tuple(16, 16, sad_16x16_c),
|
||||||
|
make_tuple(8, 16, sad_8x16_c),
|
||||||
|
make_tuple(16, 8, sad_16x8_c),
|
||||||
|
make_tuple(8, 8, sad_8x8_c),
|
||||||
|
make_tuple(4, 4, sad_4x4_c)));
|
||||||
|
|
||||||
|
// ARM tests
|
||||||
|
#if HAVE_MEDIA
|
||||||
|
const sad_m_by_n_fn_t sad_16x16_armv6 = vp8_sad16x16_armv6;
|
||||||
|
INSTANTIATE_TEST_CASE_P(MEDIA, SADTest, ::testing::Values(
|
||||||
|
make_tuple(16, 16, sad_16x16_armv6)));
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#if HAVE_NEON
|
||||||
|
const sad_m_by_n_fn_t sad_16x16_neon = vp8_sad16x16_neon;
|
||||||
|
const sad_m_by_n_fn_t sad_8x16_neon = vp8_sad8x16_neon;
|
||||||
|
const sad_m_by_n_fn_t sad_16x8_neon = vp8_sad16x8_neon;
|
||||||
|
const sad_m_by_n_fn_t sad_8x8_neon = vp8_sad8x8_neon;
|
||||||
|
const sad_m_by_n_fn_t sad_4x4_neon = vp8_sad4x4_neon;
|
||||||
|
INSTANTIATE_TEST_CASE_P(NEON, SADTest, ::testing::Values(
|
||||||
|
make_tuple(16, 16, sad_16x16_neon),
|
||||||
|
make_tuple(8, 16, sad_8x16_neon),
|
||||||
|
make_tuple(16, 8, sad_16x8_neon),
|
||||||
|
make_tuple(8, 8, sad_8x8_neon),
|
||||||
|
make_tuple(4, 4, sad_4x4_neon)));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// X86 tests
|
||||||
|
#if HAVE_MMX
|
||||||
|
const sad_m_by_n_fn_t sad_16x16_mmx = vp8_sad16x16_mmx;
|
||||||
|
const sad_m_by_n_fn_t sad_8x16_mmx = vp8_sad8x16_mmx;
|
||||||
|
const sad_m_by_n_fn_t sad_16x8_mmx = vp8_sad16x8_mmx;
|
||||||
|
const sad_m_by_n_fn_t sad_8x8_mmx = vp8_sad8x8_mmx;
|
||||||
|
const sad_m_by_n_fn_t sad_4x4_mmx = vp8_sad4x4_mmx;
|
||||||
|
INSTANTIATE_TEST_CASE_P(MMX, SADTest, ::testing::Values(
|
||||||
|
make_tuple(16, 16, sad_16x16_mmx),
|
||||||
|
make_tuple(8, 16, sad_8x16_mmx),
|
||||||
|
make_tuple(16, 8, sad_16x8_mmx),
|
||||||
|
make_tuple(8, 8, sad_8x8_mmx),
|
||||||
|
make_tuple(4, 4, sad_4x4_mmx)));
|
||||||
|
#endif
|
||||||
|
#if HAVE_SSE2
|
||||||
|
const sad_m_by_n_fn_t sad_16x16_wmt = vp8_sad16x16_wmt;
|
||||||
|
const sad_m_by_n_fn_t sad_8x16_wmt = vp8_sad8x16_wmt;
|
||||||
|
const sad_m_by_n_fn_t sad_16x8_wmt = vp8_sad16x8_wmt;
|
||||||
|
const sad_m_by_n_fn_t sad_8x8_wmt = vp8_sad8x8_wmt;
|
||||||
|
const sad_m_by_n_fn_t sad_4x4_wmt = vp8_sad4x4_wmt;
|
||||||
|
INSTANTIATE_TEST_CASE_P(SSE2, SADTest, ::testing::Values(
|
||||||
|
make_tuple(16, 16, sad_16x16_wmt),
|
||||||
|
make_tuple(8, 16, sad_8x16_wmt),
|
||||||
|
make_tuple(16, 8, sad_16x8_wmt),
|
||||||
|
make_tuple(8, 8, sad_8x8_wmt),
|
||||||
|
make_tuple(4, 4, sad_4x4_wmt)));
|
||||||
|
#endif
|
||||||
|
#if HAVE_SSSE3
|
||||||
|
const sad_m_by_n_fn_t sad_16x16_sse3 = vp8_sad16x16_sse3;
|
||||||
|
INSTANTIATE_TEST_CASE_P(SSE3, SADTest, ::testing::Values(
|
||||||
|
make_tuple(16, 16, sad_16x16_sse3)));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
} // namespace
|
||||||
182
test/set_roi.cc
Normal file
182
test/set_roi.cc
Normal file
@@ -0,0 +1,182 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2012 The WebM project authors. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by a BSD-style license
|
||||||
|
* that can be found in the LICENSE file in the root of the source
|
||||||
|
* tree. An additional intellectual property rights grant can be found
|
||||||
|
* in the file PATENTS. All contributing project authors may
|
||||||
|
* be found in the AUTHORS file in the root of the source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#include "third_party/googletest/src/include/gtest/gtest.h"
|
||||||
|
#include "vpx/vpx_integer.h"
|
||||||
|
#include "vpx_mem/vpx_mem.h"
|
||||||
|
extern "C" {
|
||||||
|
#include "vp8/encoder/onyx_int.h"
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
TEST(Vp8RoiMapTest, ParameterCheck) {
|
||||||
|
int delta_q[MAX_MB_SEGMENTS] = { -2, -25, 0, 31 };
|
||||||
|
int delta_lf[MAX_MB_SEGMENTS] = { -2, -25, 0, 31 };
|
||||||
|
unsigned int threshold[MAX_MB_SEGMENTS] = { 0, 100, 200, 300 };
|
||||||
|
|
||||||
|
const int internalq_trans[] = {
|
||||||
|
0, 1, 2, 3, 4, 5, 7, 8,
|
||||||
|
9, 10, 12, 13, 15, 17, 18, 19,
|
||||||
|
20, 21, 23, 24, 25, 26, 27, 28,
|
||||||
|
29, 30, 31, 33, 35, 37, 39, 41,
|
||||||
|
43, 45, 47, 49, 51, 53, 55, 57,
|
||||||
|
59, 61, 64, 67, 70, 73, 76, 79,
|
||||||
|
82, 85, 88, 91, 94, 97, 100, 103,
|
||||||
|
106, 109, 112, 115, 118, 121, 124, 127,
|
||||||
|
};
|
||||||
|
|
||||||
|
// Initialize elements of cpi with valid defaults.
|
||||||
|
VP8_COMP cpi;
|
||||||
|
cpi.mb.e_mbd.mb_segement_abs_delta = SEGMENT_DELTADATA;
|
||||||
|
cpi.cyclic_refresh_mode_enabled = 0;
|
||||||
|
cpi.mb.e_mbd.segmentation_enabled = 0;
|
||||||
|
cpi.mb.e_mbd.update_mb_segmentation_map = 0;
|
||||||
|
cpi.mb.e_mbd.update_mb_segmentation_data = 0;
|
||||||
|
cpi.common.mb_rows = 240 >> 4;
|
||||||
|
cpi.common.mb_cols = 320 >> 4;
|
||||||
|
const int mbs = (cpi.common.mb_rows * cpi.common.mb_cols);
|
||||||
|
vpx_memset(cpi.segment_feature_data, 0, sizeof(cpi.segment_feature_data));
|
||||||
|
|
||||||
|
// Segment map
|
||||||
|
cpi.segmentation_map = reinterpret_cast<unsigned char *>(vpx_calloc(mbs, 1));
|
||||||
|
|
||||||
|
// Allocate memory for the source memory map.
|
||||||
|
unsigned char *roi_map =
|
||||||
|
reinterpret_cast<unsigned char *>(vpx_calloc(mbs, 1));
|
||||||
|
vpx_memset(&roi_map[mbs >> 2], 1, (mbs >> 2));
|
||||||
|
vpx_memset(&roi_map[mbs >> 1], 2, (mbs >> 2));
|
||||||
|
vpx_memset(&roi_map[mbs -(mbs >> 2)], 3, (mbs >> 2));
|
||||||
|
|
||||||
|
// Do a test call with valid parameters.
|
||||||
|
int roi_retval = vp8_set_roimap(&cpi, roi_map, cpi.common.mb_rows,
|
||||||
|
cpi.common.mb_cols, delta_q, delta_lf,
|
||||||
|
threshold);
|
||||||
|
EXPECT_EQ(0, roi_retval)
|
||||||
|
<< "vp8_set_roimap roi failed with default test parameters";
|
||||||
|
|
||||||
|
// Check that the values in the cpi structure get set as expected.
|
||||||
|
if (roi_retval == 0) {
|
||||||
|
// Check that the segment map got set.
|
||||||
|
const int mapcompare = memcmp(roi_map, cpi.segmentation_map, mbs);
|
||||||
|
EXPECT_EQ(0, mapcompare) << "segment map error";
|
||||||
|
|
||||||
|
// Check the q deltas (note the need to translate into
|
||||||
|
// the interanl range of 0-127.
|
||||||
|
for (int i = 0; i < MAX_MB_SEGMENTS; ++i) {
|
||||||
|
const int transq = internalq_trans[abs(delta_q[i])];
|
||||||
|
if (abs(cpi.segment_feature_data[MB_LVL_ALT_Q][i]) != transq) {
|
||||||
|
EXPECT_EQ(transq, cpi.segment_feature_data[MB_LVL_ALT_Q][i])
|
||||||
|
<< "segment delta_q error";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check the loop filter deltas
|
||||||
|
for (int i = 0; i < MAX_MB_SEGMENTS; ++i) {
|
||||||
|
if (cpi.segment_feature_data[MB_LVL_ALT_LF][i] != delta_lf[i]) {
|
||||||
|
EXPECT_EQ(delta_lf[i], cpi.segment_feature_data[MB_LVL_ALT_LF][i])
|
||||||
|
<< "segment delta_lf error";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check the breakout thresholds
|
||||||
|
for (int i = 0; i < MAX_MB_SEGMENTS; ++i) {
|
||||||
|
unsigned int breakout =
|
||||||
|
static_cast<unsigned int>(cpi.segment_encode_breakout[i]);
|
||||||
|
|
||||||
|
if (threshold[i] != breakout) {
|
||||||
|
EXPECT_EQ(threshold[i], breakout)
|
||||||
|
<< "breakout threshold error";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Segmentation, and segmentation update flages should be set.
|
||||||
|
EXPECT_EQ(1, cpi.mb.e_mbd.segmentation_enabled)
|
||||||
|
<< "segmentation_enabled error";
|
||||||
|
EXPECT_EQ(1, cpi.mb.e_mbd.update_mb_segmentation_map)
|
||||||
|
<< "update_mb_segmentation_map error";
|
||||||
|
EXPECT_EQ(1, cpi.mb.e_mbd.update_mb_segmentation_data)
|
||||||
|
<< "update_mb_segmentation_data error";
|
||||||
|
|
||||||
|
|
||||||
|
// Try a range of delta q and lf parameters (some legal, some not)
|
||||||
|
for (int i = 0; i < 1000; ++i) {
|
||||||
|
int rand_deltas[4];
|
||||||
|
int deltas_valid;
|
||||||
|
rand_deltas[0] = (rand() % 160) - 80;
|
||||||
|
rand_deltas[1] = (rand() % 160) - 80;
|
||||||
|
rand_deltas[2] = (rand() % 160) - 80;
|
||||||
|
rand_deltas[3] = (rand() % 160) - 80;
|
||||||
|
|
||||||
|
deltas_valid = ((abs(rand_deltas[0]) <= 63) &&
|
||||||
|
(abs(rand_deltas[1]) <= 63) &&
|
||||||
|
(abs(rand_deltas[2]) <= 63) &&
|
||||||
|
(abs(rand_deltas[3]) <= 63)) ? 0 : -1;
|
||||||
|
|
||||||
|
// Test with random delta q values.
|
||||||
|
roi_retval = vp8_set_roimap(&cpi, roi_map, cpi.common.mb_rows,
|
||||||
|
cpi.common.mb_cols, rand_deltas,
|
||||||
|
delta_lf, threshold);
|
||||||
|
EXPECT_EQ(deltas_valid, roi_retval) << "dq range check error";
|
||||||
|
|
||||||
|
// One delta_q error shown at a time
|
||||||
|
if (deltas_valid != roi_retval)
|
||||||
|
break;
|
||||||
|
|
||||||
|
// Test with random loop filter values.
|
||||||
|
roi_retval = vp8_set_roimap(&cpi, roi_map, cpi.common.mb_rows,
|
||||||
|
cpi.common.mb_cols, delta_q,
|
||||||
|
rand_deltas, threshold);
|
||||||
|
EXPECT_EQ(deltas_valid, roi_retval) << "dlf range check error";
|
||||||
|
|
||||||
|
// One delta loop filter error shown at a time
|
||||||
|
if (deltas_valid != roi_retval)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test that we report and error if cyclic refresh is enabled.
|
||||||
|
cpi.cyclic_refresh_mode_enabled = 1;
|
||||||
|
roi_retval = vp8_set_roimap(&cpi, roi_map, cpi.common.mb_rows,
|
||||||
|
cpi.common.mb_cols, delta_q,
|
||||||
|
delta_lf, threshold);
|
||||||
|
EXPECT_EQ(-1, roi_retval) << "cyclic refresh check error";
|
||||||
|
cpi.cyclic_refresh_mode_enabled = 0;
|
||||||
|
|
||||||
|
// Test invalid number of rows or colums.
|
||||||
|
roi_retval = vp8_set_roimap(&cpi, roi_map, cpi.common.mb_rows + 1,
|
||||||
|
cpi.common.mb_cols, delta_q,
|
||||||
|
delta_lf, threshold);
|
||||||
|
EXPECT_EQ(-1, roi_retval) << "MB rows bounds check error";
|
||||||
|
|
||||||
|
roi_retval = vp8_set_roimap(&cpi, roi_map, cpi.common.mb_rows,
|
||||||
|
cpi.common.mb_cols - 1, delta_q,
|
||||||
|
delta_lf, threshold);
|
||||||
|
EXPECT_EQ(-1, roi_retval) << "MB cols bounds check error";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Free allocated memory
|
||||||
|
if (cpi.segmentation_map)
|
||||||
|
vpx_free(cpi.segmentation_map);
|
||||||
|
if (roi_map)
|
||||||
|
vpx_free(roi_map);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace
|
||||||
224
test/sixtap_predict_test.cc
Normal file
224
test/sixtap_predict_test.cc
Normal file
@@ -0,0 +1,224 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2012 The WebM project authors. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by a BSD-style license
|
||||||
|
* that can be found in the LICENSE file in the root of the source
|
||||||
|
* tree. An additional intellectual property rights grant can be found
|
||||||
|
* in the file PATENTS. All contributing project authors may
|
||||||
|
* be found in the AUTHORS file in the root of the source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "test/acm_random.h"
|
||||||
|
#include "test/register_state_check.h"
|
||||||
|
#include "test/util.h"
|
||||||
|
#include "third_party/googletest/src/include/gtest/gtest.h"
|
||||||
|
extern "C" {
|
||||||
|
#include "./vpx_config.h"
|
||||||
|
#include "./vpx_rtcd.h"
|
||||||
|
#include "vpx/vpx_integer.h"
|
||||||
|
#include "vpx_mem/vpx_mem.h"
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
typedef void (*sixtap_predict_fn_t)(uint8_t *src_ptr,
|
||||||
|
int src_pixels_per_line,
|
||||||
|
int xoffset,
|
||||||
|
int yoffset,
|
||||||
|
uint8_t *dst_ptr,
|
||||||
|
int dst_pitch);
|
||||||
|
|
||||||
|
class SixtapPredictTest : public PARAMS(int, int, sixtap_predict_fn_t) {
|
||||||
|
public:
|
||||||
|
static void SetUpTestCase() {
|
||||||
|
src_ = reinterpret_cast<uint8_t*>(vpx_memalign(kDataAlignment, kSrcSize));
|
||||||
|
dst_ = reinterpret_cast<uint8_t*>(vpx_memalign(kDataAlignment, kDstSize));
|
||||||
|
dst_c_ = reinterpret_cast<uint8_t*>(vpx_memalign(kDataAlignment, kDstSize));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void TearDownTestCase() {
|
||||||
|
vpx_free(src_);
|
||||||
|
src_ = NULL;
|
||||||
|
vpx_free(dst_);
|
||||||
|
dst_ = NULL;
|
||||||
|
vpx_free(dst_c_);
|
||||||
|
dst_c_ = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// Make test arrays big enough for 16x16 functions. Six-tap filters
|
||||||
|
// need 5 extra pixels outside of the macroblock.
|
||||||
|
static const int kSrcStride = 21;
|
||||||
|
static const int kDstStride = 16;
|
||||||
|
static const int kDataAlignment = 16;
|
||||||
|
static const int kSrcSize = kSrcStride * kSrcStride + 1;
|
||||||
|
static const int kDstSize = kDstStride * kDstStride;
|
||||||
|
|
||||||
|
virtual void SetUp() {
|
||||||
|
width_ = GET_PARAM(0);
|
||||||
|
height_ = GET_PARAM(1);
|
||||||
|
sixtap_predict_ = GET_PARAM(2);
|
||||||
|
memset(src_, 0, sizeof(src_));
|
||||||
|
memset(dst_, 0, sizeof(dst_));
|
||||||
|
memset(dst_c_, 0, sizeof(dst_c_));
|
||||||
|
}
|
||||||
|
|
||||||
|
int width_;
|
||||||
|
int height_;
|
||||||
|
sixtap_predict_fn_t sixtap_predict_;
|
||||||
|
// The src stores the macroblock we will filter on, and makes it 1 byte larger
|
||||||
|
// in order to test unaligned access. The result is stored in dst and dst_c(c
|
||||||
|
// reference code result).
|
||||||
|
static uint8_t* src_;
|
||||||
|
static uint8_t* dst_;
|
||||||
|
static uint8_t* dst_c_;
|
||||||
|
};
|
||||||
|
|
||||||
|
uint8_t* SixtapPredictTest::src_ = NULL;
|
||||||
|
uint8_t* SixtapPredictTest::dst_ = NULL;
|
||||||
|
uint8_t* SixtapPredictTest::dst_c_ = NULL;
|
||||||
|
|
||||||
|
TEST_P(SixtapPredictTest, TestWithPresetData) {
|
||||||
|
// Test input
|
||||||
|
static const uint8_t test_data[kSrcSize] = {
|
||||||
|
216, 184, 4, 191, 82, 92, 41, 0, 1, 226, 236, 172, 20, 182, 42, 226, 177,
|
||||||
|
79, 94, 77, 179, 203, 206, 198, 22, 192, 19, 75, 17, 192, 44, 233, 120,
|
||||||
|
48, 168, 203, 141, 210, 203, 143, 180, 184, 59, 201, 110, 102, 171, 32,
|
||||||
|
182, 10, 109, 105, 213, 60, 47, 236, 253, 67, 55, 14, 3, 99, 247, 124,
|
||||||
|
148, 159, 71, 34, 114, 19, 177, 38, 203, 237, 239, 58, 83, 155, 91, 10,
|
||||||
|
166, 201, 115, 124, 5, 163, 104, 2, 231, 160, 16, 234, 4, 8, 103, 153,
|
||||||
|
167, 174, 187, 26, 193, 109, 64, 141, 90, 48, 200, 174, 204, 36, 184,
|
||||||
|
114, 237, 43, 238, 242, 207, 86, 245, 182, 247, 6, 161, 251, 14, 8, 148,
|
||||||
|
182, 182, 79, 208, 120, 188, 17, 6, 23, 65, 206, 197, 13, 242, 126, 128,
|
||||||
|
224, 170, 110, 211, 121, 197, 200, 47, 188, 207, 208, 184, 221, 216, 76,
|
||||||
|
148, 143, 156, 100, 8, 89, 117, 14, 112, 183, 221, 54, 197, 208, 180, 69,
|
||||||
|
176, 94, 180, 131, 215, 121, 76, 7, 54, 28, 216, 238, 249, 176, 58, 142,
|
||||||
|
64, 215, 242, 72, 49, 104, 87, 161, 32, 52, 216, 230, 4, 141, 44, 181,
|
||||||
|
235, 224, 57, 195, 89, 134, 203, 144, 162, 163, 126, 156, 84, 185, 42,
|
||||||
|
148, 145, 29, 221, 194, 134, 52, 100, 166, 105, 60, 140, 110, 201, 184,
|
||||||
|
35, 181, 153, 93, 121, 243, 227, 68, 131, 134, 232, 2, 35, 60, 187, 77,
|
||||||
|
209, 76, 106, 174, 15, 241, 227, 115, 151, 77, 175, 36, 187, 121, 221,
|
||||||
|
223, 47, 118, 61, 168, 105, 32, 237, 236, 167, 213, 238, 202, 17, 170,
|
||||||
|
24, 226, 247, 131, 145, 6, 116, 117, 121, 11, 194, 41, 48, 126, 162, 13,
|
||||||
|
93, 209, 131, 154, 122, 237, 187, 103, 217, 99, 60, 200, 45, 78, 115, 69,
|
||||||
|
49, 106, 200, 194, 112, 60, 56, 234, 72, 251, 19, 120, 121, 182, 134, 215,
|
||||||
|
135, 10, 114, 2, 247, 46, 105, 209, 145, 165, 153, 191, 243, 12, 5, 36,
|
||||||
|
119, 206, 231, 231, 11, 32, 209, 83, 27, 229, 204, 149, 155, 83, 109, 35,
|
||||||
|
93, 223, 37, 84, 14, 142, 37, 160, 52, 191, 96, 40, 204, 101, 77, 67, 52,
|
||||||
|
53, 43, 63, 85, 253, 147, 113, 226, 96, 6, 125, 179, 115, 161, 17, 83,
|
||||||
|
198, 101, 98, 85, 139, 3, 137, 75, 99, 178, 23, 201, 255, 91, 253, 52,
|
||||||
|
134, 60, 138, 131, 208, 251, 101, 48, 2, 227, 228, 118, 132, 245, 202,
|
||||||
|
75, 91, 44, 160, 231, 47, 41, 50, 147, 220, 74, 92, 219, 165, 89, 16
|
||||||
|
};
|
||||||
|
|
||||||
|
// Expected result
|
||||||
|
static const uint8_t expected_dst[kDstSize] = {
|
||||||
|
117, 102, 74, 135, 42, 98, 175, 206, 70, 73, 222, 197, 50, 24, 39, 49, 38,
|
||||||
|
105, 90, 47, 169, 40, 171, 215, 200, 73, 109, 141, 53, 85, 177, 164, 79,
|
||||||
|
208, 124, 89, 212, 18, 81, 145, 151, 164, 217, 153, 91, 154, 102, 102,
|
||||||
|
159, 75, 164, 152, 136, 51, 213, 219, 186, 116, 193, 224, 186, 36, 231,
|
||||||
|
208, 84, 211, 155, 167, 35, 59, 42, 76, 216, 149, 73, 201, 78, 149, 184,
|
||||||
|
100, 96, 196, 189, 198, 188, 235, 195, 117, 129, 120, 129, 49, 25, 133,
|
||||||
|
113, 69, 221, 114, 70, 143, 99, 157, 108, 189, 140, 78, 6, 55, 65, 240,
|
||||||
|
255, 245, 184, 72, 90, 100, 116, 131, 39, 60, 234, 167, 33, 160, 88, 185,
|
||||||
|
200, 157, 159, 176, 127, 151, 138, 102, 168, 106, 170, 86, 82, 219, 189,
|
||||||
|
76, 33, 115, 197, 106, 96, 198, 136, 97, 141, 237, 151, 98, 137, 191,
|
||||||
|
185, 2, 57, 95, 142, 91, 255, 185, 97, 137, 76, 162, 94, 173, 131, 193,
|
||||||
|
161, 81, 106, 72, 135, 222, 234, 137, 66, 137, 106, 243, 210, 147, 95,
|
||||||
|
15, 137, 110, 85, 66, 16, 96, 167, 147, 150, 173, 203, 140, 118, 196,
|
||||||
|
84, 147, 160, 19, 95, 101, 123, 74, 132, 202, 82, 166, 12, 131, 166,
|
||||||
|
189, 170, 159, 85, 79, 66, 57, 152, 132, 203, 194, 0, 1, 56, 146, 180,
|
||||||
|
224, 156, 28, 83, 181, 79, 76, 80, 46, 160, 175, 59, 106, 43, 87, 75,
|
||||||
|
136, 85, 189, 46, 71, 200, 90
|
||||||
|
};
|
||||||
|
|
||||||
|
uint8_t *src = const_cast<uint8_t*>(test_data);
|
||||||
|
|
||||||
|
REGISTER_STATE_CHECK(sixtap_predict_(&src[kSrcStride * 2 + 2 + 1], kSrcStride,
|
||||||
|
2, 2, dst_, kDstStride));
|
||||||
|
|
||||||
|
for (int i = 0; i < height_; ++i)
|
||||||
|
for (int j = 0; j < width_; ++j)
|
||||||
|
ASSERT_EQ(expected_dst[i * kDstStride + j], dst_[i * kDstStride + j])
|
||||||
|
<< "i==" << (i * width_ + j);
|
||||||
|
}
|
||||||
|
|
||||||
|
using libvpx_test::ACMRandom;
|
||||||
|
|
||||||
|
TEST_P(SixtapPredictTest, TestWithRandomData) {
|
||||||
|
ACMRandom rnd(ACMRandom::DeterministicSeed());
|
||||||
|
for (int i = 0; i < kSrcSize; ++i)
|
||||||
|
src_[i] = rnd.Rand8();
|
||||||
|
|
||||||
|
// Run tests for all possible offsets.
|
||||||
|
for (int xoffset = 0; xoffset < 8; ++xoffset) {
|
||||||
|
for (int yoffset = 0; yoffset < 8; ++yoffset) {
|
||||||
|
// Call c reference function.
|
||||||
|
// Move start point to next pixel to test if the function reads
|
||||||
|
// unaligned data correctly.
|
||||||
|
vp8_sixtap_predict16x16_c(&src_[kSrcStride * 2 + 2 + 1], kSrcStride,
|
||||||
|
xoffset, yoffset, dst_c_, kDstStride);
|
||||||
|
|
||||||
|
// Run test.
|
||||||
|
REGISTER_STATE_CHECK(
|
||||||
|
sixtap_predict_(&src_[kSrcStride * 2 + 2 + 1], kSrcStride,
|
||||||
|
xoffset, yoffset, dst_, kDstStride));
|
||||||
|
|
||||||
|
for (int i = 0; i < height_; ++i)
|
||||||
|
for (int j = 0; j < width_; ++j)
|
||||||
|
ASSERT_EQ(dst_c_[i * kDstStride + j], dst_[i * kDstStride + j])
|
||||||
|
<< "i==" << (i * width_ + j);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
using std::tr1::make_tuple;
|
||||||
|
|
||||||
|
const sixtap_predict_fn_t sixtap_16x16_c = vp8_sixtap_predict16x16_c;
|
||||||
|
const sixtap_predict_fn_t sixtap_8x8_c = vp8_sixtap_predict8x8_c;
|
||||||
|
const sixtap_predict_fn_t sixtap_8x4_c = vp8_sixtap_predict8x4_c;
|
||||||
|
const sixtap_predict_fn_t sixtap_4x4_c = vp8_sixtap_predict4x4_c;
|
||||||
|
INSTANTIATE_TEST_CASE_P(
|
||||||
|
C, SixtapPredictTest, ::testing::Values(
|
||||||
|
make_tuple(16, 16, sixtap_16x16_c),
|
||||||
|
make_tuple(8, 8, sixtap_8x8_c),
|
||||||
|
make_tuple(8, 4, sixtap_8x4_c),
|
||||||
|
make_tuple(4, 4, sixtap_4x4_c)));
|
||||||
|
#if HAVE_MMX
|
||||||
|
const sixtap_predict_fn_t sixtap_16x16_mmx = vp8_sixtap_predict16x16_mmx;
|
||||||
|
const sixtap_predict_fn_t sixtap_8x8_mmx = vp8_sixtap_predict8x8_mmx;
|
||||||
|
const sixtap_predict_fn_t sixtap_8x4_mmx = vp8_sixtap_predict8x4_mmx;
|
||||||
|
const sixtap_predict_fn_t sixtap_4x4_mmx = vp8_sixtap_predict4x4_mmx;
|
||||||
|
INSTANTIATE_TEST_CASE_P(
|
||||||
|
MMX, SixtapPredictTest, ::testing::Values(
|
||||||
|
make_tuple(16, 16, sixtap_16x16_mmx),
|
||||||
|
make_tuple(8, 8, sixtap_8x8_mmx),
|
||||||
|
make_tuple(8, 4, sixtap_8x4_mmx),
|
||||||
|
make_tuple(4, 4, sixtap_4x4_mmx)));
|
||||||
|
#endif
|
||||||
|
#if HAVE_SSE2
|
||||||
|
const sixtap_predict_fn_t sixtap_16x16_sse2 = vp8_sixtap_predict16x16_sse2;
|
||||||
|
const sixtap_predict_fn_t sixtap_8x8_sse2 = vp8_sixtap_predict8x8_sse2;
|
||||||
|
const sixtap_predict_fn_t sixtap_8x4_sse2 = vp8_sixtap_predict8x4_sse2;
|
||||||
|
INSTANTIATE_TEST_CASE_P(
|
||||||
|
SSE2, SixtapPredictTest, ::testing::Values(
|
||||||
|
make_tuple(16, 16, sixtap_16x16_sse2),
|
||||||
|
make_tuple(8, 8, sixtap_8x8_sse2),
|
||||||
|
make_tuple(8, 4, sixtap_8x4_sse2)));
|
||||||
|
#endif
|
||||||
|
#if HAVE_SSSE3
|
||||||
|
const sixtap_predict_fn_t sixtap_16x16_ssse3 = vp8_sixtap_predict16x16_ssse3;
|
||||||
|
const sixtap_predict_fn_t sixtap_8x8_ssse3 = vp8_sixtap_predict8x8_ssse3;
|
||||||
|
const sixtap_predict_fn_t sixtap_8x4_ssse3 = vp8_sixtap_predict8x4_ssse3;
|
||||||
|
const sixtap_predict_fn_t sixtap_4x4_ssse3 = vp8_sixtap_predict4x4_ssse3;
|
||||||
|
INSTANTIATE_TEST_CASE_P(
|
||||||
|
SSSE3, SixtapPredictTest, ::testing::Values(
|
||||||
|
make_tuple(16, 16, sixtap_16x16_ssse3),
|
||||||
|
make_tuple(8, 8, sixtap_8x8_ssse3),
|
||||||
|
make_tuple(8, 4, sixtap_8x4_ssse3),
|
||||||
|
make_tuple(4, 4, sixtap_4x4_ssse3)));
|
||||||
|
#endif
|
||||||
|
} // namespace
|
||||||
114
test/subtract_test.cc
Normal file
114
test/subtract_test.cc
Normal file
@@ -0,0 +1,114 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2012 The WebM project authors. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by a BSD-style license
|
||||||
|
* that can be found in the LICENSE file in the root of the source
|
||||||
|
* tree. An additional intellectual property rights grant can be found
|
||||||
|
* in the file PATENTS. All contributing project authors may
|
||||||
|
* be found in the AUTHORS file in the root of the source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "third_party/googletest/src/include/gtest/gtest.h"
|
||||||
|
#include "test/acm_random.h"
|
||||||
|
#include "test/register_state_check.h"
|
||||||
|
extern "C" {
|
||||||
|
#include "vpx_config.h"
|
||||||
|
#include "vpx_rtcd.h"
|
||||||
|
#include "vp8/common/blockd.h"
|
||||||
|
#include "vp8/encoder/block.h"
|
||||||
|
#include "vpx_mem/vpx_mem.h"
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef void (*subtract_b_fn_t)(BLOCK *be, BLOCKD *bd, int pitch);
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
class SubtractBlockTest : public ::testing::TestWithParam<subtract_b_fn_t> {};
|
||||||
|
|
||||||
|
using libvpx_test::ACMRandom;
|
||||||
|
|
||||||
|
TEST_P(SubtractBlockTest, SimpleSubtract) {
|
||||||
|
ACMRandom rnd(ACMRandom::DeterministicSeed());
|
||||||
|
BLOCK be;
|
||||||
|
BLOCKD bd;
|
||||||
|
// in libvpx, this stride is always 16
|
||||||
|
const int kDiffPredStride = 16;
|
||||||
|
const int kSrcStride[] = {32, 16, 8, 4, 0};
|
||||||
|
const int kBlockWidth = 4;
|
||||||
|
const int kBlockHeight = 4;
|
||||||
|
|
||||||
|
// Allocate... align to 16 for mmx/sse tests
|
||||||
|
uint8_t *source = reinterpret_cast<uint8_t*>(
|
||||||
|
vpx_memalign(16, kBlockHeight * kSrcStride[0] * sizeof(*source)));
|
||||||
|
be.src_diff = reinterpret_cast<int16_t*>(
|
||||||
|
vpx_memalign(16, kBlockHeight * kDiffPredStride * sizeof(*be.src_diff)));
|
||||||
|
bd.predictor = reinterpret_cast<unsigned char*>(
|
||||||
|
vpx_memalign(16, kBlockHeight * kDiffPredStride * sizeof(*bd.predictor)));
|
||||||
|
|
||||||
|
for(int i = 0; kSrcStride[i] > 0; ++i) {
|
||||||
|
// start at block0
|
||||||
|
be.src = 0;
|
||||||
|
be.base_src = &source;
|
||||||
|
be.src_stride = kSrcStride[i];
|
||||||
|
|
||||||
|
// set difference
|
||||||
|
int16_t *src_diff = be.src_diff;
|
||||||
|
for (int r = 0; r < kBlockHeight; ++r) {
|
||||||
|
for (int c = 0; c < kBlockWidth; ++c) {
|
||||||
|
src_diff[c] = 0xa5a5;
|
||||||
|
}
|
||||||
|
src_diff += kDiffPredStride;
|
||||||
|
}
|
||||||
|
|
||||||
|
// set destination
|
||||||
|
uint8_t *base_src = *be.base_src;
|
||||||
|
for (int r = 0; r < kBlockHeight; ++r) {
|
||||||
|
for (int c = 0; c < kBlockWidth; ++c) {
|
||||||
|
base_src[c] = rnd.Rand8();
|
||||||
|
}
|
||||||
|
base_src += be.src_stride;
|
||||||
|
}
|
||||||
|
|
||||||
|
// set predictor
|
||||||
|
uint8_t *predictor = bd.predictor;
|
||||||
|
for (int r = 0; r < kBlockHeight; ++r) {
|
||||||
|
for (int c = 0; c < kBlockWidth; ++c) {
|
||||||
|
predictor[c] = rnd.Rand8();
|
||||||
|
}
|
||||||
|
predictor += kDiffPredStride;
|
||||||
|
}
|
||||||
|
|
||||||
|
REGISTER_STATE_CHECK(GetParam()(&be, &bd, kDiffPredStride));
|
||||||
|
|
||||||
|
base_src = *be.base_src;
|
||||||
|
src_diff = be.src_diff;
|
||||||
|
predictor = bd.predictor;
|
||||||
|
for (int r = 0; r < kBlockHeight; ++r) {
|
||||||
|
for (int c = 0; c < kBlockWidth; ++c) {
|
||||||
|
EXPECT_EQ(base_src[c], (src_diff[c] + predictor[c])) << "r = " << r
|
||||||
|
<< ", c = " << c;
|
||||||
|
}
|
||||||
|
src_diff += kDiffPredStride;
|
||||||
|
predictor += kDiffPredStride;
|
||||||
|
base_src += be.src_stride;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
vpx_free(be.src_diff);
|
||||||
|
vpx_free(source);
|
||||||
|
vpx_free(bd.predictor);
|
||||||
|
}
|
||||||
|
|
||||||
|
INSTANTIATE_TEST_CASE_P(C, SubtractBlockTest,
|
||||||
|
::testing::Values(vp8_subtract_b_c));
|
||||||
|
|
||||||
|
#if HAVE_MMX
|
||||||
|
INSTANTIATE_TEST_CASE_P(MMX, SubtractBlockTest,
|
||||||
|
::testing::Values(vp8_subtract_b_mmx));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if HAVE_SSE2
|
||||||
|
INSTANTIATE_TEST_CASE_P(SSE2, SubtractBlockTest,
|
||||||
|
::testing::Values(vp8_subtract_b_sse2));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
} // namespace
|
||||||
123
test/test-data.sha1
Normal file
123
test/test-data.sha1
Normal file
@@ -0,0 +1,123 @@
|
|||||||
|
d5dfb0151c9051f8c85999255645d7a23916d3c0 hantro_collage_w352h288.yuv
|
||||||
|
5184c46ddca8b1fadd16742e8500115bc8f749da vp80-00-comprehensive-001.ivf
|
||||||
|
65bf1bbbced81b97bd030f376d1b7f61a224793f vp80-00-comprehensive-002.ivf
|
||||||
|
906b4c1e99eb734504c504b3f1ad8052137ce672 vp80-00-comprehensive-003.ivf
|
||||||
|
ec144b1af53af895db78355785650b96dd3f0ade vp80-00-comprehensive-004.ivf
|
||||||
|
afc7091785c62f1c121c4554a2830c30704587d9 vp80-00-comprehensive-005.ivf
|
||||||
|
42ea9d55c818145d06a9b633b8e85c6a6164fd3e vp80-00-comprehensive-006.ivf
|
||||||
|
e5b3a73ab79fe024c14309d653d6bed92902ee3b vp80-00-comprehensive-007.ivf
|
||||||
|
f3c50a58875930adfb84525c0ef59d7e4c08540c vp80-00-comprehensive-008.ivf
|
||||||
|
4b2841fdb83db51ae322096ae468bbb9dc2c8362 vp80-00-comprehensive-009.ivf
|
||||||
|
efbff736e3a91ab6a98c5bc2dce65d645944c7b1 vp80-00-comprehensive-010.ivf
|
||||||
|
6b315102cae008d22a3d2c231be92cb704a222f8 vp80-00-comprehensive-011.ivf
|
||||||
|
f3214a4fea14c2d5ec689936c1613f274c859ee8 vp80-00-comprehensive-012.ivf
|
||||||
|
e4094e96d308c8a35b74c480a43d853c5294cd34 vp80-00-comprehensive-013.ivf
|
||||||
|
5b0adfaf60a69e0aaf3ec021a39d0a68fc0e1b5a vp80-00-comprehensive-014.ivf
|
||||||
|
e8467688ddf26b5000664f904faf0d70506aa653 vp80-00-comprehensive-015.ivf
|
||||||
|
aab55582337dfd2a39ff54fb2576a91910d49337 vp80-00-comprehensive-016.ivf
|
||||||
|
1ba24724f80203c9bae4f1d0f99d534721980016 vp80-00-comprehensive-017.ivf
|
||||||
|
143a15512b46f436280ddb4d0e6411eb4af434f2 vp80-00-comprehensive-018.ivf
|
||||||
|
c5baeaf5714fdfb3a8bc960a8e33ac438e83b16b vp80-01-intra-1400.ivf
|
||||||
|
f383955229afe3408453e316d11553d923ca60d5 vp80-01-intra-1411.ivf
|
||||||
|
84e1f4343f174c9f3c83f834bac3196fb325bf2c vp80-01-intra-1416.ivf
|
||||||
|
fb6e712a47dd57a28a3727d2ae2c97a8b7c7ca51 vp80-01-intra-1417.ivf
|
||||||
|
71ea772d3e9d315b8cbecf41207b8a237c34853b vp80-02-inter-1402.ivf
|
||||||
|
d85dbc4271525dcd128c503f936fe69091d1f8d0 vp80-02-inter-1412.ivf
|
||||||
|
d4e5d3ad56511867d025f93724d090f92ba6ec3d vp80-02-inter-1418.ivf
|
||||||
|
91791cbcc37c60f35dbd8090bacb54e5ec6dd4fa vp80-02-inter-1424.ivf
|
||||||
|
17fbfe2fea70f6e2f3fa6ca4efaae6c0b03b5f02 vp80-03-segmentation-01.ivf
|
||||||
|
3c3600dbbcde08e20d54c66fe3b7eadd4f09bdbb vp80-03-segmentation-02.ivf
|
||||||
|
c156778d5340967d4b369c490848076e92f1f875 vp80-03-segmentation-03.ivf
|
||||||
|
d25dcff6c60e87a1af70945b8911b6b4998533b0 vp80-03-segmentation-04.ivf
|
||||||
|
362baba2ce454c9db21218f35e81c27a5ed0b730 vp80-03-segmentation-1401.ivf
|
||||||
|
d223ae7ee748ce07e74c4679bfd219e84aa9f4b0 vp80-03-segmentation-1403.ivf
|
||||||
|
033adf7f3a13836a3f1cffcb87c1972900f2b5c6 vp80-03-segmentation-1407.ivf
|
||||||
|
4d51dfbf9f3e2c590ec99d1d6f59dd731d04375f vp80-03-segmentation-1408.ivf
|
||||||
|
f37a62b197c2600d75e0ccfbb31b60efdedac251 vp80-03-segmentation-1409.ivf
|
||||||
|
eb25bd7bfba5b2f6935018a930f42d123b1e7fcd vp80-03-segmentation-1410.ivf
|
||||||
|
b9d5c436663a30c27cfff84b53a002e501258843 vp80-03-segmentation-1413.ivf
|
||||||
|
6da92b9d1a180cc3a8afe348ab12258f5a37be1a vp80-03-segmentation-1414.ivf
|
||||||
|
a4f5842602886bd669f115f93d8a35c035cb0948 vp80-03-segmentation-1415.ivf
|
||||||
|
f295dceb8ef278b77251b3f9df8aee22e161d547 vp80-03-segmentation-1425.ivf
|
||||||
|
198dbf9f36f733200e432664cc8c5752d59779de vp80-03-segmentation-1426.ivf
|
||||||
|
7704804e32f5de976803929934a7fafe101ac7b0 vp80-03-segmentation-1427.ivf
|
||||||
|
831ccd862ea95ca025d2f3bd8b88678752f5416d vp80-03-segmentation-1432.ivf
|
||||||
|
b3c11978529289f9109f2766fcaba3ebc40e11ef vp80-03-segmentation-1435.ivf
|
||||||
|
a835a731f5520ebfc1002c40121264d0020559ac vp80-03-segmentation-1436.ivf
|
||||||
|
1d1732942f773bb2a5775fcb9689b1579ce28eab vp80-03-segmentation-1437.ivf
|
||||||
|
db04799adfe089dfdf74dbd43cc05ede7161f99e vp80-03-segmentation-1441.ivf
|
||||||
|
7caf39b3f20cfd52b998210878062e52a5edf1e6 vp80-03-segmentation-1442.ivf
|
||||||
|
3607f6bb4ee106c38fa1ea370dc4ff8b8cde2261 vp80-04-partitions-1404.ivf
|
||||||
|
93cc323b6b6867f1b12dd48773424549c6960a6b vp80-04-partitions-1405.ivf
|
||||||
|
047eedb14b865bdac8a3538e63801054e0295e9c vp80-04-partitions-1406.ivf
|
||||||
|
0f1233bd2bc33f56ce5e495dbd455d122339f384 vp80-05-sharpness-1428.ivf
|
||||||
|
51767fc136488a9535c2a4c38067c542ee2048df vp80-05-sharpness-1429.ivf
|
||||||
|
9805aa107672de25d6fb8c35e20d06deca5efe18 vp80-05-sharpness-1430.ivf
|
||||||
|
61db6b965f9c27aebe71b85bf2d5877e58e4bbdf vp80-05-sharpness-1431.ivf
|
||||||
|
10420d266290d2923555f84af38eeb96edbd3ae8 vp80-05-sharpness-1433.ivf
|
||||||
|
3ed24f9a80cddfdf75824ba95cdb4ff9286cb443 vp80-05-sharpness-1434.ivf
|
||||||
|
c87599cbecd72d4cd4f7ace3313b7a6bc6eb8163 vp80-05-sharpness-1438.ivf
|
||||||
|
aff51d865c2621b60510459244ea83e958e4baed vp80-05-sharpness-1439.ivf
|
||||||
|
da386e72b19b5485a6af199c5eb60ef25e510dd1 vp80-05-sharpness-1440.ivf
|
||||||
|
6759a095203d96ccd267ce09b1b050b8cc4c2f1f vp80-05-sharpness-1443.ivf
|
||||||
|
db55ec7fd02c864ba996ff060b25b1e08611330b vp80-00-comprehensive-001.ivf.md5
|
||||||
|
29db0ad011cba1e45f856d5623cd38dac3e3bf19 vp80-00-comprehensive-002.ivf.md5
|
||||||
|
e84f258f69e173e7d68f8f8c037a0a3766902182 vp80-00-comprehensive-003.ivf.md5
|
||||||
|
eb7912eaf69559a16fd82bc3f5fb1524cf4a4466 vp80-00-comprehensive-004.ivf.md5
|
||||||
|
4206f71c94894bd5b5b376f6c09b3817dbc65206 vp80-00-comprehensive-005.ivf.md5
|
||||||
|
4f89b356f6f2fecb928f330a10f804f00f5325f5 vp80-00-comprehensive-006.ivf.md5
|
||||||
|
2813236a32964dd8007e17648bcf035a20fcda6c vp80-00-comprehensive-007.ivf.md5
|
||||||
|
10746c72098f872803c900e17c5680e451f5f498 vp80-00-comprehensive-008.ivf.md5
|
||||||
|
39a23d0692ce64421a7bb7cdf6ccec5928d37fff vp80-00-comprehensive-009.ivf.md5
|
||||||
|
f6e3de8931a0cc659bda8fbc14050346955e72d4 vp80-00-comprehensive-010.ivf.md5
|
||||||
|
101683ec195b6e944f7cd1e468fc8921439363e6 vp80-00-comprehensive-011.ivf.md5
|
||||||
|
1f592751ce46d8688998fa0fa4fbdcda0fd4058c vp80-00-comprehensive-012.ivf.md5
|
||||||
|
6066176f90ca790251e795fca1a5797d59999841 vp80-00-comprehensive-013.ivf.md5
|
||||||
|
2656da94ba93691f23edc4d60b3a09e2be46c217 vp80-00-comprehensive-014.ivf.md5
|
||||||
|
c6e0d5f5d61460c8ac8edfa4e701f10312c03133 vp80-00-comprehensive-015.ivf.md5
|
||||||
|
ee60fee501d8493e34e8d6a1fe315b51ed09b24a vp80-00-comprehensive-016.ivf.md5
|
||||||
|
9f1914ceffcad4546c0a29de3ef591d8bea304dc vp80-00-comprehensive-017.ivf.md5
|
||||||
|
e0305178fe288a9fd8082b39e2d03181edb19054 vp80-00-comprehensive-018.ivf.md5
|
||||||
|
612494da2fa799cc9d76dcdd835ae6c7cb2e5c05 vp80-01-intra-1400.ivf.md5
|
||||||
|
48ea06097ac8269c5e8c2131d3d0639f431fcf0e vp80-01-intra-1411.ivf.md5
|
||||||
|
6e2ab4e7677ad0ba868083ca6bc387ee922b400c vp80-01-intra-1416.ivf.md5
|
||||||
|
eca0a90348959ce3854142f8d8641b13050e8349 vp80-01-intra-1417.ivf.md5
|
||||||
|
920feea203145d5c2258a91c4e6991934a79a99e vp80-02-inter-1402.ivf.md5
|
||||||
|
f71d97909fe2b3dd65be7e1f56c72237f0cef200 vp80-02-inter-1412.ivf.md5
|
||||||
|
e911254569a30bbb2a237ff8b79f69ed9da0672d vp80-02-inter-1418.ivf.md5
|
||||||
|
58c789c50c9bb9cc90580bed291164a0939d28ba vp80-02-inter-1424.ivf.md5
|
||||||
|
ff3e2f441327b9c20a0b37c524e0f5a48a36de7b vp80-03-segmentation-01.ivf.md5
|
||||||
|
0791f417f076a542ae66fbc3426ab4d94cbd6c75 vp80-03-segmentation-02.ivf.md5
|
||||||
|
722e50f1a6a91c34302d68681faffc1c26d1cc57 vp80-03-segmentation-03.ivf.md5
|
||||||
|
c701f1885bcfb27fb8e70cc65606b289172ef889 vp80-03-segmentation-04.ivf.md5
|
||||||
|
f79bc9ec189a2b4807632a3d0c5bf04a178b5300 vp80-03-segmentation-1401.ivf.md5
|
||||||
|
b9aa4c74c0219b639811c44760d0b24cd8bb436a vp80-03-segmentation-1403.ivf.md5
|
||||||
|
70d5a2207ca1891bcaebd5cf6dd88ce8d57b4334 vp80-03-segmentation-1407.ivf.md5
|
||||||
|
265f962ee781531f9a93b9309461316fd32b2a1d vp80-03-segmentation-1408.ivf.md5
|
||||||
|
0c4ecbbd6dc042d30e626d951b65f460dd6cd563 vp80-03-segmentation-1409.ivf.md5
|
||||||
|
cf779af36a937f06570a0fca9db64ba133451dee vp80-03-segmentation-1410.ivf.md5
|
||||||
|
0e6c5036d51ab078842f133934926c598a9cff02 vp80-03-segmentation-1413.ivf.md5
|
||||||
|
eb3930aaf229116c80d507516c34759c3f6cdf69 vp80-03-segmentation-1414.ivf.md5
|
||||||
|
123d6c0f72ee87911c4ae7538e87b7d163b22d6c vp80-03-segmentation-1415.ivf.md5
|
||||||
|
e70551d1a38920e097a5d8782390b79ecaeb7505 vp80-03-segmentation-1425.ivf.md5
|
||||||
|
44e8f4117e46dbb302b2cfd81171cc1a1846e431 vp80-03-segmentation-1426.ivf.md5
|
||||||
|
52636e54aee5f95bbace37021bd67de5db767e9a vp80-03-segmentation-1427.ivf.md5
|
||||||
|
b1ad3eff20215c28e295b15ef3636ed926d59cba vp80-03-segmentation-1432.ivf.md5
|
||||||
|
24c22a552fa28a90e5978f67f57181cc2d7546d7 vp80-03-segmentation-1435.ivf.md5
|
||||||
|
96c49c390abfced18a7a8c9b9ea10af778e10edb vp80-03-segmentation-1436.ivf.md5
|
||||||
|
f95eb6214571434f1f73ab7833b9ccdf47588020 vp80-03-segmentation-1437.ivf.md5
|
||||||
|
1c0700ca27c9b0090a7747a4b0b4dc21d1843181 vp80-03-segmentation-1441.ivf.md5
|
||||||
|
81d4f23ca32667ee958bae579c8f5e97ba72eb97 vp80-03-segmentation-1442.ivf.md5
|
||||||
|
272efcef07a3a30fbca51bfd566063d8258ec0be vp80-04-partitions-1404.ivf.md5
|
||||||
|
66ed219ab812ac801b256d35cf495d193d4cf478 vp80-04-partitions-1405.ivf.md5
|
||||||
|
36083f37f56f502bd60ec5e07502ee9e6b8699b0 vp80-04-partitions-1406.ivf.md5
|
||||||
|
6ca909bf168a64c09415626294665dc1be3d1973 vp80-05-sharpness-1428.ivf.md5
|
||||||
|
1667d2ee2334e5fdea8a8a866f4ccf3cf76f033a vp80-05-sharpness-1429.ivf.md5
|
||||||
|
71bcbe5357d36a19df5b07fbe3e27bffa8893f0a vp80-05-sharpness-1430.ivf.md5
|
||||||
|
89a09b1dffce2d55770a89e58d9925c70ef79bf8 vp80-05-sharpness-1431.ivf.md5
|
||||||
|
08444a18b4e6ba3450c0796dd728d48c399a2dc9 vp80-05-sharpness-1433.ivf.md5
|
||||||
|
6d6223719a90c13e848aa2a8a6642098cdb5977a vp80-05-sharpness-1434.ivf.md5
|
||||||
|
41d70bb5fa45bc88da1604a0af466930b8dd77b5 vp80-05-sharpness-1438.ivf.md5
|
||||||
|
086c56378df81b6cee264d7540a7b8f2b405c7a4 vp80-05-sharpness-1439.ivf.md5
|
||||||
|
d32dc2c4165eb266ea4c23c14a45459b363def32 vp80-05-sharpness-1440.ivf.md5
|
||||||
|
8c69dc3d8e563f56ffab5ad1e400d9e689dd23df vp80-05-sharpness-1443.ivf.md5
|
||||||
179
test/test.mk
Normal file
179
test/test.mk
Normal file
@@ -0,0 +1,179 @@
|
|||||||
|
LIBVPX_TEST_SRCS-yes += acm_random.h
|
||||||
|
LIBVPX_TEST_SRCS-yes += register_state_check.h
|
||||||
|
LIBVPX_TEST_SRCS-yes += test.mk
|
||||||
|
LIBVPX_TEST_SRCS-yes += test_libvpx.cc
|
||||||
|
LIBVPX_TEST_SRCS-yes += util.h
|
||||||
|
LIBVPX_TEST_SRCS-yes += video_source.h
|
||||||
|
|
||||||
|
##
|
||||||
|
## BLACK BOX TESTS
|
||||||
|
##
|
||||||
|
## Black box tests only use the public API.
|
||||||
|
##
|
||||||
|
LIBVPX_TEST_SRCS-$(CONFIG_VP8_ENCODER) += altref_test.cc
|
||||||
|
LIBVPX_TEST_SRCS-$(CONFIG_VP8_ENCODER) += config_test.cc
|
||||||
|
LIBVPX_TEST_SRCS-$(CONFIG_VP8_ENCODER) += cq_test.cc
|
||||||
|
LIBVPX_TEST_SRCS-$(CONFIG_VP8_ENCODER) += datarate_test.cc
|
||||||
|
LIBVPX_TEST_SRCS-$(CONFIG_VP8_ENCODER) += encode_test_driver.cc
|
||||||
|
LIBVPX_TEST_SRCS-$(CONFIG_VP8_ENCODER) += encode_test_driver.h
|
||||||
|
LIBVPX_TEST_SRCS-$(CONFIG_VP8_ENCODER) += error_resilience_test.cc
|
||||||
|
LIBVPX_TEST_SRCS-$(CONFIG_VP8_ENCODER) += i420_video_source.h
|
||||||
|
LIBVPX_TEST_SRCS-$(CONFIG_VP8_ENCODER) += keyframe_test.cc
|
||||||
|
LIBVPX_TEST_SRCS-$(CONFIG_VP8_ENCODER) += resize_test.cc
|
||||||
|
|
||||||
|
LIBVPX_TEST_SRCS-$(CONFIG_VP8_DECODER) += ../md5_utils.h ../md5_utils.c
|
||||||
|
LIBVPX_TEST_SRCS-$(CONFIG_VP8_DECODER) += decode_test_driver.cc
|
||||||
|
LIBVPX_TEST_SRCS-$(CONFIG_VP8_DECODER) += decode_test_driver.h
|
||||||
|
LIBVPX_TEST_SRCS-$(CONFIG_VP8_DECODER) += ivf_video_source.h
|
||||||
|
LIBVPX_TEST_SRCS-$(CONFIG_VP8_DECODER) += test_vector_test.cc
|
||||||
|
##
|
||||||
|
## WHITE BOX TESTS
|
||||||
|
##
|
||||||
|
## Whitebox tests invoke functions not exposed via the public API. Certain
|
||||||
|
## shared library builds don't make these functions accessible.
|
||||||
|
##
|
||||||
|
ifeq ($(CONFIG_SHARED),)
|
||||||
|
|
||||||
|
# These tests require both the encoder and decoder to be built.
|
||||||
|
ifeq ($(CONFIG_VP8_ENCODER)$(CONFIG_VP8_DECODER),yesyes)
|
||||||
|
LIBVPX_TEST_SRCS-yes += boolcoder_test.cc
|
||||||
|
endif
|
||||||
|
|
||||||
|
LIBVPX_TEST_SRCS-$(CONFIG_VP8_ENCODER) += fdct4x4_test.cc
|
||||||
|
LIBVPX_TEST_SRCS-yes += idctllm_test.cc
|
||||||
|
LIBVPX_TEST_SRCS-yes += intrapred_test.cc
|
||||||
|
LIBVPX_TEST_SRCS-$(CONFIG_POSTPROC) += pp_filter_test.cc
|
||||||
|
LIBVPX_TEST_SRCS-yes += sad_test.cc
|
||||||
|
LIBVPX_TEST_SRCS-$(CONFIG_VP8_ENCODER) += set_roi.cc
|
||||||
|
LIBVPX_TEST_SRCS-yes += sixtap_predict_test.cc
|
||||||
|
LIBVPX_TEST_SRCS-$(CONFIG_VP8_ENCODER) += subtract_test.cc
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
##
|
||||||
|
## TEST DATA
|
||||||
|
##
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_ENCODER) += hantro_collage_w352h288.yuv
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-00-comprehensive-001.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-00-comprehensive-002.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-00-comprehensive-003.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-00-comprehensive-004.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-00-comprehensive-005.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-00-comprehensive-006.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-00-comprehensive-007.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-00-comprehensive-008.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-00-comprehensive-009.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-00-comprehensive-010.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-00-comprehensive-011.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-00-comprehensive-012.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-00-comprehensive-013.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-00-comprehensive-014.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-00-comprehensive-015.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-00-comprehensive-016.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-00-comprehensive-017.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-00-comprehensive-018.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-01-intra-1400.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-01-intra-1411.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-01-intra-1416.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-01-intra-1417.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-02-inter-1402.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-02-inter-1412.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-02-inter-1418.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-02-inter-1424.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-03-segmentation-01.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-03-segmentation-02.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-03-segmentation-03.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-03-segmentation-04.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-03-segmentation-1401.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-03-segmentation-1403.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-03-segmentation-1407.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-03-segmentation-1408.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-03-segmentation-1409.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-03-segmentation-1410.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-03-segmentation-1413.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-03-segmentation-1414.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-03-segmentation-1415.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-03-segmentation-1425.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-03-segmentation-1426.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-03-segmentation-1427.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-03-segmentation-1432.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-03-segmentation-1435.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-03-segmentation-1436.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-03-segmentation-1437.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-03-segmentation-1441.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-03-segmentation-1442.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-04-partitions-1404.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-04-partitions-1405.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-04-partitions-1406.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-05-sharpness-1428.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-05-sharpness-1429.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-05-sharpness-1430.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-05-sharpness-1431.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-05-sharpness-1433.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-05-sharpness-1434.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-05-sharpness-1438.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-05-sharpness-1439.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-05-sharpness-1440.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-05-sharpness-1443.ivf
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-00-comprehensive-001.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-00-comprehensive-002.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-00-comprehensive-003.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-00-comprehensive-004.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-00-comprehensive-005.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-00-comprehensive-006.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-00-comprehensive-007.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-00-comprehensive-008.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-00-comprehensive-009.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-00-comprehensive-010.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-00-comprehensive-011.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-00-comprehensive-012.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-00-comprehensive-013.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-00-comprehensive-014.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-00-comprehensive-015.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-00-comprehensive-016.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-00-comprehensive-017.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-00-comprehensive-018.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-01-intra-1400.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-01-intra-1411.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-01-intra-1416.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-01-intra-1417.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-02-inter-1402.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-02-inter-1412.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-02-inter-1418.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-02-inter-1424.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-03-segmentation-1401.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-03-segmentation-1403.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-03-segmentation-1407.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-03-segmentation-1408.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-03-segmentation-1409.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-03-segmentation-1410.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-03-segmentation-1413.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-03-segmentation-1414.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-03-segmentation-1415.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-03-segmentation-1425.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-03-segmentation-1426.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-03-segmentation-1427.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-03-segmentation-1432.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-03-segmentation-1435.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-03-segmentation-1436.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-03-segmentation-1437.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-03-segmentation-1441.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-03-segmentation-1442.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-03-segmentation-01.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-03-segmentation-02.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-03-segmentation-03.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-03-segmentation-04.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-04-partitions-1404.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-04-partitions-1405.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-04-partitions-1406.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-05-sharpness-1428.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-05-sharpness-1429.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-05-sharpness-1430.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-05-sharpness-1431.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-05-sharpness-1433.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-05-sharpness-1434.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-05-sharpness-1438.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-05-sharpness-1439.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-05-sharpness-1440.ivf.md5
|
||||||
|
LIBVPX_TEST_DATA-$(CONFIG_VP8_DECODER) += vp80-05-sharpness-1443.ivf.md5
|
||||||
45
test/test_libvpx.cc
Normal file
45
test/test_libvpx.cc
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2012 The WebM project authors. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by a BSD-style license
|
||||||
|
* that can be found in the LICENSE file in the root of the source
|
||||||
|
* tree. An additional intellectual property rights grant can be found
|
||||||
|
* in the file PATENTS. All contributing project authors may
|
||||||
|
* be found in the AUTHORS file in the root of the source tree.
|
||||||
|
*/
|
||||||
|
#include <string>
|
||||||
|
#include "vpx_config.h"
|
||||||
|
#if ARCH_X86 || ARCH_X86_64
|
||||||
|
extern "C" {
|
||||||
|
#include "vpx_ports/x86.h"
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#include "third_party/googletest/src/include/gtest/gtest.h"
|
||||||
|
|
||||||
|
static void append_gtest_filter(const char *str) {
|
||||||
|
std::string filter = ::testing::FLAGS_gtest_filter;
|
||||||
|
filter += str;
|
||||||
|
::testing::FLAGS_gtest_filter = filter;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv) {
|
||||||
|
::testing::InitGoogleTest(&argc, argv);
|
||||||
|
|
||||||
|
#if ARCH_X86 || ARCH_X86_64
|
||||||
|
const int simd_caps = x86_simd_caps();
|
||||||
|
if(!(simd_caps & HAS_MMX))
|
||||||
|
append_gtest_filter(":-MMX/*");
|
||||||
|
if(!(simd_caps & HAS_SSE))
|
||||||
|
append_gtest_filter(":-SSE/*");
|
||||||
|
if(!(simd_caps & HAS_SSE2))
|
||||||
|
append_gtest_filter(":-SSE2/*");
|
||||||
|
if(!(simd_caps & HAS_SSE3))
|
||||||
|
append_gtest_filter(":-SSE3/*");
|
||||||
|
if(!(simd_caps & HAS_SSSE3))
|
||||||
|
append_gtest_filter(":-SSSE3/*");
|
||||||
|
if(!(simd_caps & HAS_SSE4_1))
|
||||||
|
append_gtest_filter(":-SSE4_1/*");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return RUN_ALL_TESTS();
|
||||||
|
}
|
||||||
144
test/test_vector_test.cc
Normal file
144
test/test_vector_test.cc
Normal file
@@ -0,0 +1,144 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2012 The WebM project authors. All Rights Reserved.
|
||||||
|
|
||||||
|
Use of this source code is governed by a BSD-style license
|
||||||
|
that can be found in the LICENSE file in the root of the source
|
||||||
|
tree. An additional intellectual property rights grant can be found
|
||||||
|
in the file PATENTS. All contributing project authors may
|
||||||
|
be found in the AUTHORS file in the root of the source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <string>
|
||||||
|
#include "third_party/googletest/src/include/gtest/gtest.h"
|
||||||
|
#include "test/decode_test_driver.h"
|
||||||
|
#include "test/ivf_video_source.h"
|
||||||
|
extern "C" {
|
||||||
|
#include "./md5_utils.h"
|
||||||
|
#include "vpx_mem/vpx_mem.h"
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
#define snprintf sprintf_s
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
// There are 61 test vectors in total.
|
||||||
|
const char *kTestVectors[] = {
|
||||||
|
"vp80-00-comprehensive-001.ivf",
|
||||||
|
"vp80-00-comprehensive-002.ivf", "vp80-00-comprehensive-003.ivf",
|
||||||
|
"vp80-00-comprehensive-004.ivf", "vp80-00-comprehensive-005.ivf",
|
||||||
|
"vp80-00-comprehensive-006.ivf", "vp80-00-comprehensive-007.ivf",
|
||||||
|
"vp80-00-comprehensive-008.ivf", "vp80-00-comprehensive-009.ivf",
|
||||||
|
"vp80-00-comprehensive-010.ivf", "vp80-00-comprehensive-011.ivf",
|
||||||
|
"vp80-00-comprehensive-012.ivf", "vp80-00-comprehensive-013.ivf",
|
||||||
|
"vp80-00-comprehensive-014.ivf", "vp80-00-comprehensive-015.ivf",
|
||||||
|
"vp80-00-comprehensive-016.ivf", "vp80-00-comprehensive-017.ivf",
|
||||||
|
"vp80-00-comprehensive-018.ivf", "vp80-01-intra-1400.ivf",
|
||||||
|
"vp80-01-intra-1411.ivf", "vp80-01-intra-1416.ivf",
|
||||||
|
"vp80-01-intra-1417.ivf", "vp80-02-inter-1402.ivf",
|
||||||
|
"vp80-02-inter-1412.ivf", "vp80-02-inter-1418.ivf",
|
||||||
|
"vp80-02-inter-1424.ivf", "vp80-03-segmentation-01.ivf",
|
||||||
|
"vp80-03-segmentation-02.ivf", "vp80-03-segmentation-03.ivf",
|
||||||
|
"vp80-03-segmentation-04.ivf", "vp80-03-segmentation-1401.ivf",
|
||||||
|
"vp80-03-segmentation-1403.ivf", "vp80-03-segmentation-1407.ivf",
|
||||||
|
"vp80-03-segmentation-1408.ivf", "vp80-03-segmentation-1409.ivf",
|
||||||
|
"vp80-03-segmentation-1410.ivf", "vp80-03-segmentation-1413.ivf",
|
||||||
|
"vp80-03-segmentation-1414.ivf", "vp80-03-segmentation-1415.ivf",
|
||||||
|
"vp80-03-segmentation-1425.ivf", "vp80-03-segmentation-1426.ivf",
|
||||||
|
"vp80-03-segmentation-1427.ivf", "vp80-03-segmentation-1432.ivf",
|
||||||
|
"vp80-03-segmentation-1435.ivf", "vp80-03-segmentation-1436.ivf",
|
||||||
|
"vp80-03-segmentation-1437.ivf", "vp80-03-segmentation-1441.ivf",
|
||||||
|
"vp80-03-segmentation-1442.ivf", "vp80-04-partitions-1404.ivf",
|
||||||
|
"vp80-04-partitions-1405.ivf", "vp80-04-partitions-1406.ivf",
|
||||||
|
"vp80-05-sharpness-1428.ivf", "vp80-05-sharpness-1429.ivf",
|
||||||
|
"vp80-05-sharpness-1430.ivf", "vp80-05-sharpness-1431.ivf",
|
||||||
|
"vp80-05-sharpness-1433.ivf", "vp80-05-sharpness-1434.ivf",
|
||||||
|
"vp80-05-sharpness-1438.ivf", "vp80-05-sharpness-1439.ivf",
|
||||||
|
"vp80-05-sharpness-1440.ivf", "vp80-05-sharpness-1443.ivf"
|
||||||
|
};
|
||||||
|
|
||||||
|
class TestVectorTest : public libvpx_test::DecoderTest,
|
||||||
|
public ::testing::TestWithParam<const char*> {
|
||||||
|
protected:
|
||||||
|
TestVectorTest() : md5_file_(NULL) {}
|
||||||
|
|
||||||
|
virtual ~TestVectorTest() {
|
||||||
|
if (md5_file_)
|
||||||
|
fclose(md5_file_);
|
||||||
|
}
|
||||||
|
|
||||||
|
void OpenMD5File(const std::string& md5_file_name_) {
|
||||||
|
md5_file_ = libvpx_test::OpenTestDataFile(md5_file_name_);
|
||||||
|
ASSERT_TRUE(md5_file_) << "Md5 file open failed. Filename: "
|
||||||
|
<< md5_file_name_;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void DecompressedFrameHook(const vpx_image_t& img,
|
||||||
|
const unsigned int frame_number) {
|
||||||
|
char expected_md5[33];
|
||||||
|
char junk[128];
|
||||||
|
|
||||||
|
// Read correct md5 checksums.
|
||||||
|
const int res = fscanf(md5_file_, "%s %s", expected_md5, junk);
|
||||||
|
ASSERT_NE(res, EOF) << "Read md5 data failed";
|
||||||
|
expected_md5[32] = '\0';
|
||||||
|
|
||||||
|
MD5Context md5;
|
||||||
|
MD5Init(&md5);
|
||||||
|
|
||||||
|
// Compute and update md5 for each raw in decompressed data.
|
||||||
|
for (int plane = 0; plane < 3; ++plane) {
|
||||||
|
uint8_t *buf = img.planes[plane];
|
||||||
|
|
||||||
|
for (unsigned int y = 0; y < (plane ? (img.d_h + 1) >> 1 : img.d_h);
|
||||||
|
++y) {
|
||||||
|
MD5Update(&md5, buf, (plane ? (img.d_w + 1) >> 1 : img.d_w));
|
||||||
|
buf += img.stride[plane];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t md5_sum[16];
|
||||||
|
MD5Final(md5_sum, &md5);
|
||||||
|
|
||||||
|
char actual_md5[33];
|
||||||
|
// Convert to get the actual md5.
|
||||||
|
for (int i = 0; i < 16; i++) {
|
||||||
|
snprintf(&actual_md5[i * 2], sizeof(actual_md5) - i * 2, "%02x",
|
||||||
|
md5_sum[i]);
|
||||||
|
}
|
||||||
|
actual_md5[32] = '\0';
|
||||||
|
|
||||||
|
// Check md5 match.
|
||||||
|
ASSERT_STREQ(expected_md5, actual_md5)
|
||||||
|
<< "Md5 checksums don't match: frame number = " << frame_number;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
FILE *md5_file_;
|
||||||
|
};
|
||||||
|
|
||||||
|
// This test runs through the whole set of test vectors, and decodes them.
|
||||||
|
// The md5 checksums are computed for each frame in the video file. If md5
|
||||||
|
// checksums match the correct md5 data, then the test is passed. Otherwise,
|
||||||
|
// the test failed.
|
||||||
|
TEST_P(TestVectorTest, MD5Match) {
|
||||||
|
const std::string filename = GetParam();
|
||||||
|
// Open compressed video file.
|
||||||
|
libvpx_test::IVFVideoSource video(filename);
|
||||||
|
|
||||||
|
video.Init();
|
||||||
|
|
||||||
|
// Construct md5 file name.
|
||||||
|
const std::string md5_filename = filename + ".md5";
|
||||||
|
OpenMD5File(md5_filename);
|
||||||
|
|
||||||
|
// Decode frame, and check the md5 matching.
|
||||||
|
ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
|
||||||
|
}
|
||||||
|
|
||||||
|
INSTANTIATE_TEST_CASE_P(TestVectorSequence, TestVectorTest,
|
||||||
|
::testing::ValuesIn(kTestVectors));
|
||||||
|
|
||||||
|
} // namespace
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
* Copyright (c) 2012 The WebM project authors. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Use of this source code is governed by a BSD-style license
|
* Use of this source code is governed by a BSD-style license
|
||||||
* that can be found in the LICENSE file in the root of the source
|
* that can be found in the LICENSE file in the root of the source
|
||||||
@@ -8,12 +8,11 @@
|
|||||||
* be found in the AUTHORS file in the root of the source tree.
|
* be found in the AUTHORS file in the root of the source tree.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifndef TEST_UTIL_H_
|
||||||
|
#define TEST_UTIL_H_
|
||||||
|
|
||||||
#ifndef __INC_PARTIALGFUPDATE_H
|
// Macros
|
||||||
#define __INC_PARTIALGFUPDATE_H
|
#define PARAMS(...) ::testing::TestWithParam< std::tr1::tuple< __VA_ARGS__ > >
|
||||||
|
#define GET_PARAM(k) std::tr1::get< k >(GetParam())
|
||||||
|
|
||||||
#include "onyxc_int.h"
|
#endif // TEST_UTIL_H_
|
||||||
|
|
||||||
extern void update_gf_selective(ONYX_COMMON *cm, MACROBLOCKD *x);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
175
test/video_source.h
Normal file
175
test/video_source.h
Normal file
@@ -0,0 +1,175 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2012 The WebM project authors. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by a BSD-style license
|
||||||
|
* that can be found in the LICENSE file in the root of the source
|
||||||
|
* tree. An additional intellectual property rights grant can be found
|
||||||
|
* in the file PATENTS. All contributing project authors may
|
||||||
|
* be found in the AUTHORS file in the root of the source tree.
|
||||||
|
*/
|
||||||
|
#ifndef TEST_VIDEO_SOURCE_H_
|
||||||
|
#define TEST_VIDEO_SOURCE_H_
|
||||||
|
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <string>
|
||||||
|
#include "test/acm_random.h"
|
||||||
|
#include "vpx/vpx_encoder.h"
|
||||||
|
|
||||||
|
namespace libvpx_test {
|
||||||
|
|
||||||
|
static FILE *OpenTestDataFile(const std::string& file_name) {
|
||||||
|
std::string path_to_source = file_name;
|
||||||
|
const char *kDataPath = getenv("LIBVPX_TEST_DATA_PATH");
|
||||||
|
|
||||||
|
if (kDataPath) {
|
||||||
|
path_to_source = kDataPath;
|
||||||
|
path_to_source += "/";
|
||||||
|
path_to_source += file_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
return fopen(path_to_source.c_str(), "rb");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Abstract base class for test video sources, which provide a stream of
|
||||||
|
// vpx_image_t images with associated timestamps and duration.
|
||||||
|
class VideoSource {
|
||||||
|
public:
|
||||||
|
virtual ~VideoSource() {}
|
||||||
|
|
||||||
|
// Prepare the stream for reading, rewind/open as necessary.
|
||||||
|
virtual void Begin() = 0;
|
||||||
|
|
||||||
|
// Advance the cursor to the next frame
|
||||||
|
virtual void Next() = 0;
|
||||||
|
|
||||||
|
// Get the current video frame, or NULL on End-Of-Stream.
|
||||||
|
virtual vpx_image_t *img() const = 0;
|
||||||
|
|
||||||
|
// Get the presentation timestamp of the current frame.
|
||||||
|
virtual vpx_codec_pts_t pts() const = 0;
|
||||||
|
|
||||||
|
// Get the current frame's duration
|
||||||
|
virtual unsigned long duration() const = 0;
|
||||||
|
|
||||||
|
// Get the timebase for the stream
|
||||||
|
virtual vpx_rational_t timebase() const = 0;
|
||||||
|
|
||||||
|
// Get the current frame counter, starting at 0.
|
||||||
|
virtual unsigned int frame() const = 0;
|
||||||
|
|
||||||
|
// Get the current file limit.
|
||||||
|
virtual unsigned int limit() const = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class DummyVideoSource : public VideoSource {
|
||||||
|
public:
|
||||||
|
DummyVideoSource() : img_(NULL), limit_(100), width_(0), height_(0) {
|
||||||
|
SetSize(80, 64);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual ~DummyVideoSource() { vpx_img_free(img_); }
|
||||||
|
|
||||||
|
virtual void Begin() {
|
||||||
|
frame_ = 0;
|
||||||
|
FillFrame();
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void Next() {
|
||||||
|
++frame_;
|
||||||
|
FillFrame();
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual vpx_image_t *img() const {
|
||||||
|
return (frame_ < limit_) ? img_ : NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Models a stream where Timebase = 1/FPS, so pts == frame.
|
||||||
|
virtual vpx_codec_pts_t pts() const { return frame_; }
|
||||||
|
|
||||||
|
virtual unsigned long duration() const { return 1; }
|
||||||
|
|
||||||
|
virtual vpx_rational_t timebase() const {
|
||||||
|
const vpx_rational_t t = {1, 30};
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual unsigned int frame() const { return frame_; }
|
||||||
|
|
||||||
|
virtual unsigned int limit() const { return limit_; }
|
||||||
|
|
||||||
|
void SetSize(unsigned int width, unsigned int height) {
|
||||||
|
if (width != width_ || height != height_) {
|
||||||
|
vpx_img_free(img_);
|
||||||
|
raw_sz_ = ((width + 31)&~31) * height * 3 / 2;
|
||||||
|
img_ = vpx_img_alloc(NULL, VPX_IMG_FMT_VPXI420, width, height, 32);
|
||||||
|
width_ = width;
|
||||||
|
height_ = height;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void FillFrame() { memset(img_->img_data, 0, raw_sz_); }
|
||||||
|
|
||||||
|
vpx_image_t *img_;
|
||||||
|
size_t raw_sz_;
|
||||||
|
unsigned int limit_;
|
||||||
|
unsigned int frame_;
|
||||||
|
unsigned int width_;
|
||||||
|
unsigned int height_;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class RandomVideoSource : public DummyVideoSource {
|
||||||
|
public:
|
||||||
|
RandomVideoSource(int seed = ACMRandom::DeterministicSeed())
|
||||||
|
: rnd_(seed),
|
||||||
|
seed_(seed) { }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// Reset the RNG to get a matching stream for the second pass
|
||||||
|
virtual void Begin() {
|
||||||
|
frame_ = 0;
|
||||||
|
rnd_.Reset(seed_);
|
||||||
|
FillFrame();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 15 frames of noise, followed by 15 static frames. Reset to 0 rather
|
||||||
|
// than holding previous frames to encourage keyframes to be thrown.
|
||||||
|
virtual void FillFrame() {
|
||||||
|
if (frame_ % 30 < 15)
|
||||||
|
for (size_t i = 0; i < raw_sz_; ++i)
|
||||||
|
img_->img_data[i] = rnd_.Rand8();
|
||||||
|
else
|
||||||
|
memset(img_->img_data, 0, raw_sz_);
|
||||||
|
}
|
||||||
|
|
||||||
|
ACMRandom rnd_;
|
||||||
|
int seed_;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Abstract base class for test video sources, which provide a stream of
|
||||||
|
// decompressed images to the decoder.
|
||||||
|
class CompressedVideoSource {
|
||||||
|
public:
|
||||||
|
virtual ~CompressedVideoSource() {}
|
||||||
|
|
||||||
|
virtual void Init() = 0;
|
||||||
|
|
||||||
|
// Prepare the stream for reading, rewind/open as necessary.
|
||||||
|
virtual void Begin() = 0;
|
||||||
|
|
||||||
|
// Advance the cursor to the next frame
|
||||||
|
virtual void Next() = 0;
|
||||||
|
|
||||||
|
virtual const uint8_t *cxdata() const = 0;
|
||||||
|
|
||||||
|
virtual const unsigned int frame_size() const = 0;
|
||||||
|
|
||||||
|
virtual const unsigned int frame_number() const = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace libvpx_test
|
||||||
|
|
||||||
|
#endif // TEST_VIDEO_SOURCE_H_
|
||||||
15
third_party/googletest/README.webm
vendored
Normal file
15
third_party/googletest/README.webm
vendored
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
URL: http://code.google.com/p/googletest/
|
||||||
|
Version: 1.6.0
|
||||||
|
License: BSD
|
||||||
|
License File: COPYING
|
||||||
|
|
||||||
|
Description:
|
||||||
|
Google's framework for writing C++ tests on a variety of platforms
|
||||||
|
(Linux, Mac OS X, Windows, Windows CE, Symbian, etc). Based on the
|
||||||
|
xUnit architecture. Supports automatic test discovery, a rich set of
|
||||||
|
assertions, user-defined assertions, death tests, fatal and non-fatal
|
||||||
|
failures, various options for running the tests, and XML test report
|
||||||
|
generation.
|
||||||
|
|
||||||
|
Local Modifications:
|
||||||
|
None.
|
||||||
1
third_party/googletest/gtest.mk
vendored
Normal file
1
third_party/googletest/gtest.mk
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
GTEST_SRCS-yes += src/gtest-all.cc
|
||||||
130
third_party/googletest/src/CHANGES
vendored
Normal file
130
third_party/googletest/src/CHANGES
vendored
Normal file
@@ -0,0 +1,130 @@
|
|||||||
|
Changes for 1.6.0:
|
||||||
|
|
||||||
|
* New feature: ADD_FAILURE_AT() for reporting a test failure at the
|
||||||
|
given source location -- useful for writing testing utilities.
|
||||||
|
* New feature: the universal value printer is moved from Google Mock
|
||||||
|
to Google Test.
|
||||||
|
* New feature: type parameters and value parameters are reported in
|
||||||
|
the XML report now.
|
||||||
|
* A gtest_disable_pthreads CMake option.
|
||||||
|
* Colored output works in GNU Screen sessions now.
|
||||||
|
* Parameters of value-parameterized tests are now printed in the
|
||||||
|
textual output.
|
||||||
|
* Failures from ad hoc test assertions run before RUN_ALL_TESTS() are
|
||||||
|
now correctly reported.
|
||||||
|
* Arguments of ASSERT_XY and EXPECT_XY no longer need to support << to
|
||||||
|
ostream.
|
||||||
|
* More complete handling of exceptions.
|
||||||
|
* GTEST_ASSERT_XY can be used instead of ASSERT_XY in case the latter
|
||||||
|
name is already used by another library.
|
||||||
|
* --gtest_catch_exceptions is now true by default, allowing a test
|
||||||
|
program to continue after an exception is thrown.
|
||||||
|
* Value-parameterized test fixtures can now derive from Test and
|
||||||
|
WithParamInterface<T> separately, easing conversion of legacy tests.
|
||||||
|
* Death test messages are clearly marked to make them more
|
||||||
|
distinguishable from other messages.
|
||||||
|
* Compatibility fixes for Android, Google Native Client, MinGW, HP UX,
|
||||||
|
PowerPC, Lucid autotools, libCStd, Sun C++, Borland C++ Builder (Code Gear),
|
||||||
|
IBM XL C++ (Visual Age C++), and C++0x.
|
||||||
|
* Bug fixes and implementation clean-ups.
|
||||||
|
* Potentially incompatible changes: disables the harmful 'make install'
|
||||||
|
command in autotools.
|
||||||
|
|
||||||
|
Changes for 1.5.0:
|
||||||
|
|
||||||
|
* New feature: assertions can be safely called in multiple threads
|
||||||
|
where the pthreads library is available.
|
||||||
|
* New feature: predicates used inside EXPECT_TRUE() and friends
|
||||||
|
can now generate custom failure messages.
|
||||||
|
* New feature: Google Test can now be compiled as a DLL.
|
||||||
|
* New feature: fused source files are included.
|
||||||
|
* New feature: prints help when encountering unrecognized Google Test flags.
|
||||||
|
* Experimental feature: CMake build script (requires CMake 2.6.4+).
|
||||||
|
* Experimental feature: the Pump script for meta programming.
|
||||||
|
* double values streamed to an assertion are printed with enough precision
|
||||||
|
to differentiate any two different values.
|
||||||
|
* Google Test now works on Solaris and AIX.
|
||||||
|
* Build and test script improvements.
|
||||||
|
* Bug fixes and implementation clean-ups.
|
||||||
|
|
||||||
|
Potentially breaking changes:
|
||||||
|
|
||||||
|
* Stopped supporting VC++ 7.1 with exceptions disabled.
|
||||||
|
* Dropped support for 'make install'.
|
||||||
|
|
||||||
|
Changes for 1.4.0:
|
||||||
|
|
||||||
|
* New feature: the event listener API
|
||||||
|
* New feature: test shuffling
|
||||||
|
* New feature: the XML report format is closer to junitreport and can
|
||||||
|
be parsed by Hudson now.
|
||||||
|
* New feature: when a test runs under Visual Studio, its failures are
|
||||||
|
integrated in the IDE.
|
||||||
|
* New feature: /MD(d) versions of VC++ projects.
|
||||||
|
* New feature: elapsed time for the tests is printed by default.
|
||||||
|
* New feature: comes with a TR1 tuple implementation such that Boost
|
||||||
|
is no longer needed for Combine().
|
||||||
|
* New feature: EXPECT_DEATH_IF_SUPPORTED macro and friends.
|
||||||
|
* New feature: the Xcode project can now produce static gtest
|
||||||
|
libraries in addition to a framework.
|
||||||
|
* Compatibility fixes for Solaris, Cygwin, minGW, Windows Mobile,
|
||||||
|
Symbian, gcc, and C++Builder.
|
||||||
|
* Bug fixes and implementation clean-ups.
|
||||||
|
|
||||||
|
Changes for 1.3.0:
|
||||||
|
|
||||||
|
* New feature: death tests on Windows, Cygwin, and Mac.
|
||||||
|
* New feature: ability to use Google Test assertions in other testing
|
||||||
|
frameworks.
|
||||||
|
* New feature: ability to run disabled test via
|
||||||
|
--gtest_also_run_disabled_tests.
|
||||||
|
* New feature: the --help flag for printing the usage.
|
||||||
|
* New feature: access to Google Test flag values in user code.
|
||||||
|
* New feature: a script that packs Google Test into one .h and one
|
||||||
|
.cc file for easy deployment.
|
||||||
|
* New feature: support for distributing test functions to multiple
|
||||||
|
machines (requires support from the test runner).
|
||||||
|
* Bug fixes and implementation clean-ups.
|
||||||
|
|
||||||
|
Changes for 1.2.1:
|
||||||
|
|
||||||
|
* Compatibility fixes for Linux IA-64 and IBM z/OS.
|
||||||
|
* Added support for using Boost and other TR1 implementations.
|
||||||
|
* Changes to the build scripts to support upcoming release of Google C++
|
||||||
|
Mocking Framework.
|
||||||
|
* Added Makefile to the distribution package.
|
||||||
|
* Improved build instructions in README.
|
||||||
|
|
||||||
|
Changes for 1.2.0:
|
||||||
|
|
||||||
|
* New feature: value-parameterized tests.
|
||||||
|
* New feature: the ASSERT/EXPECT_(NON)FATAL_FAILURE(_ON_ALL_THREADS)
|
||||||
|
macros.
|
||||||
|
* Changed the XML report format to match JUnit/Ant's.
|
||||||
|
* Added tests to the Xcode project.
|
||||||
|
* Added scons/SConscript for building with SCons.
|
||||||
|
* Added src/gtest-all.cc for building Google Test from a single file.
|
||||||
|
* Fixed compatibility with Solaris and z/OS.
|
||||||
|
* Enabled running Python tests on systems with python 2.3 installed,
|
||||||
|
e.g. Mac OS X 10.4.
|
||||||
|
* Bug fixes.
|
||||||
|
|
||||||
|
Changes for 1.1.0:
|
||||||
|
|
||||||
|
* New feature: type-parameterized tests.
|
||||||
|
* New feature: exception assertions.
|
||||||
|
* New feature: printing elapsed time of tests.
|
||||||
|
* Improved the robustness of death tests.
|
||||||
|
* Added an Xcode project and samples.
|
||||||
|
* Adjusted the output format on Windows to be understandable by Visual Studio.
|
||||||
|
* Minor bug fixes.
|
||||||
|
|
||||||
|
Changes for 1.0.1:
|
||||||
|
|
||||||
|
* Added project files for Visual Studio 7.1.
|
||||||
|
* Fixed issues with compiling on Mac OS X.
|
||||||
|
* Fixed issues with compiling on Cygwin.
|
||||||
|
|
||||||
|
Changes for 1.0.0:
|
||||||
|
|
||||||
|
* Initial Open Source release of Google Test
|
||||||
240
third_party/googletest/src/CMakeLists.txt
vendored
Normal file
240
third_party/googletest/src/CMakeLists.txt
vendored
Normal file
@@ -0,0 +1,240 @@
|
|||||||
|
########################################################################
|
||||||
|
# CMake build script for Google Test.
|
||||||
|
#
|
||||||
|
# To run the tests for Google Test itself on Linux, use 'make test' or
|
||||||
|
# ctest. You can select which tests to run using 'ctest -R regex'.
|
||||||
|
# For more options, run 'ctest --help'.
|
||||||
|
|
||||||
|
# BUILD_SHARED_LIBS is a standard CMake variable, but we declare it here to
|
||||||
|
# make it prominent in the GUI.
|
||||||
|
option(BUILD_SHARED_LIBS "Build shared libraries (DLLs)." OFF)
|
||||||
|
|
||||||
|
# When other libraries are using a shared version of runtime libraries,
|
||||||
|
# Google Test also has to use one.
|
||||||
|
option(
|
||||||
|
gtest_force_shared_crt
|
||||||
|
"Use shared (DLL) run-time lib even when Google Test is built as static lib."
|
||||||
|
OFF)
|
||||||
|
|
||||||
|
option(gtest_build_tests "Build all of gtest's own tests." OFF)
|
||||||
|
|
||||||
|
option(gtest_build_samples "Build gtest's sample programs." OFF)
|
||||||
|
|
||||||
|
option(gtest_disable_pthreads "Disable uses of pthreads in gtest." OFF)
|
||||||
|
|
||||||
|
# Defines pre_project_set_up_hermetic_build() and set_up_hermetic_build().
|
||||||
|
include(cmake/hermetic_build.cmake OPTIONAL)
|
||||||
|
|
||||||
|
if (COMMAND pre_project_set_up_hermetic_build)
|
||||||
|
pre_project_set_up_hermetic_build()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
#
|
||||||
|
# Project-wide settings
|
||||||
|
|
||||||
|
# Name of the project.
|
||||||
|
#
|
||||||
|
# CMake files in this project can refer to the root source directory
|
||||||
|
# as ${gtest_SOURCE_DIR} and to the root binary directory as
|
||||||
|
# ${gtest_BINARY_DIR}.
|
||||||
|
# Language "C" is required for find_package(Threads).
|
||||||
|
project(gtest CXX C)
|
||||||
|
cmake_minimum_required(VERSION 2.6.2)
|
||||||
|
|
||||||
|
if (COMMAND set_up_hermetic_build)
|
||||||
|
set_up_hermetic_build()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Define helper functions and macros used by Google Test.
|
||||||
|
include(cmake/internal_utils.cmake)
|
||||||
|
|
||||||
|
config_compiler_and_linker() # Defined in internal_utils.cmake.
|
||||||
|
|
||||||
|
# Where Google Test's .h files can be found.
|
||||||
|
include_directories(
|
||||||
|
${gtest_SOURCE_DIR}/include
|
||||||
|
${gtest_SOURCE_DIR})
|
||||||
|
|
||||||
|
# Where Google Test's libraries can be found.
|
||||||
|
link_directories(${gtest_BINARY_DIR}/src)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
#
|
||||||
|
# Defines the gtest & gtest_main libraries. User tests should link
|
||||||
|
# with one of them.
|
||||||
|
|
||||||
|
# Google Test libraries. We build them using more strict warnings than what
|
||||||
|
# are used for other targets, to ensure that gtest can be compiled by a user
|
||||||
|
# aggressive about warnings.
|
||||||
|
cxx_library(gtest "${cxx_strict}" src/gtest-all.cc)
|
||||||
|
cxx_library(gtest_main "${cxx_strict}" src/gtest_main.cc)
|
||||||
|
target_link_libraries(gtest_main gtest)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
#
|
||||||
|
# Samples on how to link user tests with gtest or gtest_main.
|
||||||
|
#
|
||||||
|
# They are not built by default. To build them, set the
|
||||||
|
# gtest_build_samples option to ON. You can do it by running ccmake
|
||||||
|
# or specifying the -Dbuild_gtest_samples=ON flag when running cmake.
|
||||||
|
|
||||||
|
if (gtest_build_samples)
|
||||||
|
cxx_executable(sample1_unittest samples gtest_main samples/sample1.cc)
|
||||||
|
cxx_executable(sample2_unittest samples gtest_main samples/sample2.cc)
|
||||||
|
cxx_executable(sample3_unittest samples gtest_main)
|
||||||
|
cxx_executable(sample4_unittest samples gtest_main samples/sample4.cc)
|
||||||
|
cxx_executable(sample5_unittest samples gtest_main samples/sample1.cc)
|
||||||
|
cxx_executable(sample6_unittest samples gtest_main)
|
||||||
|
cxx_executable(sample7_unittest samples gtest_main)
|
||||||
|
cxx_executable(sample8_unittest samples gtest_main)
|
||||||
|
cxx_executable(sample9_unittest samples gtest)
|
||||||
|
cxx_executable(sample10_unittest samples gtest)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
#
|
||||||
|
# Google Test's own tests.
|
||||||
|
#
|
||||||
|
# You can skip this section if you aren't interested in testing
|
||||||
|
# Google Test itself.
|
||||||
|
#
|
||||||
|
# The tests are not built by default. To build them, set the
|
||||||
|
# gtest_build_tests option to ON. You can do it by running ccmake
|
||||||
|
# or specifying the -Dgtest_build_tests=ON flag when running cmake.
|
||||||
|
|
||||||
|
if (gtest_build_tests)
|
||||||
|
# This must be set in the root directory for the tests to be run by
|
||||||
|
# 'make test' or ctest.
|
||||||
|
enable_testing()
|
||||||
|
|
||||||
|
############################################################
|
||||||
|
# C++ tests built with standard compiler flags.
|
||||||
|
|
||||||
|
cxx_test(gtest-death-test_test gtest_main)
|
||||||
|
cxx_test(gtest_environment_test gtest)
|
||||||
|
cxx_test(gtest-filepath_test gtest_main)
|
||||||
|
cxx_test(gtest-linked_ptr_test gtest_main)
|
||||||
|
cxx_test(gtest-listener_test gtest_main)
|
||||||
|
cxx_test(gtest_main_unittest gtest_main)
|
||||||
|
cxx_test(gtest-message_test gtest_main)
|
||||||
|
cxx_test(gtest_no_test_unittest gtest)
|
||||||
|
cxx_test(gtest-options_test gtest_main)
|
||||||
|
cxx_test(gtest-param-test_test gtest
|
||||||
|
test/gtest-param-test2_test.cc)
|
||||||
|
cxx_test(gtest-port_test gtest_main)
|
||||||
|
cxx_test(gtest_pred_impl_unittest gtest_main)
|
||||||
|
cxx_test(gtest-printers_test gtest_main)
|
||||||
|
cxx_test(gtest_prod_test gtest_main
|
||||||
|
test/production.cc)
|
||||||
|
cxx_test(gtest_repeat_test gtest)
|
||||||
|
cxx_test(gtest_sole_header_test gtest_main)
|
||||||
|
cxx_test(gtest_stress_test gtest)
|
||||||
|
cxx_test(gtest-test-part_test gtest_main)
|
||||||
|
cxx_test(gtest_throw_on_failure_ex_test gtest)
|
||||||
|
cxx_test(gtest-typed-test_test gtest_main
|
||||||
|
test/gtest-typed-test2_test.cc)
|
||||||
|
cxx_test(gtest_unittest gtest_main)
|
||||||
|
cxx_test(gtest-unittest-api_test gtest)
|
||||||
|
|
||||||
|
############################################################
|
||||||
|
# C++ tests built with non-standard compiler flags.
|
||||||
|
|
||||||
|
cxx_library(gtest_no_exception "${cxx_no_exception}"
|
||||||
|
src/gtest-all.cc)
|
||||||
|
cxx_library(gtest_main_no_exception "${cxx_no_exception}"
|
||||||
|
src/gtest-all.cc src/gtest_main.cc)
|
||||||
|
cxx_library(gtest_main_no_rtti "${cxx_no_rtti}"
|
||||||
|
src/gtest-all.cc src/gtest_main.cc)
|
||||||
|
|
||||||
|
cxx_test_with_flags(gtest-death-test_ex_nocatch_test
|
||||||
|
"${cxx_exception} -DGTEST_ENABLE_CATCH_EXCEPTIONS_=0"
|
||||||
|
gtest test/gtest-death-test_ex_test.cc)
|
||||||
|
cxx_test_with_flags(gtest-death-test_ex_catch_test
|
||||||
|
"${cxx_exception} -DGTEST_ENABLE_CATCH_EXCEPTIONS_=1"
|
||||||
|
gtest test/gtest-death-test_ex_test.cc)
|
||||||
|
|
||||||
|
cxx_test_with_flags(gtest_no_rtti_unittest "${cxx_no_rtti}"
|
||||||
|
gtest_main_no_rtti test/gtest_unittest.cc)
|
||||||
|
|
||||||
|
cxx_shared_library(gtest_dll "${cxx_default}"
|
||||||
|
src/gtest-all.cc src/gtest_main.cc)
|
||||||
|
|
||||||
|
cxx_executable_with_flags(gtest_dll_test_ "${cxx_default}"
|
||||||
|
gtest_dll test/gtest_all_test.cc)
|
||||||
|
set_target_properties(gtest_dll_test_
|
||||||
|
PROPERTIES
|
||||||
|
COMPILE_DEFINITIONS "GTEST_LINKED_AS_SHARED_LIBRARY=1")
|
||||||
|
|
||||||
|
if (NOT MSVC OR NOT MSVC_VERSION EQUAL 1600)
|
||||||
|
# The C++ Standard specifies tuple_element<int, class>.
|
||||||
|
# Yet MSVC 10's <utility> declares tuple_element<size_t, class>.
|
||||||
|
# That declaration conflicts with our own standard-conforming
|
||||||
|
# tuple implementation. Therefore using our own tuple with
|
||||||
|
# MSVC 10 doesn't compile.
|
||||||
|
cxx_library(gtest_main_use_own_tuple "${cxx_use_own_tuple}"
|
||||||
|
src/gtest-all.cc src/gtest_main.cc)
|
||||||
|
|
||||||
|
cxx_test_with_flags(gtest-tuple_test "${cxx_use_own_tuple}"
|
||||||
|
gtest_main_use_own_tuple test/gtest-tuple_test.cc)
|
||||||
|
|
||||||
|
cxx_test_with_flags(gtest_use_own_tuple_test "${cxx_use_own_tuple}"
|
||||||
|
gtest_main_use_own_tuple
|
||||||
|
test/gtest-param-test_test.cc test/gtest-param-test2_test.cc)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
############################################################
|
||||||
|
# Python tests.
|
||||||
|
|
||||||
|
cxx_executable(gtest_break_on_failure_unittest_ test gtest)
|
||||||
|
py_test(gtest_break_on_failure_unittest)
|
||||||
|
|
||||||
|
cxx_executable_with_flags(
|
||||||
|
gtest_catch_exceptions_no_ex_test_
|
||||||
|
"${cxx_no_exception}"
|
||||||
|
gtest_main_no_exception
|
||||||
|
test/gtest_catch_exceptions_test_.cc)
|
||||||
|
cxx_executable_with_flags(
|
||||||
|
gtest_catch_exceptions_ex_test_
|
||||||
|
"${cxx_exception}"
|
||||||
|
gtest_main
|
||||||
|
test/gtest_catch_exceptions_test_.cc)
|
||||||
|
py_test(gtest_catch_exceptions_test)
|
||||||
|
|
||||||
|
cxx_executable(gtest_color_test_ test gtest)
|
||||||
|
py_test(gtest_color_test)
|
||||||
|
|
||||||
|
cxx_executable(gtest_env_var_test_ test gtest)
|
||||||
|
py_test(gtest_env_var_test)
|
||||||
|
|
||||||
|
cxx_executable(gtest_filter_unittest_ test gtest)
|
||||||
|
py_test(gtest_filter_unittest)
|
||||||
|
|
||||||
|
cxx_executable(gtest_help_test_ test gtest_main)
|
||||||
|
py_test(gtest_help_test)
|
||||||
|
|
||||||
|
cxx_executable(gtest_list_tests_unittest_ test gtest)
|
||||||
|
py_test(gtest_list_tests_unittest)
|
||||||
|
|
||||||
|
cxx_executable(gtest_output_test_ test gtest)
|
||||||
|
py_test(gtest_output_test)
|
||||||
|
|
||||||
|
cxx_executable(gtest_shuffle_test_ test gtest)
|
||||||
|
py_test(gtest_shuffle_test)
|
||||||
|
|
||||||
|
cxx_executable(gtest_throw_on_failure_test_ test gtest_no_exception)
|
||||||
|
set_target_properties(gtest_throw_on_failure_test_
|
||||||
|
PROPERTIES
|
||||||
|
COMPILE_FLAGS "${cxx_no_exception}")
|
||||||
|
py_test(gtest_throw_on_failure_test)
|
||||||
|
|
||||||
|
cxx_executable(gtest_uninitialized_test_ test gtest)
|
||||||
|
py_test(gtest_uninitialized_test)
|
||||||
|
|
||||||
|
cxx_executable(gtest_xml_outfile1_test_ test gtest_main)
|
||||||
|
cxx_executable(gtest_xml_outfile2_test_ test gtest_main)
|
||||||
|
py_test(gtest_xml_outfiles_test)
|
||||||
|
|
||||||
|
cxx_executable(gtest_xml_output_unittest_ test gtest)
|
||||||
|
py_test(gtest_xml_output_unittest)
|
||||||
|
endif()
|
||||||
37
third_party/googletest/src/CONTRIBUTORS
vendored
Normal file
37
third_party/googletest/src/CONTRIBUTORS
vendored
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
# This file contains a list of people who've made non-trivial
|
||||||
|
# contribution to the Google C++ Testing Framework project. People
|
||||||
|
# who commit code to the project are encouraged to add their names
|
||||||
|
# here. Please keep the list sorted by first names.
|
||||||
|
|
||||||
|
Ajay Joshi <jaj@google.com>
|
||||||
|
Balázs Dán <balazs.dan@gmail.com>
|
||||||
|
Bharat Mediratta <bharat@menalto.com>
|
||||||
|
Chandler Carruth <chandlerc@google.com>
|
||||||
|
Chris Prince <cprince@google.com>
|
||||||
|
Chris Taylor <taylorc@google.com>
|
||||||
|
Dan Egnor <egnor@google.com>
|
||||||
|
Eric Roman <eroman@chromium.org>
|
||||||
|
Hady Zalek <hady.zalek@gmail.com>
|
||||||
|
Jeffrey Yasskin <jyasskin@google.com>
|
||||||
|
Jói Sigurðsson <joi@google.com>
|
||||||
|
Keir Mierle <mierle@gmail.com>
|
||||||
|
Keith Ray <keith.ray@gmail.com>
|
||||||
|
Kenton Varda <kenton@google.com>
|
||||||
|
Manuel Klimek <klimek@google.com>
|
||||||
|
Markus Heule <markus.heule@gmail.com>
|
||||||
|
Mika Raento <mikie@iki.fi>
|
||||||
|
Miklós Fazekas <mfazekas@szemafor.com>
|
||||||
|
Pasi Valminen <pasi.valminen@gmail.com>
|
||||||
|
Patrick Hanna <phanna@google.com>
|
||||||
|
Patrick Riley <pfr@google.com>
|
||||||
|
Peter Kaminski <piotrk@google.com>
|
||||||
|
Preston Jackson <preston.a.jackson@gmail.com>
|
||||||
|
Rainer Klaffenboeck <rainer.klaffenboeck@dynatrace.com>
|
||||||
|
Russ Cox <rsc@google.com>
|
||||||
|
Russ Rufer <russ@pentad.com>
|
||||||
|
Sean Mcafee <eefacm@gmail.com>
|
||||||
|
Sigurður Ásgeirsson <siggi@google.com>
|
||||||
|
Tracy Bialik <tracy@pentad.com>
|
||||||
|
Vadim Berman <vadimb@google.com>
|
||||||
|
Vlad Losev <vladl@google.com>
|
||||||
|
Zhanyong Wan <wan@google.com>
|
||||||
28
third_party/googletest/src/COPYING
vendored
Normal file
28
third_party/googletest/src/COPYING
vendored
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
Copyright 2008, Google Inc.
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are
|
||||||
|
met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above
|
||||||
|
copyright notice, this list of conditions and the following disclaimer
|
||||||
|
in the documentation and/or other materials provided with the
|
||||||
|
distribution.
|
||||||
|
* Neither the name of Google Inc. nor the names of its
|
||||||
|
contributors may be used to endorse or promote products derived from
|
||||||
|
this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
302
third_party/googletest/src/Makefile.am
vendored
Normal file
302
third_party/googletest/src/Makefile.am
vendored
Normal file
@@ -0,0 +1,302 @@
|
|||||||
|
# Automake file
|
||||||
|
|
||||||
|
ACLOCAL_AMFLAGS = -I m4
|
||||||
|
|
||||||
|
# Nonstandard package files for distribution
|
||||||
|
EXTRA_DIST = \
|
||||||
|
CHANGES \
|
||||||
|
CONTRIBUTORS \
|
||||||
|
include/gtest/gtest-param-test.h.pump \
|
||||||
|
include/gtest/internal/gtest-param-util-generated.h.pump \
|
||||||
|
include/gtest/internal/gtest-tuple.h.pump \
|
||||||
|
include/gtest/internal/gtest-type-util.h.pump \
|
||||||
|
make/Makefile \
|
||||||
|
scripts/fuse_gtest_files.py \
|
||||||
|
scripts/gen_gtest_pred_impl.py \
|
||||||
|
scripts/pump.py \
|
||||||
|
scripts/test/Makefile
|
||||||
|
|
||||||
|
# gtest source files that we don't compile directly. They are
|
||||||
|
# #included by gtest-all.cc.
|
||||||
|
GTEST_SRC = \
|
||||||
|
src/gtest-death-test.cc \
|
||||||
|
src/gtest-filepath.cc \
|
||||||
|
src/gtest-internal-inl.h \
|
||||||
|
src/gtest-port.cc \
|
||||||
|
src/gtest-printers.cc \
|
||||||
|
src/gtest-test-part.cc \
|
||||||
|
src/gtest-typed-test.cc \
|
||||||
|
src/gtest.cc
|
||||||
|
|
||||||
|
EXTRA_DIST += $(GTEST_SRC)
|
||||||
|
|
||||||
|
# Sample files that we don't compile.
|
||||||
|
EXTRA_DIST += \
|
||||||
|
samples/prime_tables.h \
|
||||||
|
samples/sample2_unittest.cc \
|
||||||
|
samples/sample3_unittest.cc \
|
||||||
|
samples/sample4_unittest.cc \
|
||||||
|
samples/sample5_unittest.cc \
|
||||||
|
samples/sample6_unittest.cc \
|
||||||
|
samples/sample7_unittest.cc \
|
||||||
|
samples/sample8_unittest.cc \
|
||||||
|
samples/sample9_unittest.cc
|
||||||
|
|
||||||
|
# C++ test files that we don't compile directly.
|
||||||
|
EXTRA_DIST += \
|
||||||
|
test/gtest-death-test_ex_test.cc \
|
||||||
|
test/gtest-death-test_test.cc \
|
||||||
|
test/gtest-filepath_test.cc \
|
||||||
|
test/gtest-linked_ptr_test.cc \
|
||||||
|
test/gtest-listener_test.cc \
|
||||||
|
test/gtest-message_test.cc \
|
||||||
|
test/gtest-options_test.cc \
|
||||||
|
test/gtest-param-test2_test.cc \
|
||||||
|
test/gtest-param-test2_test.cc \
|
||||||
|
test/gtest-param-test_test.cc \
|
||||||
|
test/gtest-param-test_test.cc \
|
||||||
|
test/gtest-param-test_test.h \
|
||||||
|
test/gtest-port_test.cc \
|
||||||
|
test/gtest-printers_test.cc \
|
||||||
|
test/gtest-test-part_test.cc \
|
||||||
|
test/gtest-tuple_test.cc \
|
||||||
|
test/gtest-typed-test2_test.cc \
|
||||||
|
test/gtest-typed-test_test.cc \
|
||||||
|
test/gtest-typed-test_test.h \
|
||||||
|
test/gtest-unittest-api_test.cc \
|
||||||
|
test/gtest_break_on_failure_unittest_.cc \
|
||||||
|
test/gtest_catch_exceptions_test_.cc \
|
||||||
|
test/gtest_color_test_.cc \
|
||||||
|
test/gtest_env_var_test_.cc \
|
||||||
|
test/gtest_environment_test.cc \
|
||||||
|
test/gtest_filter_unittest_.cc \
|
||||||
|
test/gtest_help_test_.cc \
|
||||||
|
test/gtest_list_tests_unittest_.cc \
|
||||||
|
test/gtest_main_unittest.cc \
|
||||||
|
test/gtest_no_test_unittest.cc \
|
||||||
|
test/gtest_output_test_.cc \
|
||||||
|
test/gtest_pred_impl_unittest.cc \
|
||||||
|
test/gtest_prod_test.cc \
|
||||||
|
test/gtest_repeat_test.cc \
|
||||||
|
test/gtest_shuffle_test_.cc \
|
||||||
|
test/gtest_sole_header_test.cc \
|
||||||
|
test/gtest_stress_test.cc \
|
||||||
|
test/gtest_throw_on_failure_ex_test.cc \
|
||||||
|
test/gtest_throw_on_failure_test_.cc \
|
||||||
|
test/gtest_uninitialized_test_.cc \
|
||||||
|
test/gtest_unittest.cc \
|
||||||
|
test/gtest_unittest.cc \
|
||||||
|
test/gtest_xml_outfile1_test_.cc \
|
||||||
|
test/gtest_xml_outfile2_test_.cc \
|
||||||
|
test/gtest_xml_output_unittest_.cc \
|
||||||
|
test/production.cc \
|
||||||
|
test/production.h
|
||||||
|
|
||||||
|
# Python tests that we don't run.
|
||||||
|
EXTRA_DIST += \
|
||||||
|
test/gtest_break_on_failure_unittest.py \
|
||||||
|
test/gtest_catch_exceptions_test.py \
|
||||||
|
test/gtest_color_test.py \
|
||||||
|
test/gtest_env_var_test.py \
|
||||||
|
test/gtest_filter_unittest.py \
|
||||||
|
test/gtest_help_test.py \
|
||||||
|
test/gtest_list_tests_unittest.py \
|
||||||
|
test/gtest_output_test.py \
|
||||||
|
test/gtest_output_test_golden_lin.txt \
|
||||||
|
test/gtest_shuffle_test.py \
|
||||||
|
test/gtest_test_utils.py \
|
||||||
|
test/gtest_throw_on_failure_test.py \
|
||||||
|
test/gtest_uninitialized_test.py \
|
||||||
|
test/gtest_xml_outfiles_test.py \
|
||||||
|
test/gtest_xml_output_unittest.py \
|
||||||
|
test/gtest_xml_test_utils.py
|
||||||
|
|
||||||
|
# CMake script
|
||||||
|
EXTRA_DIST += \
|
||||||
|
CMakeLists.txt \
|
||||||
|
cmake/internal_utils.cmake
|
||||||
|
|
||||||
|
# MSVC project files
|
||||||
|
EXTRA_DIST += \
|
||||||
|
msvc/gtest-md.sln \
|
||||||
|
msvc/gtest-md.vcproj \
|
||||||
|
msvc/gtest.sln \
|
||||||
|
msvc/gtest.vcproj \
|
||||||
|
msvc/gtest_main-md.vcproj \
|
||||||
|
msvc/gtest_main.vcproj \
|
||||||
|
msvc/gtest_prod_test-md.vcproj \
|
||||||
|
msvc/gtest_prod_test.vcproj \
|
||||||
|
msvc/gtest_unittest-md.vcproj \
|
||||||
|
msvc/gtest_unittest.vcproj
|
||||||
|
|
||||||
|
# xcode project files
|
||||||
|
EXTRA_DIST += \
|
||||||
|
xcode/Config/DebugProject.xcconfig \
|
||||||
|
xcode/Config/FrameworkTarget.xcconfig \
|
||||||
|
xcode/Config/General.xcconfig \
|
||||||
|
xcode/Config/ReleaseProject.xcconfig \
|
||||||
|
xcode/Config/StaticLibraryTarget.xcconfig \
|
||||||
|
xcode/Config/TestTarget.xcconfig \
|
||||||
|
xcode/Resources/Info.plist \
|
||||||
|
xcode/Scripts/runtests.sh \
|
||||||
|
xcode/Scripts/versiongenerate.py \
|
||||||
|
xcode/gtest.xcodeproj/project.pbxproj
|
||||||
|
|
||||||
|
# xcode sample files
|
||||||
|
EXTRA_DIST += \
|
||||||
|
xcode/Samples/FrameworkSample/Info.plist \
|
||||||
|
xcode/Samples/FrameworkSample/WidgetFramework.xcodeproj/project.pbxproj \
|
||||||
|
xcode/Samples/FrameworkSample/runtests.sh \
|
||||||
|
xcode/Samples/FrameworkSample/widget.cc \
|
||||||
|
xcode/Samples/FrameworkSample/widget.h \
|
||||||
|
xcode/Samples/FrameworkSample/widget_test.cc
|
||||||
|
|
||||||
|
# C++Builder project files
|
||||||
|
EXTRA_DIST += \
|
||||||
|
codegear/gtest.cbproj \
|
||||||
|
codegear/gtest.groupproj \
|
||||||
|
codegear/gtest_all.cc \
|
||||||
|
codegear/gtest_link.cc \
|
||||||
|
codegear/gtest_main.cbproj \
|
||||||
|
codegear/gtest_unittest.cbproj
|
||||||
|
|
||||||
|
# Distribute and install M4 macro
|
||||||
|
m4datadir = $(datadir)/aclocal
|
||||||
|
m4data_DATA = m4/gtest.m4
|
||||||
|
EXTRA_DIST += $(m4data_DATA)
|
||||||
|
|
||||||
|
# We define the global AM_CPPFLAGS as everything we compile includes from these
|
||||||
|
# directories.
|
||||||
|
AM_CPPFLAGS = -I$(srcdir) -I$(srcdir)/include
|
||||||
|
|
||||||
|
# Modifies compiler and linker flags for pthreads compatibility.
|
||||||
|
if HAVE_PTHREADS
|
||||||
|
AM_CXXFLAGS = @PTHREAD_CFLAGS@ -DGTEST_HAS_PTHREAD=1
|
||||||
|
AM_LIBS = @PTHREAD_LIBS@
|
||||||
|
else
|
||||||
|
AM_CXXFLAGS = -DGTEST_HAS_PTHREAD=0
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Build rules for libraries.
|
||||||
|
lib_LTLIBRARIES = lib/libgtest.la lib/libgtest_main.la
|
||||||
|
|
||||||
|
lib_libgtest_la_SOURCES = src/gtest-all.cc
|
||||||
|
|
||||||
|
pkginclude_HEADERS = \
|
||||||
|
include/gtest/gtest-death-test.h \
|
||||||
|
include/gtest/gtest-message.h \
|
||||||
|
include/gtest/gtest-param-test.h \
|
||||||
|
include/gtest/gtest-printers.h \
|
||||||
|
include/gtest/gtest-spi.h \
|
||||||
|
include/gtest/gtest-test-part.h \
|
||||||
|
include/gtest/gtest-typed-test.h \
|
||||||
|
include/gtest/gtest.h \
|
||||||
|
include/gtest/gtest_pred_impl.h \
|
||||||
|
include/gtest/gtest_prod.h
|
||||||
|
|
||||||
|
pkginclude_internaldir = $(pkgincludedir)/internal
|
||||||
|
pkginclude_internal_HEADERS = \
|
||||||
|
include/gtest/internal/gtest-death-test-internal.h \
|
||||||
|
include/gtest/internal/gtest-filepath.h \
|
||||||
|
include/gtest/internal/gtest-internal.h \
|
||||||
|
include/gtest/internal/gtest-linked_ptr.h \
|
||||||
|
include/gtest/internal/gtest-param-util-generated.h \
|
||||||
|
include/gtest/internal/gtest-param-util.h \
|
||||||
|
include/gtest/internal/gtest-port.h \
|
||||||
|
include/gtest/internal/gtest-string.h \
|
||||||
|
include/gtest/internal/gtest-tuple.h \
|
||||||
|
include/gtest/internal/gtest-type-util.h
|
||||||
|
|
||||||
|
lib_libgtest_main_la_SOURCES = src/gtest_main.cc
|
||||||
|
lib_libgtest_main_la_LIBADD = lib/libgtest.la
|
||||||
|
|
||||||
|
# Bulid rules for samples and tests. Automake's naming for some of
|
||||||
|
# these variables isn't terribly obvious, so this is a brief
|
||||||
|
# reference:
|
||||||
|
#
|
||||||
|
# TESTS -- Programs run automatically by "make check"
|
||||||
|
# check_PROGRAMS -- Programs built by "make check" but not necessarily run
|
||||||
|
|
||||||
|
noinst_LTLIBRARIES = samples/libsamples.la
|
||||||
|
|
||||||
|
samples_libsamples_la_SOURCES = \
|
||||||
|
samples/sample1.cc \
|
||||||
|
samples/sample1.h \
|
||||||
|
samples/sample2.cc \
|
||||||
|
samples/sample2.h \
|
||||||
|
samples/sample3-inl.h \
|
||||||
|
samples/sample4.cc \
|
||||||
|
samples/sample4.h
|
||||||
|
|
||||||
|
TESTS=
|
||||||
|
TESTS_ENVIRONMENT = GTEST_SOURCE_DIR="$(srcdir)/test" \
|
||||||
|
GTEST_BUILD_DIR="$(top_builddir)/test"
|
||||||
|
check_PROGRAMS=
|
||||||
|
|
||||||
|
# A simple sample on using gtest.
|
||||||
|
TESTS += samples/sample1_unittest
|
||||||
|
check_PROGRAMS += samples/sample1_unittest
|
||||||
|
samples_sample1_unittest_SOURCES = samples/sample1_unittest.cc
|
||||||
|
samples_sample1_unittest_LDADD = lib/libgtest_main.la \
|
||||||
|
lib/libgtest.la \
|
||||||
|
samples/libsamples.la
|
||||||
|
|
||||||
|
# Another sample. It also verifies that libgtest works.
|
||||||
|
TESTS += samples/sample10_unittest
|
||||||
|
check_PROGRAMS += samples/sample10_unittest
|
||||||
|
samples_sample10_unittest_SOURCES = samples/sample10_unittest.cc
|
||||||
|
samples_sample10_unittest_LDADD = lib/libgtest.la
|
||||||
|
|
||||||
|
# This tests most constructs of gtest and verifies that libgtest_main
|
||||||
|
# and libgtest work.
|
||||||
|
TESTS += test/gtest_all_test
|
||||||
|
check_PROGRAMS += test/gtest_all_test
|
||||||
|
test_gtest_all_test_SOURCES = test/gtest_all_test.cc
|
||||||
|
test_gtest_all_test_LDADD = lib/libgtest_main.la \
|
||||||
|
lib/libgtest.la
|
||||||
|
|
||||||
|
# Tests that fused gtest files compile and work.
|
||||||
|
FUSED_GTEST_SRC = \
|
||||||
|
fused-src/gtest/gtest-all.cc \
|
||||||
|
fused-src/gtest/gtest.h \
|
||||||
|
fused-src/gtest/gtest_main.cc
|
||||||
|
|
||||||
|
TESTS += test/fused_gtest_test
|
||||||
|
check_PROGRAMS += test/fused_gtest_test
|
||||||
|
test_fused_gtest_test_SOURCES = $(FUSED_GTEST_SRC) \
|
||||||
|
samples/sample1.cc samples/sample1_unittest.cc
|
||||||
|
test_fused_gtest_test_CPPFLAGS = -I"$(srcdir)/fused-src"
|
||||||
|
|
||||||
|
# Build rules for putting fused Google Test files into the distribution
|
||||||
|
# package. The user can also create those files by manually running
|
||||||
|
# scripts/fuse_gtest_files.py.
|
||||||
|
$(test_fused_gtest_test_SOURCES): fused-gtest
|
||||||
|
|
||||||
|
fused-gtest: $(pkginclude_HEADERS) $(pkginclude_internal_HEADERS) \
|
||||||
|
$(GTEST_SRC) src/gtest-all.cc src/gtest_main.cc \
|
||||||
|
scripts/fuse_gtest_files.py
|
||||||
|
mkdir -p "$(srcdir)/fused-src"
|
||||||
|
chmod -R u+w "$(srcdir)/fused-src"
|
||||||
|
rm -f "$(srcdir)/fused-src/gtest/gtest-all.cc"
|
||||||
|
rm -f "$(srcdir)/fused-src/gtest/gtest.h"
|
||||||
|
"$(srcdir)/scripts/fuse_gtest_files.py" "$(srcdir)/fused-src"
|
||||||
|
cp -f "$(srcdir)/src/gtest_main.cc" "$(srcdir)/fused-src/gtest/"
|
||||||
|
|
||||||
|
maintainer-clean-local:
|
||||||
|
rm -rf "$(srcdir)/fused-src"
|
||||||
|
|
||||||
|
# Death tests may produce core dumps in the build directory. In case
|
||||||
|
# this happens, clean them to keep distcleancheck happy.
|
||||||
|
CLEANFILES = core
|
||||||
|
|
||||||
|
# Disables 'make install' as installing a compiled version of Google
|
||||||
|
# Test can lead to undefined behavior due to violation of the
|
||||||
|
# One-Definition Rule.
|
||||||
|
|
||||||
|
install-exec-local:
|
||||||
|
echo "'make install' is dangerous and not supported. Instead, see README for how to integrate Google Test into your build system."
|
||||||
|
false
|
||||||
|
|
||||||
|
install-data-local:
|
||||||
|
echo "'make install' is dangerous and not supported. Instead, see README for how to integrate Google Test into your build system."
|
||||||
|
false
|
||||||
424
third_party/googletest/src/README
vendored
Normal file
424
third_party/googletest/src/README
vendored
Normal file
@@ -0,0 +1,424 @@
|
|||||||
|
Google C++ Testing Framework
|
||||||
|
============================
|
||||||
|
|
||||||
|
http://code.google.com/p/googletest/
|
||||||
|
|
||||||
|
Overview
|
||||||
|
--------
|
||||||
|
|
||||||
|
Google's framework for writing C++ tests on a variety of platforms
|
||||||
|
(Linux, Mac OS X, Windows, Windows CE, Symbian, etc). Based on the
|
||||||
|
xUnit architecture. Supports automatic test discovery, a rich set of
|
||||||
|
assertions, user-defined assertions, death tests, fatal and non-fatal
|
||||||
|
failures, various options for running the tests, and XML test report
|
||||||
|
generation.
|
||||||
|
|
||||||
|
Please see the project page above for more information as well as the
|
||||||
|
mailing list for questions, discussions, and development. There is
|
||||||
|
also an IRC channel on OFTC (irc.oftc.net) #gtest available. Please
|
||||||
|
join us!
|
||||||
|
|
||||||
|
Requirements for End Users
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
Google Test is designed to have fairly minimal requirements to build
|
||||||
|
and use with your projects, but there are some. Currently, we support
|
||||||
|
Linux, Windows, Mac OS X, and Cygwin. We will also make our best
|
||||||
|
effort to support other platforms (e.g. Solaris, AIX, and z/OS).
|
||||||
|
However, since core members of the Google Test project have no access
|
||||||
|
to these platforms, Google Test may have outstanding issues there. If
|
||||||
|
you notice any problems on your platform, please notify
|
||||||
|
googletestframework@googlegroups.com. Patches for fixing them are
|
||||||
|
even more welcome!
|
||||||
|
|
||||||
|
### Linux Requirements ###
|
||||||
|
|
||||||
|
These are the base requirements to build and use Google Test from a source
|
||||||
|
package (as described below):
|
||||||
|
* GNU-compatible Make or gmake
|
||||||
|
* POSIX-standard shell
|
||||||
|
* POSIX(-2) Regular Expressions (regex.h)
|
||||||
|
* A C++98-standard-compliant compiler
|
||||||
|
|
||||||
|
### Windows Requirements ###
|
||||||
|
|
||||||
|
* Microsoft Visual C++ 7.1 or newer
|
||||||
|
|
||||||
|
### Cygwin Requirements ###
|
||||||
|
|
||||||
|
* Cygwin 1.5.25-14 or newer
|
||||||
|
|
||||||
|
### Mac OS X Requirements ###
|
||||||
|
|
||||||
|
* Mac OS X 10.4 Tiger or newer
|
||||||
|
* Developer Tools Installed
|
||||||
|
|
||||||
|
Also, you'll need CMake 2.6.4 or higher if you want to build the
|
||||||
|
samples using the provided CMake script, regardless of the platform.
|
||||||
|
|
||||||
|
Requirements for Contributors
|
||||||
|
-----------------------------
|
||||||
|
|
||||||
|
We welcome patches. If you plan to contribute a patch, you need to
|
||||||
|
build Google Test and its own tests from an SVN checkout (described
|
||||||
|
below), which has further requirements:
|
||||||
|
|
||||||
|
* Python version 2.3 or newer (for running some of the tests and
|
||||||
|
re-generating certain source files from templates)
|
||||||
|
* CMake 2.6.4 or newer
|
||||||
|
|
||||||
|
Getting the Source
|
||||||
|
------------------
|
||||||
|
|
||||||
|
There are two primary ways of getting Google Test's source code: you
|
||||||
|
can download a stable source release in your preferred archive format,
|
||||||
|
or directly check out the source from our Subversion (SVN) repositary.
|
||||||
|
The SVN checkout requires a few extra steps and some extra software
|
||||||
|
packages on your system, but lets you track the latest development and
|
||||||
|
make patches much more easily, so we highly encourage it.
|
||||||
|
|
||||||
|
### Source Package ###
|
||||||
|
|
||||||
|
Google Test is released in versioned source packages which can be
|
||||||
|
downloaded from the download page [1]. Several different archive
|
||||||
|
formats are provided, but the only difference is the tools used to
|
||||||
|
manipulate them, and the size of the resulting file. Download
|
||||||
|
whichever you are most comfortable with.
|
||||||
|
|
||||||
|
[1] http://code.google.com/p/googletest/downloads/list
|
||||||
|
|
||||||
|
Once the package is downloaded, expand it using whichever tools you
|
||||||
|
prefer for that type. This will result in a new directory with the
|
||||||
|
name "gtest-X.Y.Z" which contains all of the source code. Here are
|
||||||
|
some examples on Linux:
|
||||||
|
|
||||||
|
tar -xvzf gtest-X.Y.Z.tar.gz
|
||||||
|
tar -xvjf gtest-X.Y.Z.tar.bz2
|
||||||
|
unzip gtest-X.Y.Z.zip
|
||||||
|
|
||||||
|
### SVN Checkout ###
|
||||||
|
|
||||||
|
To check out the main branch (also known as the "trunk") of Google
|
||||||
|
Test, run the following Subversion command:
|
||||||
|
|
||||||
|
svn checkout http://googletest.googlecode.com/svn/trunk/ gtest-svn
|
||||||
|
|
||||||
|
Setting up the Build
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
To build Google Test and your tests that use it, you need to tell your
|
||||||
|
build system where to find its headers and source files. The exact
|
||||||
|
way to do it depends on which build system you use, and is usually
|
||||||
|
straightforward.
|
||||||
|
|
||||||
|
### Generic Build Instructions ###
|
||||||
|
|
||||||
|
Suppose you put Google Test in directory ${GTEST_DIR}. To build it,
|
||||||
|
create a library build target (or a project as called by Visual Studio
|
||||||
|
and Xcode) to compile
|
||||||
|
|
||||||
|
${GTEST_DIR}/src/gtest-all.cc
|
||||||
|
|
||||||
|
with
|
||||||
|
|
||||||
|
${GTEST_DIR}/include and ${GTEST_DIR}
|
||||||
|
|
||||||
|
in the header search path. Assuming a Linux-like system and gcc,
|
||||||
|
something like the following will do:
|
||||||
|
|
||||||
|
g++ -I${GTEST_DIR}/include -I${GTEST_DIR} -c ${GTEST_DIR}/src/gtest-all.cc
|
||||||
|
ar -rv libgtest.a gtest-all.o
|
||||||
|
|
||||||
|
Next, you should compile your test source file with
|
||||||
|
${GTEST_DIR}/include in the header search path, and link it with gtest
|
||||||
|
and any other necessary libraries:
|
||||||
|
|
||||||
|
g++ -I${GTEST_DIR}/include path/to/your_test.cc libgtest.a -o your_test
|
||||||
|
|
||||||
|
As an example, the make/ directory contains a Makefile that you can
|
||||||
|
use to build Google Test on systems where GNU make is available
|
||||||
|
(e.g. Linux, Mac OS X, and Cygwin). It doesn't try to build Google
|
||||||
|
Test's own tests. Instead, it just builds the Google Test library and
|
||||||
|
a sample test. You can use it as a starting point for your own build
|
||||||
|
script.
|
||||||
|
|
||||||
|
If the default settings are correct for your environment, the
|
||||||
|
following commands should succeed:
|
||||||
|
|
||||||
|
cd ${GTEST_DIR}/make
|
||||||
|
make
|
||||||
|
./sample1_unittest
|
||||||
|
|
||||||
|
If you see errors, try to tweak the contents of make/Makefile to make
|
||||||
|
them go away. There are instructions in make/Makefile on how to do
|
||||||
|
it.
|
||||||
|
|
||||||
|
### Using CMake ###
|
||||||
|
|
||||||
|
Google Test comes with a CMake build script (CMakeLists.txt) that can
|
||||||
|
be used on a wide range of platforms ("C" stands for cross-platofrm.).
|
||||||
|
If you don't have CMake installed already, you can download it for
|
||||||
|
free from http://www.cmake.org/.
|
||||||
|
|
||||||
|
CMake works by generating native makefiles or build projects that can
|
||||||
|
be used in the compiler environment of your choice. The typical
|
||||||
|
workflow starts with:
|
||||||
|
|
||||||
|
mkdir mybuild # Create a directory to hold the build output.
|
||||||
|
cd mybuild
|
||||||
|
cmake ${GTEST_DIR} # Generate native build scripts.
|
||||||
|
|
||||||
|
If you want to build Google Test's samples, you should replace the
|
||||||
|
last command with
|
||||||
|
|
||||||
|
cmake -Dgtest_build_samples=ON ${GTEST_DIR}
|
||||||
|
|
||||||
|
If you are on a *nix system, you should now see a Makefile in the
|
||||||
|
current directory. Just type 'make' to build gtest.
|
||||||
|
|
||||||
|
If you use Windows and have Vistual Studio installed, a gtest.sln file
|
||||||
|
and several .vcproj files will be created. You can then build them
|
||||||
|
using Visual Studio.
|
||||||
|
|
||||||
|
On Mac OS X with Xcode installed, a .xcodeproj file will be generated.
|
||||||
|
|
||||||
|
### Legacy Build Scripts ###
|
||||||
|
|
||||||
|
Before settling on CMake, we have been providing hand-maintained build
|
||||||
|
projects/scripts for Visual Studio, Xcode, and Autotools. While we
|
||||||
|
continue to provide them for convenience, they are not actively
|
||||||
|
maintained any more. We highly recommend that you follow the
|
||||||
|
instructions in the previous two sections to integrate Google Test
|
||||||
|
with your existing build system.
|
||||||
|
|
||||||
|
If you still need to use the legacy build scripts, here's how:
|
||||||
|
|
||||||
|
The msvc\ folder contains two solutions with Visual C++ projects.
|
||||||
|
Open the gtest.sln or gtest-md.sln file using Visual Studio, and you
|
||||||
|
are ready to build Google Test the same way you build any Visual
|
||||||
|
Studio project. Files that have names ending with -md use DLL
|
||||||
|
versions of Microsoft runtime libraries (the /MD or the /MDd compiler
|
||||||
|
option). Files without that suffix use static versions of the runtime
|
||||||
|
libraries (the /MT or the /MTd option). Please note that one must use
|
||||||
|
the same option to compile both gtest and the test code. If you use
|
||||||
|
Visual Studio 2005 or above, we recommend the -md version as /MD is
|
||||||
|
the default for new projects in these versions of Visual Studio.
|
||||||
|
|
||||||
|
On Mac OS X, open the gtest.xcodeproj in the xcode/ folder using
|
||||||
|
Xcode. Build the "gtest" target. The universal binary framework will
|
||||||
|
end up in your selected build directory (selected in the Xcode
|
||||||
|
"Preferences..." -> "Building" pane and defaults to xcode/build).
|
||||||
|
Alternatively, at the command line, enter:
|
||||||
|
|
||||||
|
xcodebuild
|
||||||
|
|
||||||
|
This will build the "Release" configuration of gtest.framework in your
|
||||||
|
default build location. See the "xcodebuild" man page for more
|
||||||
|
information about building different configurations and building in
|
||||||
|
different locations.
|
||||||
|
|
||||||
|
Tweaking Google Test
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
Google Test can be used in diverse environments. The default
|
||||||
|
configuration may not work (or may not work well) out of the box in
|
||||||
|
some environments. However, you can easily tweak Google Test by
|
||||||
|
defining control macros on the compiler command line. Generally,
|
||||||
|
these macros are named like GTEST_XYZ and you define them to either 1
|
||||||
|
or 0 to enable or disable a certain feature.
|
||||||
|
|
||||||
|
We list the most frequently used macros below. For a complete list,
|
||||||
|
see file include/gtest/internal/gtest-port.h.
|
||||||
|
|
||||||
|
### Choosing a TR1 Tuple Library ###
|
||||||
|
|
||||||
|
Some Google Test features require the C++ Technical Report 1 (TR1)
|
||||||
|
tuple library, which is not yet available with all compilers. The
|
||||||
|
good news is that Google Test implements a subset of TR1 tuple that's
|
||||||
|
enough for its own need, and will automatically use this when the
|
||||||
|
compiler doesn't provide TR1 tuple.
|
||||||
|
|
||||||
|
Usually you don't need to care about which tuple library Google Test
|
||||||
|
uses. However, if your project already uses TR1 tuple, you need to
|
||||||
|
tell Google Test to use the same TR1 tuple library the rest of your
|
||||||
|
project uses, or the two tuple implementations will clash. To do
|
||||||
|
that, add
|
||||||
|
|
||||||
|
-DGTEST_USE_OWN_TR1_TUPLE=0
|
||||||
|
|
||||||
|
to the compiler flags while compiling Google Test and your tests. If
|
||||||
|
you want to force Google Test to use its own tuple library, just add
|
||||||
|
|
||||||
|
-DGTEST_USE_OWN_TR1_TUPLE=1
|
||||||
|
|
||||||
|
to the compiler flags instead.
|
||||||
|
|
||||||
|
If you don't want Google Test to use tuple at all, add
|
||||||
|
|
||||||
|
-DGTEST_HAS_TR1_TUPLE=0
|
||||||
|
|
||||||
|
and all features using tuple will be disabled.
|
||||||
|
|
||||||
|
### Multi-threaded Tests ###
|
||||||
|
|
||||||
|
Google Test is thread-safe where the pthread library is available.
|
||||||
|
After #include "gtest/gtest.h", you can check the GTEST_IS_THREADSAFE
|
||||||
|
macro to see whether this is the case (yes if the macro is #defined to
|
||||||
|
1, no if it's undefined.).
|
||||||
|
|
||||||
|
If Google Test doesn't correctly detect whether pthread is available
|
||||||
|
in your environment, you can force it with
|
||||||
|
|
||||||
|
-DGTEST_HAS_PTHREAD=1
|
||||||
|
|
||||||
|
or
|
||||||
|
|
||||||
|
-DGTEST_HAS_PTHREAD=0
|
||||||
|
|
||||||
|
When Google Test uses pthread, you may need to add flags to your
|
||||||
|
compiler and/or linker to select the pthread library, or you'll get
|
||||||
|
link errors. If you use the CMake script or the deprecated Autotools
|
||||||
|
script, this is taken care of for you. If you use your own build
|
||||||
|
script, you'll need to read your compiler and linker's manual to
|
||||||
|
figure out what flags to add.
|
||||||
|
|
||||||
|
### As a Shared Library (DLL) ###
|
||||||
|
|
||||||
|
Google Test is compact, so most users can build and link it as a
|
||||||
|
static library for the simplicity. You can choose to use Google Test
|
||||||
|
as a shared library (known as a DLL on Windows) if you prefer.
|
||||||
|
|
||||||
|
To compile *gtest* as a shared library, add
|
||||||
|
|
||||||
|
-DGTEST_CREATE_SHARED_LIBRARY=1
|
||||||
|
|
||||||
|
to the compiler flags. You'll also need to tell the linker to produce
|
||||||
|
a shared library instead - consult your linker's manual for how to do
|
||||||
|
it.
|
||||||
|
|
||||||
|
To compile your *tests* that use the gtest shared library, add
|
||||||
|
|
||||||
|
-DGTEST_LINKED_AS_SHARED_LIBRARY=1
|
||||||
|
|
||||||
|
to the compiler flags.
|
||||||
|
|
||||||
|
Note: while the above steps aren't technically necessary today when
|
||||||
|
using some compilers (e.g. GCC), they may become necessary in the
|
||||||
|
future, if we decide to improve the speed of loading the library (see
|
||||||
|
http://gcc.gnu.org/wiki/Visibility for details). Therefore you are
|
||||||
|
recommended to always add the above flags when using Google Test as a
|
||||||
|
shared library. Otherwise a future release of Google Test may break
|
||||||
|
your build script.
|
||||||
|
|
||||||
|
### Avoiding Macro Name Clashes ###
|
||||||
|
|
||||||
|
In C++, macros don't obey namespaces. Therefore two libraries that
|
||||||
|
both define a macro of the same name will clash if you #include both
|
||||||
|
definitions. In case a Google Test macro clashes with another
|
||||||
|
library, you can force Google Test to rename its macro to avoid the
|
||||||
|
conflict.
|
||||||
|
|
||||||
|
Specifically, if both Google Test and some other code define macro
|
||||||
|
FOO, you can add
|
||||||
|
|
||||||
|
-DGTEST_DONT_DEFINE_FOO=1
|
||||||
|
|
||||||
|
to the compiler flags to tell Google Test to change the macro's name
|
||||||
|
from FOO to GTEST_FOO. Currently FOO can be FAIL, SUCCEED, or TEST.
|
||||||
|
For example, with -DGTEST_DONT_DEFINE_TEST=1, you'll need to write
|
||||||
|
|
||||||
|
GTEST_TEST(SomeTest, DoesThis) { ... }
|
||||||
|
|
||||||
|
instead of
|
||||||
|
|
||||||
|
TEST(SomeTest, DoesThis) { ... }
|
||||||
|
|
||||||
|
in order to define a test.
|
||||||
|
|
||||||
|
Upgrating from an Earlier Version
|
||||||
|
---------------------------------
|
||||||
|
|
||||||
|
We strive to keep Google Test releases backward compatible.
|
||||||
|
Sometimes, though, we have to make some breaking changes for the
|
||||||
|
users' long-term benefits. This section describes what you'll need to
|
||||||
|
do if you are upgrading from an earlier version of Google Test.
|
||||||
|
|
||||||
|
### Upgrading from 1.3.0 or Earlier ###
|
||||||
|
|
||||||
|
You may need to explicitly enable or disable Google Test's own TR1
|
||||||
|
tuple library. See the instructions in section "Choosing a TR1 Tuple
|
||||||
|
Library".
|
||||||
|
|
||||||
|
### Upgrading from 1.4.0 or Earlier ###
|
||||||
|
|
||||||
|
The Autotools build script (configure + make) is no longer officially
|
||||||
|
supportted. You are encouraged to migrate to your own build system or
|
||||||
|
use CMake. If you still need to use Autotools, you can find
|
||||||
|
instructions in the README file from Google Test 1.4.0.
|
||||||
|
|
||||||
|
On platforms where the pthread library is available, Google Test uses
|
||||||
|
it in order to be thread-safe. See the "Multi-threaded Tests" section
|
||||||
|
for what this means to your build script.
|
||||||
|
|
||||||
|
If you use Microsoft Visual C++ 7.1 with exceptions disabled, Google
|
||||||
|
Test will no longer compile. This should affect very few people, as a
|
||||||
|
large portion of STL (including <string>) doesn't compile in this mode
|
||||||
|
anyway. We decided to stop supporting it in order to greatly simplify
|
||||||
|
Google Test's implementation.
|
||||||
|
|
||||||
|
Developing Google Test
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
This section discusses how to make your own changes to Google Test.
|
||||||
|
|
||||||
|
### Testing Google Test Itself ###
|
||||||
|
|
||||||
|
To make sure your changes work as intended and don't break existing
|
||||||
|
functionality, you'll want to compile and run Google Test's own tests.
|
||||||
|
For that you can use CMake:
|
||||||
|
|
||||||
|
mkdir mybuild
|
||||||
|
cd mybuild
|
||||||
|
cmake -Dgtest_build_tests=ON ${GTEST_DIR}
|
||||||
|
|
||||||
|
Make sure you have Python installed, as some of Google Test's tests
|
||||||
|
are written in Python. If the cmake command complains about not being
|
||||||
|
able to find Python ("Could NOT find PythonInterp (missing:
|
||||||
|
PYTHON_EXECUTABLE)"), try telling it explicitly where your Python
|
||||||
|
executable can be found:
|
||||||
|
|
||||||
|
cmake -DPYTHON_EXECUTABLE=path/to/python -Dgtest_build_tests=ON ${GTEST_DIR}
|
||||||
|
|
||||||
|
Next, you can build Google Test and all of its own tests. On *nix,
|
||||||
|
this is usually done by 'make'. To run the tests, do
|
||||||
|
|
||||||
|
make test
|
||||||
|
|
||||||
|
All tests should pass.
|
||||||
|
|
||||||
|
### Regenerating Source Files ###
|
||||||
|
|
||||||
|
Some of Google Test's source files are generated from templates (not
|
||||||
|
in the C++ sense) using a script. A template file is named FOO.pump,
|
||||||
|
where FOO is the name of the file it will generate. For example, the
|
||||||
|
file include/gtest/internal/gtest-type-util.h.pump is used to generate
|
||||||
|
gtest-type-util.h in the same directory.
|
||||||
|
|
||||||
|
Normally you don't need to worry about regenerating the source files,
|
||||||
|
unless you need to modify them. In that case, you should modify the
|
||||||
|
corresponding .pump files instead and run the pump.py Python script to
|
||||||
|
regenerate them. You can find pump.py in the scripts/ directory.
|
||||||
|
Read the Pump manual [2] for how to use it.
|
||||||
|
|
||||||
|
[2] http://code.google.com/p/googletest/wiki/PumpManual
|
||||||
|
|
||||||
|
### Contributing a Patch ###
|
||||||
|
|
||||||
|
We welcome patches. Please read the Google Test developer's guide [3]
|
||||||
|
for how you can contribute. In particular, make sure you have signed
|
||||||
|
the Contributor License Agreement, or we won't be able to accept the
|
||||||
|
patch.
|
||||||
|
|
||||||
|
[3] http://code.google.com/p/googletest/wiki/GoogleTestDevGuide
|
||||||
|
|
||||||
|
Happy testing!
|
||||||
0
third_party/googletest/src/build-aux/.keep
vendored
Normal file
0
third_party/googletest/src/build-aux/.keep
vendored
Normal file
216
third_party/googletest/src/cmake/internal_utils.cmake
vendored
Normal file
216
third_party/googletest/src/cmake/internal_utils.cmake
vendored
Normal file
@@ -0,0 +1,216 @@
|
|||||||
|
# Defines functions and macros useful for building Google Test and
|
||||||
|
# Google Mock.
|
||||||
|
#
|
||||||
|
# Note:
|
||||||
|
#
|
||||||
|
# - This file will be run twice when building Google Mock (once via
|
||||||
|
# Google Test's CMakeLists.txt, and once via Google Mock's).
|
||||||
|
# Therefore it shouldn't have any side effects other than defining
|
||||||
|
# the functions and macros.
|
||||||
|
#
|
||||||
|
# - The functions/macros defined in this file may depend on Google
|
||||||
|
# Test and Google Mock's option() definitions, and thus must be
|
||||||
|
# called *after* the options have been defined.
|
||||||
|
|
||||||
|
# Tweaks CMake's default compiler/linker settings to suit Google Test's needs.
|
||||||
|
#
|
||||||
|
# This must be a macro(), as inside a function string() can only
|
||||||
|
# update variables in the function scope.
|
||||||
|
macro(fix_default_compiler_settings_)
|
||||||
|
if (MSVC)
|
||||||
|
# For MSVC, CMake sets certain flags to defaults we want to override.
|
||||||
|
# This replacement code is taken from sample in the CMake Wiki at
|
||||||
|
# http://www.cmake.org/Wiki/CMake_FAQ#Dynamic_Replace.
|
||||||
|
foreach (flag_var
|
||||||
|
CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
|
||||||
|
CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
|
||||||
|
if (NOT BUILD_SHARED_LIBS AND NOT gtest_force_shared_crt)
|
||||||
|
# When Google Test is built as a shared library, it should also use
|
||||||
|
# shared runtime libraries. Otherwise, it may end up with multiple
|
||||||
|
# copies of runtime library data in different modules, resulting in
|
||||||
|
# hard-to-find crashes. When it is built as a static library, it is
|
||||||
|
# preferable to use CRT as static libraries, as we don't have to rely
|
||||||
|
# on CRT DLLs being available. CMake always defaults to using shared
|
||||||
|
# CRT libraries, so we override that default here.
|
||||||
|
string(REPLACE "/MD" "-MT" ${flag_var} "${${flag_var}}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# We prefer more strict warning checking for building Google Test.
|
||||||
|
# Replaces /W3 with /W4 in defaults.
|
||||||
|
string(REPLACE "/W3" "-W4" ${flag_var} "${${flag_var}}")
|
||||||
|
endforeach()
|
||||||
|
endif()
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
# Defines the compiler/linker flags used to build Google Test and
|
||||||
|
# Google Mock. You can tweak these definitions to suit your need. A
|
||||||
|
# variable's value is empty before it's explicitly assigned to.
|
||||||
|
macro(config_compiler_and_linker)
|
||||||
|
if (NOT gtest_disable_pthreads)
|
||||||
|
# Defines CMAKE_USE_PTHREADS_INIT and CMAKE_THREAD_LIBS_INIT.
|
||||||
|
find_package(Threads)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
fix_default_compiler_settings_()
|
||||||
|
if (MSVC)
|
||||||
|
# Newlines inside flags variables break CMake's NMake generator.
|
||||||
|
# TODO(vladl@google.com): Add -RTCs and -RTCu to debug builds.
|
||||||
|
set(cxx_base_flags "-GS -W4 -WX -wd4127 -wd4251 -wd4275 -nologo -J -Zi")
|
||||||
|
set(cxx_base_flags "${cxx_base_flags} -D_UNICODE -DUNICODE -DWIN32 -D_WIN32")
|
||||||
|
set(cxx_base_flags "${cxx_base_flags} -DSTRICT -DWIN32_LEAN_AND_MEAN")
|
||||||
|
set(cxx_exception_flags "-EHsc -D_HAS_EXCEPTIONS=1")
|
||||||
|
set(cxx_no_exception_flags "-D_HAS_EXCEPTIONS=0")
|
||||||
|
set(cxx_no_rtti_flags "-GR-")
|
||||||
|
elseif (CMAKE_COMPILER_IS_GNUCXX)
|
||||||
|
set(cxx_base_flags "-Wall -Wshadow")
|
||||||
|
set(cxx_exception_flags "-fexceptions")
|
||||||
|
set(cxx_no_exception_flags "-fno-exceptions")
|
||||||
|
# Until version 4.3.2, GCC doesn't define a macro to indicate
|
||||||
|
# whether RTTI is enabled. Therefore we define GTEST_HAS_RTTI
|
||||||
|
# explicitly.
|
||||||
|
set(cxx_no_rtti_flags "-fno-rtti -DGTEST_HAS_RTTI=0")
|
||||||
|
set(cxx_strict_flags "-Wextra")
|
||||||
|
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "SunPro")
|
||||||
|
set(cxx_exception_flags "-features=except")
|
||||||
|
# Sun Pro doesn't provide macros to indicate whether exceptions and
|
||||||
|
# RTTI are enabled, so we define GTEST_HAS_* explicitly.
|
||||||
|
set(cxx_no_exception_flags "-features=no%except -DGTEST_HAS_EXCEPTIONS=0")
|
||||||
|
set(cxx_no_rtti_flags "-features=no%rtti -DGTEST_HAS_RTTI=0")
|
||||||
|
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "VisualAge" OR
|
||||||
|
CMAKE_CXX_COMPILER_ID STREQUAL "XL")
|
||||||
|
# CMake 2.8 changes Visual Age's compiler ID to "XL".
|
||||||
|
set(cxx_exception_flags "-qeh")
|
||||||
|
set(cxx_no_exception_flags "-qnoeh")
|
||||||
|
# Until version 9.0, Visual Age doesn't define a macro to indicate
|
||||||
|
# whether RTTI is enabled. Therefore we define GTEST_HAS_RTTI
|
||||||
|
# explicitly.
|
||||||
|
set(cxx_no_rtti_flags "-qnortti -DGTEST_HAS_RTTI=0")
|
||||||
|
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "HP")
|
||||||
|
set(cxx_base_flags "-AA -mt")
|
||||||
|
set(cxx_exception_flags "-DGTEST_HAS_EXCEPTIONS=1")
|
||||||
|
set(cxx_no_exception_flags "+noeh -DGTEST_HAS_EXCEPTIONS=0")
|
||||||
|
# RTTI can not be disabled in HP aCC compiler.
|
||||||
|
set(cxx_no_rtti_flags "")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (CMAKE_USE_PTHREADS_INIT) # The pthreads library is available and allowed.
|
||||||
|
set(cxx_base_flags "${cxx_base_flags} -DGTEST_HAS_PTHREAD=1")
|
||||||
|
else()
|
||||||
|
set(cxx_base_flags "${cxx_base_flags} -DGTEST_HAS_PTHREAD=0")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# For building gtest's own tests and samples.
|
||||||
|
set(cxx_exception "${CMAKE_CXX_FLAGS} ${cxx_base_flags} ${cxx_exception_flags}")
|
||||||
|
set(cxx_no_exception
|
||||||
|
"${CMAKE_CXX_FLAGS} ${cxx_base_flags} ${cxx_no_exception_flags}")
|
||||||
|
set(cxx_default "${cxx_exception}")
|
||||||
|
set(cxx_no_rtti "${cxx_default} ${cxx_no_rtti_flags}")
|
||||||
|
set(cxx_use_own_tuple "${cxx_default} -DGTEST_USE_OWN_TR1_TUPLE=1")
|
||||||
|
|
||||||
|
# For building the gtest libraries.
|
||||||
|
set(cxx_strict "${cxx_default} ${cxx_strict_flags}")
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
# Defines the gtest & gtest_main libraries. User tests should link
|
||||||
|
# with one of them.
|
||||||
|
function(cxx_library_with_type name type cxx_flags)
|
||||||
|
# type can be either STATIC or SHARED to denote a static or shared library.
|
||||||
|
# ARGN refers to additional arguments after 'cxx_flags'.
|
||||||
|
add_library(${name} ${type} ${ARGN})
|
||||||
|
set_target_properties(${name}
|
||||||
|
PROPERTIES
|
||||||
|
COMPILE_FLAGS "${cxx_flags}")
|
||||||
|
if (BUILD_SHARED_LIBS OR type STREQUAL "SHARED")
|
||||||
|
set_target_properties(${name}
|
||||||
|
PROPERTIES
|
||||||
|
COMPILE_DEFINITIONS "GTEST_CREATE_SHARED_LIBRARY=1")
|
||||||
|
endif()
|
||||||
|
if (CMAKE_USE_PTHREADS_INIT)
|
||||||
|
target_link_libraries(${name} ${CMAKE_THREAD_LIBS_INIT})
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
#
|
||||||
|
# Helper functions for creating build targets.
|
||||||
|
|
||||||
|
function(cxx_shared_library name cxx_flags)
|
||||||
|
cxx_library_with_type(${name} SHARED "${cxx_flags}" ${ARGN})
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(cxx_library name cxx_flags)
|
||||||
|
cxx_library_with_type(${name} "" "${cxx_flags}" ${ARGN})
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# cxx_executable_with_flags(name cxx_flags libs srcs...)
|
||||||
|
#
|
||||||
|
# creates a named C++ executable that depends on the given libraries and
|
||||||
|
# is built from the given source files with the given compiler flags.
|
||||||
|
function(cxx_executable_with_flags name cxx_flags libs)
|
||||||
|
add_executable(${name} ${ARGN})
|
||||||
|
if (cxx_flags)
|
||||||
|
set_target_properties(${name}
|
||||||
|
PROPERTIES
|
||||||
|
COMPILE_FLAGS "${cxx_flags}")
|
||||||
|
endif()
|
||||||
|
if (BUILD_SHARED_LIBS)
|
||||||
|
set_target_properties(${name}
|
||||||
|
PROPERTIES
|
||||||
|
COMPILE_DEFINITIONS "GTEST_LINKED_AS_SHARED_LIBRARY=1")
|
||||||
|
endif()
|
||||||
|
# To support mixing linking in static and dynamic libraries, link each
|
||||||
|
# library in with an extra call to target_link_libraries.
|
||||||
|
foreach (lib "${libs}")
|
||||||
|
target_link_libraries(${name} ${lib})
|
||||||
|
endforeach()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# cxx_executable(name dir lib srcs...)
|
||||||
|
#
|
||||||
|
# creates a named target that depends on the given libs and is built
|
||||||
|
# from the given source files. dir/name.cc is implicitly included in
|
||||||
|
# the source file list.
|
||||||
|
function(cxx_executable name dir libs)
|
||||||
|
cxx_executable_with_flags(
|
||||||
|
${name} "${cxx_default}" "${libs}" "${dir}/${name}.cc" ${ARGN})
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# Sets PYTHONINTERP_FOUND and PYTHON_EXECUTABLE.
|
||||||
|
find_package(PythonInterp)
|
||||||
|
|
||||||
|
# cxx_test_with_flags(name cxx_flags libs srcs...)
|
||||||
|
#
|
||||||
|
# creates a named C++ test that depends on the given libs and is built
|
||||||
|
# from the given source files with the given compiler flags.
|
||||||
|
function(cxx_test_with_flags name cxx_flags libs)
|
||||||
|
cxx_executable_with_flags(${name} "${cxx_flags}" "${libs}" ${ARGN})
|
||||||
|
add_test(${name} ${name})
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# cxx_test(name libs srcs...)
|
||||||
|
#
|
||||||
|
# creates a named test target that depends on the given libs and is
|
||||||
|
# built from the given source files. Unlike cxx_test_with_flags,
|
||||||
|
# test/name.cc is already implicitly included in the source file list.
|
||||||
|
function(cxx_test name libs)
|
||||||
|
cxx_test_with_flags("${name}" "${cxx_default}" "${libs}"
|
||||||
|
"test/${name}.cc" ${ARGN})
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# py_test(name)
|
||||||
|
#
|
||||||
|
# creates a Python test with the given name whose main module is in
|
||||||
|
# test/name.py. It does nothing if Python is not installed.
|
||||||
|
function(py_test name)
|
||||||
|
# We are not supporting Python tests on Linux yet as they consider
|
||||||
|
# all Linux environments to be google3 and try to use google3 features.
|
||||||
|
if (PYTHONINTERP_FOUND)
|
||||||
|
# ${CMAKE_BINARY_DIR} is known at configuration time, so we can
|
||||||
|
# directly bind it from cmake. ${CTEST_CONFIGURATION_TYPE} is known
|
||||||
|
# only at ctest runtime (by calling ctest -c <Configuration>), so
|
||||||
|
# we have to escape $ to delay variable substitution here.
|
||||||
|
add_test(${name}
|
||||||
|
${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test/${name}.py
|
||||||
|
--build_dir=${CMAKE_CURRENT_BINARY_DIR}/\${CTEST_CONFIGURATION_TYPE})
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
138
third_party/googletest/src/codegear/gtest.cbproj
vendored
Normal file
138
third_party/googletest/src/codegear/gtest.cbproj
vendored
Normal file
@@ -0,0 +1,138 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<ProjectGuid>{bca37a72-5b07-46cf-b44e-89f8e06451a2}</ProjectGuid>
|
||||||
|
<Config Condition="'$(Config)'==''">Release</Config>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
|
||||||
|
<Base>true</Base>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''">
|
||||||
|
<Base>true</Base>
|
||||||
|
<Cfg_1>true</Cfg_1>
|
||||||
|
<CfgParent>Base</CfgParent>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''">
|
||||||
|
<Base>true</Base>
|
||||||
|
<Cfg_2>true</Cfg_2>
|
||||||
|
<CfgParent>Base</CfgParent>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Base)'!=''">
|
||||||
|
<BCC_OptimizeForSpeed>true</BCC_OptimizeForSpeed>
|
||||||
|
<OutputExt>lib</OutputExt>
|
||||||
|
<DCC_CBuilderOutput>JPHNE</DCC_CBuilderOutput>
|
||||||
|
<Defines>NO_STRICT</Defines>
|
||||||
|
<DynamicRTL>true</DynamicRTL>
|
||||||
|
<UsePackages>true</UsePackages>
|
||||||
|
<ProjectType>CppStaticLibrary</ProjectType>
|
||||||
|
<BCC_CPPCompileAlways>true</BCC_CPPCompileAlways>
|
||||||
|
<PackageImports>rtl.bpi;vcl.bpi;bcbie.bpi;vclx.bpi;vclactnband.bpi;xmlrtl.bpi;bcbsmp.bpi;dbrtl.bpi;vcldb.bpi;bdertl.bpi;vcldbx.bpi;dsnap.bpi;dsnapcon.bpi;vclib.bpi;ibxpress.bpi;adortl.bpi;dbxcds.bpi;dbexpress.bpi;DbxCommonDriver.bpi;websnap.bpi;vclie.bpi;webdsnap.bpi;inet.bpi;inetdbbde.bpi;inetdbxpress.bpi;soaprtl.bpi;Rave75VCL.bpi;teeUI.bpi;tee.bpi;teedb.bpi;IndyCore.bpi;IndySystem.bpi;IndyProtocols.bpi;IntrawebDB_90_100.bpi;Intraweb_90_100.bpi;dclZipForged11.bpi;vclZipForged11.bpi;GR32_BDS2006.bpi;GR32_DSGN_BDS2006.bpi;Jcl.bpi;JclVcl.bpi;JvCoreD11R.bpi;JvSystemD11R.bpi;JvStdCtrlsD11R.bpi;JvAppFrmD11R.bpi;JvBandsD11R.bpi;JvDBD11R.bpi;JvDlgsD11R.bpi;JvBDED11R.bpi;JvCmpD11R.bpi;JvCryptD11R.bpi;JvCtrlsD11R.bpi;JvCustomD11R.bpi;JvDockingD11R.bpi;JvDotNetCtrlsD11R.bpi;JvEDID11R.bpi;JvGlobusD11R.bpi;JvHMID11R.bpi;JvInterpreterD11R.bpi;JvJansD11R.bpi;JvManagedThreadsD11R.bpi;JvMMD11R.bpi;JvNetD11R.bpi;JvPageCompsD11R.bpi;JvPluginD11R.bpi;JvPrintPreviewD11R.bpi;JvRuntimeDesignD11R.bpi;JvTimeFrameworkD11R.bpi;JvValidatorsD11R.bpi;JvWizardD11R.bpi;JvXPCtrlsD11R.bpi;VclSmp.bpi;CExceptionExpert11.bpi</PackageImports>
|
||||||
|
<BCC_wpar>false</BCC_wpar>
|
||||||
|
<IncludePath>$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\src;..\include;..</IncludePath>
|
||||||
|
<AllPackageLibs>rtl.lib;vcl.lib</AllPackageLibs>
|
||||||
|
<TLIB_PageSize>32</TLIB_PageSize>
|
||||||
|
<ILINK_LibraryPath>$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk</ILINK_LibraryPath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Cfg_1)'!=''">
|
||||||
|
<BCC_OptimizeForSpeed>false</BCC_OptimizeForSpeed>
|
||||||
|
<DCC_Optimize>false</DCC_Optimize>
|
||||||
|
<DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>
|
||||||
|
<Defines>_DEBUG;$(Defines)</Defines>
|
||||||
|
<ILINK_FullDebugInfo>true</ILINK_FullDebugInfo>
|
||||||
|
<BCC_InlineFunctionExpansion>false</BCC_InlineFunctionExpansion>
|
||||||
|
<ILINK_DisableIncrementalLinking>true</ILINK_DisableIncrementalLinking>
|
||||||
|
<BCC_UseRegisterVariables>None</BCC_UseRegisterVariables>
|
||||||
|
<DCC_Define>DEBUG</DCC_Define>
|
||||||
|
<BCC_DebugLineNumbers>true</BCC_DebugLineNumbers>
|
||||||
|
<IntermediateOutputDir>Debug</IntermediateOutputDir>
|
||||||
|
<TASM_DisplaySourceLines>true</TASM_DisplaySourceLines>
|
||||||
|
<BCC_StackFrames>true</BCC_StackFrames>
|
||||||
|
<BCC_DisableOptimizations>true</BCC_DisableOptimizations>
|
||||||
|
<ILINK_LibraryPath>$(BDS)\lib\debug;$(ILINK_LibraryPath)</ILINK_LibraryPath>
|
||||||
|
<TASM_Debugging>Full</TASM_Debugging>
|
||||||
|
<BCC_SourceDebuggingOn>true</BCC_SourceDebuggingOn>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Cfg_2)'!=''">
|
||||||
|
<Defines>NDEBUG;$(Defines)</Defines>
|
||||||
|
<IntermediateOutputDir>Release</IntermediateOutputDir>
|
||||||
|
<ILINK_LibraryPath>$(BDS)\lib\release;$(ILINK_LibraryPath)</ILINK_LibraryPath>
|
||||||
|
<TASM_Debugging>None</TASM_Debugging>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ProjectExtensions>
|
||||||
|
<Borland.Personality>CPlusPlusBuilder.Personality</Borland.Personality>
|
||||||
|
<Borland.ProjectType>CppStaticLibrary</Borland.ProjectType>
|
||||||
|
<BorlandProject>
|
||||||
|
<BorlandProject><CPlusPlusBuilder.Personality><VersionInfo><VersionInfo Name="IncludeVerInfo">False</VersionInfo><VersionInfo Name="AutoIncBuild">False</VersionInfo><VersionInfo Name="MajorVer">1</VersionInfo><VersionInfo Name="MinorVer">0</VersionInfo><VersionInfo Name="Release">0</VersionInfo><VersionInfo Name="Build">0</VersionInfo><VersionInfo Name="Debug">False</VersionInfo><VersionInfo Name="PreRelease">False</VersionInfo><VersionInfo Name="Special">False</VersionInfo><VersionInfo Name="Private">False</VersionInfo><VersionInfo Name="DLL">False</VersionInfo><VersionInfo Name="Locale">1033</VersionInfo><VersionInfo Name="CodePage">1252</VersionInfo></VersionInfo><VersionInfoKeys><VersionInfoKeys Name="CompanyName"></VersionInfoKeys><VersionInfoKeys Name="FileDescription"></VersionInfoKeys><VersionInfoKeys Name="FileVersion">1.0.0.0</VersionInfoKeys><VersionInfoKeys Name="InternalName"></VersionInfoKeys><VersionInfoKeys Name="LegalCopyright"></VersionInfoKeys><VersionInfoKeys Name="LegalTrademarks"></VersionInfoKeys><VersionInfoKeys Name="OriginalFilename"></VersionInfoKeys><VersionInfoKeys Name="ProductName"></VersionInfoKeys><VersionInfoKeys Name="ProductVersion">1.0.0.0</VersionInfoKeys><VersionInfoKeys Name="Comments"></VersionInfoKeys></VersionInfoKeys><Debugging><Debugging Name="DebugSourceDirs"></Debugging></Debugging><Parameters><Parameters Name="RunParams"></Parameters><Parameters Name="Launcher"></Parameters><Parameters Name="UseLauncher">False</Parameters><Parameters Name="DebugCWD"></Parameters><Parameters Name="HostApplication"></Parameters><Parameters Name="RemoteHost"></Parameters><Parameters Name="RemotePath"></Parameters><Parameters Name="RemoteParams"></Parameters><Parameters Name="RemoteLauncher"></Parameters><Parameters Name="UseRemoteLauncher">False</Parameters><Parameters Name="RemoteCWD"></Parameters><Parameters Name="RemoteDebug">False</Parameters><Parameters Name="Debug Symbols Search Path"></Parameters><Parameters Name="LoadAllSymbols">True</Parameters><Parameters Name="LoadUnspecifiedSymbols">False</Parameters></Parameters><Excluded_Packages>
|
||||||
|
|
||||||
|
|
||||||
|
<Excluded_Packages Name="$(BDS)\bin\bcboffice2k100.bpl">CodeGear C++Builder Office 2000 Servers Package</Excluded_Packages>
|
||||||
|
<Excluded_Packages Name="$(BDS)\bin\bcbofficexp100.bpl">CodeGear C++Builder Office XP Servers Package</Excluded_Packages>
|
||||||
|
</Excluded_Packages><Linker><Linker Name="LibPrefix"></Linker><Linker Name="LibSuffix"></Linker><Linker Name="LibVersion"></Linker></Linker><ProjectProperties><ProjectProperties Name="AutoShowDeps">False</ProjectProperties><ProjectProperties Name="ManagePaths">True</ProjectProperties><ProjectProperties Name="VerifyPackages">True</ProjectProperties></ProjectProperties><HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name="Count">3</HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name="Item0">$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\src;..\include;..</HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name="Item1">$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\src;..\include;..</HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name="Item2">$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\src;..\src;..\include</HistoryLists_hlIncludePath></HistoryLists_hlIncludePath><HistoryLists_hlILINK_LibraryPath><HistoryLists_hlILINK_LibraryPath Name="Count">1</HistoryLists_hlILINK_LibraryPath><HistoryLists_hlILINK_LibraryPath Name="Item0">$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk</HistoryLists_hlILINK_LibraryPath></HistoryLists_hlILINK_LibraryPath><HistoryLists_hlDefines><HistoryLists_hlDefines Name="Count">1</HistoryLists_hlDefines><HistoryLists_hlDefines Name="Item0">NO_STRICT</HistoryLists_hlDefines></HistoryLists_hlDefines><HistoryLists_hlTLIB_PageSize><HistoryLists_hlTLIB_PageSize Name="Count">1</HistoryLists_hlTLIB_PageSize><HistoryLists_hlTLIB_PageSize Name="Item0">32</HistoryLists_hlTLIB_PageSize><HistoryLists_hlTLIB_PageSize Name="Item1">16</HistoryLists_hlTLIB_PageSize></HistoryLists_hlTLIB_PageSize></CPlusPlusBuilder.Personality></BorlandProject></BorlandProject>
|
||||||
|
</ProjectExtensions>
|
||||||
|
<Import Project="$(MSBuildBinPath)\Borland.Cpp.Targets" />
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="..\include\gtest\gtest-death-test.h">
|
||||||
|
<BuildOrder>3</BuildOrder>
|
||||||
|
</None>
|
||||||
|
<None Include="..\include\gtest\gtest-message.h">
|
||||||
|
<BuildOrder>4</BuildOrder>
|
||||||
|
</None>
|
||||||
|
<None Include="..\include\gtest\gtest-param-test.h">
|
||||||
|
<BuildOrder>5</BuildOrder>
|
||||||
|
</None>
|
||||||
|
<None Include="..\include\gtest\gtest-spi.h">
|
||||||
|
<BuildOrder>6</BuildOrder>
|
||||||
|
</None>
|
||||||
|
<None Include="..\include\gtest\gtest-test-part.h">
|
||||||
|
<BuildOrder>7</BuildOrder>
|
||||||
|
</None>
|
||||||
|
<None Include="..\include\gtest\gtest-typed-test.h">
|
||||||
|
<BuildOrder>8</BuildOrder>
|
||||||
|
</None>
|
||||||
|
<None Include="..\include\gtest\gtest.h">
|
||||||
|
<BuildOrder>0</BuildOrder>
|
||||||
|
</None>
|
||||||
|
<None Include="..\include\gtest\gtest_pred_impl.h">
|
||||||
|
<BuildOrder>1</BuildOrder>
|
||||||
|
</None>
|
||||||
|
<None Include="..\include\gtest\gtest_prod.h">
|
||||||
|
<BuildOrder>2</BuildOrder>
|
||||||
|
</None>
|
||||||
|
<None Include="..\include\gtest\internal\gtest-death-test-internal.h">
|
||||||
|
<BuildOrder>9</BuildOrder>
|
||||||
|
</None>
|
||||||
|
<None Include="..\include\gtest\internal\gtest-filepath.h">
|
||||||
|
<BuildOrder>10</BuildOrder>
|
||||||
|
</None>
|
||||||
|
<None Include="..\include\gtest\internal\gtest-internal.h">
|
||||||
|
<BuildOrder>11</BuildOrder>
|
||||||
|
</None>
|
||||||
|
<None Include="..\include\gtest\internal\gtest-linked_ptr.h">
|
||||||
|
<BuildOrder>12</BuildOrder>
|
||||||
|
</None>
|
||||||
|
<None Include="..\include\gtest\internal\gtest-param-util-generated.h">
|
||||||
|
<BuildOrder>14</BuildOrder>
|
||||||
|
</None>
|
||||||
|
<None Include="..\include\gtest\internal\gtest-param-util.h">
|
||||||
|
<BuildOrder>13</BuildOrder>
|
||||||
|
</None>
|
||||||
|
<None Include="..\include\gtest\internal\gtest-port.h">
|
||||||
|
<BuildOrder>15</BuildOrder>
|
||||||
|
</None>
|
||||||
|
<None Include="..\include\gtest\internal\gtest-string.h">
|
||||||
|
<BuildOrder>16</BuildOrder>
|
||||||
|
</None>
|
||||||
|
<None Include="..\include\gtest\internal\gtest-type-util.h">
|
||||||
|
<BuildOrder>17</BuildOrder>
|
||||||
|
</None>
|
||||||
|
<CppCompile Include="gtest_all.cc">
|
||||||
|
<BuildOrder>18</BuildOrder>
|
||||||
|
</CppCompile>
|
||||||
|
<BuildConfiguration Include="Debug">
|
||||||
|
<Key>Cfg_1</Key>
|
||||||
|
</BuildConfiguration>
|
||||||
|
<BuildConfiguration Include="Release">
|
||||||
|
<Key>Cfg_2</Key>
|
||||||
|
</BuildConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
||||||
54
third_party/googletest/src/codegear/gtest.groupproj
vendored
Normal file
54
third_party/googletest/src/codegear/gtest.groupproj
vendored
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<ProjectGuid>{c1d923e0-6cba-4332-9b6f-3420acbf5091}</ProjectGuid>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup />
|
||||||
|
<ItemGroup>
|
||||||
|
<Projects Include="gtest.cbproj" />
|
||||||
|
<Projects Include="gtest_main.cbproj" />
|
||||||
|
<Projects Include="gtest_unittest.cbproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ProjectExtensions>
|
||||||
|
<Borland.Personality>Default.Personality</Borland.Personality>
|
||||||
|
<Borland.ProjectType />
|
||||||
|
<BorlandProject>
|
||||||
|
<BorlandProject xmlns=""><Default.Personality></Default.Personality></BorlandProject></BorlandProject>
|
||||||
|
</ProjectExtensions>
|
||||||
|
<Target Name="gtest">
|
||||||
|
<MSBuild Projects="gtest.cbproj" Targets="" />
|
||||||
|
</Target>
|
||||||
|
<Target Name="gtest:Clean">
|
||||||
|
<MSBuild Projects="gtest.cbproj" Targets="Clean" />
|
||||||
|
</Target>
|
||||||
|
<Target Name="gtest:Make">
|
||||||
|
<MSBuild Projects="gtest.cbproj" Targets="Make" />
|
||||||
|
</Target>
|
||||||
|
<Target Name="gtest_main">
|
||||||
|
<MSBuild Projects="gtest_main.cbproj" Targets="" />
|
||||||
|
</Target>
|
||||||
|
<Target Name="gtest_main:Clean">
|
||||||
|
<MSBuild Projects="gtest_main.cbproj" Targets="Clean" />
|
||||||
|
</Target>
|
||||||
|
<Target Name="gtest_main:Make">
|
||||||
|
<MSBuild Projects="gtest_main.cbproj" Targets="Make" />
|
||||||
|
</Target>
|
||||||
|
<Target Name="gtest_unittest">
|
||||||
|
<MSBuild Projects="gtest_unittest.cbproj" Targets="" />
|
||||||
|
</Target>
|
||||||
|
<Target Name="gtest_unittest:Clean">
|
||||||
|
<MSBuild Projects="gtest_unittest.cbproj" Targets="Clean" />
|
||||||
|
</Target>
|
||||||
|
<Target Name="gtest_unittest:Make">
|
||||||
|
<MSBuild Projects="gtest_unittest.cbproj" Targets="Make" />
|
||||||
|
</Target>
|
||||||
|
<Target Name="Build">
|
||||||
|
<CallTarget Targets="gtest;gtest_main;gtest_unittest" />
|
||||||
|
</Target>
|
||||||
|
<Target Name="Clean">
|
||||||
|
<CallTarget Targets="gtest:Clean;gtest_main:Clean;gtest_unittest:Clean" />
|
||||||
|
</Target>
|
||||||
|
<Target Name="Make">
|
||||||
|
<CallTarget Targets="gtest:Make;gtest_main:Make;gtest_unittest:Make" />
|
||||||
|
</Target>
|
||||||
|
<Import Condition="Exists('$(MSBuildBinPath)\Borland.Group.Targets')" Project="$(MSBuildBinPath)\Borland.Group.Targets" />
|
||||||
|
</Project>
|
||||||
38
third_party/googletest/src/codegear/gtest_all.cc
vendored
Normal file
38
third_party/googletest/src/codegear/gtest_all.cc
vendored
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
// Copyright 2009, Google Inc.
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions are
|
||||||
|
// met:
|
||||||
|
//
|
||||||
|
// * Redistributions of source code must retain the above copyright
|
||||||
|
// notice, this list of conditions and the following disclaimer.
|
||||||
|
// * Redistributions in binary form must reproduce the above
|
||||||
|
// copyright notice, this list of conditions and the following disclaimer
|
||||||
|
// in the documentation and/or other materials provided with the
|
||||||
|
// distribution.
|
||||||
|
// * Neither the name of Google Inc. nor the names of its
|
||||||
|
// contributors may be used to endorse or promote products derived from
|
||||||
|
// this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
//
|
||||||
|
// Author: Josh Kelley (joshkel@gmail.com)
|
||||||
|
//
|
||||||
|
// Google C++ Testing Framework (Google Test)
|
||||||
|
//
|
||||||
|
// C++Builder's IDE cannot build a static library from files with hyphens
|
||||||
|
// in their name. See http://qc.codegear.com/wc/qcmain.aspx?d=70977 .
|
||||||
|
// This file serves as a workaround.
|
||||||
|
|
||||||
|
#include "src/gtest-all.cc"
|
||||||
40
third_party/googletest/src/codegear/gtest_link.cc
vendored
Normal file
40
third_party/googletest/src/codegear/gtest_link.cc
vendored
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
// Copyright 2009, Google Inc.
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions are
|
||||||
|
// met:
|
||||||
|
//
|
||||||
|
// * Redistributions of source code must retain the above copyright
|
||||||
|
// notice, this list of conditions and the following disclaimer.
|
||||||
|
// * Redistributions in binary form must reproduce the above
|
||||||
|
// copyright notice, this list of conditions and the following disclaimer
|
||||||
|
// in the documentation and/or other materials provided with the
|
||||||
|
// distribution.
|
||||||
|
// * Neither the name of Google Inc. nor the names of its
|
||||||
|
// contributors may be used to endorse or promote products derived from
|
||||||
|
// this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
//
|
||||||
|
// Author: Josh Kelley (joshkel@gmail.com)
|
||||||
|
//
|
||||||
|
// Google C++ Testing Framework (Google Test)
|
||||||
|
//
|
||||||
|
// Links gtest.lib and gtest_main.lib into the current project in C++Builder.
|
||||||
|
// This means that these libraries can't be renamed, but it's the only way to
|
||||||
|
// ensure that Debug versus Release test builds are linked against the
|
||||||
|
// appropriate Debug or Release build of the libraries.
|
||||||
|
|
||||||
|
#pragma link "gtest.lib"
|
||||||
|
#pragma link "gtest_main.lib"
|
||||||
82
third_party/googletest/src/codegear/gtest_main.cbproj
vendored
Normal file
82
third_party/googletest/src/codegear/gtest_main.cbproj
vendored
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<ProjectGuid>{bca37a72-5b07-46cf-b44e-89f8e06451a2}</ProjectGuid>
|
||||||
|
<Config Condition="'$(Config)'==''">Release</Config>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
|
||||||
|
<Base>true</Base>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''">
|
||||||
|
<Base>true</Base>
|
||||||
|
<Cfg_1>true</Cfg_1>
|
||||||
|
<CfgParent>Base</CfgParent>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''">
|
||||||
|
<Base>true</Base>
|
||||||
|
<Cfg_2>true</Cfg_2>
|
||||||
|
<CfgParent>Base</CfgParent>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Base)'!=''">
|
||||||
|
<BCC_OptimizeForSpeed>true</BCC_OptimizeForSpeed>
|
||||||
|
<OutputExt>lib</OutputExt>
|
||||||
|
<DCC_CBuilderOutput>JPHNE</DCC_CBuilderOutput>
|
||||||
|
<Defines>NO_STRICT</Defines>
|
||||||
|
<DynamicRTL>true</DynamicRTL>
|
||||||
|
<UsePackages>true</UsePackages>
|
||||||
|
<ProjectType>CppStaticLibrary</ProjectType>
|
||||||
|
<BCC_CPPCompileAlways>true</BCC_CPPCompileAlways>
|
||||||
|
<PackageImports>rtl.bpi;vcl.bpi;bcbie.bpi;vclx.bpi;vclactnband.bpi;xmlrtl.bpi;bcbsmp.bpi;dbrtl.bpi;vcldb.bpi;bdertl.bpi;vcldbx.bpi;dsnap.bpi;dsnapcon.bpi;vclib.bpi;ibxpress.bpi;adortl.bpi;dbxcds.bpi;dbexpress.bpi;DbxCommonDriver.bpi;websnap.bpi;vclie.bpi;webdsnap.bpi;inet.bpi;inetdbbde.bpi;inetdbxpress.bpi;soaprtl.bpi;Rave75VCL.bpi;teeUI.bpi;tee.bpi;teedb.bpi;IndyCore.bpi;IndySystem.bpi;IndyProtocols.bpi;IntrawebDB_90_100.bpi;Intraweb_90_100.bpi;dclZipForged11.bpi;vclZipForged11.bpi;GR32_BDS2006.bpi;GR32_DSGN_BDS2006.bpi;Jcl.bpi;JclVcl.bpi;JvCoreD11R.bpi;JvSystemD11R.bpi;JvStdCtrlsD11R.bpi;JvAppFrmD11R.bpi;JvBandsD11R.bpi;JvDBD11R.bpi;JvDlgsD11R.bpi;JvBDED11R.bpi;JvCmpD11R.bpi;JvCryptD11R.bpi;JvCtrlsD11R.bpi;JvCustomD11R.bpi;JvDockingD11R.bpi;JvDotNetCtrlsD11R.bpi;JvEDID11R.bpi;JvGlobusD11R.bpi;JvHMID11R.bpi;JvInterpreterD11R.bpi;JvJansD11R.bpi;JvManagedThreadsD11R.bpi;JvMMD11R.bpi;JvNetD11R.bpi;JvPageCompsD11R.bpi;JvPluginD11R.bpi;JvPrintPreviewD11R.bpi;JvRuntimeDesignD11R.bpi;JvTimeFrameworkD11R.bpi;JvValidatorsD11R.bpi;JvWizardD11R.bpi;JvXPCtrlsD11R.bpi;VclSmp.bpi;CExceptionExpert11.bpi</PackageImports>
|
||||||
|
<BCC_wpar>false</BCC_wpar>
|
||||||
|
<IncludePath>$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\src;..\include;..</IncludePath>
|
||||||
|
<AllPackageLibs>rtl.lib;vcl.lib</AllPackageLibs>
|
||||||
|
<TLIB_PageSize>32</TLIB_PageSize>
|
||||||
|
<ILINK_LibraryPath>$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk</ILINK_LibraryPath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Cfg_1)'!=''">
|
||||||
|
<BCC_OptimizeForSpeed>false</BCC_OptimizeForSpeed>
|
||||||
|
<DCC_Optimize>false</DCC_Optimize>
|
||||||
|
<DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>
|
||||||
|
<Defines>_DEBUG;$(Defines)</Defines>
|
||||||
|
<ILINK_FullDebugInfo>true</ILINK_FullDebugInfo>
|
||||||
|
<BCC_InlineFunctionExpansion>false</BCC_InlineFunctionExpansion>
|
||||||
|
<ILINK_DisableIncrementalLinking>true</ILINK_DisableIncrementalLinking>
|
||||||
|
<BCC_UseRegisterVariables>None</BCC_UseRegisterVariables>
|
||||||
|
<DCC_Define>DEBUG</DCC_Define>
|
||||||
|
<BCC_DebugLineNumbers>true</BCC_DebugLineNumbers>
|
||||||
|
<IntermediateOutputDir>Debug</IntermediateOutputDir>
|
||||||
|
<TASM_DisplaySourceLines>true</TASM_DisplaySourceLines>
|
||||||
|
<BCC_StackFrames>true</BCC_StackFrames>
|
||||||
|
<BCC_DisableOptimizations>true</BCC_DisableOptimizations>
|
||||||
|
<ILINK_LibraryPath>$(BDS)\lib\debug;$(ILINK_LibraryPath)</ILINK_LibraryPath>
|
||||||
|
<TASM_Debugging>Full</TASM_Debugging>
|
||||||
|
<BCC_SourceDebuggingOn>true</BCC_SourceDebuggingOn>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Cfg_2)'!=''">
|
||||||
|
<Defines>NDEBUG;$(Defines)</Defines>
|
||||||
|
<IntermediateOutputDir>Release</IntermediateOutputDir>
|
||||||
|
<ILINK_LibraryPath>$(BDS)\lib\release;$(ILINK_LibraryPath)</ILINK_LibraryPath>
|
||||||
|
<TASM_Debugging>None</TASM_Debugging>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ProjectExtensions>
|
||||||
|
<Borland.Personality>CPlusPlusBuilder.Personality</Borland.Personality>
|
||||||
|
<Borland.ProjectType>CppStaticLibrary</Borland.ProjectType>
|
||||||
|
<BorlandProject>
|
||||||
|
<BorlandProject><CPlusPlusBuilder.Personality><VersionInfo><VersionInfo Name="IncludeVerInfo">False</VersionInfo><VersionInfo Name="AutoIncBuild">False</VersionInfo><VersionInfo Name="MajorVer">1</VersionInfo><VersionInfo Name="MinorVer">0</VersionInfo><VersionInfo Name="Release">0</VersionInfo><VersionInfo Name="Build">0</VersionInfo><VersionInfo Name="Debug">False</VersionInfo><VersionInfo Name="PreRelease">False</VersionInfo><VersionInfo Name="Special">False</VersionInfo><VersionInfo Name="Private">False</VersionInfo><VersionInfo Name="DLL">False</VersionInfo><VersionInfo Name="Locale">1033</VersionInfo><VersionInfo Name="CodePage">1252</VersionInfo></VersionInfo><VersionInfoKeys><VersionInfoKeys Name="CompanyName"></VersionInfoKeys><VersionInfoKeys Name="FileDescription"></VersionInfoKeys><VersionInfoKeys Name="FileVersion">1.0.0.0</VersionInfoKeys><VersionInfoKeys Name="InternalName"></VersionInfoKeys><VersionInfoKeys Name="LegalCopyright"></VersionInfoKeys><VersionInfoKeys Name="LegalTrademarks"></VersionInfoKeys><VersionInfoKeys Name="OriginalFilename"></VersionInfoKeys><VersionInfoKeys Name="ProductName"></VersionInfoKeys><VersionInfoKeys Name="ProductVersion">1.0.0.0</VersionInfoKeys><VersionInfoKeys Name="Comments"></VersionInfoKeys></VersionInfoKeys><Debugging><Debugging Name="DebugSourceDirs"></Debugging></Debugging><Parameters><Parameters Name="RunParams"></Parameters><Parameters Name="Launcher"></Parameters><Parameters Name="UseLauncher">False</Parameters><Parameters Name="DebugCWD"></Parameters><Parameters Name="HostApplication"></Parameters><Parameters Name="RemoteHost"></Parameters><Parameters Name="RemotePath"></Parameters><Parameters Name="RemoteParams"></Parameters><Parameters Name="RemoteLauncher"></Parameters><Parameters Name="UseRemoteLauncher">False</Parameters><Parameters Name="RemoteCWD"></Parameters><Parameters Name="RemoteDebug">False</Parameters><Parameters Name="Debug Symbols Search Path"></Parameters><Parameters Name="LoadAllSymbols">True</Parameters><Parameters Name="LoadUnspecifiedSymbols">False</Parameters></Parameters><Excluded_Packages>
|
||||||
|
<Excluded_Packages Name="$(BDS)\bin\bcboffice2k100.bpl">CodeGear C++Builder Office 2000 Servers Package</Excluded_Packages>
|
||||||
|
<Excluded_Packages Name="$(BDS)\bin\bcbofficexp100.bpl">CodeGear C++Builder Office XP Servers Package</Excluded_Packages>
|
||||||
|
</Excluded_Packages><Linker><Linker Name="LibPrefix"></Linker><Linker Name="LibSuffix"></Linker><Linker Name="LibVersion"></Linker></Linker><ProjectProperties><ProjectProperties Name="AutoShowDeps">False</ProjectProperties><ProjectProperties Name="ManagePaths">True</ProjectProperties><ProjectProperties Name="VerifyPackages">True</ProjectProperties></ProjectProperties><HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name="Count">3</HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name="Item0">$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\src;..\include;..</HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name="Item1">$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\src;..\include;..</HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name="Item2">$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\src;..\src;..\include</HistoryLists_hlIncludePath></HistoryLists_hlIncludePath><HistoryLists_hlILINK_LibraryPath><HistoryLists_hlILINK_LibraryPath Name="Count">1</HistoryLists_hlILINK_LibraryPath><HistoryLists_hlILINK_LibraryPath Name="Item0">$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk</HistoryLists_hlILINK_LibraryPath></HistoryLists_hlILINK_LibraryPath><HistoryLists_hlDefines><HistoryLists_hlDefines Name="Count">1</HistoryLists_hlDefines><HistoryLists_hlDefines Name="Item0">NO_STRICT</HistoryLists_hlDefines></HistoryLists_hlDefines><HistoryLists_hlTLIB_PageSize><HistoryLists_hlTLIB_PageSize Name="Count">1</HistoryLists_hlTLIB_PageSize><HistoryLists_hlTLIB_PageSize Name="Item0">32</HistoryLists_hlTLIB_PageSize><HistoryLists_hlTLIB_PageSize Name="Item1">16</HistoryLists_hlTLIB_PageSize></HistoryLists_hlTLIB_PageSize></CPlusPlusBuilder.Personality></BorlandProject></BorlandProject>
|
||||||
|
</ProjectExtensions>
|
||||||
|
<Import Project="$(MSBuildBinPath)\Borland.Cpp.Targets" />
|
||||||
|
<ItemGroup>
|
||||||
|
<CppCompile Include="..\src\gtest_main.cc">
|
||||||
|
<BuildOrder>0</BuildOrder>
|
||||||
|
</CppCompile>
|
||||||
|
<BuildConfiguration Include="Debug">
|
||||||
|
<Key>Cfg_1</Key>
|
||||||
|
</BuildConfiguration>
|
||||||
|
<BuildConfiguration Include="Release">
|
||||||
|
<Key>Cfg_2</Key>
|
||||||
|
</BuildConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
||||||
88
third_party/googletest/src/codegear/gtest_unittest.cbproj
vendored
Normal file
88
third_party/googletest/src/codegear/gtest_unittest.cbproj
vendored
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<ProjectGuid>{eea63393-5ac5-4b9c-8909-d75fef2daa41}</ProjectGuid>
|
||||||
|
<Config Condition="'$(Config)'==''">Release</Config>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
|
||||||
|
<Base>true</Base>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''">
|
||||||
|
<Base>true</Base>
|
||||||
|
<Cfg_1>true</Cfg_1>
|
||||||
|
<CfgParent>Base</CfgParent>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''">
|
||||||
|
<Base>true</Base>
|
||||||
|
<Cfg_2>true</Cfg_2>
|
||||||
|
<CfgParent>Base</CfgParent>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Base)'!=''">
|
||||||
|
<OutputExt>exe</OutputExt>
|
||||||
|
<BCC_OptimizeForSpeed>true</BCC_OptimizeForSpeed>
|
||||||
|
<Defines>NO_STRICT</Defines>
|
||||||
|
<DCC_CBuilderOutput>JPHNE</DCC_CBuilderOutput>
|
||||||
|
<DynamicRTL>true</DynamicRTL>
|
||||||
|
<ILINK_ObjectSearchPath>..\test</ILINK_ObjectSearchPath>
|
||||||
|
<UsePackages>true</UsePackages>
|
||||||
|
<ProjectType>CppConsoleApplication</ProjectType>
|
||||||
|
<NoVCL>true</NoVCL>
|
||||||
|
<BCC_CPPCompileAlways>true</BCC_CPPCompileAlways>
|
||||||
|
<PackageImports>rtl.bpi;vcl.bpi;bcbie.bpi;vclx.bpi;vclactnband.bpi;xmlrtl.bpi;bcbsmp.bpi;dbrtl.bpi;vcldb.bpi;bdertl.bpi;vcldbx.bpi;dsnap.bpi;dsnapcon.bpi;vclib.bpi;ibxpress.bpi;adortl.bpi;dbxcds.bpi;dbexpress.bpi;DbxCommonDriver.bpi;websnap.bpi;vclie.bpi;webdsnap.bpi;inet.bpi;inetdbbde.bpi;inetdbxpress.bpi;soaprtl.bpi;Rave75VCL.bpi;teeUI.bpi;tee.bpi;teedb.bpi;IndyCore.bpi;IndySystem.bpi;IndyProtocols.bpi;IntrawebDB_90_100.bpi;Intraweb_90_100.bpi;Jcl.bpi;JclVcl.bpi;JvCoreD11R.bpi;JvSystemD11R.bpi;JvStdCtrlsD11R.bpi;JvAppFrmD11R.bpi;JvBandsD11R.bpi;JvDBD11R.bpi;JvDlgsD11R.bpi;JvBDED11R.bpi;JvCmpD11R.bpi;JvCryptD11R.bpi;JvCtrlsD11R.bpi;JvCustomD11R.bpi;JvDockingD11R.bpi;JvDotNetCtrlsD11R.bpi;JvEDID11R.bpi;JvGlobusD11R.bpi;JvHMID11R.bpi;JvInterpreterD11R.bpi;JvJansD11R.bpi;JvManagedThreadsD11R.bpi;JvMMD11R.bpi;JvNetD11R.bpi;JvPageCompsD11R.bpi;JvPluginD11R.bpi;JvPrintPreviewD11R.bpi;JvRuntimeDesignD11R.bpi;JvTimeFrameworkD11R.bpi;JvValidatorsD11R.bpi;JvWizardD11R.bpi;JvXPCtrlsD11R.bpi;VclSmp.bpi</PackageImports>
|
||||||
|
<BCC_wpar>false</BCC_wpar>
|
||||||
|
<IncludePath>$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\include;..\test;..</IncludePath>
|
||||||
|
<ILINK_LibraryPath>$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk;..\test</ILINK_LibraryPath>
|
||||||
|
<Multithreaded>true</Multithreaded>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Cfg_1)'!=''">
|
||||||
|
<BCC_OptimizeForSpeed>false</BCC_OptimizeForSpeed>
|
||||||
|
<DCC_Optimize>false</DCC_Optimize>
|
||||||
|
<DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>
|
||||||
|
<Defines>_DEBUG;$(Defines)</Defines>
|
||||||
|
<ILINK_FullDebugInfo>true</ILINK_FullDebugInfo>
|
||||||
|
<BCC_InlineFunctionExpansion>false</BCC_InlineFunctionExpansion>
|
||||||
|
<ILINK_DisableIncrementalLinking>true</ILINK_DisableIncrementalLinking>
|
||||||
|
<BCC_UseRegisterVariables>None</BCC_UseRegisterVariables>
|
||||||
|
<DCC_Define>DEBUG</DCC_Define>
|
||||||
|
<BCC_DebugLineNumbers>true</BCC_DebugLineNumbers>
|
||||||
|
<IntermediateOutputDir>Debug</IntermediateOutputDir>
|
||||||
|
<TASM_DisplaySourceLines>true</TASM_DisplaySourceLines>
|
||||||
|
<BCC_StackFrames>true</BCC_StackFrames>
|
||||||
|
<BCC_DisableOptimizations>true</BCC_DisableOptimizations>
|
||||||
|
<ILINK_LibraryPath>$(BDS)\lib\debug;$(ILINK_LibraryPath)</ILINK_LibraryPath>
|
||||||
|
<TASM_Debugging>Full</TASM_Debugging>
|
||||||
|
<BCC_SourceDebuggingOn>true</BCC_SourceDebuggingOn>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Cfg_2)'!=''">
|
||||||
|
<Defines>NDEBUG;$(Defines)</Defines>
|
||||||
|
<IntermediateOutputDir>Release</IntermediateOutputDir>
|
||||||
|
<ILINK_LibraryPath>$(BDS)\lib\release;$(ILINK_LibraryPath)</ILINK_LibraryPath>
|
||||||
|
<TASM_Debugging>None</TASM_Debugging>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ProjectExtensions>
|
||||||
|
<Borland.Personality>CPlusPlusBuilder.Personality</Borland.Personality>
|
||||||
|
<Borland.ProjectType>CppConsoleApplication</Borland.ProjectType>
|
||||||
|
<BorlandProject>
|
||||||
|
<BorlandProject><CPlusPlusBuilder.Personality><VersionInfo><VersionInfo Name="IncludeVerInfo">False</VersionInfo><VersionInfo Name="AutoIncBuild">False</VersionInfo><VersionInfo Name="MajorVer">1</VersionInfo><VersionInfo Name="MinorVer">0</VersionInfo><VersionInfo Name="Release">0</VersionInfo><VersionInfo Name="Build">0</VersionInfo><VersionInfo Name="Debug">False</VersionInfo><VersionInfo Name="PreRelease">False</VersionInfo><VersionInfo Name="Special">False</VersionInfo><VersionInfo Name="Private">False</VersionInfo><VersionInfo Name="DLL">False</VersionInfo><VersionInfo Name="Locale">1033</VersionInfo><VersionInfo Name="CodePage">1252</VersionInfo></VersionInfo><VersionInfoKeys><VersionInfoKeys Name="CompanyName"></VersionInfoKeys><VersionInfoKeys Name="FileDescription"></VersionInfoKeys><VersionInfoKeys Name="FileVersion">1.0.0.0</VersionInfoKeys><VersionInfoKeys Name="InternalName"></VersionInfoKeys><VersionInfoKeys Name="LegalCopyright"></VersionInfoKeys><VersionInfoKeys Name="LegalTrademarks"></VersionInfoKeys><VersionInfoKeys Name="OriginalFilename"></VersionInfoKeys><VersionInfoKeys Name="ProductName"></VersionInfoKeys><VersionInfoKeys Name="ProductVersion">1.0.0.0</VersionInfoKeys><VersionInfoKeys Name="Comments"></VersionInfoKeys></VersionInfoKeys><Debugging><Debugging Name="DebugSourceDirs"></Debugging></Debugging><Parameters><Parameters Name="RunParams"></Parameters><Parameters Name="Launcher"></Parameters><Parameters Name="UseLauncher">False</Parameters><Parameters Name="DebugCWD"></Parameters><Parameters Name="HostApplication"></Parameters><Parameters Name="RemoteHost"></Parameters><Parameters Name="RemotePath"></Parameters><Parameters Name="RemoteParams"></Parameters><Parameters Name="RemoteLauncher"></Parameters><Parameters Name="UseRemoteLauncher">False</Parameters><Parameters Name="RemoteCWD"></Parameters><Parameters Name="RemoteDebug">False</Parameters><Parameters Name="Debug Symbols Search Path"></Parameters><Parameters Name="LoadAllSymbols">True</Parameters><Parameters Name="LoadUnspecifiedSymbols">False</Parameters></Parameters><Excluded_Packages>
|
||||||
|
|
||||||
|
|
||||||
|
<Excluded_Packages Name="$(BDS)\bin\bcboffice2k100.bpl">CodeGear C++Builder Office 2000 Servers Package</Excluded_Packages>
|
||||||
|
<Excluded_Packages Name="$(BDS)\bin\bcbofficexp100.bpl">CodeGear C++Builder Office XP Servers Package</Excluded_Packages>
|
||||||
|
</Excluded_Packages><Linker><Linker Name="LibPrefix"></Linker><Linker Name="LibSuffix"></Linker><Linker Name="LibVersion"></Linker></Linker><ProjectProperties><ProjectProperties Name="AutoShowDeps">False</ProjectProperties><ProjectProperties Name="ManagePaths">True</ProjectProperties><ProjectProperties Name="VerifyPackages">True</ProjectProperties></ProjectProperties><HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name="Count">3</HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name="Item0">$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\include;..\test;..</HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name="Item1">$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\include;..\test</HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name="Item2">$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\include</HistoryLists_hlIncludePath></HistoryLists_hlIncludePath><HistoryLists_hlILINK_LibraryPath><HistoryLists_hlILINK_LibraryPath Name="Count">1</HistoryLists_hlILINK_LibraryPath><HistoryLists_hlILINK_LibraryPath Name="Item0">$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk;..\test</HistoryLists_hlILINK_LibraryPath><HistoryLists_hlILINK_LibraryPath Name="Item1">$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk;..\test</HistoryLists_hlILINK_LibraryPath><HistoryLists_hlILINK_LibraryPath Name="Item2">$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk;$(OUTPUTDIR);..\test</HistoryLists_hlILINK_LibraryPath></HistoryLists_hlILINK_LibraryPath><HistoryLists_hlDefines><HistoryLists_hlDefines Name="Count">2</HistoryLists_hlDefines><HistoryLists_hlDefines Name="Item0">NO_STRICT</HistoryLists_hlDefines><HistoryLists_hlDefines Name="Item1">STRICT</HistoryLists_hlDefines></HistoryLists_hlDefines></CPlusPlusBuilder.Personality></BorlandProject></BorlandProject>
|
||||||
|
</ProjectExtensions>
|
||||||
|
<Import Project="$(MSBuildBinPath)\Borland.Cpp.Targets" />
|
||||||
|
<ItemGroup>
|
||||||
|
<CppCompile Include="..\test\gtest_unittest.cc">
|
||||||
|
<BuildOrder>0</BuildOrder>
|
||||||
|
</CppCompile>
|
||||||
|
<CppCompile Include="gtest_link.cc">
|
||||||
|
<BuildOrder>1</BuildOrder>
|
||||||
|
</CppCompile>
|
||||||
|
<BuildConfiguration Include="Debug">
|
||||||
|
<Key>Cfg_1</Key>
|
||||||
|
</BuildConfiguration>
|
||||||
|
<BuildConfiguration Include="Release">
|
||||||
|
<Key>Cfg_2</Key>
|
||||||
|
</BuildConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
||||||
68
third_party/googletest/src/configure.ac
vendored
Normal file
68
third_party/googletest/src/configure.ac
vendored
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
m4_include(m4/acx_pthread.m4)
|
||||||
|
|
||||||
|
# At this point, the Xcode project assumes the version string will be three
|
||||||
|
# integers separated by periods and surrounded by square brackets (e.g.
|
||||||
|
# "[1.0.1]"). It also asumes that there won't be any closing parenthesis
|
||||||
|
# between "AC_INIT(" and the closing ")" including comments and strings.
|
||||||
|
AC_INIT([Google C++ Testing Framework],
|
||||||
|
[1.6.0],
|
||||||
|
[googletestframework@googlegroups.com],
|
||||||
|
[gtest])
|
||||||
|
|
||||||
|
# Provide various options to initialize the Autoconf and configure processes.
|
||||||
|
AC_PREREQ([2.59])
|
||||||
|
AC_CONFIG_SRCDIR([./COPYING])
|
||||||
|
AC_CONFIG_MACRO_DIR([m4])
|
||||||
|
AC_CONFIG_AUX_DIR([build-aux])
|
||||||
|
AC_CONFIG_HEADERS([build-aux/config.h])
|
||||||
|
AC_CONFIG_FILES([Makefile])
|
||||||
|
AC_CONFIG_FILES([scripts/gtest-config], [chmod +x scripts/gtest-config])
|
||||||
|
|
||||||
|
# Initialize Automake with various options. We require at least v1.9, prevent
|
||||||
|
# pedantic complaints about package files, and enable various distribution
|
||||||
|
# targets.
|
||||||
|
AM_INIT_AUTOMAKE([1.9 dist-bzip2 dist-zip foreign subdir-objects])
|
||||||
|
|
||||||
|
# Check for programs used in building Google Test.
|
||||||
|
AC_PROG_CC
|
||||||
|
AC_PROG_CXX
|
||||||
|
AC_LANG([C++])
|
||||||
|
AC_PROG_LIBTOOL
|
||||||
|
|
||||||
|
# TODO(chandlerc@google.com): Currently we aren't running the Python tests
|
||||||
|
# against the interpreter detected by AM_PATH_PYTHON, and so we condition
|
||||||
|
# HAVE_PYTHON by requiring "python" to be in the PATH, and that interpreter's
|
||||||
|
# version to be >= 2.3. This will allow the scripts to use a "/usr/bin/env"
|
||||||
|
# hashbang.
|
||||||
|
PYTHON= # We *do not* allow the user to specify a python interpreter
|
||||||
|
AC_PATH_PROG([PYTHON],[python],[:])
|
||||||
|
AS_IF([test "$PYTHON" != ":"],
|
||||||
|
[AM_PYTHON_CHECK_VERSION([$PYTHON],[2.3],[:],[PYTHON=":"])])
|
||||||
|
AM_CONDITIONAL([HAVE_PYTHON],[test "$PYTHON" != ":"])
|
||||||
|
|
||||||
|
# Configure pthreads.
|
||||||
|
AC_ARG_WITH([pthreads],
|
||||||
|
[AS_HELP_STRING([--with-pthreads],
|
||||||
|
[use pthreads (default is yes)])],
|
||||||
|
[with_pthreads=$withval],
|
||||||
|
[with_pthreads=check])
|
||||||
|
|
||||||
|
have_pthreads=no
|
||||||
|
AS_IF([test "x$with_pthreads" != "xno"],
|
||||||
|
[ACX_PTHREAD(
|
||||||
|
[],
|
||||||
|
[AS_IF([test "x$with_pthreads" != "xcheck"],
|
||||||
|
[AC_MSG_FAILURE(
|
||||||
|
[--with-pthreads was specified, but unable to be used])])])
|
||||||
|
have_pthreads="$acx_pthread_ok"])
|
||||||
|
AM_CONDITIONAL([HAVE_PTHREADS],[test "x$have_pthreads" == "xyes"])
|
||||||
|
AC_SUBST(PTHREAD_CFLAGS)
|
||||||
|
AC_SUBST(PTHREAD_LIBS)
|
||||||
|
|
||||||
|
# TODO(chandlerc@google.com) Check for the necessary system headers.
|
||||||
|
|
||||||
|
# TODO(chandlerc@google.com) Check the types, structures, and other compiler
|
||||||
|
# and architecture characteristics.
|
||||||
|
|
||||||
|
# Output the generated files. No further autoconf macros may be used.
|
||||||
|
AC_OUTPUT
|
||||||
283
third_party/googletest/src/include/gtest/gtest-death-test.h
vendored
Normal file
283
third_party/googletest/src/include/gtest/gtest-death-test.h
vendored
Normal file
@@ -0,0 +1,283 @@
|
|||||||
|
// Copyright 2005, Google Inc.
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions are
|
||||||
|
// met:
|
||||||
|
//
|
||||||
|
// * Redistributions of source code must retain the above copyright
|
||||||
|
// notice, this list of conditions and the following disclaimer.
|
||||||
|
// * Redistributions in binary form must reproduce the above
|
||||||
|
// copyright notice, this list of conditions and the following disclaimer
|
||||||
|
// in the documentation and/or other materials provided with the
|
||||||
|
// distribution.
|
||||||
|
// * Neither the name of Google Inc. nor the names of its
|
||||||
|
// contributors may be used to endorse or promote products derived from
|
||||||
|
// this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
//
|
||||||
|
// Author: wan@google.com (Zhanyong Wan)
|
||||||
|
//
|
||||||
|
// The Google C++ Testing Framework (Google Test)
|
||||||
|
//
|
||||||
|
// This header file defines the public API for death tests. It is
|
||||||
|
// #included by gtest.h so a user doesn't need to include this
|
||||||
|
// directly.
|
||||||
|
|
||||||
|
#ifndef GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
|
||||||
|
#define GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
|
||||||
|
|
||||||
|
#include "gtest/internal/gtest-death-test-internal.h"
|
||||||
|
|
||||||
|
namespace testing {
|
||||||
|
|
||||||
|
// This flag controls the style of death tests. Valid values are "threadsafe",
|
||||||
|
// meaning that the death test child process will re-execute the test binary
|
||||||
|
// from the start, running only a single death test, or "fast",
|
||||||
|
// meaning that the child process will execute the test logic immediately
|
||||||
|
// after forking.
|
||||||
|
GTEST_DECLARE_string_(death_test_style);
|
||||||
|
|
||||||
|
#if GTEST_HAS_DEATH_TEST
|
||||||
|
|
||||||
|
// The following macros are useful for writing death tests.
|
||||||
|
|
||||||
|
// Here's what happens when an ASSERT_DEATH* or EXPECT_DEATH* is
|
||||||
|
// executed:
|
||||||
|
//
|
||||||
|
// 1. It generates a warning if there is more than one active
|
||||||
|
// thread. This is because it's safe to fork() or clone() only
|
||||||
|
// when there is a single thread.
|
||||||
|
//
|
||||||
|
// 2. The parent process clone()s a sub-process and runs the death
|
||||||
|
// test in it; the sub-process exits with code 0 at the end of the
|
||||||
|
// death test, if it hasn't exited already.
|
||||||
|
//
|
||||||
|
// 3. The parent process waits for the sub-process to terminate.
|
||||||
|
//
|
||||||
|
// 4. The parent process checks the exit code and error message of
|
||||||
|
// the sub-process.
|
||||||
|
//
|
||||||
|
// Examples:
|
||||||
|
//
|
||||||
|
// ASSERT_DEATH(server.SendMessage(56, "Hello"), "Invalid port number");
|
||||||
|
// for (int i = 0; i < 5; i++) {
|
||||||
|
// EXPECT_DEATH(server.ProcessRequest(i),
|
||||||
|
// "Invalid request .* in ProcessRequest()")
|
||||||
|
// << "Failed to die on request " << i);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// ASSERT_EXIT(server.ExitNow(), ::testing::ExitedWithCode(0), "Exiting");
|
||||||
|
//
|
||||||
|
// bool KilledBySIGHUP(int exit_code) {
|
||||||
|
// return WIFSIGNALED(exit_code) && WTERMSIG(exit_code) == SIGHUP;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// ASSERT_EXIT(client.HangUpServer(), KilledBySIGHUP, "Hanging up!");
|
||||||
|
//
|
||||||
|
// On the regular expressions used in death tests:
|
||||||
|
//
|
||||||
|
// On POSIX-compliant systems (*nix), we use the <regex.h> library,
|
||||||
|
// which uses the POSIX extended regex syntax.
|
||||||
|
//
|
||||||
|
// On other platforms (e.g. Windows), we only support a simple regex
|
||||||
|
// syntax implemented as part of Google Test. This limited
|
||||||
|
// implementation should be enough most of the time when writing
|
||||||
|
// death tests; though it lacks many features you can find in PCRE
|
||||||
|
// or POSIX extended regex syntax. For example, we don't support
|
||||||
|
// union ("x|y"), grouping ("(xy)"), brackets ("[xy]"), and
|
||||||
|
// repetition count ("x{5,7}"), among others.
|
||||||
|
//
|
||||||
|
// Below is the syntax that we do support. We chose it to be a
|
||||||
|
// subset of both PCRE and POSIX extended regex, so it's easy to
|
||||||
|
// learn wherever you come from. In the following: 'A' denotes a
|
||||||
|
// literal character, period (.), or a single \\ escape sequence;
|
||||||
|
// 'x' and 'y' denote regular expressions; 'm' and 'n' are for
|
||||||
|
// natural numbers.
|
||||||
|
//
|
||||||
|
// c matches any literal character c
|
||||||
|
// \\d matches any decimal digit
|
||||||
|
// \\D matches any character that's not a decimal digit
|
||||||
|
// \\f matches \f
|
||||||
|
// \\n matches \n
|
||||||
|
// \\r matches \r
|
||||||
|
// \\s matches any ASCII whitespace, including \n
|
||||||
|
// \\S matches any character that's not a whitespace
|
||||||
|
// \\t matches \t
|
||||||
|
// \\v matches \v
|
||||||
|
// \\w matches any letter, _, or decimal digit
|
||||||
|
// \\W matches any character that \\w doesn't match
|
||||||
|
// \\c matches any literal character c, which must be a punctuation
|
||||||
|
// . matches any single character except \n
|
||||||
|
// A? matches 0 or 1 occurrences of A
|
||||||
|
// A* matches 0 or many occurrences of A
|
||||||
|
// A+ matches 1 or many occurrences of A
|
||||||
|
// ^ matches the beginning of a string (not that of each line)
|
||||||
|
// $ matches the end of a string (not that of each line)
|
||||||
|
// xy matches x followed by y
|
||||||
|
//
|
||||||
|
// If you accidentally use PCRE or POSIX extended regex features
|
||||||
|
// not implemented by us, you will get a run-time failure. In that
|
||||||
|
// case, please try to rewrite your regular expression within the
|
||||||
|
// above syntax.
|
||||||
|
//
|
||||||
|
// This implementation is *not* meant to be as highly tuned or robust
|
||||||
|
// as a compiled regex library, but should perform well enough for a
|
||||||
|
// death test, which already incurs significant overhead by launching
|
||||||
|
// a child process.
|
||||||
|
//
|
||||||
|
// Known caveats:
|
||||||
|
//
|
||||||
|
// A "threadsafe" style death test obtains the path to the test
|
||||||
|
// program from argv[0] and re-executes it in the sub-process. For
|
||||||
|
// simplicity, the current implementation doesn't search the PATH
|
||||||
|
// when launching the sub-process. This means that the user must
|
||||||
|
// invoke the test program via a path that contains at least one
|
||||||
|
// path separator (e.g. path/to/foo_test and
|
||||||
|
// /absolute/path/to/bar_test are fine, but foo_test is not). This
|
||||||
|
// is rarely a problem as people usually don't put the test binary
|
||||||
|
// directory in PATH.
|
||||||
|
//
|
||||||
|
// TODO(wan@google.com): make thread-safe death tests search the PATH.
|
||||||
|
|
||||||
|
// Asserts that a given statement causes the program to exit, with an
|
||||||
|
// integer exit status that satisfies predicate, and emitting error output
|
||||||
|
// that matches regex.
|
||||||
|
# define ASSERT_EXIT(statement, predicate, regex) \
|
||||||
|
GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_FATAL_FAILURE_)
|
||||||
|
|
||||||
|
// Like ASSERT_EXIT, but continues on to successive tests in the
|
||||||
|
// test case, if any:
|
||||||
|
# define EXPECT_EXIT(statement, predicate, regex) \
|
||||||
|
GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_NONFATAL_FAILURE_)
|
||||||
|
|
||||||
|
// Asserts that a given statement causes the program to exit, either by
|
||||||
|
// explicitly exiting with a nonzero exit code or being killed by a
|
||||||
|
// signal, and emitting error output that matches regex.
|
||||||
|
# define ASSERT_DEATH(statement, regex) \
|
||||||
|
ASSERT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)
|
||||||
|
|
||||||
|
// Like ASSERT_DEATH, but continues on to successive tests in the
|
||||||
|
// test case, if any:
|
||||||
|
# define EXPECT_DEATH(statement, regex) \
|
||||||
|
EXPECT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)
|
||||||
|
|
||||||
|
// Two predicate classes that can be used in {ASSERT,EXPECT}_EXIT*:
|
||||||
|
|
||||||
|
// Tests that an exit code describes a normal exit with a given exit code.
|
||||||
|
class GTEST_API_ ExitedWithCode {
|
||||||
|
public:
|
||||||
|
explicit ExitedWithCode(int exit_code);
|
||||||
|
bool operator()(int exit_status) const;
|
||||||
|
private:
|
||||||
|
// No implementation - assignment is unsupported.
|
||||||
|
void operator=(const ExitedWithCode& other);
|
||||||
|
|
||||||
|
const int exit_code_;
|
||||||
|
};
|
||||||
|
|
||||||
|
# if !GTEST_OS_WINDOWS
|
||||||
|
// Tests that an exit code describes an exit due to termination by a
|
||||||
|
// given signal.
|
||||||
|
class GTEST_API_ KilledBySignal {
|
||||||
|
public:
|
||||||
|
explicit KilledBySignal(int signum);
|
||||||
|
bool operator()(int exit_status) const;
|
||||||
|
private:
|
||||||
|
const int signum_;
|
||||||
|
};
|
||||||
|
# endif // !GTEST_OS_WINDOWS
|
||||||
|
|
||||||
|
// EXPECT_DEBUG_DEATH asserts that the given statements die in debug mode.
|
||||||
|
// The death testing framework causes this to have interesting semantics,
|
||||||
|
// since the sideeffects of the call are only visible in opt mode, and not
|
||||||
|
// in debug mode.
|
||||||
|
//
|
||||||
|
// In practice, this can be used to test functions that utilize the
|
||||||
|
// LOG(DFATAL) macro using the following style:
|
||||||
|
//
|
||||||
|
// int DieInDebugOr12(int* sideeffect) {
|
||||||
|
// if (sideeffect) {
|
||||||
|
// *sideeffect = 12;
|
||||||
|
// }
|
||||||
|
// LOG(DFATAL) << "death";
|
||||||
|
// return 12;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// TEST(TestCase, TestDieOr12WorksInDgbAndOpt) {
|
||||||
|
// int sideeffect = 0;
|
||||||
|
// // Only asserts in dbg.
|
||||||
|
// EXPECT_DEBUG_DEATH(DieInDebugOr12(&sideeffect), "death");
|
||||||
|
//
|
||||||
|
// #ifdef NDEBUG
|
||||||
|
// // opt-mode has sideeffect visible.
|
||||||
|
// EXPECT_EQ(12, sideeffect);
|
||||||
|
// #else
|
||||||
|
// // dbg-mode no visible sideeffect.
|
||||||
|
// EXPECT_EQ(0, sideeffect);
|
||||||
|
// #endif
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// This will assert that DieInDebugReturn12InOpt() crashes in debug
|
||||||
|
// mode, usually due to a DCHECK or LOG(DFATAL), but returns the
|
||||||
|
// appropriate fallback value (12 in this case) in opt mode. If you
|
||||||
|
// need to test that a function has appropriate side-effects in opt
|
||||||
|
// mode, include assertions against the side-effects. A general
|
||||||
|
// pattern for this is:
|
||||||
|
//
|
||||||
|
// EXPECT_DEBUG_DEATH({
|
||||||
|
// // Side-effects here will have an effect after this statement in
|
||||||
|
// // opt mode, but none in debug mode.
|
||||||
|
// EXPECT_EQ(12, DieInDebugOr12(&sideeffect));
|
||||||
|
// }, "death");
|
||||||
|
//
|
||||||
|
# ifdef NDEBUG
|
||||||
|
|
||||||
|
# define EXPECT_DEBUG_DEATH(statement, regex) \
|
||||||
|
do { statement; } while (::testing::internal::AlwaysFalse())
|
||||||
|
|
||||||
|
# define ASSERT_DEBUG_DEATH(statement, regex) \
|
||||||
|
do { statement; } while (::testing::internal::AlwaysFalse())
|
||||||
|
|
||||||
|
# else
|
||||||
|
|
||||||
|
# define EXPECT_DEBUG_DEATH(statement, regex) \
|
||||||
|
EXPECT_DEATH(statement, regex)
|
||||||
|
|
||||||
|
# define ASSERT_DEBUG_DEATH(statement, regex) \
|
||||||
|
ASSERT_DEATH(statement, regex)
|
||||||
|
|
||||||
|
# endif // NDEBUG for EXPECT_DEBUG_DEATH
|
||||||
|
#endif // GTEST_HAS_DEATH_TEST
|
||||||
|
|
||||||
|
// EXPECT_DEATH_IF_SUPPORTED(statement, regex) and
|
||||||
|
// ASSERT_DEATH_IF_SUPPORTED(statement, regex) expand to real death tests if
|
||||||
|
// death tests are supported; otherwise they just issue a warning. This is
|
||||||
|
// useful when you are combining death test assertions with normal test
|
||||||
|
// assertions in one test.
|
||||||
|
#if GTEST_HAS_DEATH_TEST
|
||||||
|
# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
|
||||||
|
EXPECT_DEATH(statement, regex)
|
||||||
|
# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \
|
||||||
|
ASSERT_DEATH(statement, regex)
|
||||||
|
#else
|
||||||
|
# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
|
||||||
|
GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, )
|
||||||
|
# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \
|
||||||
|
GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, return)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
} // namespace testing
|
||||||
|
|
||||||
|
#endif // GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
|
||||||
230
third_party/googletest/src/include/gtest/gtest-message.h
vendored
Normal file
230
third_party/googletest/src/include/gtest/gtest-message.h
vendored
Normal file
@@ -0,0 +1,230 @@
|
|||||||
|
// Copyright 2005, Google Inc.
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions are
|
||||||
|
// met:
|
||||||
|
//
|
||||||
|
// * Redistributions of source code must retain the above copyright
|
||||||
|
// notice, this list of conditions and the following disclaimer.
|
||||||
|
// * Redistributions in binary form must reproduce the above
|
||||||
|
// copyright notice, this list of conditions and the following disclaimer
|
||||||
|
// in the documentation and/or other materials provided with the
|
||||||
|
// distribution.
|
||||||
|
// * Neither the name of Google Inc. nor the names of its
|
||||||
|
// contributors may be used to endorse or promote products derived from
|
||||||
|
// this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
//
|
||||||
|
// Author: wan@google.com (Zhanyong Wan)
|
||||||
|
//
|
||||||
|
// The Google C++ Testing Framework (Google Test)
|
||||||
|
//
|
||||||
|
// This header file defines the Message class.
|
||||||
|
//
|
||||||
|
// IMPORTANT NOTE: Due to limitation of the C++ language, we have to
|
||||||
|
// leave some internal implementation details in this header file.
|
||||||
|
// They are clearly marked by comments like this:
|
||||||
|
//
|
||||||
|
// // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
|
||||||
|
//
|
||||||
|
// Such code is NOT meant to be used by a user directly, and is subject
|
||||||
|
// to CHANGE WITHOUT NOTICE. Therefore DO NOT DEPEND ON IT in a user
|
||||||
|
// program!
|
||||||
|
|
||||||
|
#ifndef GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
|
||||||
|
#define GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
|
||||||
|
|
||||||
|
#include <limits>
|
||||||
|
|
||||||
|
#include "gtest/internal/gtest-string.h"
|
||||||
|
#include "gtest/internal/gtest-internal.h"
|
||||||
|
|
||||||
|
namespace testing {
|
||||||
|
|
||||||
|
// The Message class works like an ostream repeater.
|
||||||
|
//
|
||||||
|
// Typical usage:
|
||||||
|
//
|
||||||
|
// 1. You stream a bunch of values to a Message object.
|
||||||
|
// It will remember the text in a stringstream.
|
||||||
|
// 2. Then you stream the Message object to an ostream.
|
||||||
|
// This causes the text in the Message to be streamed
|
||||||
|
// to the ostream.
|
||||||
|
//
|
||||||
|
// For example;
|
||||||
|
//
|
||||||
|
// testing::Message foo;
|
||||||
|
// foo << 1 << " != " << 2;
|
||||||
|
// std::cout << foo;
|
||||||
|
//
|
||||||
|
// will print "1 != 2".
|
||||||
|
//
|
||||||
|
// Message is not intended to be inherited from. In particular, its
|
||||||
|
// destructor is not virtual.
|
||||||
|
//
|
||||||
|
// Note that stringstream behaves differently in gcc and in MSVC. You
|
||||||
|
// can stream a NULL char pointer to it in the former, but not in the
|
||||||
|
// latter (it causes an access violation if you do). The Message
|
||||||
|
// class hides this difference by treating a NULL char pointer as
|
||||||
|
// "(null)".
|
||||||
|
class GTEST_API_ Message {
|
||||||
|
private:
|
||||||
|
// The type of basic IO manipulators (endl, ends, and flush) for
|
||||||
|
// narrow streams.
|
||||||
|
typedef std::ostream& (*BasicNarrowIoManip)(std::ostream&);
|
||||||
|
|
||||||
|
public:
|
||||||
|
// Constructs an empty Message.
|
||||||
|
// We allocate the stringstream separately because otherwise each use of
|
||||||
|
// ASSERT/EXPECT in a procedure adds over 200 bytes to the procedure's
|
||||||
|
// stack frame leading to huge stack frames in some cases; gcc does not reuse
|
||||||
|
// the stack space.
|
||||||
|
Message() : ss_(new ::std::stringstream) {
|
||||||
|
// By default, we want there to be enough precision when printing
|
||||||
|
// a double to a Message.
|
||||||
|
*ss_ << std::setprecision(std::numeric_limits<double>::digits10 + 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy constructor.
|
||||||
|
Message(const Message& msg) : ss_(new ::std::stringstream) { // NOLINT
|
||||||
|
*ss_ << msg.GetString();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Constructs a Message from a C-string.
|
||||||
|
explicit Message(const char* str) : ss_(new ::std::stringstream) {
|
||||||
|
*ss_ << str;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if GTEST_OS_SYMBIAN
|
||||||
|
// Streams a value (either a pointer or not) to this object.
|
||||||
|
template <typename T>
|
||||||
|
inline Message& operator <<(const T& value) {
|
||||||
|
StreamHelper(typename internal::is_pointer<T>::type(), value);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
// Streams a non-pointer value to this object.
|
||||||
|
template <typename T>
|
||||||
|
inline Message& operator <<(const T& val) {
|
||||||
|
::GTestStreamToHelper(ss_.get(), val);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Streams a pointer value to this object.
|
||||||
|
//
|
||||||
|
// This function is an overload of the previous one. When you
|
||||||
|
// stream a pointer to a Message, this definition will be used as it
|
||||||
|
// is more specialized. (The C++ Standard, section
|
||||||
|
// [temp.func.order].) If you stream a non-pointer, then the
|
||||||
|
// previous definition will be used.
|
||||||
|
//
|
||||||
|
// The reason for this overload is that streaming a NULL pointer to
|
||||||
|
// ostream is undefined behavior. Depending on the compiler, you
|
||||||
|
// may get "0", "(nil)", "(null)", or an access violation. To
|
||||||
|
// ensure consistent result across compilers, we always treat NULL
|
||||||
|
// as "(null)".
|
||||||
|
template <typename T>
|
||||||
|
inline Message& operator <<(T* const& pointer) { // NOLINT
|
||||||
|
if (pointer == NULL) {
|
||||||
|
*ss_ << "(null)";
|
||||||
|
} else {
|
||||||
|
::GTestStreamToHelper(ss_.get(), pointer);
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
#endif // GTEST_OS_SYMBIAN
|
||||||
|
|
||||||
|
// Since the basic IO manipulators are overloaded for both narrow
|
||||||
|
// and wide streams, we have to provide this specialized definition
|
||||||
|
// of operator <<, even though its body is the same as the
|
||||||
|
// templatized version above. Without this definition, streaming
|
||||||
|
// endl or other basic IO manipulators to Message will confuse the
|
||||||
|
// compiler.
|
||||||
|
Message& operator <<(BasicNarrowIoManip val) {
|
||||||
|
*ss_ << val;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Instead of 1/0, we want to see true/false for bool values.
|
||||||
|
Message& operator <<(bool b) {
|
||||||
|
return *this << (b ? "true" : "false");
|
||||||
|
}
|
||||||
|
|
||||||
|
// These two overloads allow streaming a wide C string to a Message
|
||||||
|
// using the UTF-8 encoding.
|
||||||
|
Message& operator <<(const wchar_t* wide_c_str) {
|
||||||
|
return *this << internal::String::ShowWideCString(wide_c_str);
|
||||||
|
}
|
||||||
|
Message& operator <<(wchar_t* wide_c_str) {
|
||||||
|
return *this << internal::String::ShowWideCString(wide_c_str);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if GTEST_HAS_STD_WSTRING
|
||||||
|
// Converts the given wide string to a narrow string using the UTF-8
|
||||||
|
// encoding, and streams the result to this Message object.
|
||||||
|
Message& operator <<(const ::std::wstring& wstr);
|
||||||
|
#endif // GTEST_HAS_STD_WSTRING
|
||||||
|
|
||||||
|
#if GTEST_HAS_GLOBAL_WSTRING
|
||||||
|
// Converts the given wide string to a narrow string using the UTF-8
|
||||||
|
// encoding, and streams the result to this Message object.
|
||||||
|
Message& operator <<(const ::wstring& wstr);
|
||||||
|
#endif // GTEST_HAS_GLOBAL_WSTRING
|
||||||
|
|
||||||
|
// Gets the text streamed to this object so far as a String.
|
||||||
|
// Each '\0' character in the buffer is replaced with "\\0".
|
||||||
|
//
|
||||||
|
// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
|
||||||
|
internal::String GetString() const {
|
||||||
|
return internal::StringStreamToString(ss_.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
#if GTEST_OS_SYMBIAN
|
||||||
|
// These are needed as the Nokia Symbian Compiler cannot decide between
|
||||||
|
// const T& and const T* in a function template. The Nokia compiler _can_
|
||||||
|
// decide between class template specializations for T and T*, so a
|
||||||
|
// tr1::type_traits-like is_pointer works, and we can overload on that.
|
||||||
|
template <typename T>
|
||||||
|
inline void StreamHelper(internal::true_type /*dummy*/, T* pointer) {
|
||||||
|
if (pointer == NULL) {
|
||||||
|
*ss_ << "(null)";
|
||||||
|
} else {
|
||||||
|
::GTestStreamToHelper(ss_.get(), pointer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
template <typename T>
|
||||||
|
inline void StreamHelper(internal::false_type /*dummy*/, const T& value) {
|
||||||
|
::GTestStreamToHelper(ss_.get(), value);
|
||||||
|
}
|
||||||
|
#endif // GTEST_OS_SYMBIAN
|
||||||
|
|
||||||
|
// We'll hold the text streamed to this object here.
|
||||||
|
const internal::scoped_ptr< ::std::stringstream> ss_;
|
||||||
|
|
||||||
|
// We declare (but don't implement) this to prevent the compiler
|
||||||
|
// from implementing the assignment operator.
|
||||||
|
void operator=(const Message&);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Streams a Message to an ostream.
|
||||||
|
inline std::ostream& operator <<(std::ostream& os, const Message& sb) {
|
||||||
|
return os << sb.GetString();
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace testing
|
||||||
|
|
||||||
|
#endif // GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
|
||||||
1421
third_party/googletest/src/include/gtest/gtest-param-test.h
vendored
Normal file
1421
third_party/googletest/src/include/gtest/gtest-param-test.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
487
third_party/googletest/src/include/gtest/gtest-param-test.h.pump
vendored
Normal file
487
third_party/googletest/src/include/gtest/gtest-param-test.h.pump
vendored
Normal file
@@ -0,0 +1,487 @@
|
|||||||
|
$$ -*- mode: c++; -*-
|
||||||
|
$var n = 50 $$ Maximum length of Values arguments we want to support.
|
||||||
|
$var maxtuple = 10 $$ Maximum number of Combine arguments we want to support.
|
||||||
|
// Copyright 2008, Google Inc.
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions are
|
||||||
|
// met:
|
||||||
|
//
|
||||||
|
// * Redistributions of source code must retain the above copyright
|
||||||
|
// notice, this list of conditions and the following disclaimer.
|
||||||
|
// * Redistributions in binary form must reproduce the above
|
||||||
|
// copyright notice, this list of conditions and the following disclaimer
|
||||||
|
// in the documentation and/or other materials provided with the
|
||||||
|
// distribution.
|
||||||
|
// * Neither the name of Google Inc. nor the names of its
|
||||||
|
// contributors may be used to endorse or promote products derived from
|
||||||
|
// this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
//
|
||||||
|
// Authors: vladl@google.com (Vlad Losev)
|
||||||
|
//
|
||||||
|
// Macros and functions for implementing parameterized tests
|
||||||
|
// in Google C++ Testing Framework (Google Test)
|
||||||
|
//
|
||||||
|
// This file is generated by a SCRIPT. DO NOT EDIT BY HAND!
|
||||||
|
//
|
||||||
|
#ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
|
||||||
|
#define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
|
||||||
|
|
||||||
|
|
||||||
|
// Value-parameterized tests allow you to test your code with different
|
||||||
|
// parameters without writing multiple copies of the same test.
|
||||||
|
//
|
||||||
|
// Here is how you use value-parameterized tests:
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
|
||||||
|
// To write value-parameterized tests, first you should define a fixture
|
||||||
|
// class. It is usually derived from testing::TestWithParam<T> (see below for
|
||||||
|
// another inheritance scheme that's sometimes useful in more complicated
|
||||||
|
// class hierarchies), where the type of your parameter values.
|
||||||
|
// TestWithParam<T> is itself derived from testing::Test. T can be any
|
||||||
|
// copyable type. If it's a raw pointer, you are responsible for managing the
|
||||||
|
// lifespan of the pointed values.
|
||||||
|
|
||||||
|
class FooTest : public ::testing::TestWithParam<const char*> {
|
||||||
|
// You can implement all the usual class fixture members here.
|
||||||
|
};
|
||||||
|
|
||||||
|
// Then, use the TEST_P macro to define as many parameterized tests
|
||||||
|
// for this fixture as you want. The _P suffix is for "parameterized"
|
||||||
|
// or "pattern", whichever you prefer to think.
|
||||||
|
|
||||||
|
TEST_P(FooTest, DoesBlah) {
|
||||||
|
// Inside a test, access the test parameter with the GetParam() method
|
||||||
|
// of the TestWithParam<T> class:
|
||||||
|
EXPECT_TRUE(foo.Blah(GetParam()));
|
||||||
|
...
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_P(FooTest, HasBlahBlah) {
|
||||||
|
...
|
||||||
|
}
|
||||||
|
|
||||||
|
// Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test
|
||||||
|
// case with any set of parameters you want. Google Test defines a number
|
||||||
|
// of functions for generating test parameters. They return what we call
|
||||||
|
// (surprise!) parameter generators. Here is a summary of them, which
|
||||||
|
// are all in the testing namespace:
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Range(begin, end [, step]) - Yields values {begin, begin+step,
|
||||||
|
// begin+step+step, ...}. The values do not
|
||||||
|
// include end. step defaults to 1.
|
||||||
|
// Values(v1, v2, ..., vN) - Yields values {v1, v2, ..., vN}.
|
||||||
|
// ValuesIn(container) - Yields values from a C-style array, an STL
|
||||||
|
// ValuesIn(begin,end) container, or an iterator range [begin, end).
|
||||||
|
// Bool() - Yields sequence {false, true}.
|
||||||
|
// Combine(g1, g2, ..., gN) - Yields all combinations (the Cartesian product
|
||||||
|
// for the math savvy) of the values generated
|
||||||
|
// by the N generators.
|
||||||
|
//
|
||||||
|
// For more details, see comments at the definitions of these functions below
|
||||||
|
// in this file.
|
||||||
|
//
|
||||||
|
// The following statement will instantiate tests from the FooTest test case
|
||||||
|
// each with parameter values "meeny", "miny", and "moe".
|
||||||
|
|
||||||
|
INSTANTIATE_TEST_CASE_P(InstantiationName,
|
||||||
|
FooTest,
|
||||||
|
Values("meeny", "miny", "moe"));
|
||||||
|
|
||||||
|
// To distinguish different instances of the pattern, (yes, you
|
||||||
|
// can instantiate it more then once) the first argument to the
|
||||||
|
// INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the
|
||||||
|
// actual test case name. Remember to pick unique prefixes for different
|
||||||
|
// instantiations. The tests from the instantiation above will have
|
||||||
|
// these names:
|
||||||
|
//
|
||||||
|
// * InstantiationName/FooTest.DoesBlah/0 for "meeny"
|
||||||
|
// * InstantiationName/FooTest.DoesBlah/1 for "miny"
|
||||||
|
// * InstantiationName/FooTest.DoesBlah/2 for "moe"
|
||||||
|
// * InstantiationName/FooTest.HasBlahBlah/0 for "meeny"
|
||||||
|
// * InstantiationName/FooTest.HasBlahBlah/1 for "miny"
|
||||||
|
// * InstantiationName/FooTest.HasBlahBlah/2 for "moe"
|
||||||
|
//
|
||||||
|
// You can use these names in --gtest_filter.
|
||||||
|
//
|
||||||
|
// This statement will instantiate all tests from FooTest again, each
|
||||||
|
// with parameter values "cat" and "dog":
|
||||||
|
|
||||||
|
const char* pets[] = {"cat", "dog"};
|
||||||
|
INSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets));
|
||||||
|
|
||||||
|
// The tests from the instantiation above will have these names:
|
||||||
|
//
|
||||||
|
// * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat"
|
||||||
|
// * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog"
|
||||||
|
// * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat"
|
||||||
|
// * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog"
|
||||||
|
//
|
||||||
|
// Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests
|
||||||
|
// in the given test case, whether their definitions come before or
|
||||||
|
// AFTER the INSTANTIATE_TEST_CASE_P statement.
|
||||||
|
//
|
||||||
|
// Please also note that generator expressions (including parameters to the
|
||||||
|
// generators) are evaluated in InitGoogleTest(), after main() has started.
|
||||||
|
// This allows the user on one hand, to adjust generator parameters in order
|
||||||
|
// to dynamically determine a set of tests to run and on the other hand,
|
||||||
|
// give the user a chance to inspect the generated tests with Google Test
|
||||||
|
// reflection API before RUN_ALL_TESTS() is executed.
|
||||||
|
//
|
||||||
|
// You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc
|
||||||
|
// for more examples.
|
||||||
|
//
|
||||||
|
// In the future, we plan to publish the API for defining new parameter
|
||||||
|
// generators. But for now this interface remains part of the internal
|
||||||
|
// implementation and is subject to change.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// A parameterized test fixture must be derived from testing::Test and from
|
||||||
|
// testing::WithParamInterface<T>, where T is the type of the parameter
|
||||||
|
// values. Inheriting from TestWithParam<T> satisfies that requirement because
|
||||||
|
// TestWithParam<T> inherits from both Test and WithParamInterface. In more
|
||||||
|
// complicated hierarchies, however, it is occasionally useful to inherit
|
||||||
|
// separately from Test and WithParamInterface. For example:
|
||||||
|
|
||||||
|
class BaseTest : public ::testing::Test {
|
||||||
|
// You can inherit all the usual members for a non-parameterized test
|
||||||
|
// fixture here.
|
||||||
|
};
|
||||||
|
|
||||||
|
class DerivedTest : public BaseTest, public ::testing::WithParamInterface<int> {
|
||||||
|
// The usual test fixture members go here too.
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST_F(BaseTest, HasFoo) {
|
||||||
|
// This is an ordinary non-parameterized test.
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_P(DerivedTest, DoesBlah) {
|
||||||
|
// GetParam works just the same here as if you inherit from TestWithParam.
|
||||||
|
EXPECT_TRUE(foo.Blah(GetParam()));
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // 0
|
||||||
|
|
||||||
|
#include "gtest/internal/gtest-port.h"
|
||||||
|
|
||||||
|
#if !GTEST_OS_SYMBIAN
|
||||||
|
# include <utility>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// scripts/fuse_gtest.py depends on gtest's own header being #included
|
||||||
|
// *unconditionally*. Therefore these #includes cannot be moved
|
||||||
|
// inside #if GTEST_HAS_PARAM_TEST.
|
||||||
|
#include "gtest/internal/gtest-internal.h"
|
||||||
|
#include "gtest/internal/gtest-param-util.h"
|
||||||
|
#include "gtest/internal/gtest-param-util-generated.h"
|
||||||
|
|
||||||
|
#if GTEST_HAS_PARAM_TEST
|
||||||
|
|
||||||
|
namespace testing {
|
||||||
|
|
||||||
|
// Functions producing parameter generators.
|
||||||
|
//
|
||||||
|
// Google Test uses these generators to produce parameters for value-
|
||||||
|
// parameterized tests. When a parameterized test case is instantiated
|
||||||
|
// with a particular generator, Google Test creates and runs tests
|
||||||
|
// for each element in the sequence produced by the generator.
|
||||||
|
//
|
||||||
|
// In the following sample, tests from test case FooTest are instantiated
|
||||||
|
// each three times with parameter values 3, 5, and 8:
|
||||||
|
//
|
||||||
|
// class FooTest : public TestWithParam<int> { ... };
|
||||||
|
//
|
||||||
|
// TEST_P(FooTest, TestThis) {
|
||||||
|
// }
|
||||||
|
// TEST_P(FooTest, TestThat) {
|
||||||
|
// }
|
||||||
|
// INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8));
|
||||||
|
//
|
||||||
|
|
||||||
|
// Range() returns generators providing sequences of values in a range.
|
||||||
|
//
|
||||||
|
// Synopsis:
|
||||||
|
// Range(start, end)
|
||||||
|
// - returns a generator producing a sequence of values {start, start+1,
|
||||||
|
// start+2, ..., }.
|
||||||
|
// Range(start, end, step)
|
||||||
|
// - returns a generator producing a sequence of values {start, start+step,
|
||||||
|
// start+step+step, ..., }.
|
||||||
|
// Notes:
|
||||||
|
// * The generated sequences never include end. For example, Range(1, 5)
|
||||||
|
// returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2)
|
||||||
|
// returns a generator producing {1, 3, 5, 7}.
|
||||||
|
// * start and end must have the same type. That type may be any integral or
|
||||||
|
// floating-point type or a user defined type satisfying these conditions:
|
||||||
|
// * It must be assignable (have operator=() defined).
|
||||||
|
// * It must have operator+() (operator+(int-compatible type) for
|
||||||
|
// two-operand version).
|
||||||
|
// * It must have operator<() defined.
|
||||||
|
// Elements in the resulting sequences will also have that type.
|
||||||
|
// * Condition start < end must be satisfied in order for resulting sequences
|
||||||
|
// to contain any elements.
|
||||||
|
//
|
||||||
|
template <typename T, typename IncrementT>
|
||||||
|
internal::ParamGenerator<T> Range(T start, T end, IncrementT step) {
|
||||||
|
return internal::ParamGenerator<T>(
|
||||||
|
new internal::RangeGenerator<T, IncrementT>(start, end, step));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
internal::ParamGenerator<T> Range(T start, T end) {
|
||||||
|
return Range(start, end, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ValuesIn() function allows generation of tests with parameters coming from
|
||||||
|
// a container.
|
||||||
|
//
|
||||||
|
// Synopsis:
|
||||||
|
// ValuesIn(const T (&array)[N])
|
||||||
|
// - returns a generator producing sequences with elements from
|
||||||
|
// a C-style array.
|
||||||
|
// ValuesIn(const Container& container)
|
||||||
|
// - returns a generator producing sequences with elements from
|
||||||
|
// an STL-style container.
|
||||||
|
// ValuesIn(Iterator begin, Iterator end)
|
||||||
|
// - returns a generator producing sequences with elements from
|
||||||
|
// a range [begin, end) defined by a pair of STL-style iterators. These
|
||||||
|
// iterators can also be plain C pointers.
|
||||||
|
//
|
||||||
|
// Please note that ValuesIn copies the values from the containers
|
||||||
|
// passed in and keeps them to generate tests in RUN_ALL_TESTS().
|
||||||
|
//
|
||||||
|
// Examples:
|
||||||
|
//
|
||||||
|
// This instantiates tests from test case StringTest
|
||||||
|
// each with C-string values of "foo", "bar", and "baz":
|
||||||
|
//
|
||||||
|
// const char* strings[] = {"foo", "bar", "baz"};
|
||||||
|
// INSTANTIATE_TEST_CASE_P(StringSequence, SrtingTest, ValuesIn(strings));
|
||||||
|
//
|
||||||
|
// This instantiates tests from test case StlStringTest
|
||||||
|
// each with STL strings with values "a" and "b":
|
||||||
|
//
|
||||||
|
// ::std::vector< ::std::string> GetParameterStrings() {
|
||||||
|
// ::std::vector< ::std::string> v;
|
||||||
|
// v.push_back("a");
|
||||||
|
// v.push_back("b");
|
||||||
|
// return v;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// INSTANTIATE_TEST_CASE_P(CharSequence,
|
||||||
|
// StlStringTest,
|
||||||
|
// ValuesIn(GetParameterStrings()));
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// This will also instantiate tests from CharTest
|
||||||
|
// each with parameter values 'a' and 'b':
|
||||||
|
//
|
||||||
|
// ::std::list<char> GetParameterChars() {
|
||||||
|
// ::std::list<char> list;
|
||||||
|
// list.push_back('a');
|
||||||
|
// list.push_back('b');
|
||||||
|
// return list;
|
||||||
|
// }
|
||||||
|
// ::std::list<char> l = GetParameterChars();
|
||||||
|
// INSTANTIATE_TEST_CASE_P(CharSequence2,
|
||||||
|
// CharTest,
|
||||||
|
// ValuesIn(l.begin(), l.end()));
|
||||||
|
//
|
||||||
|
template <typename ForwardIterator>
|
||||||
|
internal::ParamGenerator<
|
||||||
|
typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
|
||||||
|
ValuesIn(ForwardIterator begin, ForwardIterator end) {
|
||||||
|
typedef typename ::testing::internal::IteratorTraits<ForwardIterator>
|
||||||
|
::value_type ParamType;
|
||||||
|
return internal::ParamGenerator<ParamType>(
|
||||||
|
new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T, size_t N>
|
||||||
|
internal::ParamGenerator<T> ValuesIn(const T (&array)[N]) {
|
||||||
|
return ValuesIn(array, array + N);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Container>
|
||||||
|
internal::ParamGenerator<typename Container::value_type> ValuesIn(
|
||||||
|
const Container& container) {
|
||||||
|
return ValuesIn(container.begin(), container.end());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Values() allows generating tests from explicitly specified list of
|
||||||
|
// parameters.
|
||||||
|
//
|
||||||
|
// Synopsis:
|
||||||
|
// Values(T v1, T v2, ..., T vN)
|
||||||
|
// - returns a generator producing sequences with elements v1, v2, ..., vN.
|
||||||
|
//
|
||||||
|
// For example, this instantiates tests from test case BarTest each
|
||||||
|
// with values "one", "two", and "three":
|
||||||
|
//
|
||||||
|
// INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values("one", "two", "three"));
|
||||||
|
//
|
||||||
|
// This instantiates tests from test case BazTest each with values 1, 2, 3.5.
|
||||||
|
// The exact type of values will depend on the type of parameter in BazTest.
|
||||||
|
//
|
||||||
|
// INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5));
|
||||||
|
//
|
||||||
|
// Currently, Values() supports from 1 to $n parameters.
|
||||||
|
//
|
||||||
|
$range i 1..n
|
||||||
|
$for i [[
|
||||||
|
$range j 1..i
|
||||||
|
|
||||||
|
template <$for j, [[typename T$j]]>
|
||||||
|
internal::ValueArray$i<$for j, [[T$j]]> Values($for j, [[T$j v$j]]) {
|
||||||
|
return internal::ValueArray$i<$for j, [[T$j]]>($for j, [[v$j]]);
|
||||||
|
}
|
||||||
|
|
||||||
|
]]
|
||||||
|
|
||||||
|
// Bool() allows generating tests with parameters in a set of (false, true).
|
||||||
|
//
|
||||||
|
// Synopsis:
|
||||||
|
// Bool()
|
||||||
|
// - returns a generator producing sequences with elements {false, true}.
|
||||||
|
//
|
||||||
|
// It is useful when testing code that depends on Boolean flags. Combinations
|
||||||
|
// of multiple flags can be tested when several Bool()'s are combined using
|
||||||
|
// Combine() function.
|
||||||
|
//
|
||||||
|
// In the following example all tests in the test case FlagDependentTest
|
||||||
|
// will be instantiated twice with parameters false and true.
|
||||||
|
//
|
||||||
|
// class FlagDependentTest : public testing::TestWithParam<bool> {
|
||||||
|
// virtual void SetUp() {
|
||||||
|
// external_flag = GetParam();
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool());
|
||||||
|
//
|
||||||
|
inline internal::ParamGenerator<bool> Bool() {
|
||||||
|
return Values(false, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
# if GTEST_HAS_COMBINE
|
||||||
|
// Combine() allows the user to combine two or more sequences to produce
|
||||||
|
// values of a Cartesian product of those sequences' elements.
|
||||||
|
//
|
||||||
|
// Synopsis:
|
||||||
|
// Combine(gen1, gen2, ..., genN)
|
||||||
|
// - returns a generator producing sequences with elements coming from
|
||||||
|
// the Cartesian product of elements from the sequences generated by
|
||||||
|
// gen1, gen2, ..., genN. The sequence elements will have a type of
|
||||||
|
// tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types
|
||||||
|
// of elements from sequences produces by gen1, gen2, ..., genN.
|
||||||
|
//
|
||||||
|
// Combine can have up to $maxtuple arguments. This number is currently limited
|
||||||
|
// by the maximum number of elements in the tuple implementation used by Google
|
||||||
|
// Test.
|
||||||
|
//
|
||||||
|
// Example:
|
||||||
|
//
|
||||||
|
// This will instantiate tests in test case AnimalTest each one with
|
||||||
|
// the parameter values tuple("cat", BLACK), tuple("cat", WHITE),
|
||||||
|
// tuple("dog", BLACK), and tuple("dog", WHITE):
|
||||||
|
//
|
||||||
|
// enum Color { BLACK, GRAY, WHITE };
|
||||||
|
// class AnimalTest
|
||||||
|
// : public testing::TestWithParam<tuple<const char*, Color> > {...};
|
||||||
|
//
|
||||||
|
// TEST_P(AnimalTest, AnimalLooksNice) {...}
|
||||||
|
//
|
||||||
|
// INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest,
|
||||||
|
// Combine(Values("cat", "dog"),
|
||||||
|
// Values(BLACK, WHITE)));
|
||||||
|
//
|
||||||
|
// This will instantiate tests in FlagDependentTest with all variations of two
|
||||||
|
// Boolean flags:
|
||||||
|
//
|
||||||
|
// class FlagDependentTest
|
||||||
|
// : public testing::TestWithParam<tuple(bool, bool)> > {
|
||||||
|
// virtual void SetUp() {
|
||||||
|
// // Assigns external_flag_1 and external_flag_2 values from the tuple.
|
||||||
|
// tie(external_flag_1, external_flag_2) = GetParam();
|
||||||
|
// }
|
||||||
|
// };
|
||||||
|
//
|
||||||
|
// TEST_P(FlagDependentTest, TestFeature1) {
|
||||||
|
// // Test your code using external_flag_1 and external_flag_2 here.
|
||||||
|
// }
|
||||||
|
// INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest,
|
||||||
|
// Combine(Bool(), Bool()));
|
||||||
|
//
|
||||||
|
$range i 2..maxtuple
|
||||||
|
$for i [[
|
||||||
|
$range j 1..i
|
||||||
|
|
||||||
|
template <$for j, [[typename Generator$j]]>
|
||||||
|
internal::CartesianProductHolder$i<$for j, [[Generator$j]]> Combine(
|
||||||
|
$for j, [[const Generator$j& g$j]]) {
|
||||||
|
return internal::CartesianProductHolder$i<$for j, [[Generator$j]]>(
|
||||||
|
$for j, [[g$j]]);
|
||||||
|
}
|
||||||
|
|
||||||
|
]]
|
||||||
|
# endif // GTEST_HAS_COMBINE
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# define TEST_P(test_case_name, test_name) \
|
||||||
|
class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
|
||||||
|
: public test_case_name { \
|
||||||
|
public: \
|
||||||
|
GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \
|
||||||
|
virtual void TestBody(); \
|
||||||
|
private: \
|
||||||
|
static int AddToRegistry() { \
|
||||||
|
::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
|
||||||
|
GetTestCasePatternHolder<test_case_name>(\
|
||||||
|
#test_case_name, __FILE__, __LINE__)->AddTestPattern(\
|
||||||
|
#test_case_name, \
|
||||||
|
#test_name, \
|
||||||
|
new ::testing::internal::TestMetaFactory< \
|
||||||
|
GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>()); \
|
||||||
|
return 0; \
|
||||||
|
} \
|
||||||
|
static int gtest_registering_dummy_; \
|
||||||
|
GTEST_DISALLOW_COPY_AND_ASSIGN_(\
|
||||||
|
GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \
|
||||||
|
}; \
|
||||||
|
int GTEST_TEST_CLASS_NAME_(test_case_name, \
|
||||||
|
test_name)::gtest_registering_dummy_ = \
|
||||||
|
GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \
|
||||||
|
void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
|
||||||
|
|
||||||
|
# define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator) \
|
||||||
|
::testing::internal::ParamGenerator<test_case_name::ParamType> \
|
||||||
|
gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \
|
||||||
|
int gtest_##prefix##test_case_name##_dummy_ = \
|
||||||
|
::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
|
||||||
|
GetTestCasePatternHolder<test_case_name>(\
|
||||||
|
#test_case_name, __FILE__, __LINE__)->AddTestCaseInstantiation(\
|
||||||
|
#prefix, \
|
||||||
|
>est_##prefix##test_case_name##_EvalGenerator_, \
|
||||||
|
__FILE__, __LINE__)
|
||||||
|
|
||||||
|
} // namespace testing
|
||||||
|
|
||||||
|
#endif // GTEST_HAS_PARAM_TEST
|
||||||
|
|
||||||
|
#endif // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
|
||||||
796
third_party/googletest/src/include/gtest/gtest-printers.h
vendored
Normal file
796
third_party/googletest/src/include/gtest/gtest-printers.h
vendored
Normal file
@@ -0,0 +1,796 @@
|
|||||||
|
// Copyright 2007, Google Inc.
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions are
|
||||||
|
// met:
|
||||||
|
//
|
||||||
|
// * Redistributions of source code must retain the above copyright
|
||||||
|
// notice, this list of conditions and the following disclaimer.
|
||||||
|
// * Redistributions in binary form must reproduce the above
|
||||||
|
// copyright notice, this list of conditions and the following disclaimer
|
||||||
|
// in the documentation and/or other materials provided with the
|
||||||
|
// distribution.
|
||||||
|
// * Neither the name of Google Inc. nor the names of its
|
||||||
|
// contributors may be used to endorse or promote products derived from
|
||||||
|
// this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
//
|
||||||
|
// Author: wan@google.com (Zhanyong Wan)
|
||||||
|
|
||||||
|
// Google Test - The Google C++ Testing Framework
|
||||||
|
//
|
||||||
|
// This file implements a universal value printer that can print a
|
||||||
|
// value of any type T:
|
||||||
|
//
|
||||||
|
// void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr);
|
||||||
|
//
|
||||||
|
// A user can teach this function how to print a class type T by
|
||||||
|
// defining either operator<<() or PrintTo() in the namespace that
|
||||||
|
// defines T. More specifically, the FIRST defined function in the
|
||||||
|
// following list will be used (assuming T is defined in namespace
|
||||||
|
// foo):
|
||||||
|
//
|
||||||
|
// 1. foo::PrintTo(const T&, ostream*)
|
||||||
|
// 2. operator<<(ostream&, const T&) defined in either foo or the
|
||||||
|
// global namespace.
|
||||||
|
//
|
||||||
|
// If none of the above is defined, it will print the debug string of
|
||||||
|
// the value if it is a protocol buffer, or print the raw bytes in the
|
||||||
|
// value otherwise.
|
||||||
|
//
|
||||||
|
// To aid debugging: when T is a reference type, the address of the
|
||||||
|
// value is also printed; when T is a (const) char pointer, both the
|
||||||
|
// pointer value and the NUL-terminated string it points to are
|
||||||
|
// printed.
|
||||||
|
//
|
||||||
|
// We also provide some convenient wrappers:
|
||||||
|
//
|
||||||
|
// // Prints a value to a string. For a (const or not) char
|
||||||
|
// // pointer, the NUL-terminated string (but not the pointer) is
|
||||||
|
// // printed.
|
||||||
|
// std::string ::testing::PrintToString(const T& value);
|
||||||
|
//
|
||||||
|
// // Prints a value tersely: for a reference type, the referenced
|
||||||
|
// // value (but not the address) is printed; for a (const or not) char
|
||||||
|
// // pointer, the NUL-terminated string (but not the pointer) is
|
||||||
|
// // printed.
|
||||||
|
// void ::testing::internal::UniversalTersePrint(const T& value, ostream*);
|
||||||
|
//
|
||||||
|
// // Prints value using the type inferred by the compiler. The difference
|
||||||
|
// // from UniversalTersePrint() is that this function prints both the
|
||||||
|
// // pointer and the NUL-terminated string for a (const or not) char pointer.
|
||||||
|
// void ::testing::internal::UniversalPrint(const T& value, ostream*);
|
||||||
|
//
|
||||||
|
// // Prints the fields of a tuple tersely to a string vector, one
|
||||||
|
// // element for each field. Tuple support must be enabled in
|
||||||
|
// // gtest-port.h.
|
||||||
|
// std::vector<string> UniversalTersePrintTupleFieldsToStrings(
|
||||||
|
// const Tuple& value);
|
||||||
|
//
|
||||||
|
// Known limitation:
|
||||||
|
//
|
||||||
|
// The print primitives print the elements of an STL-style container
|
||||||
|
// using the compiler-inferred type of *iter where iter is a
|
||||||
|
// const_iterator of the container. When const_iterator is an input
|
||||||
|
// iterator but not a forward iterator, this inferred type may not
|
||||||
|
// match value_type, and the print output may be incorrect. In
|
||||||
|
// practice, this is rarely a problem as for most containers
|
||||||
|
// const_iterator is a forward iterator. We'll fix this if there's an
|
||||||
|
// actual need for it. Note that this fix cannot rely on value_type
|
||||||
|
// being defined as many user-defined container types don't have
|
||||||
|
// value_type.
|
||||||
|
|
||||||
|
#ifndef GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
|
||||||
|
#define GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
|
||||||
|
|
||||||
|
#include <ostream> // NOLINT
|
||||||
|
#include <sstream>
|
||||||
|
#include <string>
|
||||||
|
#include <utility>
|
||||||
|
#include <vector>
|
||||||
|
#include "gtest/internal/gtest-port.h"
|
||||||
|
#include "gtest/internal/gtest-internal.h"
|
||||||
|
|
||||||
|
namespace testing {
|
||||||
|
|
||||||
|
// Definitions in the 'internal' and 'internal2' name spaces are
|
||||||
|
// subject to change without notice. DO NOT USE THEM IN USER CODE!
|
||||||
|
namespace internal2 {
|
||||||
|
|
||||||
|
// Prints the given number of bytes in the given object to the given
|
||||||
|
// ostream.
|
||||||
|
GTEST_API_ void PrintBytesInObjectTo(const unsigned char* obj_bytes,
|
||||||
|
size_t count,
|
||||||
|
::std::ostream* os);
|
||||||
|
|
||||||
|
// For selecting which printer to use when a given type has neither <<
|
||||||
|
// nor PrintTo().
|
||||||
|
enum TypeKind {
|
||||||
|
kProtobuf, // a protobuf type
|
||||||
|
kConvertibleToInteger, // a type implicitly convertible to BiggestInt
|
||||||
|
// (e.g. a named or unnamed enum type)
|
||||||
|
kOtherType // anything else
|
||||||
|
};
|
||||||
|
|
||||||
|
// TypeWithoutFormatter<T, kTypeKind>::PrintValue(value, os) is called
|
||||||
|
// by the universal printer to print a value of type T when neither
|
||||||
|
// operator<< nor PrintTo() is defined for T, where kTypeKind is the
|
||||||
|
// "kind" of T as defined by enum TypeKind.
|
||||||
|
template <typename T, TypeKind kTypeKind>
|
||||||
|
class TypeWithoutFormatter {
|
||||||
|
public:
|
||||||
|
// This default version is called when kTypeKind is kOtherType.
|
||||||
|
static void PrintValue(const T& value, ::std::ostream* os) {
|
||||||
|
PrintBytesInObjectTo(reinterpret_cast<const unsigned char*>(&value),
|
||||||
|
sizeof(value), os);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// We print a protobuf using its ShortDebugString() when the string
|
||||||
|
// doesn't exceed this many characters; otherwise we print it using
|
||||||
|
// DebugString() for better readability.
|
||||||
|
const size_t kProtobufOneLinerMaxLength = 50;
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
class TypeWithoutFormatter<T, kProtobuf> {
|
||||||
|
public:
|
||||||
|
static void PrintValue(const T& value, ::std::ostream* os) {
|
||||||
|
const ::testing::internal::string short_str = value.ShortDebugString();
|
||||||
|
const ::testing::internal::string pretty_str =
|
||||||
|
short_str.length() <= kProtobufOneLinerMaxLength ?
|
||||||
|
short_str : ("\n" + value.DebugString());
|
||||||
|
*os << ("<" + pretty_str + ">");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
class TypeWithoutFormatter<T, kConvertibleToInteger> {
|
||||||
|
public:
|
||||||
|
// Since T has no << operator or PrintTo() but can be implicitly
|
||||||
|
// converted to BiggestInt, we print it as a BiggestInt.
|
||||||
|
//
|
||||||
|
// Most likely T is an enum type (either named or unnamed), in which
|
||||||
|
// case printing it as an integer is the desired behavior. In case
|
||||||
|
// T is not an enum, printing it as an integer is the best we can do
|
||||||
|
// given that it has no user-defined printer.
|
||||||
|
static void PrintValue(const T& value, ::std::ostream* os) {
|
||||||
|
const internal::BiggestInt kBigInt = value;
|
||||||
|
*os << kBigInt;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Prints the given value to the given ostream. If the value is a
|
||||||
|
// protocol message, its debug string is printed; if it's an enum or
|
||||||
|
// of a type implicitly convertible to BiggestInt, it's printed as an
|
||||||
|
// integer; otherwise the bytes in the value are printed. This is
|
||||||
|
// what UniversalPrinter<T>::Print() does when it knows nothing about
|
||||||
|
// type T and T has neither << operator nor PrintTo().
|
||||||
|
//
|
||||||
|
// A user can override this behavior for a class type Foo by defining
|
||||||
|
// a << operator in the namespace where Foo is defined.
|
||||||
|
//
|
||||||
|
// We put this operator in namespace 'internal2' instead of 'internal'
|
||||||
|
// to simplify the implementation, as much code in 'internal' needs to
|
||||||
|
// use << in STL, which would conflict with our own << were it defined
|
||||||
|
// in 'internal'.
|
||||||
|
//
|
||||||
|
// Note that this operator<< takes a generic std::basic_ostream<Char,
|
||||||
|
// CharTraits> type instead of the more restricted std::ostream. If
|
||||||
|
// we define it to take an std::ostream instead, we'll get an
|
||||||
|
// "ambiguous overloads" compiler error when trying to print a type
|
||||||
|
// Foo that supports streaming to std::basic_ostream<Char,
|
||||||
|
// CharTraits>, as the compiler cannot tell whether
|
||||||
|
// operator<<(std::ostream&, const T&) or
|
||||||
|
// operator<<(std::basic_stream<Char, CharTraits>, const Foo&) is more
|
||||||
|
// specific.
|
||||||
|
template <typename Char, typename CharTraits, typename T>
|
||||||
|
::std::basic_ostream<Char, CharTraits>& operator<<(
|
||||||
|
::std::basic_ostream<Char, CharTraits>& os, const T& x) {
|
||||||
|
TypeWithoutFormatter<T,
|
||||||
|
(internal::IsAProtocolMessage<T>::value ? kProtobuf :
|
||||||
|
internal::ImplicitlyConvertible<const T&, internal::BiggestInt>::value ?
|
||||||
|
kConvertibleToInteger : kOtherType)>::PrintValue(x, &os);
|
||||||
|
return os;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace internal2
|
||||||
|
} // namespace testing
|
||||||
|
|
||||||
|
// This namespace MUST NOT BE NESTED IN ::testing, or the name look-up
|
||||||
|
// magic needed for implementing UniversalPrinter won't work.
|
||||||
|
namespace testing_internal {
|
||||||
|
|
||||||
|
// Used to print a value that is not an STL-style container when the
|
||||||
|
// user doesn't define PrintTo() for it.
|
||||||
|
template <typename T>
|
||||||
|
void DefaultPrintNonContainerTo(const T& value, ::std::ostream* os) {
|
||||||
|
// With the following statement, during unqualified name lookup,
|
||||||
|
// testing::internal2::operator<< appears as if it was declared in
|
||||||
|
// the nearest enclosing namespace that contains both
|
||||||
|
// ::testing_internal and ::testing::internal2, i.e. the global
|
||||||
|
// namespace. For more details, refer to the C++ Standard section
|
||||||
|
// 7.3.4-1 [namespace.udir]. This allows us to fall back onto
|
||||||
|
// testing::internal2::operator<< in case T doesn't come with a <<
|
||||||
|
// operator.
|
||||||
|
//
|
||||||
|
// We cannot write 'using ::testing::internal2::operator<<;', which
|
||||||
|
// gcc 3.3 fails to compile due to a compiler bug.
|
||||||
|
using namespace ::testing::internal2; // NOLINT
|
||||||
|
|
||||||
|
// Assuming T is defined in namespace foo, in the next statement,
|
||||||
|
// the compiler will consider all of:
|
||||||
|
//
|
||||||
|
// 1. foo::operator<< (thanks to Koenig look-up),
|
||||||
|
// 2. ::operator<< (as the current namespace is enclosed in ::),
|
||||||
|
// 3. testing::internal2::operator<< (thanks to the using statement above).
|
||||||
|
//
|
||||||
|
// The operator<< whose type matches T best will be picked.
|
||||||
|
//
|
||||||
|
// We deliberately allow #2 to be a candidate, as sometimes it's
|
||||||
|
// impossible to define #1 (e.g. when foo is ::std, defining
|
||||||
|
// anything in it is undefined behavior unless you are a compiler
|
||||||
|
// vendor.).
|
||||||
|
*os << value;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace testing_internal
|
||||||
|
|
||||||
|
namespace testing {
|
||||||
|
namespace internal {
|
||||||
|
|
||||||
|
// UniversalPrinter<T>::Print(value, ostream_ptr) prints the given
|
||||||
|
// value to the given ostream. The caller must ensure that
|
||||||
|
// 'ostream_ptr' is not NULL, or the behavior is undefined.
|
||||||
|
//
|
||||||
|
// We define UniversalPrinter as a class template (as opposed to a
|
||||||
|
// function template), as we need to partially specialize it for
|
||||||
|
// reference types, which cannot be done with function templates.
|
||||||
|
template <typename T>
|
||||||
|
class UniversalPrinter;
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
void UniversalPrint(const T& value, ::std::ostream* os);
|
||||||
|
|
||||||
|
// Used to print an STL-style container when the user doesn't define
|
||||||
|
// a PrintTo() for it.
|
||||||
|
template <typename C>
|
||||||
|
void DefaultPrintTo(IsContainer /* dummy */,
|
||||||
|
false_type /* is not a pointer */,
|
||||||
|
const C& container, ::std::ostream* os) {
|
||||||
|
const size_t kMaxCount = 32; // The maximum number of elements to print.
|
||||||
|
*os << '{';
|
||||||
|
size_t count = 0;
|
||||||
|
for (typename C::const_iterator it = container.begin();
|
||||||
|
it != container.end(); ++it, ++count) {
|
||||||
|
if (count > 0) {
|
||||||
|
*os << ',';
|
||||||
|
if (count == kMaxCount) { // Enough has been printed.
|
||||||
|
*os << " ...";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*os << ' ';
|
||||||
|
// We cannot call PrintTo(*it, os) here as PrintTo() doesn't
|
||||||
|
// handle *it being a native array.
|
||||||
|
internal::UniversalPrint(*it, os);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count > 0) {
|
||||||
|
*os << ' ';
|
||||||
|
}
|
||||||
|
*os << '}';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Used to print a pointer that is neither a char pointer nor a member
|
||||||
|
// pointer, when the user doesn't define PrintTo() for it. (A member
|
||||||
|
// variable pointer or member function pointer doesn't really point to
|
||||||
|
// a location in the address space. Their representation is
|
||||||
|
// implementation-defined. Therefore they will be printed as raw
|
||||||
|
// bytes.)
|
||||||
|
template <typename T>
|
||||||
|
void DefaultPrintTo(IsNotContainer /* dummy */,
|
||||||
|
true_type /* is a pointer */,
|
||||||
|
T* p, ::std::ostream* os) {
|
||||||
|
if (p == NULL) {
|
||||||
|
*os << "NULL";
|
||||||
|
} else {
|
||||||
|
// C++ doesn't allow casting from a function pointer to any object
|
||||||
|
// pointer.
|
||||||
|
//
|
||||||
|
// IsTrue() silences warnings: "Condition is always true",
|
||||||
|
// "unreachable code".
|
||||||
|
if (IsTrue(ImplicitlyConvertible<T*, const void*>::value)) {
|
||||||
|
// T is not a function type. We just call << to print p,
|
||||||
|
// relying on ADL to pick up user-defined << for their pointer
|
||||||
|
// types, if any.
|
||||||
|
*os << p;
|
||||||
|
} else {
|
||||||
|
// T is a function type, so '*os << p' doesn't do what we want
|
||||||
|
// (it just prints p as bool). We want to print p as a const
|
||||||
|
// void*. However, we cannot cast it to const void* directly,
|
||||||
|
// even using reinterpret_cast, as earlier versions of gcc
|
||||||
|
// (e.g. 3.4.5) cannot compile the cast when p is a function
|
||||||
|
// pointer. Casting to UInt64 first solves the problem.
|
||||||
|
*os << reinterpret_cast<const void*>(
|
||||||
|
reinterpret_cast<internal::UInt64>(p));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Used to print a non-container, non-pointer value when the user
|
||||||
|
// doesn't define PrintTo() for it.
|
||||||
|
template <typename T>
|
||||||
|
void DefaultPrintTo(IsNotContainer /* dummy */,
|
||||||
|
false_type /* is not a pointer */,
|
||||||
|
const T& value, ::std::ostream* os) {
|
||||||
|
::testing_internal::DefaultPrintNonContainerTo(value, os);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prints the given value using the << operator if it has one;
|
||||||
|
// otherwise prints the bytes in it. This is what
|
||||||
|
// UniversalPrinter<T>::Print() does when PrintTo() is not specialized
|
||||||
|
// or overloaded for type T.
|
||||||
|
//
|
||||||
|
// A user can override this behavior for a class type Foo by defining
|
||||||
|
// an overload of PrintTo() in the namespace where Foo is defined. We
|
||||||
|
// give the user this option as sometimes defining a << operator for
|
||||||
|
// Foo is not desirable (e.g. the coding style may prevent doing it,
|
||||||
|
// or there is already a << operator but it doesn't do what the user
|
||||||
|
// wants).
|
||||||
|
template <typename T>
|
||||||
|
void PrintTo(const T& value, ::std::ostream* os) {
|
||||||
|
// DefaultPrintTo() is overloaded. The type of its first two
|
||||||
|
// arguments determine which version will be picked. If T is an
|
||||||
|
// STL-style container, the version for container will be called; if
|
||||||
|
// T is a pointer, the pointer version will be called; otherwise the
|
||||||
|
// generic version will be called.
|
||||||
|
//
|
||||||
|
// Note that we check for container types here, prior to we check
|
||||||
|
// for protocol message types in our operator<<. The rationale is:
|
||||||
|
//
|
||||||
|
// For protocol messages, we want to give people a chance to
|
||||||
|
// override Google Mock's format by defining a PrintTo() or
|
||||||
|
// operator<<. For STL containers, other formats can be
|
||||||
|
// incompatible with Google Mock's format for the container
|
||||||
|
// elements; therefore we check for container types here to ensure
|
||||||
|
// that our format is used.
|
||||||
|
//
|
||||||
|
// The second argument of DefaultPrintTo() is needed to bypass a bug
|
||||||
|
// in Symbian's C++ compiler that prevents it from picking the right
|
||||||
|
// overload between:
|
||||||
|
//
|
||||||
|
// PrintTo(const T& x, ...);
|
||||||
|
// PrintTo(T* x, ...);
|
||||||
|
DefaultPrintTo(IsContainerTest<T>(0), is_pointer<T>(), value, os);
|
||||||
|
}
|
||||||
|
|
||||||
|
// The following list of PrintTo() overloads tells
|
||||||
|
// UniversalPrinter<T>::Print() how to print standard types (built-in
|
||||||
|
// types, strings, plain arrays, and pointers).
|
||||||
|
|
||||||
|
// Overloads for various char types.
|
||||||
|
GTEST_API_ void PrintTo(unsigned char c, ::std::ostream* os);
|
||||||
|
GTEST_API_ void PrintTo(signed char c, ::std::ostream* os);
|
||||||
|
inline void PrintTo(char c, ::std::ostream* os) {
|
||||||
|
// When printing a plain char, we always treat it as unsigned. This
|
||||||
|
// way, the output won't be affected by whether the compiler thinks
|
||||||
|
// char is signed or not.
|
||||||
|
PrintTo(static_cast<unsigned char>(c), os);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Overloads for other simple built-in types.
|
||||||
|
inline void PrintTo(bool x, ::std::ostream* os) {
|
||||||
|
*os << (x ? "true" : "false");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Overload for wchar_t type.
|
||||||
|
// Prints a wchar_t as a symbol if it is printable or as its internal
|
||||||
|
// code otherwise and also as its decimal code (except for L'\0').
|
||||||
|
// The L'\0' char is printed as "L'\\0'". The decimal code is printed
|
||||||
|
// as signed integer when wchar_t is implemented by the compiler
|
||||||
|
// as a signed type and is printed as an unsigned integer when wchar_t
|
||||||
|
// is implemented as an unsigned type.
|
||||||
|
GTEST_API_ void PrintTo(wchar_t wc, ::std::ostream* os);
|
||||||
|
|
||||||
|
// Overloads for C strings.
|
||||||
|
GTEST_API_ void PrintTo(const char* s, ::std::ostream* os);
|
||||||
|
inline void PrintTo(char* s, ::std::ostream* os) {
|
||||||
|
PrintTo(ImplicitCast_<const char*>(s), os);
|
||||||
|
}
|
||||||
|
|
||||||
|
// signed/unsigned char is often used for representing binary data, so
|
||||||
|
// we print pointers to it as void* to be safe.
|
||||||
|
inline void PrintTo(const signed char* s, ::std::ostream* os) {
|
||||||
|
PrintTo(ImplicitCast_<const void*>(s), os);
|
||||||
|
}
|
||||||
|
inline void PrintTo(signed char* s, ::std::ostream* os) {
|
||||||
|
PrintTo(ImplicitCast_<const void*>(s), os);
|
||||||
|
}
|
||||||
|
inline void PrintTo(const unsigned char* s, ::std::ostream* os) {
|
||||||
|
PrintTo(ImplicitCast_<const void*>(s), os);
|
||||||
|
}
|
||||||
|
inline void PrintTo(unsigned char* s, ::std::ostream* os) {
|
||||||
|
PrintTo(ImplicitCast_<const void*>(s), os);
|
||||||
|
}
|
||||||
|
|
||||||
|
// MSVC can be configured to define wchar_t as a typedef of unsigned
|
||||||
|
// short. It defines _NATIVE_WCHAR_T_DEFINED when wchar_t is a native
|
||||||
|
// type. When wchar_t is a typedef, defining an overload for const
|
||||||
|
// wchar_t* would cause unsigned short* be printed as a wide string,
|
||||||
|
// possibly causing invalid memory accesses.
|
||||||
|
#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)
|
||||||
|
// Overloads for wide C strings
|
||||||
|
GTEST_API_ void PrintTo(const wchar_t* s, ::std::ostream* os);
|
||||||
|
inline void PrintTo(wchar_t* s, ::std::ostream* os) {
|
||||||
|
PrintTo(ImplicitCast_<const wchar_t*>(s), os);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Overload for C arrays. Multi-dimensional arrays are printed
|
||||||
|
// properly.
|
||||||
|
|
||||||
|
// Prints the given number of elements in an array, without printing
|
||||||
|
// the curly braces.
|
||||||
|
template <typename T>
|
||||||
|
void PrintRawArrayTo(const T a[], size_t count, ::std::ostream* os) {
|
||||||
|
UniversalPrint(a[0], os);
|
||||||
|
for (size_t i = 1; i != count; i++) {
|
||||||
|
*os << ", ";
|
||||||
|
UniversalPrint(a[i], os);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Overloads for ::string and ::std::string.
|
||||||
|
#if GTEST_HAS_GLOBAL_STRING
|
||||||
|
GTEST_API_ void PrintStringTo(const ::string&s, ::std::ostream* os);
|
||||||
|
inline void PrintTo(const ::string& s, ::std::ostream* os) {
|
||||||
|
PrintStringTo(s, os);
|
||||||
|
}
|
||||||
|
#endif // GTEST_HAS_GLOBAL_STRING
|
||||||
|
|
||||||
|
GTEST_API_ void PrintStringTo(const ::std::string&s, ::std::ostream* os);
|
||||||
|
inline void PrintTo(const ::std::string& s, ::std::ostream* os) {
|
||||||
|
PrintStringTo(s, os);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Overloads for ::wstring and ::std::wstring.
|
||||||
|
#if GTEST_HAS_GLOBAL_WSTRING
|
||||||
|
GTEST_API_ void PrintWideStringTo(const ::wstring&s, ::std::ostream* os);
|
||||||
|
inline void PrintTo(const ::wstring& s, ::std::ostream* os) {
|
||||||
|
PrintWideStringTo(s, os);
|
||||||
|
}
|
||||||
|
#endif // GTEST_HAS_GLOBAL_WSTRING
|
||||||
|
|
||||||
|
#if GTEST_HAS_STD_WSTRING
|
||||||
|
GTEST_API_ void PrintWideStringTo(const ::std::wstring&s, ::std::ostream* os);
|
||||||
|
inline void PrintTo(const ::std::wstring& s, ::std::ostream* os) {
|
||||||
|
PrintWideStringTo(s, os);
|
||||||
|
}
|
||||||
|
#endif // GTEST_HAS_STD_WSTRING
|
||||||
|
|
||||||
|
#if GTEST_HAS_TR1_TUPLE
|
||||||
|
// Overload for ::std::tr1::tuple. Needed for printing function arguments,
|
||||||
|
// which are packed as tuples.
|
||||||
|
|
||||||
|
// Helper function for printing a tuple. T must be instantiated with
|
||||||
|
// a tuple type.
|
||||||
|
template <typename T>
|
||||||
|
void PrintTupleTo(const T& t, ::std::ostream* os);
|
||||||
|
|
||||||
|
// Overloaded PrintTo() for tuples of various arities. We support
|
||||||
|
// tuples of up-to 10 fields. The following implementation works
|
||||||
|
// regardless of whether tr1::tuple is implemented using the
|
||||||
|
// non-standard variadic template feature or not.
|
||||||
|
|
||||||
|
inline void PrintTo(const ::std::tr1::tuple<>& t, ::std::ostream* os) {
|
||||||
|
PrintTupleTo(t, os);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T1>
|
||||||
|
void PrintTo(const ::std::tr1::tuple<T1>& t, ::std::ostream* os) {
|
||||||
|
PrintTupleTo(t, os);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T1, typename T2>
|
||||||
|
void PrintTo(const ::std::tr1::tuple<T1, T2>& t, ::std::ostream* os) {
|
||||||
|
PrintTupleTo(t, os);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T1, typename T2, typename T3>
|
||||||
|
void PrintTo(const ::std::tr1::tuple<T1, T2, T3>& t, ::std::ostream* os) {
|
||||||
|
PrintTupleTo(t, os);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T1, typename T2, typename T3, typename T4>
|
||||||
|
void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4>& t, ::std::ostream* os) {
|
||||||
|
PrintTupleTo(t, os);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T1, typename T2, typename T3, typename T4, typename T5>
|
||||||
|
void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5>& t,
|
||||||
|
::std::ostream* os) {
|
||||||
|
PrintTupleTo(t, os);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T1, typename T2, typename T3, typename T4, typename T5,
|
||||||
|
typename T6>
|
||||||
|
void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6>& t,
|
||||||
|
::std::ostream* os) {
|
||||||
|
PrintTupleTo(t, os);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T1, typename T2, typename T3, typename T4, typename T5,
|
||||||
|
typename T6, typename T7>
|
||||||
|
void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7>& t,
|
||||||
|
::std::ostream* os) {
|
||||||
|
PrintTupleTo(t, os);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T1, typename T2, typename T3, typename T4, typename T5,
|
||||||
|
typename T6, typename T7, typename T8>
|
||||||
|
void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8>& t,
|
||||||
|
::std::ostream* os) {
|
||||||
|
PrintTupleTo(t, os);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T1, typename T2, typename T3, typename T4, typename T5,
|
||||||
|
typename T6, typename T7, typename T8, typename T9>
|
||||||
|
void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>& t,
|
||||||
|
::std::ostream* os) {
|
||||||
|
PrintTupleTo(t, os);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T1, typename T2, typename T3, typename T4, typename T5,
|
||||||
|
typename T6, typename T7, typename T8, typename T9, typename T10>
|
||||||
|
void PrintTo(
|
||||||
|
const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>& t,
|
||||||
|
::std::ostream* os) {
|
||||||
|
PrintTupleTo(t, os);
|
||||||
|
}
|
||||||
|
#endif // GTEST_HAS_TR1_TUPLE
|
||||||
|
|
||||||
|
// Overload for std::pair.
|
||||||
|
template <typename T1, typename T2>
|
||||||
|
void PrintTo(const ::std::pair<T1, T2>& value, ::std::ostream* os) {
|
||||||
|
*os << '(';
|
||||||
|
// We cannot use UniversalPrint(value.first, os) here, as T1 may be
|
||||||
|
// a reference type. The same for printing value.second.
|
||||||
|
UniversalPrinter<T1>::Print(value.first, os);
|
||||||
|
*os << ", ";
|
||||||
|
UniversalPrinter<T2>::Print(value.second, os);
|
||||||
|
*os << ')';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Implements printing a non-reference type T by letting the compiler
|
||||||
|
// pick the right overload of PrintTo() for T.
|
||||||
|
template <typename T>
|
||||||
|
class UniversalPrinter {
|
||||||
|
public:
|
||||||
|
// MSVC warns about adding const to a function type, so we want to
|
||||||
|
// disable the warning.
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
# pragma warning(push) // Saves the current warning state.
|
||||||
|
# pragma warning(disable:4180) // Temporarily disables warning 4180.
|
||||||
|
#endif // _MSC_VER
|
||||||
|
|
||||||
|
// Note: we deliberately don't call this PrintTo(), as that name
|
||||||
|
// conflicts with ::testing::internal::PrintTo in the body of the
|
||||||
|
// function.
|
||||||
|
static void Print(const T& value, ::std::ostream* os) {
|
||||||
|
// By default, ::testing::internal::PrintTo() is used for printing
|
||||||
|
// the value.
|
||||||
|
//
|
||||||
|
// Thanks to Koenig look-up, if T is a class and has its own
|
||||||
|
// PrintTo() function defined in its namespace, that function will
|
||||||
|
// be visible here. Since it is more specific than the generic ones
|
||||||
|
// in ::testing::internal, it will be picked by the compiler in the
|
||||||
|
// following statement - exactly what we want.
|
||||||
|
PrintTo(value, os);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
# pragma warning(pop) // Restores the warning state.
|
||||||
|
#endif // _MSC_VER
|
||||||
|
};
|
||||||
|
|
||||||
|
// UniversalPrintArray(begin, len, os) prints an array of 'len'
|
||||||
|
// elements, starting at address 'begin'.
|
||||||
|
template <typename T>
|
||||||
|
void UniversalPrintArray(const T* begin, size_t len, ::std::ostream* os) {
|
||||||
|
if (len == 0) {
|
||||||
|
*os << "{}";
|
||||||
|
} else {
|
||||||
|
*os << "{ ";
|
||||||
|
const size_t kThreshold = 18;
|
||||||
|
const size_t kChunkSize = 8;
|
||||||
|
// If the array has more than kThreshold elements, we'll have to
|
||||||
|
// omit some details by printing only the first and the last
|
||||||
|
// kChunkSize elements.
|
||||||
|
// TODO(wan@google.com): let the user control the threshold using a flag.
|
||||||
|
if (len <= kThreshold) {
|
||||||
|
PrintRawArrayTo(begin, len, os);
|
||||||
|
} else {
|
||||||
|
PrintRawArrayTo(begin, kChunkSize, os);
|
||||||
|
*os << ", ..., ";
|
||||||
|
PrintRawArrayTo(begin + len - kChunkSize, kChunkSize, os);
|
||||||
|
}
|
||||||
|
*os << " }";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// This overload prints a (const) char array compactly.
|
||||||
|
GTEST_API_ void UniversalPrintArray(const char* begin,
|
||||||
|
size_t len,
|
||||||
|
::std::ostream* os);
|
||||||
|
|
||||||
|
// Implements printing an array type T[N].
|
||||||
|
template <typename T, size_t N>
|
||||||
|
class UniversalPrinter<T[N]> {
|
||||||
|
public:
|
||||||
|
// Prints the given array, omitting some elements when there are too
|
||||||
|
// many.
|
||||||
|
static void Print(const T (&a)[N], ::std::ostream* os) {
|
||||||
|
UniversalPrintArray(a, N, os);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Implements printing a reference type T&.
|
||||||
|
template <typename T>
|
||||||
|
class UniversalPrinter<T&> {
|
||||||
|
public:
|
||||||
|
// MSVC warns about adding const to a function type, so we want to
|
||||||
|
// disable the warning.
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
# pragma warning(push) // Saves the current warning state.
|
||||||
|
# pragma warning(disable:4180) // Temporarily disables warning 4180.
|
||||||
|
#endif // _MSC_VER
|
||||||
|
|
||||||
|
static void Print(const T& value, ::std::ostream* os) {
|
||||||
|
// Prints the address of the value. We use reinterpret_cast here
|
||||||
|
// as static_cast doesn't compile when T is a function type.
|
||||||
|
*os << "@" << reinterpret_cast<const void*>(&value) << " ";
|
||||||
|
|
||||||
|
// Then prints the value itself.
|
||||||
|
UniversalPrint(value, os);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
# pragma warning(pop) // Restores the warning state.
|
||||||
|
#endif // _MSC_VER
|
||||||
|
};
|
||||||
|
|
||||||
|
// Prints a value tersely: for a reference type, the referenced value
|
||||||
|
// (but not the address) is printed; for a (const) char pointer, the
|
||||||
|
// NUL-terminated string (but not the pointer) is printed.
|
||||||
|
template <typename T>
|
||||||
|
void UniversalTersePrint(const T& value, ::std::ostream* os) {
|
||||||
|
UniversalPrint(value, os);
|
||||||
|
}
|
||||||
|
inline void UniversalTersePrint(const char* str, ::std::ostream* os) {
|
||||||
|
if (str == NULL) {
|
||||||
|
*os << "NULL";
|
||||||
|
} else {
|
||||||
|
UniversalPrint(string(str), os);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
inline void UniversalTersePrint(char* str, ::std::ostream* os) {
|
||||||
|
UniversalTersePrint(static_cast<const char*>(str), os);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prints a value using the type inferred by the compiler. The
|
||||||
|
// difference between this and UniversalTersePrint() is that for a
|
||||||
|
// (const) char pointer, this prints both the pointer and the
|
||||||
|
// NUL-terminated string.
|
||||||
|
template <typename T>
|
||||||
|
void UniversalPrint(const T& value, ::std::ostream* os) {
|
||||||
|
UniversalPrinter<T>::Print(value, os);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if GTEST_HAS_TR1_TUPLE
|
||||||
|
typedef ::std::vector<string> Strings;
|
||||||
|
|
||||||
|
// This helper template allows PrintTo() for tuples and
|
||||||
|
// UniversalTersePrintTupleFieldsToStrings() to be defined by
|
||||||
|
// induction on the number of tuple fields. The idea is that
|
||||||
|
// TuplePrefixPrinter<N>::PrintPrefixTo(t, os) prints the first N
|
||||||
|
// fields in tuple t, and can be defined in terms of
|
||||||
|
// TuplePrefixPrinter<N - 1>.
|
||||||
|
|
||||||
|
// The inductive case.
|
||||||
|
template <size_t N>
|
||||||
|
struct TuplePrefixPrinter {
|
||||||
|
// Prints the first N fields of a tuple.
|
||||||
|
template <typename Tuple>
|
||||||
|
static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) {
|
||||||
|
TuplePrefixPrinter<N - 1>::PrintPrefixTo(t, os);
|
||||||
|
*os << ", ";
|
||||||
|
UniversalPrinter<typename ::std::tr1::tuple_element<N - 1, Tuple>::type>
|
||||||
|
::Print(::std::tr1::get<N - 1>(t), os);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tersely prints the first N fields of a tuple to a string vector,
|
||||||
|
// one element for each field.
|
||||||
|
template <typename Tuple>
|
||||||
|
static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) {
|
||||||
|
TuplePrefixPrinter<N - 1>::TersePrintPrefixToStrings(t, strings);
|
||||||
|
::std::stringstream ss;
|
||||||
|
UniversalTersePrint(::std::tr1::get<N - 1>(t), &ss);
|
||||||
|
strings->push_back(ss.str());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Base cases.
|
||||||
|
template <>
|
||||||
|
struct TuplePrefixPrinter<0> {
|
||||||
|
template <typename Tuple>
|
||||||
|
static void PrintPrefixTo(const Tuple&, ::std::ostream*) {}
|
||||||
|
|
||||||
|
template <typename Tuple>
|
||||||
|
static void TersePrintPrefixToStrings(const Tuple&, Strings*) {}
|
||||||
|
};
|
||||||
|
// We have to specialize the entire TuplePrefixPrinter<> class
|
||||||
|
// template here, even though the definition of
|
||||||
|
// TersePrintPrefixToStrings() is the same as the generic version, as
|
||||||
|
// Embarcadero (formerly CodeGear, formerly Borland) C++ doesn't
|
||||||
|
// support specializing a method template of a class template.
|
||||||
|
template <>
|
||||||
|
struct TuplePrefixPrinter<1> {
|
||||||
|
template <typename Tuple>
|
||||||
|
static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) {
|
||||||
|
UniversalPrinter<typename ::std::tr1::tuple_element<0, Tuple>::type>::
|
||||||
|
Print(::std::tr1::get<0>(t), os);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Tuple>
|
||||||
|
static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) {
|
||||||
|
::std::stringstream ss;
|
||||||
|
UniversalTersePrint(::std::tr1::get<0>(t), &ss);
|
||||||
|
strings->push_back(ss.str());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Helper function for printing a tuple. T must be instantiated with
|
||||||
|
// a tuple type.
|
||||||
|
template <typename T>
|
||||||
|
void PrintTupleTo(const T& t, ::std::ostream* os) {
|
||||||
|
*os << "(";
|
||||||
|
TuplePrefixPrinter< ::std::tr1::tuple_size<T>::value>::
|
||||||
|
PrintPrefixTo(t, os);
|
||||||
|
*os << ")";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prints the fields of a tuple tersely to a string vector, one
|
||||||
|
// element for each field. See the comment before
|
||||||
|
// UniversalTersePrint() for how we define "tersely".
|
||||||
|
template <typename Tuple>
|
||||||
|
Strings UniversalTersePrintTupleFieldsToStrings(const Tuple& value) {
|
||||||
|
Strings result;
|
||||||
|
TuplePrefixPrinter< ::std::tr1::tuple_size<Tuple>::value>::
|
||||||
|
TersePrintPrefixToStrings(value, &result);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
#endif // GTEST_HAS_TR1_TUPLE
|
||||||
|
|
||||||
|
} // namespace internal
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
::std::string PrintToString(const T& value) {
|
||||||
|
::std::stringstream ss;
|
||||||
|
internal::UniversalTersePrint(value, &ss);
|
||||||
|
return ss.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace testing
|
||||||
|
|
||||||
|
#endif // GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
|
||||||
232
third_party/googletest/src/include/gtest/gtest-spi.h
vendored
Normal file
232
third_party/googletest/src/include/gtest/gtest-spi.h
vendored
Normal file
@@ -0,0 +1,232 @@
|
|||||||
|
// Copyright 2007, Google Inc.
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions are
|
||||||
|
// met:
|
||||||
|
//
|
||||||
|
// * Redistributions of source code must retain the above copyright
|
||||||
|
// notice, this list of conditions and the following disclaimer.
|
||||||
|
// * Redistributions in binary form must reproduce the above
|
||||||
|
// copyright notice, this list of conditions and the following disclaimer
|
||||||
|
// in the documentation and/or other materials provided with the
|
||||||
|
// distribution.
|
||||||
|
// * Neither the name of Google Inc. nor the names of its
|
||||||
|
// contributors may be used to endorse or promote products derived from
|
||||||
|
// this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
//
|
||||||
|
// Author: wan@google.com (Zhanyong Wan)
|
||||||
|
//
|
||||||
|
// Utilities for testing Google Test itself and code that uses Google Test
|
||||||
|
// (e.g. frameworks built on top of Google Test).
|
||||||
|
|
||||||
|
#ifndef GTEST_INCLUDE_GTEST_GTEST_SPI_H_
|
||||||
|
#define GTEST_INCLUDE_GTEST_GTEST_SPI_H_
|
||||||
|
|
||||||
|
#include "gtest/gtest.h"
|
||||||
|
|
||||||
|
namespace testing {
|
||||||
|
|
||||||
|
// This helper class can be used to mock out Google Test failure reporting
|
||||||
|
// so that we can test Google Test or code that builds on Google Test.
|
||||||
|
//
|
||||||
|
// An object of this class appends a TestPartResult object to the
|
||||||
|
// TestPartResultArray object given in the constructor whenever a Google Test
|
||||||
|
// failure is reported. It can either intercept only failures that are
|
||||||
|
// generated in the same thread that created this object or it can intercept
|
||||||
|
// all generated failures. The scope of this mock object can be controlled with
|
||||||
|
// the second argument to the two arguments constructor.
|
||||||
|
class GTEST_API_ ScopedFakeTestPartResultReporter
|
||||||
|
: public TestPartResultReporterInterface {
|
||||||
|
public:
|
||||||
|
// The two possible mocking modes of this object.
|
||||||
|
enum InterceptMode {
|
||||||
|
INTERCEPT_ONLY_CURRENT_THREAD, // Intercepts only thread local failures.
|
||||||
|
INTERCEPT_ALL_THREADS // Intercepts all failures.
|
||||||
|
};
|
||||||
|
|
||||||
|
// The c'tor sets this object as the test part result reporter used
|
||||||
|
// by Google Test. The 'result' parameter specifies where to report the
|
||||||
|
// results. This reporter will only catch failures generated in the current
|
||||||
|
// thread. DEPRECATED
|
||||||
|
explicit ScopedFakeTestPartResultReporter(TestPartResultArray* result);
|
||||||
|
|
||||||
|
// Same as above, but you can choose the interception scope of this object.
|
||||||
|
ScopedFakeTestPartResultReporter(InterceptMode intercept_mode,
|
||||||
|
TestPartResultArray* result);
|
||||||
|
|
||||||
|
// The d'tor restores the previous test part result reporter.
|
||||||
|
virtual ~ScopedFakeTestPartResultReporter();
|
||||||
|
|
||||||
|
// Appends the TestPartResult object to the TestPartResultArray
|
||||||
|
// received in the constructor.
|
||||||
|
//
|
||||||
|
// This method is from the TestPartResultReporterInterface
|
||||||
|
// interface.
|
||||||
|
virtual void ReportTestPartResult(const TestPartResult& result);
|
||||||
|
private:
|
||||||
|
void Init();
|
||||||
|
|
||||||
|
const InterceptMode intercept_mode_;
|
||||||
|
TestPartResultReporterInterface* old_reporter_;
|
||||||
|
TestPartResultArray* const result_;
|
||||||
|
|
||||||
|
GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedFakeTestPartResultReporter);
|
||||||
|
};
|
||||||
|
|
||||||
|
namespace internal {
|
||||||
|
|
||||||
|
// A helper class for implementing EXPECT_FATAL_FAILURE() and
|
||||||
|
// EXPECT_NONFATAL_FAILURE(). Its destructor verifies that the given
|
||||||
|
// TestPartResultArray contains exactly one failure that has the given
|
||||||
|
// type and contains the given substring. If that's not the case, a
|
||||||
|
// non-fatal failure will be generated.
|
||||||
|
class GTEST_API_ SingleFailureChecker {
|
||||||
|
public:
|
||||||
|
// The constructor remembers the arguments.
|
||||||
|
SingleFailureChecker(const TestPartResultArray* results,
|
||||||
|
TestPartResult::Type type,
|
||||||
|
const string& substr);
|
||||||
|
~SingleFailureChecker();
|
||||||
|
private:
|
||||||
|
const TestPartResultArray* const results_;
|
||||||
|
const TestPartResult::Type type_;
|
||||||
|
const string substr_;
|
||||||
|
|
||||||
|
GTEST_DISALLOW_COPY_AND_ASSIGN_(SingleFailureChecker);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace internal
|
||||||
|
|
||||||
|
} // namespace testing
|
||||||
|
|
||||||
|
// A set of macros for testing Google Test assertions or code that's expected
|
||||||
|
// to generate Google Test fatal failures. It verifies that the given
|
||||||
|
// statement will cause exactly one fatal Google Test failure with 'substr'
|
||||||
|
// being part of the failure message.
|
||||||
|
//
|
||||||
|
// There are two different versions of this macro. EXPECT_FATAL_FAILURE only
|
||||||
|
// affects and considers failures generated in the current thread and
|
||||||
|
// EXPECT_FATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.
|
||||||
|
//
|
||||||
|
// The verification of the assertion is done correctly even when the statement
|
||||||
|
// throws an exception or aborts the current function.
|
||||||
|
//
|
||||||
|
// Known restrictions:
|
||||||
|
// - 'statement' cannot reference local non-static variables or
|
||||||
|
// non-static members of the current object.
|
||||||
|
// - 'statement' cannot return a value.
|
||||||
|
// - You cannot stream a failure message to this macro.
|
||||||
|
//
|
||||||
|
// Note that even though the implementations of the following two
|
||||||
|
// macros are much alike, we cannot refactor them to use a common
|
||||||
|
// helper macro, due to some peculiarity in how the preprocessor
|
||||||
|
// works. The AcceptsMacroThatExpandsToUnprotectedComma test in
|
||||||
|
// gtest_unittest.cc will fail to compile if we do that.
|
||||||
|
#define EXPECT_FATAL_FAILURE(statement, substr) \
|
||||||
|
do { \
|
||||||
|
class GTestExpectFatalFailureHelper {\
|
||||||
|
public:\
|
||||||
|
static void Execute() { statement; }\
|
||||||
|
};\
|
||||||
|
::testing::TestPartResultArray gtest_failures;\
|
||||||
|
::testing::internal::SingleFailureChecker gtest_checker(\
|
||||||
|
>est_failures, ::testing::TestPartResult::kFatalFailure, (substr));\
|
||||||
|
{\
|
||||||
|
::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
|
||||||
|
::testing::ScopedFakeTestPartResultReporter:: \
|
||||||
|
INTERCEPT_ONLY_CURRENT_THREAD, >est_failures);\
|
||||||
|
GTestExpectFatalFailureHelper::Execute();\
|
||||||
|
}\
|
||||||
|
} while (::testing::internal::AlwaysFalse())
|
||||||
|
|
||||||
|
#define EXPECT_FATAL_FAILURE_ON_ALL_THREADS(statement, substr) \
|
||||||
|
do { \
|
||||||
|
class GTestExpectFatalFailureHelper {\
|
||||||
|
public:\
|
||||||
|
static void Execute() { statement; }\
|
||||||
|
};\
|
||||||
|
::testing::TestPartResultArray gtest_failures;\
|
||||||
|
::testing::internal::SingleFailureChecker gtest_checker(\
|
||||||
|
>est_failures, ::testing::TestPartResult::kFatalFailure, (substr));\
|
||||||
|
{\
|
||||||
|
::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
|
||||||
|
::testing::ScopedFakeTestPartResultReporter:: \
|
||||||
|
INTERCEPT_ALL_THREADS, >est_failures);\
|
||||||
|
GTestExpectFatalFailureHelper::Execute();\
|
||||||
|
}\
|
||||||
|
} while (::testing::internal::AlwaysFalse())
|
||||||
|
|
||||||
|
// A macro for testing Google Test assertions or code that's expected to
|
||||||
|
// generate Google Test non-fatal failures. It asserts that the given
|
||||||
|
// statement will cause exactly one non-fatal Google Test failure with 'substr'
|
||||||
|
// being part of the failure message.
|
||||||
|
//
|
||||||
|
// There are two different versions of this macro. EXPECT_NONFATAL_FAILURE only
|
||||||
|
// affects and considers failures generated in the current thread and
|
||||||
|
// EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.
|
||||||
|
//
|
||||||
|
// 'statement' is allowed to reference local variables and members of
|
||||||
|
// the current object.
|
||||||
|
//
|
||||||
|
// The verification of the assertion is done correctly even when the statement
|
||||||
|
// throws an exception or aborts the current function.
|
||||||
|
//
|
||||||
|
// Known restrictions:
|
||||||
|
// - You cannot stream a failure message to this macro.
|
||||||
|
//
|
||||||
|
// Note that even though the implementations of the following two
|
||||||
|
// macros are much alike, we cannot refactor them to use a common
|
||||||
|
// helper macro, due to some peculiarity in how the preprocessor
|
||||||
|
// works. If we do that, the code won't compile when the user gives
|
||||||
|
// EXPECT_NONFATAL_FAILURE() a statement that contains a macro that
|
||||||
|
// expands to code containing an unprotected comma. The
|
||||||
|
// AcceptsMacroThatExpandsToUnprotectedComma test in gtest_unittest.cc
|
||||||
|
// catches that.
|
||||||
|
//
|
||||||
|
// For the same reason, we have to write
|
||||||
|
// if (::testing::internal::AlwaysTrue()) { statement; }
|
||||||
|
// instead of
|
||||||
|
// GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
|
||||||
|
// to avoid an MSVC warning on unreachable code.
|
||||||
|
#define EXPECT_NONFATAL_FAILURE(statement, substr) \
|
||||||
|
do {\
|
||||||
|
::testing::TestPartResultArray gtest_failures;\
|
||||||
|
::testing::internal::SingleFailureChecker gtest_checker(\
|
||||||
|
>est_failures, ::testing::TestPartResult::kNonFatalFailure, \
|
||||||
|
(substr));\
|
||||||
|
{\
|
||||||
|
::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
|
||||||
|
::testing::ScopedFakeTestPartResultReporter:: \
|
||||||
|
INTERCEPT_ONLY_CURRENT_THREAD, >est_failures);\
|
||||||
|
if (::testing::internal::AlwaysTrue()) { statement; }\
|
||||||
|
}\
|
||||||
|
} while (::testing::internal::AlwaysFalse())
|
||||||
|
|
||||||
|
#define EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(statement, substr) \
|
||||||
|
do {\
|
||||||
|
::testing::TestPartResultArray gtest_failures;\
|
||||||
|
::testing::internal::SingleFailureChecker gtest_checker(\
|
||||||
|
>est_failures, ::testing::TestPartResult::kNonFatalFailure, \
|
||||||
|
(substr));\
|
||||||
|
{\
|
||||||
|
::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
|
||||||
|
::testing::ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS,\
|
||||||
|
>est_failures);\
|
||||||
|
if (::testing::internal::AlwaysTrue()) { statement; }\
|
||||||
|
}\
|
||||||
|
} while (::testing::internal::AlwaysFalse())
|
||||||
|
|
||||||
|
#endif // GTEST_INCLUDE_GTEST_GTEST_SPI_H_
|
||||||
176
third_party/googletest/src/include/gtest/gtest-test-part.h
vendored
Normal file
176
third_party/googletest/src/include/gtest/gtest-test-part.h
vendored
Normal file
@@ -0,0 +1,176 @@
|
|||||||
|
// Copyright 2008, Google Inc.
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions are
|
||||||
|
// met:
|
||||||
|
//
|
||||||
|
// * Redistributions of source code must retain the above copyright
|
||||||
|
// notice, this list of conditions and the following disclaimer.
|
||||||
|
// * Redistributions in binary form must reproduce the above
|
||||||
|
// copyright notice, this list of conditions and the following disclaimer
|
||||||
|
// in the documentation and/or other materials provided with the
|
||||||
|
// distribution.
|
||||||
|
// * Neither the name of Google Inc. nor the names of its
|
||||||
|
// contributors may be used to endorse or promote products derived from
|
||||||
|
// this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
//
|
||||||
|
// Author: mheule@google.com (Markus Heule)
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
|
||||||
|
#define GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
|
||||||
|
|
||||||
|
#include <iosfwd>
|
||||||
|
#include <vector>
|
||||||
|
#include "gtest/internal/gtest-internal.h"
|
||||||
|
#include "gtest/internal/gtest-string.h"
|
||||||
|
|
||||||
|
namespace testing {
|
||||||
|
|
||||||
|
// A copyable object representing the result of a test part (i.e. an
|
||||||
|
// assertion or an explicit FAIL(), ADD_FAILURE(), or SUCCESS()).
|
||||||
|
//
|
||||||
|
// Don't inherit from TestPartResult as its destructor is not virtual.
|
||||||
|
class GTEST_API_ TestPartResult {
|
||||||
|
public:
|
||||||
|
// The possible outcomes of a test part (i.e. an assertion or an
|
||||||
|
// explicit SUCCEED(), FAIL(), or ADD_FAILURE()).
|
||||||
|
enum Type {
|
||||||
|
kSuccess, // Succeeded.
|
||||||
|
kNonFatalFailure, // Failed but the test can continue.
|
||||||
|
kFatalFailure // Failed and the test should be terminated.
|
||||||
|
};
|
||||||
|
|
||||||
|
// C'tor. TestPartResult does NOT have a default constructor.
|
||||||
|
// Always use this constructor (with parameters) to create a
|
||||||
|
// TestPartResult object.
|
||||||
|
TestPartResult(Type a_type,
|
||||||
|
const char* a_file_name,
|
||||||
|
int a_line_number,
|
||||||
|
const char* a_message)
|
||||||
|
: type_(a_type),
|
||||||
|
file_name_(a_file_name),
|
||||||
|
line_number_(a_line_number),
|
||||||
|
summary_(ExtractSummary(a_message)),
|
||||||
|
message_(a_message) {
|
||||||
|
}
|
||||||
|
|
||||||
|
// Gets the outcome of the test part.
|
||||||
|
Type type() const { return type_; }
|
||||||
|
|
||||||
|
// Gets the name of the source file where the test part took place, or
|
||||||
|
// NULL if it's unknown.
|
||||||
|
const char* file_name() const { return file_name_.c_str(); }
|
||||||
|
|
||||||
|
// Gets the line in the source file where the test part took place,
|
||||||
|
// or -1 if it's unknown.
|
||||||
|
int line_number() const { return line_number_; }
|
||||||
|
|
||||||
|
// Gets the summary of the failure message.
|
||||||
|
const char* summary() const { return summary_.c_str(); }
|
||||||
|
|
||||||
|
// Gets the message associated with the test part.
|
||||||
|
const char* message() const { return message_.c_str(); }
|
||||||
|
|
||||||
|
// Returns true iff the test part passed.
|
||||||
|
bool passed() const { return type_ == kSuccess; }
|
||||||
|
|
||||||
|
// Returns true iff the test part failed.
|
||||||
|
bool failed() const { return type_ != kSuccess; }
|
||||||
|
|
||||||
|
// Returns true iff the test part non-fatally failed.
|
||||||
|
bool nonfatally_failed() const { return type_ == kNonFatalFailure; }
|
||||||
|
|
||||||
|
// Returns true iff the test part fatally failed.
|
||||||
|
bool fatally_failed() const { return type_ == kFatalFailure; }
|
||||||
|
private:
|
||||||
|
Type type_;
|
||||||
|
|
||||||
|
// Gets the summary of the failure message by omitting the stack
|
||||||
|
// trace in it.
|
||||||
|
static internal::String ExtractSummary(const char* message);
|
||||||
|
|
||||||
|
// The name of the source file where the test part took place, or
|
||||||
|
// NULL if the source file is unknown.
|
||||||
|
internal::String file_name_;
|
||||||
|
// The line in the source file where the test part took place, or -1
|
||||||
|
// if the line number is unknown.
|
||||||
|
int line_number_;
|
||||||
|
internal::String summary_; // The test failure summary.
|
||||||
|
internal::String message_; // The test failure message.
|
||||||
|
};
|
||||||
|
|
||||||
|
// Prints a TestPartResult object.
|
||||||
|
std::ostream& operator<<(std::ostream& os, const TestPartResult& result);
|
||||||
|
|
||||||
|
// An array of TestPartResult objects.
|
||||||
|
//
|
||||||
|
// Don't inherit from TestPartResultArray as its destructor is not
|
||||||
|
// virtual.
|
||||||
|
class GTEST_API_ TestPartResultArray {
|
||||||
|
public:
|
||||||
|
TestPartResultArray() {}
|
||||||
|
|
||||||
|
// Appends the given TestPartResult to the array.
|
||||||
|
void Append(const TestPartResult& result);
|
||||||
|
|
||||||
|
// Returns the TestPartResult at the given index (0-based).
|
||||||
|
const TestPartResult& GetTestPartResult(int index) const;
|
||||||
|
|
||||||
|
// Returns the number of TestPartResult objects in the array.
|
||||||
|
int size() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::vector<TestPartResult> array_;
|
||||||
|
|
||||||
|
GTEST_DISALLOW_COPY_AND_ASSIGN_(TestPartResultArray);
|
||||||
|
};
|
||||||
|
|
||||||
|
// This interface knows how to report a test part result.
|
||||||
|
class TestPartResultReporterInterface {
|
||||||
|
public:
|
||||||
|
virtual ~TestPartResultReporterInterface() {}
|
||||||
|
|
||||||
|
virtual void ReportTestPartResult(const TestPartResult& result) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
namespace internal {
|
||||||
|
|
||||||
|
// This helper class is used by {ASSERT|EXPECT}_NO_FATAL_FAILURE to check if a
|
||||||
|
// statement generates new fatal failures. To do so it registers itself as the
|
||||||
|
// current test part result reporter. Besides checking if fatal failures were
|
||||||
|
// reported, it only delegates the reporting to the former result reporter.
|
||||||
|
// The original result reporter is restored in the destructor.
|
||||||
|
// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
|
||||||
|
class GTEST_API_ HasNewFatalFailureHelper
|
||||||
|
: public TestPartResultReporterInterface {
|
||||||
|
public:
|
||||||
|
HasNewFatalFailureHelper();
|
||||||
|
virtual ~HasNewFatalFailureHelper();
|
||||||
|
virtual void ReportTestPartResult(const TestPartResult& result);
|
||||||
|
bool has_new_fatal_failure() const { return has_new_fatal_failure_; }
|
||||||
|
private:
|
||||||
|
bool has_new_fatal_failure_;
|
||||||
|
TestPartResultReporterInterface* original_reporter_;
|
||||||
|
|
||||||
|
GTEST_DISALLOW_COPY_AND_ASSIGN_(HasNewFatalFailureHelper);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace internal
|
||||||
|
|
||||||
|
} // namespace testing
|
||||||
|
|
||||||
|
#endif // GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user