mirror of
https://github.com/opencv/opencv.git
synced 2026-07-29 23:33:05 +04:00
Compare commits
4377 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 725e440d27 | |||
| 121034876d | |||
| 9627ab9462 | |||
| 499035c6ea | |||
| 71765858dc | |||
| 9a2a34f94e | |||
| 838c34eee1 | |||
| 253429d3f1 | |||
| 38f7cd7173 | |||
| eab7faf536 | |||
| 83391ac59d | |||
| a8a93a57e7 | |||
| f637629c5a | |||
| 93aa94e71e | |||
| 86b46a27cf | |||
| 1bc3077890 | |||
| fc27a343e9 | |||
| 692d6168b3 | |||
| de9787a6ac | |||
| d2bf2be8e6 | |||
| b7292bc899 | |||
| dbd4a0e5e6 | |||
| b361209d52 | |||
| 4abe6dc48d | |||
| 26f36f2ff9 | |||
| b42c11de82 | |||
| a494c75bfe | |||
| bc8c912c7a | |||
| 5247237bf0 | |||
| 8e6aae0d7a | |||
| 8681686d8f | |||
| 9012e6dd9b | |||
| 139bd30247 | |||
| 4930516652 | |||
| ad568edd7f | |||
| 62b3a20da5 | |||
| 1f41d06f9a | |||
| 1339c7f30c | |||
| 734fb18c4d | |||
| 71c6339af0 | |||
| 34a0897f90 | |||
| a32100d9ba | |||
| b5400902a7 | |||
| d35fbe6bfc | |||
| 645930387c | |||
| 44dfe62af0 | |||
| 4acb267cf4 | |||
| 8676d19dc3 | |||
| 6b4f3e5fab | |||
| dafc4e456d | |||
| 2a884cc179 | |||
| b774753922 | |||
| 5e03305da5 | |||
| 3ff1ec99ac | |||
| bc8d494617 | |||
| 35e771daab | |||
| 1ab259df9a | |||
| 0bd54a60e9 | |||
| 63b6b24cd0 | |||
| 8e49560709 | |||
| b8f57c9a96 | |||
| c6a15e1835 | |||
| 05f4416ba0 | |||
| 91ac790249 | |||
| 3cfe737581 | |||
| a2b3acfc6e | |||
| f4b23de9dd | |||
| a08c98cdfb | |||
| 279e2be56b | |||
| cdbb893b27 | |||
| 41d172f22d | |||
| 3f7ec99166 | |||
| 1102b7eff8 | |||
| da43778c1f | |||
| 9aa5ab7557 | |||
| d44c58a1fb | |||
| 7463e9b8bb | |||
| 9f201a8ebe | |||
| 91998d6424 | |||
| 420db56ffd | |||
| 07ed5e5346 | |||
| 4824ce300f | |||
| 5855eba9f3 | |||
| cdaf4c7321 | |||
| eace6adb6d | |||
| 6db9fcbc30 | |||
| b4b35cff15 | |||
| 47fb79bd8c | |||
| 6b50410336 | |||
| 6e3700593f | |||
| 6a8c5a1d27 | |||
| 50da209dc4 | |||
| b7b08fa0c3 | |||
| b1288dad40 | |||
| ac6fb17784 | |||
| 3f22f4727c | |||
| 0153e796cc | |||
| 4891818114 | |||
| db4a557187 | |||
| 04c3a534af | |||
| a32143003d | |||
| 8bd17163c7 | |||
| 81aaca8c04 | |||
| 189e1b228d | |||
| 52709c7771 | |||
| 7dbb125a34 | |||
| aff375808d | |||
| 3f5f09e730 | |||
| 332ff4bf1c | |||
| 253a4c113e | |||
| 1788c93aea | |||
| c2ecbc76ce | |||
| 4203c903f8 | |||
| 727feda935 | |||
| 39087fecdc | |||
| c725771e11 | |||
| 103212f209 | |||
| be326ff752 | |||
| ebaee3ea21 | |||
| 423bc515e5 | |||
| 941d89e06d | |||
| 281b790618 | |||
| f5d7c5f103 | |||
| 93c4bca04d | |||
| 726f0adde3 | |||
| 24d7eb0ca5 | |||
| 8ba44e7d55 | |||
| 49f539cb46 | |||
| 0a650b573b | |||
| 7e3c53b9d3 | |||
| ab912329b6 | |||
| 6ad216576d | |||
| c5a4df30c6 | |||
| cb8f1dca3b | |||
| d1ff87d94d | |||
| b16f76eede | |||
| 4792837f2e | |||
| 416830fb59 | |||
| 07b1bc2e88 | |||
| d16b3b2487 | |||
| 74d0b4cc78 | |||
| 8832a9dbd5 | |||
| c55613ccf7 | |||
| 6c399aa62a | |||
| 5862b50217 | |||
| 5696629b13 | |||
| 3a15152be5 | |||
| f1055a7e91 | |||
| d4dc6b509b | |||
| 1192779d05 | |||
| 71a1150c95 | |||
| e14ca39fd7 | |||
| 421ba8730a | |||
| 0d56524b72 | |||
| 9fded9ca53 | |||
| 441624a5fb | |||
| 25ac77e010 | |||
| 77d887898d | |||
| a32f2cd24a | |||
| eb68de9268 | |||
| ed3810f7a5 | |||
| 1c3e287d32 | |||
| 5044af69d1 | |||
| bc6544c0bc | |||
| a462f49b99 | |||
| 7622fbf895 | |||
| 3f371fe2dd | |||
| 6ca205a029 | |||
| aba2167d9c | |||
| 5db4f1f7df | |||
| a0a8d2160d | |||
| 2a5da50902 | |||
| 51758b2dd6 | |||
| 90b144cf0a | |||
| 529bd0425e | |||
| 6c36cd5d6e | |||
| c102720af4 | |||
| c63a6c472d | |||
| 5b3f721efa | |||
| e5bea2bde4 | |||
| e9d64e0a8c | |||
| f0df78b7e7 | |||
| e93d976d00 | |||
| 64aad34cb4 | |||
| 7592d58f0c | |||
| 08906ddd4b | |||
| d21761c0fd | |||
| 277ead95d9 | |||
| 5d14cc68b7 | |||
| ce80e0dc57 | |||
| 4c74e6d89d | |||
| 45d04175d4 | |||
| 687c9b7b29 | |||
| d9f66413ee | |||
| 1b1bbe4262 | |||
| 3edf7c25d4 | |||
| 54531f8e3b | |||
| b5a68f235a | |||
| 5bf64e7dfe | |||
| 51b897b672 | |||
| da4ac6b7ef | |||
| 1ba0984203 | |||
| f5e852cdf0 | |||
| ef2677b0a6 | |||
| 2aad039b4f | |||
| 8a90948a1c | |||
| 63bff33e85 | |||
| 21133a2091 | |||
| 39f995e319 | |||
| 91624e87ab | |||
| 11d492b0b9 | |||
| 17f2b56291 | |||
| d1d8ac57f3 | |||
| b418eb112c | |||
| ee9137f176 | |||
| 903bf0147e | |||
| 540aa13300 | |||
| bbbf1168dc | |||
| 18fbb72f7d | |||
| 0b5fd4f6bb | |||
| 87360c2ae5 | |||
| 17b98dd005 | |||
| 1293e99ad8 | |||
| 028d4d83d3 | |||
| be670e168a | |||
| b619477be9 | |||
| 778faddbd8 | |||
| f644634aa6 | |||
| 547f4c2c5a | |||
| 5462a6be6e | |||
| a60496f9df | |||
| acd8d3a617 | |||
| 0c92305a4b | |||
| 1ecfff0fa0 | |||
| d933034ad4 | |||
| a6fadfe1c2 | |||
| aae317c017 | |||
| 37683aca56 | |||
| 22f8fb4d5c | |||
| 7d1589d407 | |||
| b35018d955 | |||
| c29a3aa0a0 | |||
| eae5fd81e5 | |||
| 23edec83fb | |||
| e4cd430710 | |||
| 35b2cff295 | |||
| 8e5f37f87c | |||
| cee8c86b6e | |||
| c0a84dcc85 | |||
| e80b443cd9 | |||
| e309a06b47 | |||
| 86dad3aebe | |||
| 5a9fe9dedb | |||
| c7d24c0fb3 | |||
| 5d292826b2 | |||
| f378f02954 | |||
| ba575fd4ad | |||
| dd14cf6a9c | |||
| 2c81cb2f76 | |||
| 6eb34716b8 | |||
| 871bc98933 | |||
| ec7fc5adca | |||
| c0c3f4cbac | |||
| 02143cd0e2 | |||
| 1c5dcbcac8 | |||
| d24d8f2abe | |||
| 584ea43b2f | |||
| 292f62c5cc | |||
| 762481411d | |||
| d816442e4d | |||
| ea5ca16036 | |||
| 2991717191 | |||
| 0fa43e3aac | |||
| 085fb78e85 | |||
| a565aa6db9 | |||
| 2763f988da | |||
| 82ac7ea236 | |||
| f89dee4f3e | |||
| 70779d4e66 | |||
| c0ecf08ca0 | |||
| 35f43cc429 | |||
| cfafd0493c | |||
| 9119692bb8 | |||
| 8b0aa6a64d | |||
| ec26541771 | |||
| 1c825dd509 | |||
| d9eff7daeb | |||
| 3419e64dcf | |||
| 1e2ceca4df | |||
| 347246901e | |||
| 68bd156a71 | |||
| 9821fae59d | |||
| 43b2bb2c25 | |||
| a3ebafbdeb | |||
| 5cd07006f6 | |||
| 3d350a002e | |||
| f18b8cd569 | |||
| 5389d9e0d4 | |||
| 07c795408d | |||
| 5f50e7bafe | |||
| e92716a1b6 | |||
| bbcc1752b1 | |||
| 40ae06091d | |||
| d480e2e51b | |||
| 839321642e | |||
| 9f88a65873 | |||
| b77330bafc | |||
| 4a4b2a0ce6 | |||
| 0ae126d3b8 | |||
| af9332dfaf | |||
| 4103567776 | |||
| 8f0edf6a1c | |||
| ab5279f4ad | |||
| 1113c9ab10 | |||
| bf5d7c0c10 | |||
| fef8d4c990 | |||
| 5a0c85b3ef | |||
| 9fd877acc9 | |||
| ed3b56d763 | |||
| 2f79b1b087 | |||
| 7208f63221 | |||
| 572d4f4491 | |||
| 0cd4396180 | |||
| aafb7567c1 | |||
| 468431cd8f | |||
| cf5db9b94f | |||
| 589b6c15f0 | |||
| 2af0813634 | |||
| 15d2a5faf8 | |||
| b1d28d5b4a | |||
| a6fbd8287c | |||
| b0b77b3047 | |||
| 96844b0ca5 | |||
| 7fc6146973 | |||
| 6cf0910842 | |||
| 692c536ac5 | |||
| 1646a21197 | |||
| 4557971481 | |||
| 8baf46c0a8 | |||
| 0c0083ba72 | |||
| d18362c726 | |||
| b403d37267 | |||
| 2d189e24ee | |||
| c8c29b0f1a | |||
| 784dd55d88 | |||
| adb916ce82 | |||
| 15cfafb360 | |||
| d43cb4fe7c | |||
| 38c9c20a35 | |||
| 935acc500f | |||
| c189f31f23 | |||
| cbf43a54fb | |||
| 2918071a3e | |||
| 1829eba584 | |||
| 3a64607d94 | |||
| 64649a1207 | |||
| 4dfbbabf8b | |||
| 72f1ce6550 | |||
| c34c4b50d0 | |||
| 4521d66103 | |||
| 0c238c9e72 | |||
| 3d9f27b877 | |||
| 50e66a2e53 | |||
| a682f02f59 | |||
| df24bd295d | |||
| 04ebedb6f0 | |||
| 71ae1cac5f | |||
| e0b21dccf1 | |||
| bfeeb0ad70 | |||
| 2273af0166 | |||
| 604192337f | |||
| ccfc34b13f | |||
| 3f4abcb228 | |||
| f2ccce23f3 | |||
| 7d96ef2671 | |||
| 2882725927 | |||
| 062cee2933 | |||
| fcf9f117b0 | |||
| 0f1cb5ad7c | |||
| 0ab4872032 | |||
| a6274647a4 | |||
| 65f71ce2eb | |||
| 6aefb8e86f | |||
| 4aef9b1c93 | |||
| 0ac67ee8d9 | |||
| 66b3155a48 | |||
| b3adffe437 | |||
| ec92f3fefa | |||
| fb85a83108 | |||
| 41ef2bfb16 | |||
| 1ae801554d | |||
| 65998d8076 | |||
| 45a7b71cac | |||
| e1e9261450 | |||
| 819e5b19b3 | |||
| a3cb2020bc | |||
| a6017ac550 | |||
| 7faeb82585 | |||
| 48e50a7674 | |||
| dc9d775f88 | |||
| 66cbb7b911 | |||
| 9ca3a3139a | |||
| 6fb465cb4e | |||
| 8ae03fcd6e | |||
| 122250b554 | |||
| eb8883160d | |||
| 8af4fe9ed3 | |||
| adb5971494 | |||
| 377fdf5ae5 | |||
| e1272d73fe | |||
| e3e61078a5 | |||
| 13823f117b | |||
| 2e15582799 | |||
| 65bdb3a544 | |||
| ac91c45b0f | |||
| 6481cfd048 | |||
| 0f6b01a531 | |||
| 364b3f181d | |||
| 04849f26b2 | |||
| 26a7647e0e | |||
| 8eb036fb3c | |||
| fce8349c99 | |||
| 5ea912e778 | |||
| c2c8da2517 | |||
| 1be40554af | |||
| d717de5719 | |||
| bcc19a622d | |||
| fb3fc5322c | |||
| 2eff70fbf4 | |||
| d885242b61 | |||
| 46d988e2cb | |||
| 7a5122121b | |||
| 7fc14504b1 | |||
| cb1a1e9a51 | |||
| 619e038de9 | |||
| 4154bd0667 | |||
| 5408949951 | |||
| 866191478f | |||
| c9060b053d | |||
| 9dc844a6e1 | |||
| e2a9cff3dc | |||
| c3b83b8354 | |||
| e24382691f | |||
| 9074b3e980 | |||
| 65d66a05dd | |||
| 7de7891c4d | |||
| 4bec43cf79 | |||
| 6cc0107693 | |||
| ca7f964104 | |||
| b26fc6f31b | |||
| 5fa624f35e | |||
| 7955469f7c | |||
| ce62fc8371 | |||
| 2e40b7f113 | |||
| 2ac62bccec | |||
| 22eb91a7e0 | |||
| 448e3a7e58 | |||
| bf54a370e5 | |||
| 337452b4c0 | |||
| 5bb098ba5d | |||
| 4159842195 | |||
| b69b1eae8f | |||
| c4a6e1fd4d | |||
| 3456d28cc2 | |||
| f376bfe95d | |||
| a72074b33f | |||
| 5185544864 | |||
| 7834a465d5 | |||
| 1f0bfc8d83 | |||
| a122f0f248 | |||
| a31fb88fd0 | |||
| 70fb1cd603 | |||
| d2c48b898c | |||
| 2d837efba7 | |||
| 1852d0b9b8 | |||
| 837e41f9a7 | |||
| 1fd45a1b85 | |||
| 2cd7e17b65 | |||
| 8eb4f72531 | |||
| 2619099fe5 | |||
| 2959286eb5 | |||
| a4b191a7e0 | |||
| 3929e26276 | |||
| a1d5565e65 | |||
| 9638e34ab0 | |||
| ed9d4c0b2b | |||
| bb64db98d8 | |||
| 88115811a9 | |||
| 67fa8a2f47 | |||
| 560eba91e5 | |||
| 42561e1233 | |||
| 7e2c8cc9f4 | |||
| eea05f5078 | |||
| 7eaec9dd22 | |||
| e1305e8d05 | |||
| 2dd3408caa | |||
| 3651831e7e | |||
| a1d752bfc0 | |||
| d10832074e | |||
| a001ab3a44 | |||
| ef570e4e13 | |||
| 7831aae5dd | |||
| 1336da9450 | |||
| 6432f02996 | |||
| 1fb8d60fd2 | |||
| 5e92bf8e41 | |||
| 7e5d012f75 | |||
| 925ff6241f | |||
| e14c3cff85 | |||
| 984e42b0bc | |||
| 0702685e7e | |||
| 7deb8f568f | |||
| d8434e6875 | |||
| b9a1039566 | |||
| 03130548ea | |||
| 11c5a6bb4d | |||
| 8dc332721f | |||
| 189f647264 | |||
| 56baf4ed87 | |||
| 7ffb103758 | |||
| 9fcf015214 | |||
| 27bfab4e6e | |||
| ffccfa2ee9 | |||
| d3dcef4b8b | |||
| 3cd36ebc7b | |||
| 2ebdc04787 | |||
| cc8add9f66 | |||
| c2c539e3cc | |||
| 0cdff46725 | |||
| d0d115321d | |||
| 99683e958a | |||
| f572ae3474 | |||
| e65ad44b32 | |||
| 3d8614cb47 | |||
| d09cc0f30c | |||
| 80c82e10aa | |||
| 2fb652ce09 | |||
| 1bab920cf5 | |||
| bb71cb200e | |||
| 48afe1586a | |||
| e7e814fa8c | |||
| 496eed950f | |||
| f0d29cd33c | |||
| 75bb6aa9a1 | |||
| 44b2f9637a | |||
| 0643165519 | |||
| cde18648dc | |||
| 04e01e2b31 | |||
| 348b7383f9 | |||
| b2b7193374 | |||
| 47a59d72c9 | |||
| 163770f99a | |||
| 4c1e064a2b | |||
| 88555948d0 | |||
| 1893b37e23 | |||
| c3cbd302cb | |||
| 2ffa7ac0da | |||
| 885a446b10 | |||
| 8bfe620fcc | |||
| 129319b0bc | |||
| 7ce83f2a95 | |||
| 4b05765174 | |||
| 3390da6beb | |||
| 50707a2741 | |||
| 0614c40b42 | |||
| facd07a732 | |||
| 26ac81df3e | |||
| 1ec10ca565 | |||
| 26a39c733b | |||
| 15f0e2e7cb | |||
| d4640f4647 | |||
| 4c9364a803 | |||
| e951edeed3 | |||
| e7a787aa41 | |||
| 500e24d6cd | |||
| 759cbd7486 | |||
| 57545653b1 | |||
| 3c5377ca1b | |||
| a89868928b | |||
| 5bf3991f55 | |||
| 08696d92ea | |||
| 2c2466fb25 | |||
| fc3e393516 | |||
| ebaf8cc06c | |||
| 0862d69a6e | |||
| b8106e4ba4 | |||
| 6ce2f1316f | |||
| 294348939b | |||
| e2db95184f | |||
| f8597fc150 | |||
| 85b0b0cd77 | |||
| 2bd72af2ef | |||
| f729202272 | |||
| 47f30a04d2 | |||
| a42b35598e | |||
| db53f4533e | |||
| 71e33265f5 | |||
| a016f6022c | |||
| 3e3b53f815 | |||
| e2bfe0ce76 | |||
| 98c33c605d | |||
| b3269b08a1 | |||
| e59cff47d4 | |||
| 47912431e6 | |||
| 0ef803950b | |||
| 3c23a44786 | |||
| 701d0d9905 | |||
| d4e1d89901 | |||
| 14aa9eaadd | |||
| 1feabf4275 | |||
| 65c173f2a3 | |||
| 697acf7f6a | |||
| ed69bcae2d | |||
| 728545468c | |||
| 33b1e76e48 | |||
| 1d134025a5 | |||
| 96a9cfab36 | |||
| c9e10e1d0b | |||
| 60846b2b7a | |||
| 6fe7886e2b | |||
| 199c2d2fd0 | |||
| bd54ba911d | |||
| a9354fc743 | |||
| b4b69ae484 | |||
| 1c7b71bf9e | |||
| 1377f0147e | |||
| d2b1e38207 | |||
| 9ffb67478f | |||
| 1dee848d3e | |||
| afe1c70f2d | |||
| 1b8fba8e26 | |||
| 45fbb67aba | |||
| 914005174f | |||
| 2a82467a6f | |||
| a233232b7d | |||
| ed4bf13960 | |||
| 3135063100 | |||
| 87ef6a9cc1 | |||
| ff31f90b7e | |||
| 2b2ba534e2 | |||
| 3635b3dee7 | |||
| fa613e393f | |||
| 7d3dbcb027 | |||
| db70676933 | |||
| b3b235ebc0 | |||
| 70492c2127 | |||
| f562264674 | |||
| 0a88f84847 | |||
| 139c443770 | |||
| a630ad73cb | |||
| 366e8217c2 | |||
| 01226cb8ac | |||
| 3891b72f33 | |||
| a80fcacd90 | |||
| c54ccaac31 | |||
| 79731cb0ff | |||
| 16b5fd4bf2 | |||
| fb9463c55f | |||
| 2920a8e0ec | |||
| 6a4c3b61e6 | |||
| 6360c3bf46 | |||
| e313603aac | |||
| 0f3de805f4 | |||
| 3bf22d0024 | |||
| 66567933d7 | |||
| 56e19e3494 | |||
| d2f5a10f5d | |||
| 32bb4fa950 | |||
| 8ae06b4648 | |||
| 652396678d | |||
| 59b870a87a | |||
| 0f067fd0a6 | |||
| b91f173680 | |||
| a311d1bdc0 | |||
| eb7add1828 | |||
| b152b8cbcd | |||
| 2336b0706d | |||
| 300b57dd70 | |||
| 0769bf416f | |||
| 90f2e1f8b5 | |||
| 2a4926f417 | |||
| 5e1c9099e8 | |||
| 397e9bc8d6 | |||
| 2366f2cb2e | |||
| 35f1a90df7 | |||
| 9faefa0c96 | |||
| b5adffd5c2 | |||
| 82010bf5c1 | |||
| 6234f01a6d | |||
| 44c2519d75 | |||
| ef94275eb6 | |||
| a6ca48a1c2 | |||
| 24a66a44bf | |||
| 2411b825b4 | |||
| dd7b9000ad | |||
| f1328c7395 | |||
| 9d06e58c3c | |||
| 711b136191 | |||
| a04f9e7a59 | |||
| db5b22e895 | |||
| 0d52c37e11 | |||
| 734e309b3e | |||
| 3efc645975 | |||
| 572812217b | |||
| 008507327c | |||
| f4a6c3e7ea | |||
| ff41fbc5c1 | |||
| cac864192c | |||
| b19683eb41 | |||
| 7a46d7efde | |||
| d09bd6f862 | |||
| 7676be5570 | |||
| ed9524e125 | |||
| 533bb035cf | |||
| dda2e9374b | |||
| 14754deb21 | |||
| b0dc474160 | |||
| adf89bbb33 | |||
| c103b63fe1 | |||
| a3d0882317 | |||
| 583bd1a6e2 | |||
| 53eda42da7 | |||
| c26c4a61c6 | |||
| ea2527c2d1 | |||
| 65fcf22670 | |||
| d0572538ff | |||
| 3577265508 | |||
| f28e191d70 | |||
| 38b6c44b4c | |||
| 1a24e316d5 | |||
| 9da9e8244b | |||
| 8d51ef0f35 | |||
| 9cfae823a7 | |||
| d6151eae23 | |||
| 4a0a3281c6 | |||
| 1230075011 | |||
| 7459954377 | |||
| cf38098ba8 | |||
| 8ca394efaf | |||
| f9c7931800 | |||
| 24547f40ff | |||
| 72debee125 | |||
| a3d6994afa | |||
| 08c270f65a | |||
| e585453c2e | |||
| 86f4524010 | |||
| 6d098cc230 | |||
| 434c96e625 | |||
| d6e9616256 | |||
| e9187ae38c | |||
| 978dc76653 | |||
| b409fd32ac | |||
| a2ad997e97 | |||
| e9428726ca | |||
| 400906b433 | |||
| 50d7c61c01 | |||
| d9bf522b27 | |||
| 93dc0679ec | |||
| 1ddc51cfd1 | |||
| 50bf0e10f5 | |||
| d1ccb7e47f | |||
| 6a22c5b2b5 | |||
| 7e845a3b87 | |||
| ea1c970190 | |||
| 3d207ccf11 | |||
| aaf7f5ae02 | |||
| 50e8ad285b | |||
| bb5462e327 | |||
| df2e7fa6eb | |||
| 11f36bdf9a | |||
| bc0d4585b3 | |||
| 70917f291c | |||
| 9f6f0c7424 | |||
| 4722a8df3c | |||
| 7be8a71c60 | |||
| ce859edba8 | |||
| 90820cd044 | |||
| c929f1b62f | |||
| ff88132620 | |||
| 89f8d4ae12 | |||
| 3f4ffe7844 | |||
| ed567a2dd1 | |||
| 22a00036e2 | |||
| 2aac0a5a26 | |||
| 07ad6a437e | |||
| d9a444ca1a | |||
| 766f58ed7e | |||
| 1099b4c881 | |||
| 7c0f49fc36 | |||
| 761e796201 | |||
| 8d0fbc6a1e | |||
| affcea8822 | |||
| 53f0be00a9 | |||
| 602caa9cd6 | |||
| f35ec8c955 | |||
| 1316491e50 | |||
| 2cc4309bf8 | |||
| 612d43f284 | |||
| 56824d1769 | |||
| 2238ac7d59 | |||
| 2b5b192cd7 | |||
| 64e1d23cba | |||
| 40d2904f3d | |||
| 9712cc479b | |||
| 0ef1fb0b67 | |||
| 2b67bc448d | |||
| a3f81b79ed | |||
| 8d0dae4cec | |||
| dda96264df | |||
| 4af8e5c5c4 | |||
| eff5605be5 | |||
| 2b53ab23c0 | |||
| 2010de9104 | |||
| 280a99b3b6 | |||
| 646025589b | |||
| 4502003e61 | |||
| 07abb6240e | |||
| dea0815199 | |||
| e4ed2d2e42 | |||
| c8228e5789 | |||
| 667e5e4f89 | |||
| ada703a73a | |||
| 2b8094f915 | |||
| 9e1e960116 | |||
| 82ae9ef541 | |||
| 1b07274e34 | |||
| 15ac54d5d6 | |||
| 1cdd8510fd | |||
| 039f3d01a0 | |||
| f63feea05e | |||
| fbac38d98b | |||
| ca2ab3387f | |||
| 64ded50bbf | |||
| d44ac61033 | |||
| 18ada77d8a | |||
| 6d0f1275c2 | |||
| a848eccfc6 | |||
| 2402fa4824 | |||
| 2bf4135afc | |||
| c677f132cd | |||
| ec4015d73c | |||
| 8c42dbf71c | |||
| 4ca679180d | |||
| 64da959619 | |||
| 88123e2512 | |||
| 87e98e8788 | |||
| 767857c516 | |||
| 2b60166e5c | |||
| 2e41db39f5 | |||
| a55fa8389e | |||
| d23142027f | |||
| 438fe3f9db | |||
| 5cc154147f | |||
| 9cd5a0a1e6 | |||
| 2958142e31 | |||
| 27c15bed60 | |||
| 2985739b8c | |||
| 2465d93330 | |||
| 556d211136 | |||
| 0ee2a58cdc | |||
| 7daf84fb44 | |||
| 9aff01c9a9 | |||
| a2b84e9897 | |||
| 66f3c2673c | |||
| 554d08c3a1 | |||
| 3a595ea5c4 | |||
| 03c9648f2e | |||
| e3a55af336 | |||
| be4a432bea | |||
| 0d32a24cba | |||
| e36948cfbc | |||
| 9aa647068b | |||
| 092030c1ca | |||
| 0bd261ded4 | |||
| 7ed557497d | |||
| d793ec2ffe | |||
| 271f7df343 | |||
| 08d44f588f | |||
| 84b4a5a495 | |||
| b2e20a82ba | |||
| 1b3a06a02a | |||
| 91a5e75151 | |||
| 4754b0e253 | |||
| 84b517f5a0 | |||
| 8ac88cf069 | |||
| 13a995cc1d | |||
| a93fb52632 | |||
| 4d927e73f1 | |||
| 38228709c8 | |||
| 38788a3161 | |||
| 46b6973c05 | |||
| af2b7708a8 | |||
| a233982931 | |||
| ed1439fbc6 | |||
| b379b67a32 | |||
| f3945fbddb | |||
| 8b44ee2ce1 | |||
| 7b582b71ba | |||
| 4e8c507276 | |||
| 9390c56831 | |||
| abebbf04b1 | |||
| 5e434073d4 | |||
| 3e4a566e46 | |||
| 6f5cf8c15f | |||
| b687bc807a | |||
| 5440fd6cb4 | |||
| b060151625 | |||
| be38d4ea93 | |||
| 56f21c4fd5 | |||
| 386df457a9 | |||
| e4abf6e723 | |||
| 1339ebaa84 | |||
| c9b90884da | |||
| 9b2b2c88df | |||
| e5bdab0355 | |||
| 4d46958c82 | |||
| 9dd8e4df7f | |||
| d98e07c3d3 | |||
| 78bc11465b | |||
| 8e8e4bbabc | |||
| 90671233c6 | |||
| 12bae51384 | |||
| 7b848e215f | |||
| 21872e2fb0 | |||
| 2a218b96c4 | |||
| e76cda6923 | |||
| 9d16612a9b | |||
| 63c865ace6 | |||
| 0a62de0d4f | |||
| 593996216f | |||
| 4eae23a2cc | |||
| f3699b5ac8 | |||
| 9ce0e51305 | |||
| 4c79318694 | |||
| f7ac724c5d | |||
| ee9fe1239a | |||
| b6b5c27cec | |||
| 632e07b749 | |||
| 48cd2d190f | |||
| 685797f403 | |||
| ef6f421f89 | |||
| e0ffd3e8a5 | |||
| 0d16b5fc38 | |||
| ac8a27cba9 | |||
| e5f2a8ebf2 | |||
| 54733eba6f | |||
| 93353aea70 | |||
| e16cb8b4a2 | |||
| 5bf3c1df24 | |||
| 419918076e | |||
| fb768c420d | |||
| eb067fee55 | |||
| 6390b50d6e | |||
| 5d8134ed32 | |||
| 852904e1a4 | |||
| a120adde63 | |||
| a80af177b6 | |||
| 8db7d435b9 | |||
| 901e0ddfe4 | |||
| ecb30409f6 | |||
| 44c2c77548 | |||
| 5be5efdacf | |||
| 057c3da82a | |||
| 8fa429caef | |||
| 87f526d82f | |||
| 1ae2320e09 | |||
| 54693cf7b1 | |||
| a082375d57 | |||
| 9c7adb7248 | |||
| ccebbbc0ac | |||
| ebb6915e58 | |||
| 5cc27fd3b5 | |||
| a332509e02 | |||
| 375fe81311 | |||
| d354ad1c34 | |||
| 119d8b3aca | |||
| cd9edba26f | |||
| 8f1c502d2b | |||
| 92312fbc0c | |||
| 2efcaa9e8e | |||
| aa53541235 | |||
| b863c25d21 | |||
| f77c3574af | |||
| f5105bac65 | |||
| 5a86592e93 | |||
| 2c83cfc14c | |||
| 863546e125 | |||
| 9198e30688 | |||
| 1890157faa | |||
| 0898f372b1 | |||
| b9e5256cf9 | |||
| 6b6d89b911 | |||
| d3e0193c8a | |||
| 31881209d6 | |||
| 5c7e893393 | |||
| 3c814ebf87 | |||
| 5cf1dca36e | |||
| 12338c1dc4 | |||
| 5b23752205 | |||
| 4e53f301d8 | |||
| 2b7803dbac | |||
| 446a278f3d | |||
| 0047d3f81a | |||
| 4e1f17d65b | |||
| f9b1dbe2ac | |||
| a251474144 | |||
| 8d88bb06b2 | |||
| 9f2ff3ed22 | |||
| 45cbf70265 | |||
| 59e16b88ae | |||
| 33f219dfe6 | |||
| 44db2eea70 | |||
| 12ab54648c | |||
| 19926e2979 | |||
| 1620a1e014 | |||
| 888546b6f5 | |||
| 3215db26aa | |||
| 76aff84788 | |||
| fc28ba3156 | |||
| effce0573b | |||
| e8db363431 | |||
| 9603b6877d | |||
| d5ecb5ff5a | |||
| dae73938e8 | |||
| 619b6dfae3 | |||
| 8f9c36b730 | |||
| 3eeec4faae | |||
| 972a4b95b6 | |||
| ffee1a4126 | |||
| 96e23c2ff6 | |||
| 08356007c9 | |||
| 5064b6f747 | |||
| 57d3002ee1 | |||
| a00a0dbfcd | |||
| b41d2c5c14 | |||
| 1da48beeec | |||
| b57ff73086 | |||
| 67978b5746 | |||
| 062f305d1a | |||
| 1f70d4e2a5 | |||
| aa5bc20c83 | |||
| 09af10f635 | |||
| 4d7953aa56 | |||
| 46e1560678 | |||
| 4d0148b417 | |||
| 1605d1d24d | |||
| 5190043e56 | |||
| f66a2ffa1e | |||
| d1e76a34a0 | |||
| 5b3d5f9f3c | |||
| 415a42f327 | |||
| 09f6e55338 | |||
| a351e05a17 | |||
| d37bcbdc92 | |||
| 437af37b13 | |||
| c62367612d | |||
| a92cba8484 | |||
| 5f7d922b10 | |||
| dc29632d4e | |||
| f4a7754cc0 | |||
| 6811d3d80b | |||
| 245f6273bd | |||
| 870c8d3c4e | |||
| d573472a86 | |||
| 441b6dbda0 | |||
| a7e6a1059c | |||
| 85719a0a5d | |||
| b5b52afd35 | |||
| dc35633aa4 | |||
| 9e3ba487fa | |||
| aee8425b68 | |||
| 94229bb262 | |||
| 1f6444fbea | |||
| 439ef6447d | |||
| 9cab808c5d | |||
| d41fcf7345 | |||
| ac51ba38f9 | |||
| ef85b24a78 | |||
| d88730685e | |||
| 16661847a7 | |||
| 7f782a1a24 | |||
| 9188ce68aa | |||
| 2b79a6ff8f | |||
| 70b0274c8e | |||
| 83ce1de8e7 | |||
| b1d484f827 | |||
| 123519165d | |||
| 30ff9c6775 | |||
| 906f5f7e96 | |||
| 9238316cf1 | |||
| 5e89b9a455 | |||
| e3a4ff33d2 | |||
| 5d9ea394ba | |||
| abb5c9fd92 | |||
| 266835cd2e | |||
| 92af03579c | |||
| 2e20f2b89f | |||
| e67593673f | |||
| d1b533d399 | |||
| 2647902fee | |||
| 574320ec3f | |||
| 3f2377017c | |||
| 2b5bb02817 | |||
| 302d14adef | |||
| b796ededae | |||
| f811ba8777 | |||
| eb7b45d26b | |||
| 17b2d92a3d | |||
| 22f0bcaf8f | |||
| e61277002c | |||
| ca5258f140 | |||
| 8f4473b3e3 | |||
| 51e8af9e5f | |||
| 82818e7324 | |||
| 6ae8103022 | |||
| eca2d92791 | |||
| 6778e19710 | |||
| 25f25275cd | |||
| 7e746ad2a6 | |||
| 6ffa2b01e1 | |||
| ed6ca0d7fa | |||
| 8e2a3c1d2f | |||
| 7f6dcc2745 | |||
| 76e34d6f2c | |||
| e613b17c05 | |||
| 5ba9a089e1 | |||
| f2d5d6d24e | |||
| a1ec4ea3a9 | |||
| 0fe7420638 | |||
| b304730225 | |||
| 4801526f35 | |||
| f1857030b5 | |||
| b5b3f4e1c6 | |||
| 172bb7887c | |||
| 60228d30d1 | |||
| 9592537840 | |||
| 8768a80242 | |||
| d5f73f89d8 | |||
| 19bbe6c67d | |||
| aebb65e983 | |||
| 5e327af327 | |||
| bc1f8813c2 | |||
| 80d9f624d0 | |||
| e9c46f38fc | |||
| ecfbaa267d | |||
| c25fd3349b | |||
| c3e27bcf87 | |||
| a5894f3e6b | |||
| 4db3a388dd | |||
| 6fd1a2ef52 | |||
| fe2a259eb1 | |||
| 1ba7c2f276 | |||
| 649f747f8a | |||
| 05dbaf7672 | |||
| 742a08229e | |||
| 5602d2c7bb | |||
| f3e0479a8f | |||
| a1143c4ea0 | |||
| 0314d1dd01 | |||
| 751b3f502d | |||
| bf5e09d5ab | |||
| 14e4a10312 | |||
| 53b89e1ee4 | |||
| 370f878a36 | |||
| 6e4d61c1fd | |||
| f6fe5c07f6 | |||
| c685293297 | |||
| 0e6a2c0491 | |||
| c2209ad5e4 | |||
| 5f249a3e67 | |||
| 76fb3652fc | |||
| 92925e846d | |||
| 43c04c29ce | |||
| 06b74c87da | |||
| 7f075b0b15 | |||
| c5a86c22a4 | |||
| 3621c6234c | |||
| 80c2fefc43 | |||
| a47952146a | |||
| a55950865e | |||
| ab181ac329 | |||
| db172d1053 | |||
| dad26339a9 | |||
| 3b0ed61826 | |||
| 9699e2b483 | |||
| 3048188b5b | |||
| 547bb3b053 | |||
| 7c2087cf05 | |||
| 217fea9667 | |||
| 523c3cd50b | |||
| 631126c77a | |||
| 655d381ef3 | |||
| c68fec7e97 | |||
| cdfa8a668b | |||
| 92651d228d | |||
| 90e3692603 | |||
| 3a8316ab93 | |||
| 8d3f0d0eab | |||
| ded0efb955 | |||
| cdd4354256 | |||
| bde955fc56 | |||
| abc9e98625 | |||
| d086ee14dd | |||
| f43fec7ee6 | |||
| 6385511e88 | |||
| ed4becf007 | |||
| f11ab4c569 | |||
| b12c2c76d1 | |||
| f5589445b9 | |||
| 032a61b197 | |||
| 011ed380aa | |||
| 88a18c8b6a | |||
| 51e65db715 | |||
| cc02fcd889 | |||
| 9f17c62533 | |||
| 36bd2a65e3 | |||
| 85d4e56bb1 | |||
| 381d9bafdf | |||
| ada16fd188 | |||
| c408157a4d | |||
| 6e299b582a | |||
| 9777fbacf6 | |||
| 643b4dd126 | |||
| 19ac54277b | |||
| c78a8dfd2d | |||
| b1a57c4cb2 | |||
| 54c180092d | |||
| be110d0464 | |||
| 6e733b65ae | |||
| f948a2d0c0 | |||
| 2aa47554fc | |||
| c80b270678 | |||
| dcc32e84b9 | |||
| 947d610309 | |||
| 3e01a387ba | |||
| 4dbba5ac98 | |||
| 374cc4183e | |||
| b9d9730b62 | |||
| 0a178a687a | |||
| c4c43c3d26 | |||
| 8fa86d4d34 | |||
| a22dd28e02 | |||
| 0e274fc4be | |||
| bc3da25a4a | |||
| 80492d663e | |||
| 172c539a5a | |||
| a079acc0d9 | |||
| 30df77fa4c | |||
| 71a22e45b0 | |||
| defd8a527b | |||
| 3ce29236f3 | |||
| 04ee99f1a3 | |||
| 91817bffe1 | |||
| c39b83667b | |||
| 1bd382c1d0 | |||
| 49bef1cdbf | |||
| 249c508126 | |||
| 04b27525fa | |||
| 175bcb1734 | |||
| fec2c7e715 | |||
| 07dca8cc03 | |||
| 60c093f086 | |||
| db4ab1c936 | |||
| f071207463 | |||
| 622b9d9276 | |||
| 05bfdeab7a | |||
| b4bb98ea60 | |||
| 792b7e0629 | |||
| a079c2eb7c | |||
| f7aa91e660 | |||
| 6d677bbd63 | |||
| cee3ec6dc4 | |||
| 3da17c42a4 | |||
| 2329cbc1a2 | |||
| b39ee54103 | |||
| 299f9837b7 | |||
| 6a889ed3e5 | |||
| f3ba88c87c | |||
| 498f1525b2 | |||
| e7c5120682 | |||
| 19cfaa2be7 | |||
| e97c7e042b | |||
| d8b1fc45aa | |||
| 35f27d0d3e | |||
| 330a11861e | |||
| 4827fe86bb | |||
| 72c55b56f2 | |||
| 295da7e5f3 | |||
| 4eab85d364 | |||
| 3cc83ce024 | |||
| 52c423a423 | |||
| 952f8e38cf | |||
| 542b3e8a64 | |||
| 4f79eb256d | |||
| 7620456486 | |||
| 052d209901 | |||
| e9c45ff406 | |||
| f1053d48a2 | |||
| ba12f52f6c | |||
| 456137fa24 | |||
| 692059e899 | |||
| 252ce0b581 | |||
| d24befa0bc | |||
| 5462710103 | |||
| d1b923bee9 | |||
| 81a6d1b0d4 | |||
| 04020f391a | |||
| c4ab0c09ea | |||
| 6e50e4b9ee | |||
| 1599f9f0c0 | |||
| 0c5b6e5556 | |||
| e3e04f5dae | |||
| 17bc8565f6 | |||
| c08954c18b | |||
| 7ba56a4b88 | |||
| 9b7f40ce4d | |||
| b70370f3fd | |||
| 4d3cf77ad5 | |||
| b2005ccaef | |||
| 659cf7249e | |||
| 62a010a25d | |||
| 6b4ea68bc7 | |||
| d6891c705e | |||
| 9bcb006ec7 | |||
| 02ac6ec81c | |||
| 5c91f5b71d | |||
| 16b674b984 | |||
| 65392d5e6b | |||
| 41d108ead6 | |||
| 0c9dbc61a1 | |||
| 6788fdb0d6 | |||
| 3a4b61579d | |||
| 51d7ba7446 | |||
| e608adea60 | |||
| 8dd6882222 | |||
| 5aef565fb6 | |||
| a4d6bcba09 | |||
| f09a577ab5 | |||
| 973e1acb67 | |||
| 676a724491 | |||
| 73318fd514 | |||
| cb08c15616 | |||
| a3287b85c5 | |||
| 0c0b1ec9ae | |||
| d2f87ca76c | |||
| 4935b14539 | |||
| 0835611d3a | |||
| 8b4fa2605e | |||
| c3910807c5 | |||
| c5b8b5687f | |||
| f61883b227 | |||
| 35ff9af6ce | |||
| dad2b9aac8 | |||
| 1613d30544 | |||
| b6df9debaf | |||
| b9d0dc60b0 | |||
| 37b1876807 | |||
| d206350738 | |||
| 2da1f9181a | |||
| bd396e1fd5 | |||
| f55c9ed1ba | |||
| 5da69c0b9a | |||
| a806e8cc58 | |||
| 369b260e12 | |||
| d9e7c1626a | |||
| 1a1a7bbbfd | |||
| 33e97e994d | |||
| 11e6848bb9 | |||
| 829410729c | |||
| 4995aecd62 | |||
| 0e2a3686c0 | |||
| 66b2140892 | |||
| 0d2857a242 | |||
| 17d99e6266 | |||
| ea7d4be3f8 | |||
| 05db8784ae | |||
| 68667d6057 | |||
| d58b5ef74b | |||
| f044037ec5 | |||
| a97f21ba4e | |||
| b594ed99b8 | |||
| 58b06222ff | |||
| 58dc397930 | |||
| 15073d63d9 | |||
| a6277370ca | |||
| 31b2d6be75 | |||
| 57ee14d62d | |||
| d470cfe86e | |||
| b55d8f46f4 | |||
| c15218e37a | |||
| 985aa0423d | |||
| c14a8dce93 | |||
| f5d45221ca | |||
| d668aa7c24 | |||
| e20fe421e7 | |||
| 2deb38d615 | |||
| b95d71af2b | |||
| ebe4ca6b60 | |||
| f159ed20c2 | |||
| cdbb042ce4 | |||
| 23bbe511fe | |||
| 444218e755 | |||
| 9cc60c9dd3 | |||
| cc1fbe0956 | |||
| 2c226d597d | |||
| c6ab32ffb9 | |||
| 97c6ec6d49 | |||
| 1fcf7ba5bc | |||
| 12c1e1d149 | |||
| fa222b0ea2 | |||
| 101be77d9d | |||
| a6dbef89c2 | |||
| 02f08879a4 | |||
| 61f1ee2d2d | |||
| ac4b592b4e | |||
| 93b6e80cd7 | |||
| f5de714451 | |||
| d4741eece1 | |||
| 585484cb06 | |||
| b696928a5b | |||
| 79d4e865fe | |||
| 8380879804 | |||
| 091461cece | |||
| d228c5459d | |||
| 3d5d3ea20c | |||
| de7f8eec04 | |||
| 4b6047e746 | |||
| c47673bf10 | |||
| 49432009fe | |||
| 2f6d2b08aa | |||
| 473f10877c | |||
| c7df82460c | |||
| b19697e3ac | |||
| 3e51448ef0 | |||
| 2b2e515a30 | |||
| 394e640909 | |||
| b48eb4e88b | |||
| b525480b25 | |||
| 45f18eaa52 | |||
| 4c92a2869b | |||
| 8041ab8a61 | |||
| 8251fc0811 | |||
| 827ff80c06 | |||
| 18ca998f67 | |||
| cb286a66be | |||
| 8444470e3a | |||
| f33828a1ca | |||
| 68e425f869 | |||
| da6344297a | |||
| 3cfca01372 | |||
| d934bb15b0 | |||
| 0c0a8392e5 | |||
| 98b6ce353c | |||
| 58043dac0f | |||
| d2c1f1131b | |||
| fa5c7a9e75 | |||
| ceb94d52a1 | |||
| a2716712ab | |||
| 1ac7baceff | |||
| 968d94d417 | |||
| 7842181b47 | |||
| 2ce47fda88 | |||
| ffd010767f | |||
| 635990a5b0 | |||
| 562f2375c5 | |||
| edf533c83e | |||
| c1d61c88e9 | |||
| 6360b846c6 | |||
| 57900d07f0 | |||
| 8e72e1ed88 | |||
| 10c547396d | |||
| 66dd871288 | |||
| d484939c02 | |||
| 85fd8729ce | |||
| b3e16c6423 | |||
| 30d6766db4 | |||
| 17234f82d0 | |||
| 7b57df02a7 | |||
| b65ae3b036 | |||
| bce76a7977 | |||
| 66f3e97457 | |||
| 0ee61d178f | |||
| 1ceba29f4b | |||
| 40c748a2ae | |||
| 0e9453a395 | |||
| 69d0bc8fd5 | |||
| 6a73e5a720 | |||
| e70ba29d95 | |||
| e5647cf70d | |||
| 9637cf0574 | |||
| 74cc63ba2f | |||
| 0b6e360602 | |||
| a49cda6523 | |||
| d612c72405 | |||
| eb152d7431 | |||
| 6bd143dd25 | |||
| 770d3eabc0 | |||
| 75e2ba5af3 | |||
| 1726bb6c0d | |||
| 5dfe65d53a | |||
| 83afd09f13 | |||
| d059cc7170 | |||
| 96488c1c74 | |||
| 84a81579ba | |||
| 244ba1a61a | |||
| 9dadc06e64 | |||
| 60f949e36f | |||
| af154e3053 | |||
| 9e6c290696 | |||
| 0a71063530 | |||
| 0b1ae11498 | |||
| 017a4e7c30 | |||
| 3891f18e71 | |||
| 6a2077cbd8 | |||
| aa11cc19e8 | |||
| 9267536fee | |||
| a6f5717567 | |||
| 0a58d6812a | |||
| 12507aab8a | |||
| d376fe9e17 | |||
| d21622bef4 | |||
| 7febec49b2 | |||
| 14d5098ca2 | |||
| bc8eac2439 | |||
| 4e65db80e8 | |||
| c0c71d6b3a | |||
| bac1c6d12f | |||
| ce68291d83 | |||
| 4176a0ade3 | |||
| ec10f2e72b | |||
| f36c268b9e | |||
| 824392a1c2 | |||
| 1f9a7b8fd3 | |||
| 9379e85e23 | |||
| 805c2832c1 | |||
| d33a048d89 | |||
| f77fdc0ce8 | |||
| 7da51787b9 | |||
| b1f422c1c5 | |||
| b3f966e2ca | |||
| 3f191e1b75 | |||
| 6d5fdfbf73 | |||
| 9a9e457dd6 | |||
| c316dbe2aa | |||
| b5fcb06a76 | |||
| b5a9a6793b | |||
| 0cf79155d4 | |||
| f8f9f3c438 | |||
| 1926e919be | |||
| e6c68eed51 | |||
| f9e747dbc6 | |||
| 0e86e292e4 | |||
| a590682764 | |||
| 31c40fa4cc | |||
| 1feb3838b5 | |||
| bd0732b1d0 | |||
| 0b5cbcefdd | |||
| e4a87f2f4f | |||
| 3c8cadf7ca | |||
| 7c0b26e8a0 | |||
| 982503e9a8 | |||
| 3d93675ff9 | |||
| 53d6c9b9c0 | |||
| a02e90d502 | |||
| 238dbffb48 | |||
| a9d7b6eab7 | |||
| 39c3334147 | |||
| 4223495e6c | |||
| 023e86d68f | |||
| ac57be91e1 | |||
| c2e65bafb5 | |||
| 74161b2122 | |||
| 39ee5c5a46 | |||
| 788f330d07 | |||
| af56151231 | |||
| 34d359fe03 | |||
| 4672dbda2a | |||
| 62252d157e | |||
| b1cf550123 | |||
| 9c84749e2c | |||
| cca4c47781 | |||
| 17bd9a1fa1 | |||
| 0321644bbd | |||
| 81e7988eb9 | |||
| 4985311d46 | |||
| 05348f3250 | |||
| 003609e565 | |||
| e0cfaee7aa | |||
| 9537a909f7 | |||
| e75387f029 | |||
| 8c2dd5fb9a | |||
| 27545dcc86 | |||
| 724e04e979 | |||
| dfc94c58f0 | |||
| 4b0f8d76f4 | |||
| fac895d7ba | |||
| d023f316ac | |||
| 04b40ff221 | |||
| 03a08435e2 | |||
| 4dd3ab8f32 | |||
| 8e0660ad54 | |||
| 1f42512199 | |||
| 1a29ea1038 | |||
| eab2b9dc09 | |||
| 94e92cd6c0 | |||
| 57cd6d2de1 | |||
| 822d468232 | |||
| bdaa6a1910 | |||
| 2221dcc9f2 | |||
| 2eb1ee967c | |||
| c49cfefe88 | |||
| c6a6f39d29 | |||
| a3d7811f24 | |||
| eb56ca3b0d | |||
| 755e0143fb | |||
| dfa48094dc | |||
| e585192eeb | |||
| 646924fce8 | |||
| 13c6eb42e9 | |||
| e5fb50476c | |||
| 073c590d0b | |||
| c63aa7f085 | |||
| c832e62db0 | |||
| b7a7119b1f | |||
| 19a880bb91 | |||
| 672399c751 | |||
| c54abde1bd | |||
| 95c1d2a887 | |||
| 3e6f27522b | |||
| 1b70f94282 | |||
| ebef84e9ea | |||
| 87d4970e8b | |||
| b1a772d194 | |||
| 4938765eb3 | |||
| cce78cc5e2 | |||
| f11f2bfb56 | |||
| 24f43e7ae9 | |||
| 9085b933d8 | |||
| d94d469c86 | |||
| 59502594f8 | |||
| d20c9bde7e | |||
| 62414e3073 | |||
| 505dde09de | |||
| 603d623eda | |||
| 87ebf2e50b | |||
| 37c3f0d8a0 | |||
| 48c985e775 | |||
| 7358fffb0f | |||
| de5b6386e0 | |||
| 1de2d5c2b6 | |||
| ef53a9229f | |||
| 259c39a63a | |||
| 4d87f6025e | |||
| 327b98eb13 | |||
| f977d10a19 | |||
| a0cf8c322d | |||
| 627be179c1 | |||
| 1e74f5850b | |||
| 6d83a73858 | |||
| 9b76872708 | |||
| 9b093c9a12 | |||
| 4d587c341b | |||
| f8f6cd6ef5 | |||
| cf08eac15e | |||
| 9a8552e8ae | |||
| 846317ef37 | |||
| 7e62789edf | |||
| 5865af7f6e | |||
| 852663f6d2 | |||
| c1148c4ea6 | |||
| 280dc77f8b | |||
| a9b30984a3 | |||
| 2f83c3b689 | |||
| b25ad12f1a | |||
| d95e43a6a1 | |||
| 27df987211 | |||
| 982745fb83 | |||
| 8fa8d471af | |||
| 2cc14bd0fb | |||
| 98ad72b096 | |||
| fdc8ed8d05 | |||
| 24fcb7f813 | |||
| 236c64a17d | |||
| 9e835e8edb | |||
| f96569da1e | |||
| 91ff45fbde | |||
| 1261f250c6 | |||
| 3673b45437 | |||
| 45aabc5d0d | |||
| f9bd83c854 | |||
| 499d8adb75 | |||
| 54386c82fd | |||
| 86a51015b1 | |||
| 38b9ec7a18 | |||
| 998406d20e | |||
| f7b4b750d8 | |||
| 2558ab3de7 | |||
| a4e2c56317 | |||
| 0c10ae1861 | |||
| b3cc828995 | |||
| ba8f9d8620 | |||
| 3c89a28a06 | |||
| 9c5d7716e2 | |||
| 46fd26e366 | |||
| 41a2eb5245 | |||
| c410d7a97d | |||
| 6fa63dcc0c | |||
| 3d7670a6ba | |||
| 96f25332ea | |||
| 3385d38648 | |||
| 1618c963e4 | |||
| 50462dcdc6 | |||
| 1e3be09b3b | |||
| 6e66a9222a | |||
| c3ac834526 | |||
| 9d1e8b1e1d | |||
| f605373a2b | |||
| 56b7622612 | |||
| 696a6ccd57 | |||
| 51b03b87e6 | |||
| aa7ba0bc1a | |||
| 07e4076585 | |||
| de1a459879 | |||
| 1aacb9bb15 | |||
| 9b4ecc96f6 | |||
| e3f4f874c5 | |||
| 6ace801418 | |||
| d31b93b513 | |||
| ac0fd6aa9a | |||
| c7e0888982 | |||
| 068f33cfdf | |||
| 4807cd8a6e | |||
| c703f1eed6 | |||
| 5ac5da3524 | |||
| 0c13d34ade | |||
| 35e824c287 | |||
| 1e0d290f2e | |||
| 0097a8d097 | |||
| 36cc43170d | |||
| 5578ad5e14 | |||
| d11f0a709d | |||
| 0a43b23275 | |||
| 7967683296 | |||
| 5b2c016834 | |||
| aaff125608 | |||
| 407adc7061 | |||
| d0e612dc36 | |||
| 5aa7435d25 | |||
| 7c23ec90a9 | |||
| 390957fec4 | |||
| 060a76dc3e | |||
| 6625810d2a | |||
| edc442afdb | |||
| 16b9514543 | |||
| 95c7f4a7f0 | |||
| ae6fabc6fe | |||
| 7eaadf616c | |||
| 8fed5fc5ae | |||
| f25951c412 | |||
| c11195d5e3 | |||
| 2ed5cba110 | |||
| 4c05a697fa | |||
| 1259a474ba | |||
| 3995deaf76 | |||
| 076587425e | |||
| da6aeaca46 | |||
| 8ee33ca551 | |||
| ea7f13922b | |||
| 38d0063c36 | |||
| 56d0d5986f | |||
| df83459721 | |||
| 54a9e00970 | |||
| 9bda96d39e | |||
| 053470d5a8 | |||
| 6f4160c014 | |||
| 65ef82a946 | |||
| b509a7060a | |||
| 5ad6ff239b | |||
| fdaa6ff9e3 | |||
| 2f31763335 | |||
| 350562919c | |||
| aa5c4945d6 | |||
| 6fbfc58602 | |||
| 77a5c43d50 | |||
| f28e4b86fb | |||
| 6801dd043d | |||
| b675e6ab77 | |||
| d6306f8ccb | |||
| a9817e9127 | |||
| bb5f33d13c | |||
| c08897cd10 | |||
| 384875f4fc | |||
| 9cfa84313c | |||
| f787c49b53 | |||
| fa90e14b06 | |||
| fe625a558e | |||
| 03b989251d | |||
| 95919051e0 | |||
| 46fb88c76f | |||
| 210bfaf8d6 | |||
| a50dec88d5 | |||
| 8dcec034ed | |||
| 9ef41f68fb | |||
| 05d733e707 | |||
| 4bbe28bdf0 | |||
| 0c01cf7c85 | |||
| 917cd13ce2 | |||
| cfb36443fb | |||
| 9d3826c676 | |||
| 4300bb2e1f | |||
| 6edc438789 | |||
| 955cf35d5f | |||
| 25cd7c7c50 | |||
| 0f8efb07c7 | |||
| 732cb6c45c | |||
| 4d63a89fa6 | |||
| 266a868ba9 | |||
| 8199967b31 | |||
| 9d61c18143 | |||
| 7c73e28a6d | |||
| 221bfa4c67 | |||
| aaca4987c9 | |||
| 1a8b7f7513 | |||
| 992b47b991 | |||
| 21d0f40751 | |||
| 5e7f06397f | |||
| adaace4ab8 | |||
| 739ff84732 | |||
| 2a177052de | |||
| 424eaba4c5 | |||
| e1cafa3834 | |||
| ba539eb9aa | |||
| 24de676a64 | |||
| 0c2741f7ad | |||
| f7c82baee9 | |||
| 2b34e0abdc | |||
| 6306bc3ddc | |||
| ea068dcc2c | |||
| 633fedaa96 | |||
| 4ff76cad2a | |||
| 65134c793b | |||
| 5af09e73f2 | |||
| d5f34cf34c | |||
| 6a2e559222 | |||
| cefa602601 | |||
| d773691848 | |||
| da07ad16c1 | |||
| f40707dc68 | |||
| 2d8ce500fa | |||
| ba0cea6826 | |||
| ddf1b04cce | |||
| ad5b3a4753 | |||
| 531ea5b3a2 | |||
| b468468e7e | |||
| d52e4e5df3 | |||
| 907743eee7 | |||
| 610e3dccb7 | |||
| 27392f832d | |||
| e9db7fea5b | |||
| bdd3930855 | |||
| cff0168f3a | |||
| 70d5c88026 | |||
| d83901e665 | |||
| 1e1984a586 | |||
| 2f180cea7f | |||
| f4d6a3ec4e | |||
| 7aa922ceac | |||
| 06dcc5a2c6 | |||
| 000f762fb9 | |||
| 3bc3eeb5da | |||
| 4e5699fa71 | |||
| acc576658a | |||
| a76274b549 | |||
| 803ff8ebb9 | |||
| b42152ffeb | |||
| 4015a5486c | |||
| 024b43ca06 | |||
| aae48e6fd7 | |||
| d29c7e7871 | |||
| 9448fe3db4 | |||
| 3817f3a89b | |||
| 755f4f324b | |||
| 863ab0e72e | |||
| 4ab0377c6e | |||
| 2062a7ca8f | |||
| b61a55eebf | |||
| c30078c5a3 | |||
| 39b91c97f0 | |||
| 8334ee18e6 | |||
| cc2592f582 | |||
| 96d35f7c54 | |||
| 98c5fc6ae2 | |||
| fbde0c6c96 | |||
| 602e7c83e2 | |||
| eb9218a86b | |||
| 9f2dcc3f13 | |||
| bc210b292b | |||
| 2113af9c52 | |||
| 6f417b57c1 | |||
| a7742d7d63 | |||
| 5179e37bd1 | |||
| a7b17bfaf0 | |||
| 4af1f31a3f | |||
| 0acd06d13c | |||
| fd22e98298 | |||
| 9e42e04b4a | |||
| 9103837228 | |||
| 3f3c5de851 | |||
| 167a12028d | |||
| 6af2faebd2 | |||
| 34b65be44a | |||
| fd16222613 | |||
| 1ba6cd8423 | |||
| b928ebdd53 | |||
| b42623ff9d | |||
| 59ae0e0013 | |||
| 4788de784b | |||
| 926535469d | |||
| c0f63eb21f | |||
| 5627a0cbdf | |||
| ed2a698392 | |||
| aaad1791d9 | |||
| ad6e82942b | |||
| 9a9954a036 | |||
| d60bb57d4b | |||
| 591708903b | |||
| f9d62fba7a | |||
| 85dde8a800 | |||
| 9d039c206b | |||
| cbff19ff1a | |||
| 4c3f9b2ef4 | |||
| 167bac23aa | |||
| 5d0cfa2527 | |||
| 0e523618a1 | |||
| 821fae0d94 | |||
| 3b26105f68 | |||
| 0f2f966a91 | |||
| d7d491d445 | |||
| 41effbe2da | |||
| 9b0d6862c4 | |||
| 890fcdf842 | |||
| 18dbac203f | |||
| 8d1f254dcc | |||
| e5841d3126 | |||
| 90df3af6cf | |||
| 11cc36d770 | |||
| 05f1939b02 | |||
| 050ea9762f | |||
| 0f24d4d2a1 | |||
| fc799191f4 | |||
| 8fad85edda | |||
| d70053aba5 | |||
| b699fe7a9d | |||
| 94c67faaea | |||
| b2ed5c3070 | |||
| 9fe49497bb | |||
| 5b8c10f2f8 | |||
| 24983f62e2 | |||
| f2057ce1ab | |||
| 6797fd65a5 | |||
| bf489feef1 | |||
| 947e06a860 | |||
| 6a3d925a47 | |||
| 04d5ba266f | |||
| 90be83ae99 | |||
| 5e80bd3cc9 | |||
| fb7ef76e74 | |||
| db4b1e613c | |||
| ee39081b11 | |||
| 7d842f5bcf | |||
| 4eac198270 | |||
| faac32418c | |||
| 42810621df | |||
| 61a5378aeb | |||
| 42d644ef91 | |||
| c95a56450d | |||
| dc5199feea | |||
| f88fdf6a1b | |||
| b68057d927 | |||
| e9a860d9cb | |||
| 8be86cbdfd | |||
| 5091e64a42 | |||
| 828304d587 | |||
| 9d584475f6 | |||
| bb60cb0bf9 | |||
| 25f908b320 | |||
| 9b7dca2fa1 | |||
| 55e1dfb778 | |||
| 735a79ae83 | |||
| ef2b400c61 | |||
| c2263db7bc | |||
| 53eca2ff5b | |||
| 7bbbda71df | |||
| 3a15a3821a | |||
| 9557b9f70f | |||
| 464441d8c3 | |||
| f30f1afd47 | |||
| b3db37b99d | |||
| 7a276f39fb | |||
| 415668ecf0 | |||
| 651967b95c | |||
| 8e0baf257c | |||
| c8268e65fd | |||
| 3cf4375387 | |||
| 438e2dc228 | |||
| c1adbe3189 | |||
| 7ee1816612 | |||
| b4084491e5 | |||
| cb97421edf | |||
| e461031d40 | |||
| c82e4596e4 | |||
| 8f4f834ce6 | |||
| 15ba3e123f | |||
| 2db243b8ed | |||
| b57b64b7a3 | |||
| 8e386ac71f | |||
| bc1af6227a | |||
| 2b84c97a78 | |||
| 3ddf84534b | |||
| 4c2dff88de | |||
| bd26104088 | |||
| 80238880e6 | |||
| f4abafb093 | |||
| 3e538355e2 | |||
| 5f80f43ff5 | |||
| 76e9da3fe9 | |||
| cafa04f842 | |||
| fef84f69ec | |||
| ba98cd97e5 | |||
| 81b897c291 | |||
| 1c4d70896a | |||
| 039bcd932a | |||
| eaa9228a4f | |||
| a8757df963 | |||
| b221143c0f | |||
| 2c796de92b | |||
| 6f2a64a511 | |||
| 995841624c | |||
| f5f675ef6c | |||
| bdc8e9118b | |||
| d9ed9a9a83 | |||
| b57faa41c2 | |||
| 1b5fe91624 | |||
| 1a305cadb3 | |||
| bbcd06f42f | |||
| 34183237ce | |||
| 286ec92967 | |||
| 43940f7ffc | |||
| b05631432b | |||
| dc92886ab6 | |||
| 993416d9cf | |||
| f4a79b0554 | |||
| 411fd2b761 | |||
| 327109f327 | |||
| f1f9121bc7 | |||
| 3b42e19505 | |||
| 709156ee65 | |||
| 472030907b | |||
| 61e30c15a9 | |||
| d332f33346 | |||
| 636db09d73 | |||
| 64c018507b | |||
| 3e513ee6ab | |||
| c34445a496 | |||
| c2ce3d927a | |||
| ff60abb575 | |||
| 7d91dfe339 | |||
| 15af65d4cf | |||
| 0e8431d17b | |||
| 81afeda537 | |||
| e10de25e86 | |||
| 826fdaf06c | |||
| a4d0a1483a | |||
| 746bd47ce5 | |||
| dcb4cabb26 | |||
| 59b4baee0c | |||
| 2610724ee0 | |||
| 61359a5bd0 | |||
| bb3bbd192b | |||
| de781b306f | |||
| 1212aef03b | |||
| 814550d2a6 | |||
| 478663b08c | |||
| fb9a00c36d | |||
| fb68fe8930 | |||
| 73ee01a7f4 | |||
| eb9b5fa9a5 | |||
| 8bd5405228 | |||
| cb51a155b2 | |||
| d3be58b6d7 | |||
| 8ecfbdb4ff | |||
| 63256a00ff | |||
| 450dc92452 | |||
| 9c16408e91 | |||
| d42a2b2d16 | |||
| 3d2f4fa164 | |||
| 3d394943e6 | |||
| cf96a9fd27 | |||
| 76e81dfbb0 | |||
| 684ba6fe14 | |||
| 830cb5cad7 | |||
| 3e25f32c9b | |||
| 81567a9d3e | |||
| 2b06208bbd | |||
| 5f637e5a02 | |||
| cc712a165d | |||
| 4a2adba8f4 | |||
| 84f78059d3 | |||
| b67c0e5f4a | |||
| 1e1ddd3279 | |||
| 70f69cb265 | |||
| ae4cc404c1 | |||
| 32df5faa25 | |||
| ac8e7d57dc | |||
| da4a531717 | |||
| fea12f7806 | |||
| 7499a15c92 | |||
| 115e471515 | |||
| c4df8989e9 | |||
| 0f11b1fc0d | |||
| 5f4e55bc68 | |||
| c621384707 | |||
| c0162a64d1 | |||
| 527d86a93d | |||
| 7d66f1e391 | |||
| 6265155ce4 | |||
| 70d1ff7155 | |||
| 4753206783 | |||
| 6376a3aef2 | |||
| 1ae16beb06 | |||
| e53a4ce64d | |||
| 72655a9eea | |||
| 125f890dc3 | |||
| 101d50703c | |||
| 901ed5545f | |||
| a604d44d06 | |||
| bb92eb5a93 | |||
| 699b4b9fc5 | |||
| 1fb3133ec5 | |||
| fea45c6911 | |||
| 1d7d18afba | |||
| aadbebf9d8 | |||
| 7e12af2448 | |||
| b335fe67b0 | |||
| 776d92e797 | |||
| dde029f105 | |||
| 7ffc02283b | |||
| 7a31a6edee | |||
| df05bc65c5 | |||
| 3a49ff9e72 | |||
| 302c2354a3 | |||
| 158b13e0ba | |||
| 71e2a17fdb | |||
| b1dc7ed873 | |||
| 1bced43e96 | |||
| 7de627c504 | |||
| 6a4bfc0863 | |||
| 170bf6d7af | |||
| 8550f7e04d | |||
| 9f3e83baf6 | |||
| 17ab61a40d | |||
| 1b844f8413 | |||
| baa22fa808 | |||
| f78cebfc98 | |||
| d2a9ca13f1 | |||
| 71bae7c23f | |||
| 1dacea3a20 | |||
| 083a7c8f0a | |||
| d4f104f17f | |||
| fd44ba296d | |||
| 4ed91ce7ed | |||
| b04d6a2d9b | |||
| 15e2f991dd | |||
| a08eac452e | |||
| 0c171c0749 | |||
| 7021ea6748 | |||
| dbd65a3b01 | |||
| 55aa1d4852 | |||
| 971dacaf41 | |||
| 159534313e | |||
| 2f68c43e39 | |||
| e2483aa072 | |||
| 6c53af8e41 | |||
| c4ca9a7bae | |||
| c69f37343c | |||
| aec62a7fc5 | |||
| bf26050f7e | |||
| 402bce1a31 | |||
| e68657cdb2 | |||
| e00cfe067d | |||
| 8868350888 | |||
| fcaeeac931 | |||
| a53582d706 | |||
| e655083e3c | |||
| 1b64851fa8 | |||
| 40a7c70969 | |||
| 2e143b8799 | |||
| 5105a937d1 | |||
| 3930c9a492 | |||
| 29fb4f98b1 | |||
| f0839d2703 | |||
| 405e820fe1 | |||
| 3386efddba | |||
| c41650db20 | |||
| a0ff55db7d | |||
| 896bffb543 | |||
| 0df6159149 | |||
| cfb77091ca | |||
| 6598e9d506 | |||
| 8c2cf89845 | |||
| aeb8dfc52d | |||
| 0649a2fbdb | |||
| ec32061f5f | |||
| f2da1a0a7a | |||
| fda1e6f148 | |||
| 2a48730166 | |||
| 0bdbc745c4 | |||
| 6f70b0524a | |||
| b9b19185bc | |||
| 63ba9970bd | |||
| 1f726e81f9 | |||
| a9a6801c6d | |||
| 222af8e7e4 | |||
| df71853075 | |||
| bfb10d74eb | |||
| ec8b7c933a | |||
| 68d15fc62e | |||
| f479935cda | |||
| 76860933f0 | |||
| 19a936fc03 | |||
| be17fce657 | |||
| 9a1d7736f8 | |||
| 9f295b2c91 | |||
| 6e8daaec0f | |||
| 3a8154051f | |||
| f3f46096d6 | |||
| ace37df941 | |||
| de7377485b | |||
| e23578acd9 | |||
| 770445ae2a | |||
| b9b65e9392 | |||
| ac9182f20d | |||
| 125b9f6057 | |||
| 69357b1e88 | |||
| e9e9e3898a | |||
| 9ef20ad20e | |||
| 2cf1a13755 | |||
| 6465e393b6 | |||
| 6e6c0f31f7 | |||
| 1263949e70 | |||
| 12d80b9e64 | |||
| ad333e0d22 | |||
| 34a8a45a6a | |||
| 1e51f87298 | |||
| 8095f601d1 | |||
| b40d24ad75 | |||
| f839fa4070 | |||
| 32d51313d0 | |||
| 69341edfe6 | |||
| 81f0b0e0dc | |||
| 28f919d9d2 | |||
| 3e1673e8b2 | |||
| 174753921d | |||
| aa32e3deb1 | |||
| 47fe017a6c | |||
| 7baae20c20 | |||
| 921c4551d9 | |||
| c20a424e3a | |||
| 2e005f5dc2 | |||
| 9f13fdb840 | |||
| e6f52b0996 | |||
| e11408f6ad | |||
| 61a4100d0c | |||
| 69fc0acd1a | |||
| 3f14cb073b | |||
| 5ffe32439d | |||
| 76a9c0ccb0 | |||
| c89084e6b7 | |||
| 64072e44cc | |||
| e7007668a6 | |||
| 105b57c8d9 | |||
| 79d4a38d87 | |||
| e08de1101d | |||
| b5339cc01b | |||
| 35eaacd1db | |||
| ad2f5ccc66 | |||
| 77bfd9434b | |||
| 6ba99068c9 | |||
| b7f6584dab | |||
| 3290a5f370 | |||
| 0753408e10 | |||
| b62d015285 | |||
| 24002a5dfe | |||
| 7c4b873ba3 | |||
| 7949983c41 | |||
| b0d66e06f4 | |||
| a00d6b8377 | |||
| ca8c3dd9b5 | |||
| c434ca74a2 | |||
| 94f00cf096 | |||
| 50a264d832 | |||
| 3f52d0e46c | |||
| 716bdd5ee5 | |||
| bad08d26da | |||
| a41394c885 | |||
| dc31e20925 | |||
| af63fffb63 | |||
| 0a6adedaf1 | |||
| b19f860384 | |||
| 4c1d5840bb | |||
| c5c2b6f9bf | |||
| 0f4b27c300 | |||
| fbb38cc245 | |||
| c1a57a10a4 | |||
| 12fa8d8444 | |||
| ddd2447192 | |||
| 04d907fb97 | |||
| e2610df073 | |||
| 4287961aed | |||
| d643a90efa | |||
| d0fe6ad109 | |||
| b450dd7a87 | |||
| 2e429268ff | |||
| e2ca50f1cb | |||
| be24659c03 | |||
| 2dc157246b | |||
| b6670f3ac3 | |||
| d2ac304ade | |||
| 16c3522f4e | |||
| 7ac6abe02a | |||
| 6af20d3907 | |||
| a823b06fa5 | |||
| cbb0151303 | |||
| ec4baf337a | |||
| 325bdf952c | |||
| 6fbf93750b | |||
| 65eb946756 | |||
| 137ec1c846 | |||
| b0afb4d63c | |||
| 51fd26b19b | |||
| 1b0f781b7c | |||
| d1c04af603 | |||
| eb82ba36a3 | |||
| 7bcb51eded | |||
| f70e80a6ba | |||
| e0265c67c6 | |||
| 28c064f345 | |||
| c7f03814ea | |||
| 90623498a2 | |||
| 21b2e33ebb | |||
| 0553543e6e | |||
| 543379d343 | |||
| 37eba84056 | |||
| 293e777fce | |||
| dd5976162b | |||
| 7328600a7a | |||
| 3d0a421ab4 | |||
| 831d48d971 | |||
| 3a062eed5b | |||
| 52a6a823ad | |||
| 9d61b1e754 | |||
| b89410a266 | |||
| 317db39a5e | |||
| 9d89edff2f | |||
| 599d64a405 | |||
| 0a6f216f83 | |||
| 1d0334fc07 | |||
| 6c57428742 | |||
| 0f35412dcd | |||
| 6d81a88288 | |||
| 96a15434a2 | |||
| 6111935835 | |||
| c131c12fd7 | |||
| ca7518c13b | |||
| 77e26a7db3 | |||
| a7c1838c69 | |||
| 54d80d9168 | |||
| db2cefd12b | |||
| a40d308d6a | |||
| 3dd55d284d | |||
| 504ff978c5 | |||
| 9a7df7a85d | |||
| b5a4bd22fb | |||
| 0aca3fb5af | |||
| b50c1ba9e6 | |||
| 413c056504 | |||
| 20d5d1c4c2 | |||
| 928d5ae315 | |||
| 0cdbdfdf9f | |||
| 47426a8ae5 | |||
| cc73c36e32 | |||
| fdd5c26eb8 | |||
| ad66b070a7 | |||
| 6f6dd227f8 | |||
| 3d5f9e8b14 | |||
| 2cb48e034e | |||
| e5d78960c6 | |||
| ba8d20e9ae | |||
| 767127c92e | |||
| 65b5d34aee | |||
| 107f233626 | |||
| 0677f3e21c | |||
| 1162cef978 | |||
| c527b3cefd | |||
| 8fa013309e | |||
| 7ab3a80d0a | |||
| e5518ee657 | |||
| 0c31c0756c | |||
| 7405075ede | |||
| 6b474c4051 | |||
| a9c954e821 | |||
| b6933dbf3a | |||
| f46b1252c4 | |||
| e6959055b5 | |||
| 7ea21c4b3c | |||
| 9d227641c9 | |||
| 2a2e4e78bf | |||
| fb3b297369 | |||
| 050327a1e2 | |||
| fcff767a7f | |||
| 7a282a8892 | |||
| 3e34cec96b | |||
| 6ca46afa63 | |||
| ab0e1c573a | |||
| 26da491053 | |||
| 674ecc5581 | |||
| eced4dd023 | |||
| 94e1126678 | |||
| 2b787eb4b8 | |||
| e250bae356 | |||
| 1a5b411ae4 | |||
| 4c7f56263e | |||
| 6be9496d73 | |||
| 46b2da409b | |||
| 694fe3e7d2 | |||
| 900051cd04 | |||
| 34c3f0f495 | |||
| e705414bea | |||
| 467870415b | |||
| 37c12db366 | |||
| b73bf03bfc | |||
| 8c221981bf | |||
| e85b41f9be | |||
| f54f6627c3 | |||
| 13a1105318 | |||
| 8e5e1b62aa | |||
| 19ef9505e8 | |||
| e982ad2284 | |||
| 7825abd540 | |||
| cd59516433 | |||
| 1a3a25f825 | |||
| b4e941d431 | |||
| ea41f89b40 | |||
| 7a790d0d35 | |||
| 995c308a49 | |||
| 1d5589296e | |||
| 8a44e712f8 | |||
| e4e10e54df | |||
| d93790717d | |||
| 5e5f47321b | |||
| 109637e213 | |||
| e49ae68524 | |||
| 49127b6a26 | |||
| 255853a819 | |||
| 28c0cd8460 | |||
| 10ef76905c | |||
| e43375cc68 | |||
| 63bb2abada | |||
| 5202186681 | |||
| 98889e41b0 | |||
| 962cdc2d98 | |||
| 71acf078ba | |||
| b3233de1c2 | |||
| 63982d6771 | |||
| 2cd540b9c4 | |||
| bbdae291ed | |||
| f9f33a7bb5 | |||
| d34a34f328 | |||
| 3eaeca58da | |||
| d3bc563c6e | |||
| 941a9792f7 | |||
| 646a023ff4 | |||
| 005508a07b | |||
| 701744c621 | |||
| e4c7fca755 | |||
| bec7b297ed | |||
| ee17b5de6e | |||
| a0041125c6 | |||
| 378a634de8 | |||
| 8a05850302 | |||
| 8c74d7e4fa | |||
| ba3f150b14 | |||
| 2f8c62999f | |||
| 3eea3dd46b | |||
| ba2b331461 | |||
| a6f7dca685 | |||
| 282605ea76 | |||
| 244511e434 | |||
| 656b20a169 | |||
| 50bb344a9d | |||
| 1c078c59e3 | |||
| cd68cc1f46 | |||
| e80f6624ed | |||
| 109255a730 | |||
| b13b5d86f6 | |||
| 15265918a7 | |||
| ed00088f17 | |||
| 3ed376d103 | |||
| e2930c7898 | |||
| 84676fefe3 | |||
| 1363496c11 | |||
| a029f03edc | |||
| 03df48899c | |||
| cdbea6f0a0 | |||
| 6659d55a9d | |||
| b4795086fe | |||
| a6b5771297 | |||
| dac298ef41 | |||
| 3e9158acd6 | |||
| b82700ae41 | |||
| 009860e98a | |||
| 624d532000 | |||
| c51f5e8d76 | |||
| ba7dbca018 | |||
| 7d7ab462d6 | |||
| c4c21c2fa7 | |||
| e06a497c7c | |||
| f7cab121fe | |||
| bb59b81d82 | |||
| b74804f61f | |||
| 50baf76cc2 | |||
| fcdd69fd97 | |||
| 46e275dfe4 | |||
| 743f1810c7 | |||
| dd1494eebf | |||
| 5bb45baa6c | |||
| a04479746a | |||
| 8ac304517e | |||
| e52291cbcc | |||
| 79b4dc14a3 | |||
| 8ed0fc6f0c | |||
| 9f01b97e14 | |||
| 9f52244574 | |||
| fce8d8e090 | |||
| 8ff27a07bb | |||
| d1ea2ad143 | |||
| de385009ae | |||
| 114848d313 | |||
| a55150b1bc | |||
| b5a9ef6b7b | |||
| 8ebe320270 | |||
| f41327df0c | |||
| f77276311d | |||
| da5bfefc78 | |||
| 619cc01ca1 | |||
| ad94d8cc4f | |||
| c3cebc3ac5 | |||
| 02488c5cbb | |||
| 40ca8f4695 | |||
| cf28b5e5be | |||
| c79a1528ad | |||
| 31619faa70 | |||
| 9e6b7f5dc1 | |||
| 541a09b7ac | |||
| d1b5a78171 | |||
| 753ccd6b17 | |||
| 08bee40fa2 | |||
| 461e26b60b | |||
| 6fdb7aee84 | |||
| 22d64ae08f | |||
| 5ecf693774 | |||
| b7a70fda79 | |||
| b023fcd264 | |||
| e98c845f0b | |||
| e4ed1d08f4 | |||
| 8e32566583 | |||
| a3de45741e | |||
| 7d7d907de7 | |||
| 673e4e20f0 | |||
| 38a4eaf8a3 | |||
| 29b453eb86 | |||
| ef0eed8d3c | |||
| 9d37cdaa66 | |||
| 3f686a6ab8 | |||
| db3e3a766a | |||
| 9cef41000a | |||
| fc54853d44 | |||
| 6f5af6eb42 | |||
| eb6d8e6af2 | |||
| 446f344818 | |||
| 3c40f87af3 | |||
| 69e1167882 | |||
| e726ff3296 | |||
| 56568dae31 | |||
| 74b6646737 | |||
| 986ad4ff06 | |||
| 95ce8f45ea | |||
| 7521f207b1 | |||
| 2155296a13 | |||
| 23be514886 | |||
| 77b986c7a1 | |||
| f90673ef4c | |||
| df18431b45 | |||
| 5c987e4c75 | |||
| 7efc0011fd | |||
| ece14eae24 | |||
| 3c9d03c36f | |||
| 7afd48658c | |||
| d65c6af3a5 | |||
| c08e38acd0 | |||
| 85b0fb2a9c | |||
| 19d825aa16 | |||
| e1a8fc0417 | |||
| eafe6ccdbe | |||
| 0f8ab0557e | |||
| 0105f8fa38 | |||
| 049b50d9c0 | |||
| 12fd382fec | |||
| c996fd1c06 | |||
| c4c9cdd2b1 | |||
| 34c4e454c5 | |||
| 11cfa64a10 | |||
| adafb20d1e | |||
| dbfa1bfba4 | |||
| f8c7862f69 | |||
| b86f129393 | |||
| e8536c4a0e | |||
| 2687a2b6dc | |||
| aab6362705 | |||
| 94e8a08d1d | |||
| ce8027c6fb | |||
| 9acbfc6e05 | |||
| a316b11aaa | |||
| 2c6a2f0381 | |||
| b866d0dc38 | |||
| 23baf1a75e | |||
| b5c162175b | |||
| 60c76cc289 | |||
| efd556b1a9 | |||
| b4b2a276c8 | |||
| 464d53bb16 | |||
| 4c9e3723e8 | |||
| 06477743ab | |||
| e4a9ad1730 | |||
| d0b6637c1d | |||
| 58268b6eef | |||
| 14aa8affe5 | |||
| 56074c2eb3 | |||
| 3da1e8b2f8 | |||
| 786cecfe66 | |||
| dde3cb3b99 | |||
| 24f2b7dd3f | |||
| 936530f795 | |||
| cfbdbffcad | |||
| 71db9d3b57 | |||
| b455e1cf52 | |||
| 90bea15e35 | |||
| 892cac9e1b | |||
| f58f36dc88 | |||
| 9e84b860f2 | |||
| 2e7ef6f4e8 | |||
| cea137f313 | |||
| 79a82013ad | |||
| 3826158547 | |||
| a7c150ec66 | |||
| 389495f76a | |||
| a3f3fbe05d | |||
| 4d00ed8df7 | |||
| 41e906d1a4 | |||
| 0e4b5b88dc | |||
| 011d8e80d8 | |||
| 1f8f0abe92 | |||
| d9c5b85671 | |||
| 76cf31bee7 | |||
| d986cc4861 | |||
| 724001aa0f | |||
| 5564d73071 | |||
| 3fc1c73064 | |||
| 1b0dca9c2c | |||
| ef32d7fd16 | |||
| 5f1ca33c6f | |||
| e12adcdf08 | |||
| 527cedd848 | |||
| ec5065eb53 | |||
| 90524a8528 | |||
| eb24575e2c | |||
| d9877efe1d | |||
| 7459613623 | |||
| 07736c912f | |||
| a110ede0a2 | |||
| 2a3cdba724 | |||
| 099ad1a259 | |||
| 6df92b3bca | |||
| 48ccbe39b4 | |||
| 691c3d1e3c | |||
| ca8bb8d053 | |||
| 56d2b7137c | |||
| d9a62c42e5 | |||
| 978f387961 | |||
| 209f6cdcc7 | |||
| 1fe276d041 | |||
| f345ed564a | |||
| 3d4563913d | |||
| 93c3775927 | |||
| afbf383ba3 | |||
| 36598677cf | |||
| 72dfd4846e | |||
| bd40952097 | |||
| ea1e3fb90d | |||
| 3a99fb9d34 | |||
| e1b56e376e | |||
| e8058b9fdb | |||
| d31b6c3480 | |||
| 95ff928228 | |||
| 510dc17c2e | |||
| 2669d8ce73 | |||
| 1729297ef3 | |||
| b87f7a625e | |||
| c3e8790dfd | |||
| bf49149c97 | |||
| 49d5960a32 | |||
| dcfa23d5d2 | |||
| 5ac0712cf1 | |||
| adac1da64e | |||
| 9c8626bf3c | |||
| ef21fd3cf8 | |||
| aa51382dbc | |||
| 8bf451a3e0 | |||
| 0d3e05f9b3 | |||
| 06a09d5991 | |||
| 57c894f44d | |||
| 7de189114b | |||
| 4c048a487e | |||
| 09a62012b2 | |||
| b494de6a01 | |||
| dbeec7715d | |||
| 1048feac3b | |||
| 78476a0fe2 | |||
| d5fd2f0155 | |||
| c8ebe0eb86 | |||
| 16561ed71e | |||
| 4bfdf7cf2a | |||
| e58da86efc | |||
| 2dd2d60955 | |||
| 1b443219ed | |||
| 76be3529f4 | |||
| 6a51e3b39a | |||
| ae265a48c7 | |||
| af2f8c69f0 | |||
| 46ccde82cf | |||
| 537494f4dd | |||
| 39d5e14c1f | |||
| d5dce63254 | |||
| 01981ed290 | |||
| 6f5d56d994 | |||
| 793b2b9ad9 | |||
| 050c960dfc | |||
| aabeb8a18e | |||
| d7d51e4cc7 | |||
| 5224d016e9 | |||
| 199687a1c5 | |||
| b5a6c8e2b2 | |||
| 955909bdb5 | |||
| e3da18121f | |||
| 0c4a8e2ca8 | |||
| a3e7c2d8e3 | |||
| 40b8b58bc6 | |||
| fc1a156262 | |||
| 8cbd20b380 | |||
| 43d306fc2d | |||
| 01e23a2222 | |||
| f88d89ad82 | |||
| b29f73d5e0 | |||
| e998d89e88 | |||
| b91e701f35 | |||
| 295afd5882 | |||
| 8da1b9aafa | |||
| 19f4cc57c1 | |||
| 80d4d4d92c | |||
| 6a7df4e973 | |||
| 098f07664d | |||
| 4dbb8ac4b2 | |||
| e7f2af5fdb | |||
| 4419f4093e | |||
| c945ea125a | |||
| c32e349332 | |||
| 118218754b | |||
| 00c61cf197 | |||
| f6901ab877 | |||
| 862fc06b6f | |||
| 89ed813585 | |||
| 0dc28d3446 | |||
| 50657e2324 | |||
| 7c22cd49a7 | |||
| c012490399 | |||
| e937d9b559 | |||
| 688aea6bec | |||
| 7186c46377 | |||
| 3fc1487cc9 | |||
| 48ddb53332 | |||
| f584c6d723 | |||
| 3ea9022c5f | |||
| 45ee8e2532 | |||
| f7b8f522ff | |||
| f6aa9ac304 | |||
| 6c575e8826 | |||
| f52a2cf5e1 | |||
| 5bfb779d82 | |||
| 95fd61c9b4 | |||
| d1cdef596c | |||
| 7163781639 | |||
| a63cee2139 | |||
| 830d8d6b75 | |||
| a07f064e50 | |||
| ea4b491a73 | |||
| 986bc65e1f | |||
| 5218443784 | |||
| 3b00ee2afb | |||
| 7d832337ae | |||
| a258404a58 | |||
| a3048239b3 | |||
| f787c73841 | |||
| 1604ea3b27 | |||
| b23d377567 | |||
| f445b826d0 | |||
| a12ceb04bb | |||
| 623aaaccd4 | |||
| da0fd62c23 | |||
| a10d289997 | |||
| 750b1aba8d | |||
| a3e8c6e866 | |||
| bfd056ceb1 | |||
| 620629593b | |||
| 05ad3a535f | |||
| 5c76f99fdd | |||
| 36915db699 | |||
| 17640d6008 | |||
| 8711653530 | |||
| 7e019af50d | |||
| 8b61719a9d | |||
| 5ae9892170 | |||
| 6426101433 | |||
| cf8322c0d3 | |||
| 0384eb7d8c | |||
| 0c84b91dde | |||
| 7a796b20ea | |||
| 71f665bd8c | |||
| 2129c72bc0 | |||
| 0428dce27d | |||
| 60354e3901 | |||
| 2e6e9c14b5 | |||
| 721ab68bec | |||
| 192e5c8166 | |||
| bce5d364df | |||
| 2dfb163281 | |||
| 417d7a38de | |||
| ba147d2be2 | |||
| 1192cbe4ab | |||
| 458bd1652d | |||
| e5e08ec523 | |||
| 3547ac4b49 | |||
| f6c2bf21c8 | |||
| 397ba2d9aa | |||
| 8cc2cbf1c4 | |||
| d696d7f9ea | |||
| 41548a091b | |||
| c9e1386e44 | |||
| 5108e3ced6 | |||
| 8753203df0 | |||
| a66f61748f | |||
| b45273eccb | |||
| 7fe87d9a5b | |||
| a37f7cce52 | |||
| 949fe93d5a | |||
| b4e9b4fe7d | |||
| c3ced6db4e | |||
| 0b38571920 | |||
| 2ffe15f22f | |||
| 31ddd98c8e | |||
| 759c9522fd | |||
| f0149cdae2 | |||
| bedabc15ae | |||
| 565f14655c | |||
| 760e7e8efa | |||
| fa25faa2d2 | |||
| dbab8d8c38 | |||
| 9f02b8742e | |||
| 422f802ec9 | |||
| 5fd3d36fe8 | |||
| 11eff8bae0 | |||
| 27b2059662 | |||
| e6ec42d462 | |||
| ff4c3873f2 | |||
| 1192734131 | |||
| 29976a04c5 | |||
| a3106d424b | |||
| 77b01deb80 | |||
| f53f491cd2 | |||
| e421233a1d | |||
| a2f7ef9d21 | |||
| c708f506a4 | |||
| ae293f27cf | |||
| afe9993376 | |||
| a9f5c19239 | |||
| 53bfdc318a | |||
| 4cf76754d3 | |||
| b698d0a6ee | |||
| 11fb04c2f7 | |||
| aaf65bb3af | |||
| 9d38a95292 | |||
| 0291dd3ef8 | |||
| a46ca98c57 | |||
| e65e23b9c0 | |||
| d8b2f11cc8 | |||
| c3bb57afea | |||
| 8a480ac3c1 | |||
| ffe0d50447 | |||
| a199d7adf1 | |||
| 348414dc62 | |||
| 243ce78508 | |||
| 33db2ac928 | |||
| 1fabe92ace | |||
| 4564b8a224 | |||
| 971cc3354b | |||
| 9b7b22ee0e | |||
| d17ab271e8 | |||
| a216b8bf87 | |||
| af9ee90091 | |||
| cb2e276bff | |||
| cd0f0384ef | |||
| 5924770504 | |||
| 111cdd7a32 | |||
| 89a17b4232 | |||
| f0c411d8b5 | |||
| e5e767abc1 | |||
| 521aac9665 | |||
| 1949056423 | |||
| 3d50bde46e | |||
| 0b454486cf | |||
| ead1dcf308 | |||
| 553259ef99 | |||
| ff992183b2 | |||
| 37e2afb8f6 | |||
| d0e6d2438c | |||
| a724dc99e8 | |||
| 44d473fba0 | |||
| 988bc804bf | |||
| 52ac3661b0 | |||
| 27f1ab5a70 | |||
| 8bf1b9a422 | |||
| 524a2fffe9 | |||
| 6781ca7d55 | |||
| 0970ef57bd | |||
| f98c97f796 | |||
| 46d3637609 | |||
| 992c908b56 | |||
| cbdaa93e54 | |||
| 4988e131fd | |||
| 657c8d1c65 | |||
| e03891b744 | |||
| a5fdcf9881 | |||
| 62a63021c7 | |||
| 33fab84473 | |||
| 0ccc839397 | |||
| a711e2aa41 | |||
| ab4065fa1c | |||
| ee73b0bd08 | |||
| e58977a3de | |||
| 31bee49371 | |||
| 48ef6df842 | |||
| 98ad7d01d5 | |||
| 206c843f36 | |||
| 4e6a108bda | |||
| c62e63909a | |||
| 7566921364 | |||
| 4cec9e5ff1 | |||
| 59ba33658a | |||
| 085bd5f55f | |||
| 86905754e4 | |||
| 6044395986 | |||
| eff259b047 | |||
| 4f03f70968 | |||
| c81d785ada | |||
| 6fb46bb34b | |||
| 365a10f58c | |||
| 3bdd7bfbea | |||
| 6573b9ace0 | |||
| ee5ff71d55 | |||
| 6e5f0a2a58 | |||
| 721fac5542 | |||
| 99bc35a883 | |||
| 63e92cccf2 | |||
| a74ed58893 | |||
| 5ed65460d1 | |||
| 0eb7060205 | |||
| e3d502310f | |||
| 9ba5581d17 | |||
| 6fdddd53a1 | |||
| 88a187a737 | |||
| 57f5700e18 | |||
| d84b213f59 | |||
| 177fbc7bbb | |||
| 56373428dc | |||
| 13962b8533 | |||
| 04bee3f9b7 | |||
| 305a245530 | |||
| 74113737f3 | |||
| c244b456f0 | |||
| 87ab4ee567 | |||
| 0cbaaba4b1 | |||
| 6fbf7042b5 | |||
| 265acccd56 | |||
| c6638d62e6 | |||
| 55ca0fcc27 | |||
| 25f3a11a16 | |||
| b1706bc7e5 | |||
| 579d74d35b | |||
| 7ce518106b | |||
| 171cba4947 | |||
| fd498501d6 | |||
| 51bfe74ce1 | |||
| 5f3012fc9a | |||
| 0f3c82e73b | |||
| 02385472b6 | |||
| f30b5995b6 | |||
| 89a6937c00 | |||
| 08a3eef62a | |||
| 434014b05e | |||
| 29ff1129fb | |||
| 5906b49bd1 | |||
| b03ed532cf | |||
| 7d30e19b3e | |||
| b083c20eb2 | |||
| 7722a2b8a8 | |||
| 977e5afbac | |||
| a17d1843fb | |||
| c3e8a82c9c | |||
| d3aaf2d3a3 | |||
| 515a06cedf | |||
| 9f177b2bcd | |||
| 765f333a1d | |||
| 4e97c69792 | |||
| 88d8a48b09 | |||
| 6202556fc0 | |||
| be9f3826d7 | |||
| 7f453ade73 | |||
| b3a261c7ce | |||
| 6b0fff72d9 | |||
| 21e28adb87 | |||
| 57ca10636c | |||
| e96a58f091 | |||
| e02318d384 | |||
| 9039284d96 | |||
| 593af7287b | |||
| c0f435349a | |||
| 5ecf5f106a | |||
| 5b095dfcb6 | |||
| 7c41b54e3d | |||
| 486de65067 | |||
| 06bff34a6b | |||
| 77ddfa2fc9 | |||
| 7386d8523b | |||
| 713577b257 | |||
| 583f4b9633 | |||
| 45a6386e45 | |||
| 3c35b563d7 | |||
| d981d04c76 | |||
| 666be238d8 | |||
| 3e3d4ad797 | |||
| 6e5437a582 | |||
| 09799402f9 | |||
| c722625f28 | |||
| 1d30a524fa | |||
| 7f90f04df2 | |||
| 7228d2a824 | |||
| 152e6476d9 | |||
| 15b948d109 | |||
| aff2c7c43c | |||
| 51a42c0647 | |||
| 189fc43765 | |||
| a1641f938e | |||
| 351fb8c058 | |||
| 561421f748 | |||
| 9415560250 | |||
| 511d0fe198 | |||
| bfcc136dc7 | |||
| 94e36d8c8d | |||
| 4ee6852a1e | |||
| 05d5c284f6 | |||
| f19d0ae41d | |||
| 850b1ea2d7 | |||
| 10d2bcc8a2 | |||
| 7ce1bd5d88 | |||
| 2cef100303 | |||
| fecebea2e3 | |||
| 07a0274507 | |||
| 8ff0399432 | |||
| dd2c7c5140 | |||
| ca9756f6a1 | |||
| f351653589 | |||
| 0556450801 | |||
| 1537a5f253 | |||
| ce772b346c | |||
| b1f42a6506 | |||
| cb5921b375 | |||
| 016f9ab16e | |||
| 499e20da4f | |||
| d50c21e571 | |||
| 676d1dfd5b | |||
| acede976e4 | |||
| 90e7c29c46 | |||
| ca6a11e4d2 | |||
| b8579f12be | |||
| 31ec9b2aa7 | |||
| 0c2a43923c | |||
| 63320aba6c | |||
| 2fe9c87433 | |||
| ab4dbff150 | |||
| 01a85736e6 | |||
| 7d5a8053d7 | |||
| b8cf5d8d5f | |||
| 43df944eb4 | |||
| 763a1d7392 | |||
| 5db3092a1f | |||
| be1615b1c3 | |||
| ca9fd66744 | |||
| bdc95d2c66 | |||
| a10385543b | |||
| e80adc0bc6 | |||
| 1b5730a799 | |||
| 01dcfb0825 | |||
| 01b2c5a77c | |||
| 3a45a65625 | |||
| c8776e6ebd | |||
| cf2a3c8e74 | |||
| 277f0d270f | |||
| 3ffed0bf6e | |||
| 557ac3dbaf | |||
| d448a636f8 | |||
| 3c5fec6746 | |||
| 95a07ca11c | |||
| 72c5ac37de | |||
| 1eba7f60c2 | |||
| 0c00d082cf | |||
| faceb05775 | |||
| 8d78400052 | |||
| b4b4d21212 | |||
| 99502e99cc | |||
| 99436bb8cf | |||
| c303aaa94d | |||
| b0563ce368 | |||
| 673eb2b006 | |||
| ef395c3866 | |||
| 4d3d6230c5 | |||
| ea34b2fefb | |||
| 978666c816 | |||
| 0b4c101e8a | |||
| 4e8cd4629c | |||
| 4dfa798e75 | |||
| 2aeb32d2d1 | |||
| 760e9e0943 | |||
| 4cdb4652cf | |||
| 020be63df5 | |||
| 31d624f9a8 | |||
| dbb30134bc | |||
| 8fe9674301 | |||
| 2160f9b20e | |||
| 034a43e7f7 | |||
| ca23c0e630 | |||
| c48473dfe4 | |||
| 7e7bb3027c | |||
| 2a52e44bc6 | |||
| 3af63fe052 | |||
| a1230ad0a0 | |||
| 448a5452d0 | |||
| 4cebef9090 | |||
| d3b68b059b | |||
| 866b15ddb8 | |||
| 7d1c42afe1 | |||
| d594e72586 | |||
| 3ba6b41961 | |||
| 034a5f140c | |||
| 11b08b5ff3 | |||
| 850414a501 | |||
| a560ebf09d | |||
| 72fedbe096 | |||
| d00e58cdb0 | |||
| 3c85745e22 | |||
| 3befdb4ae8 | |||
| 27b71d6368 | |||
| 9b3be01b83 | |||
| 44560c3e50 | |||
| 198b5096aa | |||
| 619180dffd | |||
| 6271192a32 | |||
| c9296e599f | |||
| 90a4d67e8d | |||
| 23bc89d6fc | |||
| 73ddc091a2 | |||
| bce9837604 | |||
| f3a50224f2 | |||
| d4a17da7b2 | |||
| bc036e1e86 | |||
| 8ed89bae84 | |||
| 29d214474f | |||
| 8808aaccff | |||
| 831153d5fb | |||
| 333a767be4 | |||
| db5f1c3554 | |||
| 9c4b1d0a51 | |||
| 98b5fb4b9f | |||
| e93c51762b | |||
| b16c1096d1 | |||
| 4d8d152461 | |||
| cc0066d38d | |||
| b17e9c614b | |||
| 45d073f889 | |||
| 95aa6d7307 | |||
| 2617c9aa64 | |||
| 84bb67e49b | |||
| f2d3edec80 | |||
| 53c0189ed7 | |||
| 43a907ddda | |||
| 5e082ab852 | |||
| 8eafddf211 | |||
| c23ab37355 | |||
| 102ef39a27 | |||
| a41cbbdc99 | |||
| 96b26dc8f4 | |||
| 4fdf4d380c | |||
| 1f695c4532 | |||
| 77dd40c96c | |||
| dae1fc8889 | |||
| a6ef9b4584 | |||
| f3237fdc6e | |||
| cc259e49f6 | |||
| 3efa78311a | |||
| aa2777ed61 | |||
| 8a588f2c0b | |||
| a631196155 | |||
| 98d96f2cc8 | |||
| bd6ab6d38e | |||
| f791cf825f | |||
| 7d998336d3 | |||
| d0d676929d | |||
| 4dffcbd9f0 | |||
| 5baa2c0706 | |||
| 225566da7b | |||
| 0dd1ce1a4f | |||
| c56e91dcc0 | |||
| 20fb9281f4 | |||
| a173ea36f7 | |||
| e569e9dcbd | |||
| 01c1b341a8 | |||
| a9a33d9a5f | |||
| 57c9991413 | |||
| bf2f7b0f8b | |||
| 27edba495a | |||
| 0d456f9111 | |||
| 2ced568d34 | |||
| e037800e46 | |||
| 5542dcb2bc | |||
| 560f85f8e5 | |||
| f856c964e2 | |||
| 5d01821d9f | |||
| 4b2363de5c | |||
| 5265db82c7 | |||
| 1358c0ae66 | |||
| e5ed22bd5b | |||
| 3d14dd4e39 | |||
| 3fe9dfaa2e | |||
| 8b3042da63 | |||
| 65ccafd494 | |||
| 6c93e42d94 | |||
| 7dad0f23d6 | |||
| b3a07166ba | |||
| 282fcb90dc | |||
| a696348ec5 | |||
| d85e67d3ec | |||
| c30af724ef | |||
| 1f8802b94d | |||
| 2b9cfe1e1c | |||
| ed377ac1e8 | |||
| ced3df73da | |||
| 4057e81b76 | |||
| 24ca53183d | |||
| fd369a5004 | |||
| a90dacdf75 | |||
| 4e2ef8c8f5 | |||
| afc8dd5661 | |||
| 52f930cca7 | |||
| 4cb9faf6c9 | |||
| f163778da7 | |||
| 55f2370f36 | |||
| fb61f88b9c | |||
| 1e32781b54 | |||
| e57ceea3d3 | |||
| 1f2b2c5242 | |||
| e4a64760db | |||
| 43a91f82fe | |||
| ccfca869e5 | |||
| f6ec467f19 | |||
| 1996ae4a42 | |||
| dec25e8531 | |||
| 48eecafc89 | |||
| 7b12cbd7dc | |||
| 01f97f150c | |||
| 17a35587e1 | |||
| d76f24567b | |||
| 03a602b6ef | |||
| 9ec3d76b21 | |||
| c4c94f891e | |||
| 4ebd91e637 | |||
| 659ffaddb4 | |||
| 2da7360b63 | |||
| 16bc505d26 | |||
| 89d3f95a8e | |||
| bda89a6469 | |||
| ee4feb4b09 | |||
| 1fac1421e5 | |||
| 4de1efd3c8 | |||
| 545f8a8c93 | |||
| 97b6068c46 | |||
| 71ef76ecad | |||
| 4c86fc13cb | |||
| b379969c63 | |||
| b8e0898c7c | |||
| 61969dc158 | |||
| 8f910d2d49 | |||
| fd4fac946a | |||
| 287874a444 | |||
| c6c8783c60 | |||
| a11f9e1963 | |||
| d427cebd12 | |||
| e5b58b1020 | |||
| 2c0d9fa81f | |||
| cf93df41fc | |||
| ba7b0f4c54 | |||
| 17c485eb03 | |||
| 5b0b59ecfb | |||
| c2b6c67431 | |||
| 4a4ff6749b | |||
| f270e8d040 | |||
| 3cd8976493 | |||
| 92b9888837 | |||
| 121bc50ca9 | |||
| 0d19fa0720 | |||
| b8ef2036b0 | |||
| 8b9982a0a5 | |||
| 6b6c2f6087 | |||
| 9a18330f3a | |||
| c89780dfe0 | |||
| 3fddd3bf93 | |||
| b505cf84de | |||
| 476a02739e | |||
| 544ceedcac | |||
| e0e683aedf | |||
| dd3f517fe9 | |||
| 65d606630d | |||
| ad56838040 | |||
| 202ba124a5 | |||
| a91eca6ec2 | |||
| c0503718cd | |||
| 1ddcfc5c68 | |||
| 9b8ddba4d1 | |||
| b2b6f52d14 | |||
| 15621532b8 | |||
| 774d28efb1 | |||
| c3023fb52b | |||
| ccf415c341 | |||
| 8108fb0575 | |||
| b4a3c92867 | |||
| 72315e7b00 | |||
| 1633c29f29 | |||
| 529a241a26 | |||
| 5e3a7ac8a7 | |||
| 63b154396a | |||
| fbb3f64a1a | |||
| 0dc0bc80ae | |||
| 4b0132ed7a | |||
| 78c5e41c23 | |||
| 01a28db949 | |||
| 53b6fb465c | |||
| a7acb8805f | |||
| fb5e7964b3 | |||
| d9efb55d29 | |||
| 9276f1910b | |||
| ad0ab4109a | |||
| a4d16acd00 | |||
| 744798aadd | |||
| 318cba4ce3 | |||
| cf93217365 | |||
| 0867e3188d | |||
| 1261559305 | |||
| af230ec133 | |||
| fc41c18c6f | |||
| 1acadd363b | |||
| ac2dc29525 | |||
| d1c4e4b5a5 | |||
| beb14c70da | |||
| b5426a8679 | |||
| 7a52a4c134 | |||
| 363976694e | |||
| b6a58818bb | |||
| 5dd3e6052e | |||
| 3d47e043af | |||
| 895fc72a0b | |||
| f42d5399aa | |||
| ad5874779c | |||
| d19bccad74 | |||
| 417034518c | |||
| dcf72e49e2 | |||
| c4c4ac28dc | |||
| a165f55579 | |||
| 0d7f770996 | |||
| 0ca5f68d72 | |||
| 48073e6d95 | |||
| 469addeca3 | |||
| c394847c35 | |||
| ea64bb58a5 | |||
| ea5499fa51 | |||
| 278b4ca40c | |||
| cd6d79d106 | |||
| 02f4d6ca53 | |||
| 8dfba51884 | |||
| 055ffc0425 | |||
| 61d7d67c39 | |||
| 87a692b89e | |||
| 09619c1c45 | |||
| 8bf5bed0a9 | |||
| 5ffeebabad | |||
| e89c1103ff | |||
| fe4f27b99b | |||
| 471b40040a | |||
| 613c12e590 | |||
| 8ec6544624 | |||
| da0fec7308 | |||
| 2477103707 | |||
| 2ff12c4981 | |||
| 194304bbe4 | |||
| cc9b199ecb | |||
| a84969bdcd | |||
| 823e767eed | |||
| e42560bed5 | |||
| d6630ab35b | |||
| 2f30c3fd4f | |||
| 2f9351d995 | |||
| 230e44b01d | |||
| 46206b4814 | |||
| 4c71dbf0af | |||
| 0cf77c3916 | |||
| 9efafc3e33 | |||
| 65573784c4 | |||
| 40215f99d7 | |||
| 9ab5e52f04 | |||
| ec37364762 | |||
| 23288b7cb5 | |||
| 626bfbf309 | |||
| c54753c185 | |||
| 8115b004b9 | |||
| 4429352125 | |||
| c9b2cedebd | |||
| f0058bbed3 | |||
| 3c50d24d8e | |||
| 53c88f0f9e | |||
| d50babfc99 | |||
| 3fb6617d62 | |||
| 3133bb49aa | |||
| 06067efa3f | |||
| 6aa689f87c | |||
| fba9fdfd27 | |||
| 507ca291e1 | |||
| bc927f9788 | |||
| e2a5a6a05c | |||
| 9f4f9000bc | |||
| 6e246ee58c | |||
| 2fef9bc1d8 | |||
| bab8addcbb | |||
| a74fe2ec01 | |||
| a052567db8 | |||
| 2d2330382d | |||
| ee23a7575d | |||
| 9fa6c2ac04 | |||
| 3ece62cb9c | |||
| cd7fa04985 | |||
| b8d4664e6e | |||
| bd5d16ce36 | |||
| e98852a389 | |||
| 08e4ffdf79 | |||
| b4c5b50a3e | |||
| 3ddb005480 | |||
| 1e410ed826 | |||
| 95a55250a7 | |||
| 349f0cf5e9 | |||
| 57b16a4b6e | |||
| 758156a9b6 | |||
| 8747082091 | |||
| 4de115c08c | |||
| 60488ffbbd | |||
| 8b42995e8b | |||
| 84c3bbd934 | |||
| a0d227714e | |||
| bea2c75452 | |||
| 00f36a261b | |||
| b17d16623a | |||
| 61cc855564 | |||
| e736f590f7 | |||
| 6d669dcd7d | |||
| 55c1720719 | |||
| 07f0225ca6 | |||
| f7b5900671 | |||
| 8a7e74673e | |||
| 3c62f3a8e3 | |||
| 48d41ab088 | |||
| e98e58c65a | |||
| 3b9f981358 | |||
| 1661e83939 | |||
| 834c992553 | |||
| 1ae001d10a | |||
| 4e67eb6c42 | |||
| a7b954f655 | |||
| 576644a197 | |||
| 410583e5f9 | |||
| ccecd3405a | |||
| 4700722444 | |||
| 0e92ac2af7 | |||
| b77a0039ee | |||
| b2274a63cd | |||
| 6a439ae53d | |||
| 19a4b51371 | |||
| a41b79d43e | |||
| ec43292e1e | |||
| ea667d82b3 | |||
| 0a02dd5f58 | |||
| 32aba5e64b | |||
| dbf8e22fad | |||
| 0b5d0b83be | |||
| 35e5f00cac | |||
| 290da93845 | |||
| f6bb900259 | |||
| f7f2438478 | |||
| 2ad0487cec | |||
| 72ccb5fe6e | |||
| bf0765fc7f | |||
| 59de4d9ad8 | |||
| 4c168e95de | |||
| 183fc43a67 | |||
| c95407f1bc | |||
| f1ea9d86b9 | |||
| e06efd5329 | |||
| 358d69956a | |||
| 212f0fb509 | |||
| 487d331d74 | |||
| 5e527d22e3 | |||
| 816929c704 | |||
| a9839af903 | |||
| 174b4ce29d | |||
| bca49b99ca | |||
| 6427744063 | |||
| 0757a51e2b | |||
| 290078e0d0 | |||
| 59b0314a0e | |||
| 95eb199f41 | |||
| d659eb9327 | |||
| f17a6b478b | |||
| f18cbd036a | |||
| f9cefc84a3 | |||
| fc85f3644d | |||
| 304e3ac12f | |||
| 778f42ad34 | |||
| f482050f9a | |||
| 4e998c9ade | |||
| 3debb98805 | |||
| ddbd10c001 | |||
| 7c0a43d425 | |||
| 0cf479dd5c | |||
| 1f736a95a7 | |||
| 79859ebca3 | |||
| 5691d998ea | |||
| b10ec8ef8b | |||
| 8313209704 | |||
| 89f23a35c5 | |||
| 293729f48a | |||
| 79310a0051 | |||
| b69bf8a897 | |||
| 426482e05b | |||
| 2734291b35 | |||
| 95c65aff75 | |||
| 3361c59576 | |||
| 8936d55675 | |||
| 199ddff13b | |||
| 985e5014bc | |||
| 8b341884d2 | |||
| a897fc91ec | |||
| e7bb0ecee0 | |||
| 4a28ef8034 | |||
| f6ec0cd827 | |||
| add1df4bcb | |||
| 65d148d9a8 | |||
| c9bd43c0f6 | |||
| c11423df1e | |||
| e629785a97 | |||
| 3a2a74b655 | |||
| 97e88bd769 | |||
| d4501f08b8 | |||
| 2df7736562 | |||
| ee1de8f30d | |||
| bee510dbce | |||
| 571b69bdb6 | |||
| 095f44f4b2 | |||
| 95415ac3a5 | |||
| f6c573880e | |||
| f663e8f903 | |||
| de4d304d90 | |||
| 2a9521661e | |||
| 693877212d | |||
| 8408587341 | |||
| 0fc584961c | |||
| d7744aca02 | |||
| db211446f3 | |||
| 43eba3d750 | |||
| ad49138fae | |||
| 097d81363b | |||
| 2bf8793632 | |||
| bff90d4684 | |||
| 65552bf403 | |||
| 6fdce865b8 | |||
| 453466eb1a | |||
| 49805f976a | |||
| 1666195984 | |||
| 3d345ca4c4 | |||
| 8dd596b7ba | |||
| 719912e46e | |||
| 75c567b6ab | |||
| 0e9a865bbf | |||
| b95e93c20a | |||
| b58b2c5ae8 | |||
| de60600126 | |||
| f4ca2c8e72 | |||
| 46205a7235 | |||
| 974491f93d | |||
| 442bc80cd7 | |||
| f84b08ff08 | |||
| f33f88de31 | |||
| e69ff71302 | |||
| 2b2633c11f | |||
| 729848caeb | |||
| 9cb239247d | |||
| 1b7b2c3a62 | |||
| 7c0a9ff4c1 | |||
| 8d75bfae47 | |||
| 1d2ef6b2a1 | |||
| 7f9a9f2a09 | |||
| 26dfa5e77c | |||
| 7b099e0fe2 | |||
| 66d7956e67 | |||
| 3df83dce7e | |||
| d3c0f4ef98 | |||
| cf9bddcb89 | |||
| 3af1b6ecdc | |||
| 4623e6220f | |||
| ae31115017 | |||
| 6389303c1c | |||
| 5015829ce8 | |||
| 81fad9e247 | |||
| e7dbc4ff28 | |||
| b4d3ff378e | |||
| 6c8ffe81d0 | |||
| 1706a7609a | |||
| d60ac98ef2 | |||
| 3f67623c26 | |||
| 59f4a2e0f3 | |||
| d3d13c41c4 | |||
| f6230ae019 | |||
| 11b020b9f9 | |||
| 987061d800 | |||
| f99f58d99f | |||
| 1aefa6779f | |||
| ddcf388270 | |||
| f3de2b4be7 | |||
| 25e4bce1a6 | |||
| e329c84d5e | |||
| 03a3be0844 | |||
| 76fca0e755 | |||
| db900af8c7 | |||
| 9fd95b93f7 | |||
| ae279966c2 | |||
| 3ccb1d67c2 | |||
| d2d8535a31 | |||
| 419a6d51b3 | |||
| 9f68376c91 | |||
| 216988b0b1 | |||
| 53c771551c | |||
| 43467a2ac7 | |||
| ed96864892 | |||
| d1615ba11a | |||
| 6c6dd16acf | |||
| a6144b8e1a | |||
| 166ecaeda8 | |||
| 2080e06f7b | |||
| 1050b5351e | |||
| 8bf9dda604 | |||
| 54ff72a1cc | |||
| cbb699efd2 | |||
| d9dac9cd1b | |||
| bcf7286ad9 | |||
| 935c02c0a3 | |||
| de977cc9c8 | |||
| e4b9a58c15 | |||
| 3c1267dbe6 | |||
| b4ec8fe3ef | |||
| 6fc6207e93 | |||
| 9003b60d65 | |||
| d93588dfeb | |||
| e21262deba | |||
| b8f9076de0 | |||
| d784b40e24 | |||
| 50af4df1d7 | |||
| b2abd8ca41 | |||
| 2aed9aea47 | |||
| c2e26c1527 | |||
| 610f5481c1 | |||
| 03ec1ca0a4 | |||
| 04caf0549d | |||
| 0e1dd63f5e | |||
| e28e3c9491 | |||
| 076ee65c85 | |||
| 834d438d6e | |||
| f5801ee7da | |||
| faca45a7ea | |||
| e8ac7a34dd | |||
| c9f3f4d1d3 | |||
| 7b8ce63730 | |||
| ffaf4d5da4 | |||
| fb326a3589 | |||
| f81886d17c | |||
| d0032b0717 | |||
| 8120595c3e | |||
| 44bd849697 | |||
| 8af96248bf | |||
| f439fc4306 | |||
| 25247b9f6e | |||
| c024edb9a8 | |||
| 1f517b8a02 | |||
| 7ad5d21900 | |||
| a56c12278e | |||
| 4635356435 | |||
| d68e722b71 | |||
| 5cb0eded64 | |||
| 15bb0b86ce | |||
| 64168fc20a | |||
| 072b524e02 | |||
| 371bba8f54 | |||
| 2eaf35eb63 | |||
| 0b9d53829f | |||
| c9fc27b337 | |||
| aa1359dc19 | |||
| 4c2100e02c | |||
| 473941c341 | |||
| 4001346a30 | |||
| ee7255aac4 | |||
| 5dc606097c | |||
| 14843679af | |||
| 785a540ebd | |||
| d2854448c2 | |||
| cd6d8048bb | |||
| 3d7a3a51a7 | |||
| b4e2c99346 | |||
| 33dde339fe | |||
| 066c074b66 | |||
| 142a524d2f | |||
| 7142f46d1c | |||
| f2803aba07 | |||
| 45428b897f | |||
| 50a6f9d251 | |||
| 360758e8ae | |||
| 8afb2f0cb7 | |||
| 7442100caa | |||
| 52cd1dacbf | |||
| 62775660d1 | |||
| f75152a597 | |||
| b761ec0132 | |||
| c7c987843c | |||
| 73191ad3ec | |||
| 769d2f4c44 | |||
| 90df5e00b4 | |||
| 8c25a8eb7b | |||
| f147ba16e2 | |||
| c43371f190 | |||
| fbed33cc1f | |||
| a509ec0d91 | |||
| 40da61a314 | |||
| f473b61585 | |||
| 6501cb93a4 | |||
| 0d1a0b126b | |||
| 9a202c1522 | |||
| e8a0bc5794 | |||
| e783e6677e | |||
| 8518d078d7 | |||
| 3a1ccd5f43 | |||
| 6e90b85cae | |||
| dd2823aaec | |||
| 00171ca935 | |||
| 9c748beef5 | |||
| 26087e28ad | |||
| 17ad33c919 | |||
| 1ed47900d8 | |||
| d338644159 | |||
| bd1fd59fc1 | |||
| 1fa3d21f6a | |||
| 3f42122387 | |||
| f73b4f4a26 | |||
| a534af68b8 | |||
| 6e2ede8c56 | |||
| 8c0b0714e7 | |||
| 55f02d8c66 | |||
| 49093d6d38 | |||
| d71977b4dd | |||
| a1ef612662 | |||
| 4f9a99141e | |||
| 713d91b04e | |||
| 332c37f332 | |||
| b46fa2e556 | |||
| 25a9a32f8e | |||
| 11fd9e5fdc | |||
| 403f11fdbf | |||
| b4cba524d3 | |||
| 746cd1e1e6 | |||
| 19cf511895 | |||
| 6b31f58092 | |||
| 7444f0c651 | |||
| dd37c10d4a | |||
| dd262b7087 | |||
| 65e76adeda | |||
| c0d41f05d6 | |||
| 9a6f2630b2 | |||
| 939ea4ba30 | |||
| c3cf35ab63 | |||
| 4188e8aaf9 | |||
| 9702987209 | |||
| 8bde6aea4b | |||
| f1d9666a20 | |||
| c0076b58cd | |||
| 00e8c7810f | |||
| 322115bfcf | |||
| a6160b6994 | |||
| abfcb60118 | |||
| 406392e13d | |||
| 7b7d21ebef | |||
| 54a1bbe1c4 | |||
| caf438c63b | |||
| dfef04b325 | |||
| f8ac46ba07 | |||
| 997b7b18af | |||
| f414c16c13 | |||
| c6f39870ff | |||
| b1cc114b7b | |||
| 766fd20faa | |||
| 315e7fbbee | |||
| fcec053d59 | |||
| d073215f10 | |||
| 665408e57f | |||
| ea3dc78986 | |||
| a65ccc0603 | |||
| e2dbf054ac | |||
| 62f3c9bfa9 | |||
| 287ee9d0ea | |||
| 3c6d5aba22 | |||
| eeb6f7726e | |||
| 631b246881 | |||
| e1c8256602 | |||
| 5728679fd5 | |||
| a6af9c75e9 | |||
| 6de86e325f | |||
| 48e471fdd4 | |||
| e5917a8fa5 | |||
| 49a43dfc8f | |||
| 40959fcc61 | |||
| 55770c9853 | |||
| 2ea4626911 | |||
| c8a89134a7 | |||
| 53c2ebf7f6 | |||
| 7e2ebecd52 | |||
| 581d0ef8a9 | |||
| a9c1af39d6 | |||
| 5f419c014f | |||
| ed7607935e | |||
| 78da679472 | |||
| 2f89158339 | |||
| 27d15894d8 | |||
| 79e13be04c | |||
| c72a855214 | |||
| fd08d0d80d | |||
| d93ec07dd8 | |||
| 6b96512d46 | |||
| a9cf01113a | |||
| 85ade61ef7 | |||
| 3d44e9ad92 | |||
| a8fb72a807 | |||
| 73959fed45 | |||
| e267342108 | |||
| 757411bffc | |||
| 6142b21dd5 | |||
| b363489702 | |||
| dae03273cd | |||
| be6a837e15 | |||
| e1f5b886fb | |||
| c9ad5779f2 | |||
| 26c5b0c71f | |||
| 1dee705074 | |||
| f9c951440d | |||
| 578ea4bae9 | |||
| 6bcf0b5519 | |||
| e82d03ef61 | |||
| eedd7bfd50 | |||
| cbf80117af | |||
| 2b35c1708b | |||
| e093a19c70 | |||
| 6fbcb283b9 | |||
| 7fb70e1701 | |||
| 2fb409b286 | |||
| d5f430cc11 | |||
| fd27d5ea00 | |||
| 493611ace5 | |||
| e058febaad | |||
| d7f60f69f1 | |||
| 4b33910449 | |||
| 0c16d8f6c3 | |||
| 5340073770 | |||
| 384ac63490 | |||
| d38676085a | |||
| d8583b2c7a | |||
| 82227b5ace | |||
| c8f934b5b1 | |||
| a4111fab39 | |||
| 54de51ef3c | |||
| 0915df5b18 | |||
| 81e7c7d8c8 | |||
| ea64e860de | |||
| e70786e05e | |||
| cab15f6c5e | |||
| e82e672a93 | |||
| 93971a53d9 | |||
| 09b3dcb6db | |||
| ef42baf9f0 | |||
| e55ad25355 | |||
| 80a3d7bffa | |||
| 6481397710 | |||
| 388ccda85d | |||
| 2e0150e601 | |||
| 2dc5e245d0 | |||
| ea3a5950a3 | |||
| 4e8311085f | |||
| cf0be1a0af | |||
| c577c2cc6a | |||
| 905d96dd4a | |||
| 197285d12a | |||
| ab430b8c87 | |||
| d1029faa90 | |||
| 6374b99a1a | |||
| 4fb9bce79f | |||
| 487f631243 | |||
| c928c21fe7 | |||
| 59fa477edb | |||
| 992d5b8bcd | |||
| 6808d33b2f | |||
| 966f27df34 | |||
| 21bb17e3ee | |||
| 4ba4901ca9 | |||
| 9de63c1edd | |||
| 51cc78b2a2 | |||
| 8f4e5c2fb8 | |||
| db1c8b3f9e | |||
| f07856eab9 | |||
| dd952f6d68 | |||
| e63efe2978 | |||
| fb6929ac3d | |||
| 4e65283081 | |||
| c6daa4aa16 | |||
| c0016d7fe9 | |||
| a518e7063d | |||
| de8696aa43 | |||
| 02cc1cd6e6 | |||
| 0e6cf41923 | |||
| 7579cd8068 | |||
| b6a447798a | |||
| 9344d0d0e3 | |||
| 7fa7fa0226 | |||
| a3df05d93b | |||
| 798e2779f2 | |||
| 1b13df5368 | |||
| 083332f85f | |||
| 6757c2c5a6 | |||
| 59e2ca16d9 | |||
| 75ed282b20 | |||
| 754956857c | |||
| f6ee03471d | |||
| a4ab60920f | |||
| a574788e89 | |||
| 22dbcf98c5 | |||
| d7540c9a3c | |||
| bea312bd65 | |||
| 3705648c9b | |||
| 940dc1f2b7 | |||
| f54b230906 | |||
| 3bbc4e44c3 | |||
| f81370232a | |||
| 85fad1504a | |||
| 1d10d56651 | |||
| ef5d921eac | |||
| 8409aa9eba | |||
| ca9aa180c1 | |||
| ce46cc9852 | |||
| 39f327acdb | |||
| 6189b47648 | |||
| dd6f5949c2 | |||
| a62539489d | |||
| d6b2739525 | |||
| 846a500fb4 | |||
| 8b7f805642 | |||
| cc5190eb91 | |||
| 4eff798270 | |||
| 4e40e5bb88 | |||
| a456b968cf | |||
| a6387c3012 | |||
| 5f2074d757 | |||
| 2a9c81eb25 | |||
| 65fb8ae33e | |||
| dc88c9f3a2 | |||
| fc3fc6005e | |||
| 27fd913c86 | |||
| e0e828ef5c | |||
| 9992c4d275 | |||
| ab65b9745b | |||
| 4e3ab026fe | |||
| f5b212a9d4 | |||
| e31eb46123 | |||
| 326be0d7ba | |||
| e5c39ed48a | |||
| 0d65397ae7 | |||
| a7f30391d0 | |||
| c96850ba59 | |||
| 5459c11e99 | |||
| e755a2a6e4 | |||
| 1913482cf5 | |||
| c7d04c6c5c | |||
| 1ba7c728a6 | |||
| be9b676db3 | |||
| 75a6eaf147 | |||
| 10e1c2b3cd | |||
| a1dd30ed50 | |||
| f74f1a94fe | |||
| 96bf26611e | |||
| 841741aa52 | |||
| 8f15a609af | |||
| 8cdf7bb84b | |||
| 6fb780eae6 | |||
| 858ba6c798 | |||
| 386733aea1 | |||
| 11eafca3e2 | |||
| 5087ff0814 | |||
| ebc8015638 | |||
| 35c7cab742 | |||
| c1921f1b12 | |||
| 9b978afaa2 | |||
| 997ad12730 | |||
| 777eaa7352 | |||
| bb61a2547a | |||
| 5869415a57 | |||
| b5248da826 | |||
| b059a361dd | |||
| 3c99dc96b1 | |||
| dadba232de | |||
| 787f5236a9 | |||
| 31498ebbea | |||
| 9636ffc471 | |||
| b17e1531d2 | |||
| 05dc645b81 | |||
| d4f038dfcc | |||
| c972c94662 | |||
| 33c9d57c6f | |||
| 2c6f1ab57d | |||
| 000110e760 | |||
| 7a686a0c43 | |||
| 835e4b6de9 | |||
| 0a5301bc5b | |||
| 3a4bc0d41e | |||
| cfb02b5370 | |||
| b8175f8976 | |||
| 182f43b6f9 | |||
| 6d2a97e954 | |||
| 66e4ace39f | |||
| a920ed9e1e | |||
| 6c8ec5336f | |||
| 687fa6a8ca | |||
| 32797515de | |||
| 0f622206e4 | |||
| ca55982669 | |||
| ea67060081 | |||
| 2dfaad3259 | |||
| 06ffa408ce | |||
| 34e9d1eb3c | |||
| 3914c17b0d | |||
| c92e0838c1 | |||
| 443fed796a | |||
| 08536943ad | |||
| 936523ae52 | |||
| 7fff245f87 | |||
| 6e3ea8b49d | |||
| 220b278575 | |||
| 2b022311a4 | |||
| 853f5111c2 | |||
| 65ab6ed59f | |||
| 389aae59ae | |||
| c9abb823a7 | |||
| e6dd9a78ae | |||
| e0c888acf7 | |||
| 50bec53afc | |||
| 828091cfbb | |||
| eb981cc7d7 | |||
| 31be03a805 | |||
| ca3848d773 | |||
| e6d9486a6c | |||
| 9a8e47a766 | |||
| 13f244b6a5 | |||
| 28556f1498 | |||
| 0ccd810738 | |||
| e959f449ae | |||
| e4aea680b9 | |||
| 5d3822f15e | |||
| 465ae048a0 | |||
| 71009c9b4d | |||
| dbed39a931 | |||
| ea31c09384 | |||
| 329a1fb781 | |||
| 043e7e3516 | |||
| 9c23f2f1a6 | |||
| 5e9750d1f5 | |||
| 2180a67670 | |||
| 1188c6fe14 | |||
| a2e754c136 | |||
| 5339ef3004 | |||
| 6a2b3c8d4c | |||
| edacd91a27 | |||
| 5dd46b54c1 | |||
| ea502b6e84 | |||
| 954536073d | |||
| cc45c10f3d | |||
| 13aa23f706 | |||
| 78b51fb574 | |||
| 922d5796b9 | |||
| f0ddc2a53c | |||
| d5d059690f | |||
| fd832bb57d | |||
| 09cb329d73 | |||
| 4a9291fd89 | |||
| 5115e5decb | |||
| 1ed9ff17e1 | |||
| f1fdfa1a51 | |||
| 0f3fe957f5 | |||
| fc4679d4cf | |||
| 35c53204cb | |||
| f731515628 | |||
| 59bf2a34fa | |||
| abbb73e894 | |||
| dada5a422d | |||
| 8bb3d363a4 | |||
| 1522722fab | |||
| 8f1f4273a2 | |||
| a9c8a526cf | |||
| 699db77293 | |||
| 690fb0544c | |||
| ae4c72a153 | |||
| ea92c2b1a6 | |||
| 9ac7aea930 | |||
| 5f17cc1abd | |||
| 8f6695acc7 | |||
| 9524abcd28 | |||
| 83efde6243 | |||
| 8eb987e393 | |||
| 2c6ab65476 | |||
| 66fdddc339 | |||
| 5575171652 | |||
| a8b0db4e5d | |||
| e104fcc000 | |||
| e4f71994c2 | |||
| 29e88e50ff | |||
| 852f061b26 | |||
| f0d277e452 | |||
| 2e8483bd1c | |||
| 3eec8fd0eb | |||
| d8d025c33b | |||
| 8811dabbac | |||
| efca746d36 | |||
| e0f524d3b7 | |||
| d1c842cf29 | |||
| 4d23a5d92d | |||
| 0739d1c2eb | |||
| 475c775b25 | |||
| b7e8ce4523 | |||
| e8fcd721b8 | |||
| ef5579dc86 | |||
| 84ae8097b1 | |||
| 295b988657 | |||
| 68942affdb | |||
| e0980c4d73 | |||
| c5920df159 | |||
| 86ddff0b88 | |||
| 908978d00b | |||
| a956732874 | |||
| 879e046b22 | |||
| 5fb0f34e8a | |||
| 861415133e | |||
| fce75cd858 | |||
| b6d5565df1 | |||
| 53ad291ef1 | |||
| 145d3ba99d | |||
| e6171d17f8 | |||
| aa1c86f95e | |||
| 699565828d | |||
| 38de2a8754 | |||
| 8b661cde15 | |||
| e628fd7bce | |||
| 808ba552c5 | |||
| a024593fa6 | |||
| 87b5737293 | |||
| b80c978f5d | |||
| 10ae0c4364 | |||
| cb3ae1232b | |||
| e73e393c82 | |||
| b01f63835e | |||
| 6d7f5871db | |||
| 89720ae24d | |||
| 9097ccf515 | |||
| dca657a2fd | |||
| df8b057b44 | |||
| 64b3c1e691 | |||
| 15aee09c7f | |||
| 80610ca054 | |||
| fd0df5a89b | |||
| b487e2df0b | |||
| c6ed2bf9aa | |||
| 40b1dc12de | |||
| 8eba3c1e7e | |||
| b50c70bbfa | |||
| af021e79d9 | |||
| 73bfe68821 | |||
| 4a73b4859f | |||
| f5d181db3a | |||
| da7e1cfb49 | |||
| 43b64140ae | |||
| d74b98c3d9 | |||
| e0bfe44cac | |||
| 10fb88d027 | |||
| f826709452 | |||
| f10fd64630 | |||
| 09837928d9 | |||
| dce4e94f02 | |||
| ee6415bd1c | |||
| 78835ad87a | |||
| 4e6be21a44 | |||
| f89e4e7dd0 | |||
| dfa8467a08 | |||
| 669ee0415a | |||
| 367668710c | |||
| 94dea84915 | |||
| 9f1218b00b | |||
| fcfa488250 | |||
| 2bbe31a8f6 | |||
| 7cdb0eafeb | |||
| 90f47eb952 | |||
| 15e57d28f5 | |||
| 532eace7d6 | |||
| d4ac4fcde1 | |||
| c1db75e0c7 | |||
| acfdd0e1fc | |||
| 9fb8f6347f | |||
| 7f73b105ca | |||
| ae8dcdf40d | |||
| ee1e1ce377 | |||
| 6d165dae5e | |||
| 335e61dc47 | |||
| 64380baa85 | |||
| b5eb65e53e | |||
| f1ca05c822 | |||
| 900df21b7d | |||
| 93bad514a8 | |||
| d8cd1d8fcc | |||
| 6356403964 | |||
| e8a14a775e | |||
| 7b90a1e85a | |||
| 49283ec035 | |||
| 7d4bb9428b | |||
| 76eb389761 | |||
| e9a1ccb89a | |||
| db262fa76a | |||
| 4e59d6fd12 | |||
| e136c11c7c | |||
| 0e80f56e44 | |||
| 94758c18de | |||
| e76b375a31 | |||
| 9f5f64e14e | |||
| 4eb2966559 | |||
| 293facbae7 | |||
| 053259fd92 | |||
| da41ac9e60 | |||
| 82c477c9f7 | |||
| 57bead3a5e | |||
| d044ac1c66 | |||
| 9787ab598b | |||
| 7e9b5d9e30 | |||
| 3d141280aa | |||
| 9df7517dea | |||
| 4560909a5e | |||
| 3f65924c45 | |||
| 5e31c82b5b | |||
| 4382bdc859 | |||
| fa66c6b797 | |||
| 2da96be217 | |||
| 43f821afb9 | |||
| 3165baa1f1 | |||
| 9a8a964b69 | |||
| 17888ce0fd | |||
| 051b40f956 | |||
| cc8db99695 | |||
| b39cd06249 | |||
| 46def2fdc1 | |||
| 2195f0cc62 | |||
| 387e92353c | |||
| 2047abd9c3 | |||
| 64f2b1b250 | |||
| 577546ccd9 | |||
| e858c21e1f | |||
| 0d6518aaa0 | |||
| d1a598c652 | |||
| bfc227b8d4 | |||
| 45dd575ed2 | |||
| 80709697e5 | |||
| 1b53a4fccc | |||
| 4bb220bb90 | |||
| e1b3cf5c14 | |||
| 0f298a4203 | |||
| 5e68f35500 | |||
| ba1bd64bf9 | |||
| db88cd1b25 | |||
| 936d2963a2 | |||
| 4378b4d03d | |||
| 6ddef3b7a9 | |||
| 68c92908d5 | |||
| 51e543050c | |||
| 000a13b6a3 | |||
| 84b3b5b4a4 | |||
| 4e83f4c579 | |||
| cd2b188c9a | |||
| 1e0a60be2a | |||
| fc5bba66af | |||
| 4d7d630e92 | |||
| 4b2d1aaeea | |||
| 7e5581cd86 | |||
| 8b6a6d4546 | |||
| 7ae83df8aa | |||
| 779a42678d | |||
| 10ba6a93a6 | |||
| c917be2189 | |||
| c6aa97c9aa | |||
| 250941bd47 | |||
| 5b17a60dde | |||
| b07f772f36 | |||
| d4688e6474 | |||
| e7e29cb63c | |||
| ca922443db | |||
| 2385a5870e | |||
| e567135ed3 | |||
| 98c8584b88 | |||
| 2b2fa58f97 | |||
| 2d54fed3cc | |||
| 964a4d75b4 |
@@ -7,9 +7,9 @@ This is a template helping you to create an issue which can be processed as quic
|
|||||||
|
|
||||||
##### System information (version)
|
##### System information (version)
|
||||||
<!-- Example
|
<!-- Example
|
||||||
- OpenCV => 3.1
|
- OpenCV => 4.2
|
||||||
- Operating System / Platform => Windows 64 Bit
|
- Operating System / Platform => Windows 64 Bit
|
||||||
- Compiler => Visual Studio 2015
|
- Compiler => Visual Studio 2017
|
||||||
-->
|
-->
|
||||||
|
|
||||||
- OpenCV => :grey_question:
|
- OpenCV => :grey_question:
|
||||||
@@ -28,3 +28,42 @@ This is a template helping you to create an issue which can be processed as quic
|
|||||||
```
|
```
|
||||||
or attach as .txt or .zip file
|
or attach as .txt or .zip file
|
||||||
-->
|
-->
|
||||||
|
|
||||||
|
##### Issue submission checklist
|
||||||
|
|
||||||
|
- [ ] I report the issue, it's not a question
|
||||||
|
<!--
|
||||||
|
OpenCV team works with forum.opencv.org, Stack Overflow and other communities
|
||||||
|
to discuss problems. Tickets with questions without a real issue statement will be
|
||||||
|
closed.
|
||||||
|
-->
|
||||||
|
- [ ] I checked the problem with documentation, FAQ, open issues,
|
||||||
|
forum.opencv.org, Stack Overflow, etc and have not found any solution
|
||||||
|
<!--
|
||||||
|
Places to check:
|
||||||
|
* OpenCV documentation: https://docs.opencv.org
|
||||||
|
* FAQ page: https://github.com/opencv/opencv/wiki/FAQ
|
||||||
|
* OpenCV forum: https://forum.opencv.org
|
||||||
|
* OpenCV issue tracker: https://github.com/opencv/opencv/issues?q=is%3Aissue
|
||||||
|
* Stack Overflow branch: https://stackoverflow.com/questions/tagged/opencv
|
||||||
|
-->
|
||||||
|
- [ ] I updated to the latest OpenCV version and the issue is still there
|
||||||
|
<!--
|
||||||
|
master branch for OpenCV 4.x and 3.4 branch for OpenCV 3.x releases.
|
||||||
|
OpenCV team supports only the latest release for each branch.
|
||||||
|
The ticket is closed if the problem is not reproduced with the modern version.
|
||||||
|
-->
|
||||||
|
- [ ] There is reproducer code and related data files: videos, images, onnx, etc
|
||||||
|
<!--
|
||||||
|
The best reproducer -- test case for OpenCV that we can add to the library.
|
||||||
|
Recommendations for media files and binary files:
|
||||||
|
* Try to reproduce the issue with images and videos in opencv_extra repository
|
||||||
|
to reduce attachment size
|
||||||
|
* Use PNG for images, if you report some CV related bug, but not image reader
|
||||||
|
issue
|
||||||
|
* Attach the image as an archive to the ticket, if you report some reader issue.
|
||||||
|
Image hosting services compress images and it breaks the repro code.
|
||||||
|
* Provide ONNX file for some public model or ONNX file with random weights,
|
||||||
|
if you report ONNX parsing or handling issue. Architecture details diagram
|
||||||
|
from netron tool can be very useful too. See https://lutzroeder.github.io/netron/
|
||||||
|
-->
|
||||||
|
|||||||
@@ -0,0 +1,64 @@
|
|||||||
|
name: Bug Report
|
||||||
|
description: Create a report to help us reproduce and fix the bug
|
||||||
|
labels: ["bug"]
|
||||||
|
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: >
|
||||||
|
#### Thank you for contributing! Before reporting a bug, please have a look at the [FAQ](https://github.com/opencv/opencv/wiki/FAQ), make sure the issue has no duplicate and hasn't been already addressed by searching through [the existing and past issues](https://github.com/opencv/opencv/issues?page=1&q=is%3Aissue+sort%3Acreated-desc).
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: System Information
|
||||||
|
description: |
|
||||||
|
Please provide the following system information to help us diagnose the bug. For example:
|
||||||
|
|
||||||
|
// example for c++ user
|
||||||
|
OpenCV version: 4.6.0
|
||||||
|
Operating System / Platform: Ubuntu 20.04
|
||||||
|
Compiler & compiler version: GCC 9.3.0
|
||||||
|
|
||||||
|
// example for python user
|
||||||
|
OpenCV python version: 4.6.0.66
|
||||||
|
Operating System / Platform: Ubuntu 20.04
|
||||||
|
Python version: 3.9.6
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Detailed description
|
||||||
|
description: |
|
||||||
|
Please provide a clear and concise description of what the bug is and paste the error log below. It helps improving readability if the error log is wrapped in ```` ```triple quotes blocks``` ````.
|
||||||
|
placeholder: |
|
||||||
|
A clear and concise description of what the bug is.
|
||||||
|
|
||||||
|
```
|
||||||
|
# error log
|
||||||
|
```
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Steps to reproduce
|
||||||
|
description: |
|
||||||
|
Please provide a minimal example to help us reproduce the bug. Code should be wrapped with ```` ```triple quotes blocks``` ```` to improve readability. If the code is too long, please attach as a file or create and link a public gist: https://gist.github.com.
|
||||||
|
|
||||||
|
Related data files (images, onnx, etc) should be attached below as well. If the data files are too big, feel free to upload them to a online drive, share them and put the link below.
|
||||||
|
placeholder: |
|
||||||
|
```cpp (replace cpp with python if python code)
|
||||||
|
# sample code to reproduce the bug
|
||||||
|
```
|
||||||
|
|
||||||
|
Test data: [image](https://link/to/the/image), [model.onnx](htts://link/to/the/onnx/model)
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: checkboxes
|
||||||
|
attributes:
|
||||||
|
label: Issue submission checklist
|
||||||
|
options:
|
||||||
|
- label: I report the issue, it's not a question
|
||||||
|
required: true
|
||||||
|
- label: I checked the problem with documentation, FAQ, open issues, forum.opencv.org, Stack Overflow, etc and have not found any solution
|
||||||
|
- label: I updated to the latest OpenCV version and the issue is still there
|
||||||
|
- label: There is reproducer code and related data files (videos, images, onnx, etc)
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
blank_issues_enabled: true
|
||||||
|
contact_links:
|
||||||
|
- name: Questions
|
||||||
|
url: https://forum.opencv.org/
|
||||||
|
about: Ask questions and discuss with OpenCV community members
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
name: Documentation
|
||||||
|
description: Report an issue related to https://docs.opencv.org/
|
||||||
|
labels: ["category: documentation"]
|
||||||
|
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: >
|
||||||
|
#### Thank you for contributing! Before submitting a doc issue, please make sure it has no duplicate by searching through [the existing and past issues](https://github.com/opencv/opencv/issues?page=1&q=is%3Aissue+sort%3Acreated-desc)
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Descripe the doc issue
|
||||||
|
description: >
|
||||||
|
Please provide a clear and concise description of what content in https://docs.opencv.org/ is an issue. Note that there are multiple active branches, such as 3.4, 4.x and 5.x, so please specify the branch with the problem.
|
||||||
|
placeholder: |
|
||||||
|
A clear and concise description of what content in https://docs.opencv.org/ is an issue.
|
||||||
|
|
||||||
|
Link to the doc: https://docs.opencv.org/4.x/d3/d63/classcv_1_1Mat.html
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Fix suggestion
|
||||||
|
description: >
|
||||||
|
Tell us how we could improve the documentation in this regard.
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
name: Feature request
|
||||||
|
description: Submit a request for a new OpenCV feature
|
||||||
|
labels: ["feature"]
|
||||||
|
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: >
|
||||||
|
#### Thank you for contributing! Before submitting a feature request, please make sure the request has no duplicate by searching through [the existing and past issues](https://github.com/opencv/opencv/issues?page=1&q=is%3Aissue+sort%3Acreated-desc)
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Descripe the feature and motivation
|
||||||
|
description: |
|
||||||
|
Please provide a clear and concise proposal of the feature and outline the motivation.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Additional context
|
||||||
|
description: |
|
||||||
|
Add any other context, such as pseudo code, links, diagram, screenshots, to help the community better understand the feature request.
|
||||||
@@ -1,9 +1,11 @@
|
|||||||
<!-- Please use this line to close one or multiple issues when this pullrequest gets merged
|
### Pull Request Readiness Checklist
|
||||||
You can add another line right under the first one:
|
|
||||||
resolves #1234
|
|
||||||
resolves #1235
|
|
||||||
-->
|
|
||||||
|
|
||||||
### This pullrequest changes
|
See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request
|
||||||
|
|
||||||
<!-- Please describe what your pullrequest is changing -->
|
- [ ] I agree to contribute to the project under Apache 2 License.
|
||||||
|
- [ ] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV
|
||||||
|
- [ ] The PR is proposed to the proper branch
|
||||||
|
- [ ] There is a reference to the original bug report and related work
|
||||||
|
- [ ] There is accuracy test, performance test and test data in opencv_extra repository, if applicable
|
||||||
|
Patch to opencv_extra has the same branch name.
|
||||||
|
- [ ] The feature is well documented and sample code can be built with the project CMake
|
||||||
|
|||||||
@@ -0,0 +1,41 @@
|
|||||||
|
name: PR:4.x
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- 4.x
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
Ubuntu2004-ARM64:
|
||||||
|
uses: opencv/ci-gha-workflow/.github/workflows/OCV-PR-4.x-ARM64.yaml@main
|
||||||
|
|
||||||
|
Ubuntu2004-ARM64-Debug:
|
||||||
|
uses: opencv/ci-gha-workflow/.github/workflows/OCV-PR-4.x-ARM64-Debug.yaml@main
|
||||||
|
|
||||||
|
Ubuntu2004-x64:
|
||||||
|
uses: opencv/ci-gha-workflow/.github/workflows/OCV-PR-4.x-U20.yaml@main
|
||||||
|
|
||||||
|
Ubuntu2004-x64-CUDA:
|
||||||
|
if: "${{ contains(github.event.pull_request.labels.*.name, 'category: dnn') }} || ${{ contains(github.event.pull_request.labels.*.name, 'category: dnn (onnx)') }}"
|
||||||
|
uses: opencv/ci-gha-workflow/.github/workflows/OCV-PR-4.x-U20-Cuda.yaml@main
|
||||||
|
|
||||||
|
Windows10-x64:
|
||||||
|
uses: opencv/ci-gha-workflow/.github/workflows/OCV-PR-4.x-W10.yaml@main
|
||||||
|
|
||||||
|
macOS-ARM64:
|
||||||
|
uses: opencv/ci-gha-workflow/.github/workflows/OCV-PR-4.x-macOS-ARM64.yaml@main
|
||||||
|
|
||||||
|
macOS-x64:
|
||||||
|
uses: opencv/ci-gha-workflow/.github/workflows/OCV-PR-4.x-macOS-x86_64.yaml@main
|
||||||
|
|
||||||
|
iOS:
|
||||||
|
uses: opencv/ci-gha-workflow/.github/workflows/OCV-PR-4.x-iOS.yaml@main
|
||||||
|
|
||||||
|
Android:
|
||||||
|
uses: opencv/ci-gha-workflow/.github/workflows/OCV-PR-4.x-Android.yaml@main
|
||||||
|
|
||||||
|
TIM-VX:
|
||||||
|
uses: opencv/ci-gha-workflow/.github/workflows/OCV-timvx-backend-tests-4.x.yml@main
|
||||||
|
|
||||||
|
docs:
|
||||||
|
uses: opencv/ci-gha-workflow/.github/workflows/OCV-PR-4.x-docs.yaml@main
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
name: arm64 build checks
|
||||||
|
|
||||||
|
on: workflow_dispatch
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read # to fetch code (actions/checkout)
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
|
||||||
|
runs-on: ubuntu-18.04
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- name: Install dependency packages
|
||||||
|
run: |
|
||||||
|
sudo sed -i -E 's|^deb ([^ ]+) (.*)$|deb [arch=amd64] \1 \2\ndeb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ \2|' /etc/apt/sources.list
|
||||||
|
sudo dpkg --add-architecture arm64
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y --no-install-recommends \
|
||||||
|
crossbuild-essential-arm64 \
|
||||||
|
git \
|
||||||
|
cmake \
|
||||||
|
libpython-dev:arm64 \
|
||||||
|
libpython3-dev:arm64 \
|
||||||
|
python-numpy \
|
||||||
|
python3-numpy
|
||||||
|
|
||||||
|
- name: Fetch opencv_contrib
|
||||||
|
run: |
|
||||||
|
git clone --depth 1 https://github.com/opencv/opencv_contrib.git ../opencv_contrib
|
||||||
|
|
||||||
|
- name: Configure
|
||||||
|
run: |
|
||||||
|
mkdir build
|
||||||
|
cd build
|
||||||
|
cmake -DPYTHON2_INCLUDE_PATH=/usr/include/python2.7/ \
|
||||||
|
-DPYTHON2_LIBRARIES=/usr/lib/aarch64-linux-gnu/libpython2.7.so \
|
||||||
|
-DPYTHON2_NUMPY_INCLUDE_DIRS=/usr/lib/python2.7/dist-packages/numpy/core/include \
|
||||||
|
-DPYTHON3_INCLUDE_PATH=/usr/include/python3.6m/ \
|
||||||
|
-DPYTHON3_LIBRARIES=/usr/lib/aarch64-linux-gnu/libpython3.6m.so \
|
||||||
|
-DPYTHON3_NUMPY_INCLUDE_DIRS=/usr/lib/python3/dist-packages/numpy/core/include \
|
||||||
|
-DCMAKE_TOOLCHAIN_FILE=../platforms/linux/aarch64-gnu.toolchain.cmake \
|
||||||
|
-DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \
|
||||||
|
../
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: |
|
||||||
|
cd build
|
||||||
|
make -j$(nproc --all)
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
name: lint_python
|
||||||
|
on: workflow_dispatch
|
||||||
|
permissions:
|
||||||
|
contents: read # to fetch code (actions/checkout)
|
||||||
|
jobs:
|
||||||
|
lint_python:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- uses: actions/setup-python@v2
|
||||||
|
- run: pip install --upgrade pip wheel
|
||||||
|
- run: pip install bandit black codespell flake8 flake8-2020 flake8-bugbear
|
||||||
|
flake8-comprehensions isort mypy pytest pyupgrade safety
|
||||||
|
- run: bandit --recursive --skip B101 . || true # B101 is assert statements
|
||||||
|
- run: black --check . || true
|
||||||
|
- run: codespell || true # --ignore-words-list="" --skip="*.css,*.js,*.lock"
|
||||||
|
- run: flake8 . --count --select=E9,F63,F7 --show-source --statistics
|
||||||
|
- run: flake8 . --count --exit-zero --max-complexity=10 --max-line-length=88
|
||||||
|
--show-source --statistics
|
||||||
|
- run: isort --check-only --profile black . || true
|
||||||
|
- run: pip install -r requirements.txt || pip install --editable . || true
|
||||||
|
- run: mkdir --parents --verbose .mypy_cache
|
||||||
|
- run: mypy --ignore-missing-imports --install-types --non-interactive . || true
|
||||||
|
- run: pytest . || true
|
||||||
|
- run: pytest --doctest-modules . || true
|
||||||
|
- run: shopt -s globstar && pyupgrade --py36-plus **/*.py || true
|
||||||
|
- run: safety check
|
||||||
@@ -24,3 +24,4 @@ bin/
|
|||||||
build
|
build
|
||||||
node_modules
|
node_modules
|
||||||
CMakeSettings.json
|
CMakeSettings.json
|
||||||
|
xcuserdata/
|
||||||
|
|||||||
Vendored
+5
-1
@@ -1,4 +1,4 @@
|
|||||||
cmake_minimum_required(VERSION 2.8.11 FATAL_ERROR)
|
cmake_minimum_required(VERSION ${MIN_VER_CMAKE} FATAL_ERROR)
|
||||||
|
|
||||||
project(Carotene)
|
project(Carotene)
|
||||||
|
|
||||||
@@ -27,6 +27,10 @@ if(CMAKE_COMPILER_IS_GNUCC)
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(APPLE AND CV_CLANG AND WITH_NEON)
|
||||||
|
ocv_warnings_disable(CMAKE_CXX_FLAGS -Wno-unused-function)
|
||||||
|
endif()
|
||||||
|
|
||||||
add_library(carotene_objs OBJECT EXCLUDE_FROM_ALL
|
add_library(carotene_objs OBJECT EXCLUDE_FROM_ALL
|
||||||
${carotene_headers}
|
${carotene_headers}
|
||||||
${carotene_sources}
|
${carotene_sources}
|
||||||
|
|||||||
Vendored
+3
-1
@@ -1,4 +1,4 @@
|
|||||||
cmake_minimum_required(VERSION 2.8.8 FATAL_ERROR)
|
cmake_minimum_required(VERSION ${MIN_VER_CMAKE} FATAL_ERROR)
|
||||||
|
|
||||||
include(CheckCCompilerFlag)
|
include(CheckCCompilerFlag)
|
||||||
include(CheckCXXCompilerFlag)
|
include(CheckCXXCompilerFlag)
|
||||||
@@ -12,6 +12,8 @@ elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64.*|AARCH64.*")
|
|||||||
set(AARCH64 TRUE)
|
set(AARCH64 TRUE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
ocv_warnings_disable(CMAKE_CXX_FLAGS -Wunused-function)
|
||||||
|
|
||||||
set(TEGRA_COMPILER_FLAGS "")
|
set(TEGRA_COMPILER_FLAGS "")
|
||||||
|
|
||||||
if(CV_GCC OR CV_CLANG)
|
if(CV_GCC OR CV_CLANG)
|
||||||
|
|||||||
Vendored
+28
-19
@@ -1296,13 +1296,13 @@ struct MorphCtx
|
|||||||
CAROTENE_NS::BORDER_MODE border;
|
CAROTENE_NS::BORDER_MODE border;
|
||||||
uchar borderValues[4];
|
uchar borderValues[4];
|
||||||
};
|
};
|
||||||
inline int TEGRA_MORPHINIT(cvhalFilter2D **context, int operation, int src_type, int dst_type, int, int,
|
inline int TEGRA_MORPHINIT(cvhalFilter2D **context, int operation, int src_type, int dst_type, int width, int height,
|
||||||
int kernel_type, uchar *kernel_data, size_t kernel_step, int kernel_width, int kernel_height, int anchor_x, int anchor_y,
|
int kernel_type, uchar *kernel_data, size_t kernel_step, int kernel_width, int kernel_height, int anchor_x, int anchor_y,
|
||||||
int borderType, const double borderValue[4], int iterations, bool allowSubmatrix, bool allowInplace)
|
int borderType, const double borderValue[4], int iterations, bool allowSubmatrix, bool allowInplace)
|
||||||
{
|
{
|
||||||
if(!context || !kernel_data || src_type != dst_type ||
|
if(!context || !kernel_data || src_type != dst_type ||
|
||||||
CV_MAT_DEPTH(src_type) != CV_8U || src_type < 0 || (src_type >> CV_CN_SHIFT) > 3 ||
|
CV_MAT_DEPTH(src_type) != CV_8U || src_type < 0 || (src_type >> CV_CN_SHIFT) > 3 ||
|
||||||
|
width < kernel_width || height < kernel_height ||
|
||||||
allowSubmatrix || allowInplace || iterations != 1 ||
|
allowSubmatrix || allowInplace || iterations != 1 ||
|
||||||
!CAROTENE_NS::isSupportedConfiguration())
|
!CAROTENE_NS::isSupportedConfiguration())
|
||||||
return CV_HAL_ERROR_NOT_IMPLEMENTED;
|
return CV_HAL_ERROR_NOT_IMPLEMENTED;
|
||||||
@@ -1778,30 +1778,30 @@ TegraCvtColor_Invoker(bgrx2hsvf, bgrx2hsv, src_data + static_cast<size_t>(range.
|
|||||||
: CV_HAL_ERROR_NOT_IMPLEMENTED \
|
: CV_HAL_ERROR_NOT_IMPLEMENTED \
|
||||||
)
|
)
|
||||||
|
|
||||||
#define TEGRA_CVT2PYUVTOBGR(src_data, src_step, dst_data, dst_step, dst_width, dst_height, dcn, swapBlue, uIdx) \
|
#define TEGRA_CVT2PYUVTOBGR_EX(y_data, y_step, uv_data, uv_step, dst_data, dst_step, dst_width, dst_height, dcn, swapBlue, uIdx) \
|
||||||
( \
|
( \
|
||||||
CAROTENE_NS::isSupportedConfiguration() ? \
|
CAROTENE_NS::isSupportedConfiguration() ? \
|
||||||
dcn == 3 ? \
|
dcn == 3 ? \
|
||||||
uIdx == 0 ? \
|
uIdx == 0 ? \
|
||||||
(swapBlue ? \
|
(swapBlue ? \
|
||||||
CAROTENE_NS::yuv420i2rgb(CAROTENE_NS::Size2D(dst_width, dst_height), \
|
CAROTENE_NS::yuv420i2rgb(CAROTENE_NS::Size2D(dst_width, dst_height), \
|
||||||
src_data, src_step, \
|
y_data, y_step, \
|
||||||
src_data + src_step * dst_height, src_step, \
|
uv_data, uv_step, \
|
||||||
dst_data, dst_step) : \
|
dst_data, dst_step) : \
|
||||||
CAROTENE_NS::yuv420i2bgr(CAROTENE_NS::Size2D(dst_width, dst_height), \
|
CAROTENE_NS::yuv420i2bgr(CAROTENE_NS::Size2D(dst_width, dst_height), \
|
||||||
src_data, src_step, \
|
y_data, y_step, \
|
||||||
src_data + src_step * dst_height, src_step, \
|
uv_data, uv_step, \
|
||||||
dst_data, dst_step)), \
|
dst_data, dst_step)), \
|
||||||
CV_HAL_ERROR_OK : \
|
CV_HAL_ERROR_OK : \
|
||||||
uIdx == 1 ? \
|
uIdx == 1 ? \
|
||||||
(swapBlue ? \
|
(swapBlue ? \
|
||||||
CAROTENE_NS::yuv420sp2rgb(CAROTENE_NS::Size2D(dst_width, dst_height), \
|
CAROTENE_NS::yuv420sp2rgb(CAROTENE_NS::Size2D(dst_width, dst_height), \
|
||||||
src_data, src_step, \
|
y_data, y_step, \
|
||||||
src_data + src_step * dst_height, src_step, \
|
uv_data, uv_step, \
|
||||||
dst_data, dst_step) : \
|
dst_data, dst_step) : \
|
||||||
CAROTENE_NS::yuv420sp2bgr(CAROTENE_NS::Size2D(dst_width, dst_height), \
|
CAROTENE_NS::yuv420sp2bgr(CAROTENE_NS::Size2D(dst_width, dst_height), \
|
||||||
src_data, src_step, \
|
y_data, y_step, \
|
||||||
src_data + src_step * dst_height, src_step, \
|
uv_data, uv_step, \
|
||||||
dst_data, dst_step)), \
|
dst_data, dst_step)), \
|
||||||
CV_HAL_ERROR_OK : \
|
CV_HAL_ERROR_OK : \
|
||||||
CV_HAL_ERROR_NOT_IMPLEMENTED : \
|
CV_HAL_ERROR_NOT_IMPLEMENTED : \
|
||||||
@@ -1809,29 +1809,32 @@ TegraCvtColor_Invoker(bgrx2hsvf, bgrx2hsv, src_data + static_cast<size_t>(range.
|
|||||||
uIdx == 0 ? \
|
uIdx == 0 ? \
|
||||||
(swapBlue ? \
|
(swapBlue ? \
|
||||||
CAROTENE_NS::yuv420i2rgbx(CAROTENE_NS::Size2D(dst_width, dst_height), \
|
CAROTENE_NS::yuv420i2rgbx(CAROTENE_NS::Size2D(dst_width, dst_height), \
|
||||||
src_data, src_step, \
|
y_data, y_step, \
|
||||||
src_data + src_step * dst_height, src_step, \
|
uv_data, uv_step, \
|
||||||
dst_data, dst_step) : \
|
dst_data, dst_step) : \
|
||||||
CAROTENE_NS::yuv420i2bgrx(CAROTENE_NS::Size2D(dst_width, dst_height), \
|
CAROTENE_NS::yuv420i2bgrx(CAROTENE_NS::Size2D(dst_width, dst_height), \
|
||||||
src_data, src_step, \
|
y_data, y_step, \
|
||||||
src_data + src_step * dst_height, src_step, \
|
uv_data, uv_step, \
|
||||||
dst_data, dst_step)), \
|
dst_data, dst_step)), \
|
||||||
CV_HAL_ERROR_OK : \
|
CV_HAL_ERROR_OK : \
|
||||||
uIdx == 1 ? \
|
uIdx == 1 ? \
|
||||||
(swapBlue ? \
|
(swapBlue ? \
|
||||||
CAROTENE_NS::yuv420sp2rgbx(CAROTENE_NS::Size2D(dst_width, dst_height), \
|
CAROTENE_NS::yuv420sp2rgbx(CAROTENE_NS::Size2D(dst_width, dst_height), \
|
||||||
src_data, src_step, \
|
y_data, y_step, \
|
||||||
src_data + src_step * dst_height, src_step, \
|
uv_data, uv_step, \
|
||||||
dst_data, dst_step) : \
|
dst_data, dst_step) : \
|
||||||
CAROTENE_NS::yuv420sp2bgrx(CAROTENE_NS::Size2D(dst_width, dst_height), \
|
CAROTENE_NS::yuv420sp2bgrx(CAROTENE_NS::Size2D(dst_width, dst_height), \
|
||||||
src_data, src_step, \
|
y_data, y_step, \
|
||||||
src_data + src_step * dst_height, src_step, \
|
uv_data, uv_step, \
|
||||||
dst_data, dst_step)), \
|
dst_data, dst_step)), \
|
||||||
CV_HAL_ERROR_OK : \
|
CV_HAL_ERROR_OK : \
|
||||||
CV_HAL_ERROR_NOT_IMPLEMENTED : \
|
CV_HAL_ERROR_NOT_IMPLEMENTED : \
|
||||||
CV_HAL_ERROR_NOT_IMPLEMENTED \
|
CV_HAL_ERROR_NOT_IMPLEMENTED \
|
||||||
: CV_HAL_ERROR_NOT_IMPLEMENTED \
|
: CV_HAL_ERROR_NOT_IMPLEMENTED \
|
||||||
)
|
)
|
||||||
|
#define TEGRA_CVT2PYUVTOBGR(src_data, src_step, dst_data, dst_step, dst_width, dst_height, dcn, swapBlue, uIdx) \
|
||||||
|
TEGRA_CVT2PYUVTOBGR_EX(src_data, src_step, src_data + src_step * dst_height, src_step, dst_data, dst_step, \
|
||||||
|
dst_width, dst_height, dcn, swapBlue, uIdx);
|
||||||
|
|
||||||
#undef cv_hal_cvtBGRtoBGR
|
#undef cv_hal_cvtBGRtoBGR
|
||||||
#define cv_hal_cvtBGRtoBGR TEGRA_CVTBGRTOBGR
|
#define cv_hal_cvtBGRtoBGR TEGRA_CVTBGRTOBGR
|
||||||
@@ -1841,12 +1844,18 @@ TegraCvtColor_Invoker(bgrx2hsvf, bgrx2hsv, src_data + static_cast<size_t>(range.
|
|||||||
#define cv_hal_cvtBGRtoGray TEGRA_CVTBGRTOGRAY
|
#define cv_hal_cvtBGRtoGray TEGRA_CVTBGRTOGRAY
|
||||||
#undef cv_hal_cvtGraytoBGR
|
#undef cv_hal_cvtGraytoBGR
|
||||||
#define cv_hal_cvtGraytoBGR TEGRA_CVTGRAYTOBGR
|
#define cv_hal_cvtGraytoBGR TEGRA_CVTGRAYTOBGR
|
||||||
|
#if 0 // bit-exact tests are failed
|
||||||
#undef cv_hal_cvtBGRtoYUV
|
#undef cv_hal_cvtBGRtoYUV
|
||||||
#define cv_hal_cvtBGRtoYUV TEGRA_CVTBGRTOYUV
|
#define cv_hal_cvtBGRtoYUV TEGRA_CVTBGRTOYUV
|
||||||
|
#endif
|
||||||
#undef cv_hal_cvtBGRtoHSV
|
#undef cv_hal_cvtBGRtoHSV
|
||||||
#define cv_hal_cvtBGRtoHSV TEGRA_CVTBGRTOHSV
|
#define cv_hal_cvtBGRtoHSV TEGRA_CVTBGRTOHSV
|
||||||
|
#if 0 // bit-exact tests are failed
|
||||||
#undef cv_hal_cvtTwoPlaneYUVtoBGR
|
#undef cv_hal_cvtTwoPlaneYUVtoBGR
|
||||||
#define cv_hal_cvtTwoPlaneYUVtoBGR TEGRA_CVT2PYUVTOBGR
|
#define cv_hal_cvtTwoPlaneYUVtoBGR TEGRA_CVT2PYUVTOBGR
|
||||||
|
#undef cv_hal_cvtTwoPlaneYUVtoBGREx
|
||||||
|
#define cv_hal_cvtTwoPlaneYUVtoBGREx TEGRA_CVT2PYUVTOBGR_EX
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // OPENCV_IMGPROC_HAL_INTERFACE_H
|
#endif // OPENCV_IMGPROC_HAL_INTERFACE_H
|
||||||
|
|
||||||
|
|||||||
+18
-18
@@ -109,9 +109,9 @@ template <> struct wAdd<s32>
|
|||||||
vgamma = vdupq_n_f32(_gamma + 0.5);
|
vgamma = vdupq_n_f32(_gamma + 0.5);
|
||||||
}
|
}
|
||||||
|
|
||||||
void operator() (const typename VecTraits<s32>::vec128 & v_src0,
|
void operator() (const VecTraits<s32>::vec128 & v_src0,
|
||||||
const typename VecTraits<s32>::vec128 & v_src1,
|
const VecTraits<s32>::vec128 & v_src1,
|
||||||
typename VecTraits<s32>::vec128 & v_dst) const
|
VecTraits<s32>::vec128 & v_dst) const
|
||||||
{
|
{
|
||||||
float32x4_t vs1 = vcvtq_f32_s32(v_src0);
|
float32x4_t vs1 = vcvtq_f32_s32(v_src0);
|
||||||
float32x4_t vs2 = vcvtq_f32_s32(v_src1);
|
float32x4_t vs2 = vcvtq_f32_s32(v_src1);
|
||||||
@@ -121,9 +121,9 @@ template <> struct wAdd<s32>
|
|||||||
v_dst = vcvtq_s32_f32(vs1);
|
v_dst = vcvtq_s32_f32(vs1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void operator() (const typename VecTraits<s32>::vec64 & v_src0,
|
void operator() (const VecTraits<s32>::vec64 & v_src0,
|
||||||
const typename VecTraits<s32>::vec64 & v_src1,
|
const VecTraits<s32>::vec64 & v_src1,
|
||||||
typename VecTraits<s32>::vec64 & v_dst) const
|
VecTraits<s32>::vec64 & v_dst) const
|
||||||
{
|
{
|
||||||
float32x2_t vs1 = vcvt_f32_s32(v_src0);
|
float32x2_t vs1 = vcvt_f32_s32(v_src0);
|
||||||
float32x2_t vs2 = vcvt_f32_s32(v_src1);
|
float32x2_t vs2 = vcvt_f32_s32(v_src1);
|
||||||
@@ -153,9 +153,9 @@ template <> struct wAdd<u32>
|
|||||||
vgamma = vdupq_n_f32(_gamma + 0.5);
|
vgamma = vdupq_n_f32(_gamma + 0.5);
|
||||||
}
|
}
|
||||||
|
|
||||||
void operator() (const typename VecTraits<u32>::vec128 & v_src0,
|
void operator() (const VecTraits<u32>::vec128 & v_src0,
|
||||||
const typename VecTraits<u32>::vec128 & v_src1,
|
const VecTraits<u32>::vec128 & v_src1,
|
||||||
typename VecTraits<u32>::vec128 & v_dst) const
|
VecTraits<u32>::vec128 & v_dst) const
|
||||||
{
|
{
|
||||||
float32x4_t vs1 = vcvtq_f32_u32(v_src0);
|
float32x4_t vs1 = vcvtq_f32_u32(v_src0);
|
||||||
float32x4_t vs2 = vcvtq_f32_u32(v_src1);
|
float32x4_t vs2 = vcvtq_f32_u32(v_src1);
|
||||||
@@ -165,9 +165,9 @@ template <> struct wAdd<u32>
|
|||||||
v_dst = vcvtq_u32_f32(vs1);
|
v_dst = vcvtq_u32_f32(vs1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void operator() (const typename VecTraits<u32>::vec64 & v_src0,
|
void operator() (const VecTraits<u32>::vec64 & v_src0,
|
||||||
const typename VecTraits<u32>::vec64 & v_src1,
|
const VecTraits<u32>::vec64 & v_src1,
|
||||||
typename VecTraits<u32>::vec64 & v_dst) const
|
VecTraits<u32>::vec64 & v_dst) const
|
||||||
{
|
{
|
||||||
float32x2_t vs1 = vcvt_f32_u32(v_src0);
|
float32x2_t vs1 = vcvt_f32_u32(v_src0);
|
||||||
float32x2_t vs2 = vcvt_f32_u32(v_src1);
|
float32x2_t vs2 = vcvt_f32_u32(v_src1);
|
||||||
@@ -197,17 +197,17 @@ template <> struct wAdd<f32>
|
|||||||
vgamma = vdupq_n_f32(_gamma + 0.5);
|
vgamma = vdupq_n_f32(_gamma + 0.5);
|
||||||
}
|
}
|
||||||
|
|
||||||
void operator() (const typename VecTraits<f32>::vec128 & v_src0,
|
void operator() (const VecTraits<f32>::vec128 & v_src0,
|
||||||
const typename VecTraits<f32>::vec128 & v_src1,
|
const VecTraits<f32>::vec128 & v_src1,
|
||||||
typename VecTraits<f32>::vec128 & v_dst) const
|
VecTraits<f32>::vec128 & v_dst) const
|
||||||
{
|
{
|
||||||
float32x4_t vs1 = vmlaq_f32(vgamma, v_src0, valpha);
|
float32x4_t vs1 = vmlaq_f32(vgamma, v_src0, valpha);
|
||||||
v_dst = vmlaq_f32(vs1, v_src1, vbeta);
|
v_dst = vmlaq_f32(vs1, v_src1, vbeta);
|
||||||
}
|
}
|
||||||
|
|
||||||
void operator() (const typename VecTraits<f32>::vec64 & v_src0,
|
void operator() (const VecTraits<f32>::vec64 & v_src0,
|
||||||
const typename VecTraits<f32>::vec64 & v_src1,
|
const VecTraits<f32>::vec64 & v_src1,
|
||||||
typename VecTraits<f32>::vec64 & v_dst) const
|
VecTraits<f32>::vec64 & v_dst) const
|
||||||
{
|
{
|
||||||
float32x2_t vs1 = vmla_f32(vget_low(vgamma), v_src0, vget_low(valpha));
|
float32x2_t vs1 = vmla_f32(vget_low(vgamma), v_src0, vget_low(valpha));
|
||||||
v_dst = vmla_f32(vs1, v_src1, vget_low(vbeta));
|
v_dst = vmla_f32(vs1, v_src1, vget_low(vbeta));
|
||||||
|
|||||||
Vendored
+1
-1
@@ -391,9 +391,9 @@ void blur3x3(const Size2D &size, s32 cn,
|
|||||||
}
|
}
|
||||||
else if (borderType == BORDER_MODE_REFLECT101)
|
else if (borderType == BORDER_MODE_REFLECT101)
|
||||||
{
|
{
|
||||||
tcurr = vsetq_lane_u16(vgetq_lane_u16(tcurr, 3),tcurr, 5);
|
|
||||||
tcurr = vsetq_lane_u16(vgetq_lane_u16(tcurr, 4),tcurr, 6);
|
tcurr = vsetq_lane_u16(vgetq_lane_u16(tcurr, 4),tcurr, 6);
|
||||||
tcurr = vsetq_lane_u16(vgetq_lane_u16(tcurr, 5),tcurr, 7);
|
tcurr = vsetq_lane_u16(vgetq_lane_u16(tcurr, 5),tcurr, 7);
|
||||||
|
tcurr = vsetq_lane_u16(vgetq_lane_u16(tcurr, 3),tcurr, 5);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
+4
-4
@@ -49,12 +49,12 @@ namespace {
|
|||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
SHIFT = 14,
|
SHIFT = 15,
|
||||||
SHIFT_DELTA = 1 << (SHIFT - 1),
|
SHIFT_DELTA = 1 << (SHIFT - 1),
|
||||||
|
|
||||||
R2Y_BT601 = 4899,
|
R2Y_BT601 = 9798,
|
||||||
G2Y_BT601 = 9617,
|
G2Y_BT601 = 19235,
|
||||||
B2Y_BT601 = 1868,
|
B2Y_BT601 = 3735,
|
||||||
|
|
||||||
R2Y_BT709 = 3483,
|
R2Y_BT709 = 3483,
|
||||||
G2Y_BT709 = 11718,
|
G2Y_BT709 = 11718,
|
||||||
|
|||||||
Vendored
+22
-36
@@ -151,6 +151,10 @@ void div(const Size2D &size,
|
|||||||
typedef typename internal::VecTraits<T>::vec128 vec128;
|
typedef typename internal::VecTraits<T>::vec128 vec128;
|
||||||
typedef typename internal::VecTraits<T>::vec64 vec64;
|
typedef typename internal::VecTraits<T>::vec64 vec64;
|
||||||
|
|
||||||
|
#if defined(__GNUC__) && (defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L)
|
||||||
|
static_assert(std::numeric_limits<T>::is_integer, "template implementation is for integer types only");
|
||||||
|
#endif
|
||||||
|
|
||||||
if (scale == 0.0f ||
|
if (scale == 0.0f ||
|
||||||
(std::numeric_limits<T>::is_integer &&
|
(std::numeric_limits<T>::is_integer &&
|
||||||
(scale * std::numeric_limits<T>::max()) < 1.0f &&
|
(scale * std::numeric_limits<T>::max()) < 1.0f &&
|
||||||
@@ -311,6 +315,10 @@ void recip(const Size2D &size,
|
|||||||
typedef typename internal::VecTraits<T>::vec128 vec128;
|
typedef typename internal::VecTraits<T>::vec128 vec128;
|
||||||
typedef typename internal::VecTraits<T>::vec64 vec64;
|
typedef typename internal::VecTraits<T>::vec64 vec64;
|
||||||
|
|
||||||
|
#if defined(__GNUC__) && (defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L)
|
||||||
|
static_assert(std::numeric_limits<T>::is_integer, "template implementation is for integer types only");
|
||||||
|
#endif
|
||||||
|
|
||||||
if (scale == 0.0f ||
|
if (scale == 0.0f ||
|
||||||
(std::numeric_limits<T>::is_integer &&
|
(std::numeric_limits<T>::is_integer &&
|
||||||
scale < 1.0f &&
|
scale < 1.0f &&
|
||||||
@@ -463,8 +471,6 @@ void div(const Size2D &size,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
float32x4_t v_zero = vdupq_n_f32(0.0f);
|
|
||||||
|
|
||||||
size_t roiw128 = size.width >= 3 ? size.width - 3 : 0;
|
size_t roiw128 = size.width >= 3 ? size.width - 3 : 0;
|
||||||
size_t roiw64 = size.width >= 1 ? size.width - 1 : 0;
|
size_t roiw64 = size.width >= 1 ? size.width - 1 : 0;
|
||||||
|
|
||||||
@@ -485,9 +491,7 @@ void div(const Size2D &size,
|
|||||||
float32x4_t v_src0 = vld1q_f32(src0 + j);
|
float32x4_t v_src0 = vld1q_f32(src0 + j);
|
||||||
float32x4_t v_src1 = vld1q_f32(src1 + j);
|
float32x4_t v_src1 = vld1q_f32(src1 + j);
|
||||||
|
|
||||||
uint32x4_t v_mask = vceqq_f32(v_src1,v_zero);
|
vst1q_f32(dst + j, vmulq_f32(v_src0, internal::vrecpq_f32(v_src1)));
|
||||||
vst1q_f32(dst + j, vreinterpretq_f32_u32(vbicq_u32(
|
|
||||||
vreinterpretq_u32_f32(vmulq_f32(v_src0, internal::vrecpq_f32(v_src1))), v_mask)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (; j < roiw64; j += 2)
|
for (; j < roiw64; j += 2)
|
||||||
@@ -495,14 +499,12 @@ void div(const Size2D &size,
|
|||||||
float32x2_t v_src0 = vld1_f32(src0 + j);
|
float32x2_t v_src0 = vld1_f32(src0 + j);
|
||||||
float32x2_t v_src1 = vld1_f32(src1 + j);
|
float32x2_t v_src1 = vld1_f32(src1 + j);
|
||||||
|
|
||||||
uint32x2_t v_mask = vceq_f32(v_src1,vget_low_f32(v_zero));
|
vst1_f32(dst + j, vmul_f32(v_src0, internal::vrecp_f32(v_src1)));
|
||||||
vst1_f32(dst + j, vreinterpret_f32_u32(vbic_u32(
|
|
||||||
vreinterpret_u32_f32(vmul_f32(v_src0, internal::vrecp_f32(v_src1))), v_mask)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (; j < size.width; j++)
|
for (; j < size.width; j++)
|
||||||
{
|
{
|
||||||
dst[j] = src1[j] ? src0[j] / src1[j] : 0.0f;
|
dst[j] = src0[j] / src1[j];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -523,10 +525,8 @@ void div(const Size2D &size,
|
|||||||
float32x4_t v_src0 = vld1q_f32(src0 + j);
|
float32x4_t v_src0 = vld1q_f32(src0 + j);
|
||||||
float32x4_t v_src1 = vld1q_f32(src1 + j);
|
float32x4_t v_src1 = vld1q_f32(src1 + j);
|
||||||
|
|
||||||
uint32x4_t v_mask = vceqq_f32(v_src1,v_zero);
|
vst1q_f32(dst + j, vmulq_f32(vmulq_n_f32(v_src0, scale),
|
||||||
vst1q_f32(dst + j, vreinterpretq_f32_u32(vbicq_u32(
|
internal::vrecpq_f32(v_src1)));
|
||||||
vreinterpretq_u32_f32(vmulq_f32(vmulq_n_f32(v_src0, scale),
|
|
||||||
internal::vrecpq_f32(v_src1))), v_mask)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (; j < roiw64; j += 2)
|
for (; j < roiw64; j += 2)
|
||||||
@@ -534,15 +534,13 @@ void div(const Size2D &size,
|
|||||||
float32x2_t v_src0 = vld1_f32(src0 + j);
|
float32x2_t v_src0 = vld1_f32(src0 + j);
|
||||||
float32x2_t v_src1 = vld1_f32(src1 + j);
|
float32x2_t v_src1 = vld1_f32(src1 + j);
|
||||||
|
|
||||||
uint32x2_t v_mask = vceq_f32(v_src1,vget_low_f32(v_zero));
|
vst1_f32(dst + j, vmul_f32(vmul_n_f32(v_src0, scale),
|
||||||
vst1_f32(dst + j, vreinterpret_f32_u32(vbic_u32(
|
internal::vrecp_f32(v_src1)));
|
||||||
vreinterpret_u32_f32(vmul_f32(vmul_n_f32(v_src0, scale),
|
|
||||||
internal::vrecp_f32(v_src1))), v_mask)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (; j < size.width; j++)
|
for (; j < size.width; j++)
|
||||||
{
|
{
|
||||||
dst[j] = src1[j] ? src0[j] * scale / src1[j] : 0.0f;
|
dst[j] = src0[j] * scale / src1[j];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -620,8 +618,6 @@ void reciprocal(const Size2D &size,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
float32x4_t v_zero = vdupq_n_f32(0.0f);
|
|
||||||
|
|
||||||
size_t roiw128 = size.width >= 3 ? size.width - 3 : 0;
|
size_t roiw128 = size.width >= 3 ? size.width - 3 : 0;
|
||||||
size_t roiw64 = size.width >= 1 ? size.width - 1 : 0;
|
size_t roiw64 = size.width >= 1 ? size.width - 1 : 0;
|
||||||
|
|
||||||
@@ -639,23 +635,19 @@ void reciprocal(const Size2D &size,
|
|||||||
|
|
||||||
float32x4_t v_src1 = vld1q_f32(src1 + j);
|
float32x4_t v_src1 = vld1q_f32(src1 + j);
|
||||||
|
|
||||||
uint32x4_t v_mask = vceqq_f32(v_src1,v_zero);
|
vst1q_f32(dst + j, internal::vrecpq_f32(v_src1));
|
||||||
vst1q_f32(dst + j, vreinterpretq_f32_u32(vbicq_u32(
|
|
||||||
vreinterpretq_u32_f32(internal::vrecpq_f32(v_src1)), v_mask)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (; j < roiw64; j += 2)
|
for (; j < roiw64; j += 2)
|
||||||
{
|
{
|
||||||
float32x2_t v_src1 = vld1_f32(src1 + j);
|
float32x2_t v_src1 = vld1_f32(src1 + j);
|
||||||
|
|
||||||
uint32x2_t v_mask = vceq_f32(v_src1,vget_low_f32(v_zero));
|
vst1_f32(dst + j, internal::vrecp_f32(v_src1));
|
||||||
vst1_f32(dst + j, vreinterpret_f32_u32(vbic_u32(
|
|
||||||
vreinterpret_u32_f32(internal::vrecp_f32(v_src1)), v_mask)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (; j < size.width; j++)
|
for (; j < size.width; j++)
|
||||||
{
|
{
|
||||||
dst[j] = src1[j] ? 1.0f / src1[j] : 0;
|
dst[j] = 1.0f / src1[j];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -673,25 +665,19 @@ void reciprocal(const Size2D &size,
|
|||||||
|
|
||||||
float32x4_t v_src1 = vld1q_f32(src1 + j);
|
float32x4_t v_src1 = vld1q_f32(src1 + j);
|
||||||
|
|
||||||
uint32x4_t v_mask = vceqq_f32(v_src1,v_zero);
|
vst1q_f32(dst + j, vmulq_n_f32(internal::vrecpq_f32(v_src1), scale));
|
||||||
vst1q_f32(dst + j, vreinterpretq_f32_u32(vbicq_u32(
|
|
||||||
vreinterpretq_u32_f32(vmulq_n_f32(internal::vrecpq_f32(v_src1),
|
|
||||||
scale)),v_mask)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (; j < roiw64; j += 2)
|
for (; j < roiw64; j += 2)
|
||||||
{
|
{
|
||||||
float32x2_t v_src1 = vld1_f32(src1 + j);
|
float32x2_t v_src1 = vld1_f32(src1 + j);
|
||||||
|
|
||||||
uint32x2_t v_mask = vceq_f32(v_src1,vget_low_f32(v_zero));
|
vst1_f32(dst + j, vmul_n_f32(internal::vrecp_f32(v_src1), scale));
|
||||||
vst1_f32(dst + j, vreinterpret_f32_u32(vbic_u32(
|
|
||||||
vreinterpret_u32_f32(vmul_n_f32(internal::vrecp_f32(v_src1),
|
|
||||||
scale)), v_mask)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (; j < size.width; j++)
|
for (; j < size.width; j++)
|
||||||
{
|
{
|
||||||
dst[j] = src1[j] ? scale / src1[j] : 0;
|
dst[j] = scale / src1[j];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+1
@@ -30,6 +30,7 @@
|
|||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
__BEGIN_DECLS
|
__BEGIN_DECLS
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -1,6 +1,6 @@
|
|||||||
$url = "https://raw.githubusercontent.com/opencv/opencv_3rdparty/@FFMPEG_BINARIES_COMMIT@/ffmpeg/opencv_ffmpeg_64.dll"
|
$url = "https://raw.githubusercontent.com/opencv/opencv_3rdparty/@FFMPEG_BINARIES_COMMIT@/ffmpeg/opencv_videoio_ffmpeg_64.dll"
|
||||||
$expected_md5 = "@FFMPEG_FILE_HASH_BIN64@"
|
$expected_md5 = "@FFMPEG_FILE_HASH_BIN64@"
|
||||||
$output = "$PSScriptRoot\@OPENCV_BIN_INSTALL_PATH@\opencv_ffmpeg@OPENCV_DLLVERSION@_64.dll"
|
$output = "$PSScriptRoot\@OPENCV_BIN_INSTALL_PATH@\opencv_videoio_ffmpeg@OPENCV_DLLVERSION@_64.dll"
|
||||||
|
|
||||||
Write-Output ("=" * 120)
|
Write-Output ("=" * 120)
|
||||||
try {
|
try {
|
||||||
|
|||||||
Vendored
+8
-8
@@ -1,16 +1,16 @@
|
|||||||
# Binaries branch name: ffmpeg/3.4_20210302
|
# Binaries branch name: ffmpeg/4.x_20221225
|
||||||
# Binaries were created for OpenCV: 2ab1f3f166fccc3a01497209cc01c5cea44ff201
|
# Binaries were created for OpenCV: 4abe6dc48d4ec6229f332cc6cf6c7e234ac8027e
|
||||||
ocv_update(FFMPEG_BINARIES_COMMIT "e99214251d9f3cde7c48abd46b2259bddc9885b6")
|
ocv_update(FFMPEG_BINARIES_COMMIT "7dd0d4f1d6fe75f05f3d3b5e38cbc96c1a2d2809")
|
||||||
ocv_update(FFMPEG_FILE_HASH_BIN32 "fad5ada9be36120bba8966709e7953a8")
|
ocv_update(FFMPEG_FILE_HASH_BIN32 "e598ae2ece1ddf310bc49b58202fd87a")
|
||||||
ocv_update(FFMPEG_FILE_HASH_BIN64 "650e2272728491923e566f784f79cfef")
|
ocv_update(FFMPEG_FILE_HASH_BIN64 "b2a40c142c20aef9fd663fc8f85c2971")
|
||||||
ocv_update(FFMPEG_FILE_HASH_CMAKE "3b90f67f4b429e77d3da36698cef700c")
|
ocv_update(FFMPEG_FILE_HASH_CMAKE "8862c87496e2e8c375965e1277dee1c7")
|
||||||
|
|
||||||
function(download_win_ffmpeg script_var)
|
function(download_win_ffmpeg script_var)
|
||||||
set(${script_var} "" PARENT_SCOPE)
|
set(${script_var} "" PARENT_SCOPE)
|
||||||
|
|
||||||
set(ids BIN32 BIN64 CMAKE)
|
set(ids BIN32 BIN64 CMAKE)
|
||||||
set(name_BIN32 "opencv_ffmpeg.dll")
|
set(name_BIN32 "opencv_videoio_ffmpeg.dll")
|
||||||
set(name_BIN64 "opencv_ffmpeg_64.dll")
|
set(name_BIN64 "opencv_videoio_ffmpeg_64.dll")
|
||||||
set(name_CMAKE "ffmpeg_version.cmake")
|
set(name_CMAKE "ffmpeg_version.cmake")
|
||||||
|
|
||||||
set(FFMPEG_DOWNLOAD_DIR "${OpenCV_BINARY_DIR}/3rdparty/ffmpeg")
|
set(FFMPEG_DOWNLOAD_DIR "${OpenCV_BINARY_DIR}/3rdparty/ffmpeg")
|
||||||
|
|||||||
Vendored
+4
-4
@@ -13,10 +13,10 @@
|
|||||||
|
|
||||||
* On Windows OpenCV uses pre-built ffmpeg binaries, built with proper flags (without GPL components) and
|
* On Windows OpenCV uses pre-built ffmpeg binaries, built with proper flags (without GPL components) and
|
||||||
wrapped with simple, stable OpenCV-compatible API.
|
wrapped with simple, stable OpenCV-compatible API.
|
||||||
The binaries are opencv_ffmpeg.dll (version for 32-bit Windows) and
|
The binaries are opencv_videoio_ffmpeg.dll (version for 32-bit Windows) and
|
||||||
opencv_ffmpeg_64.dll (version for 64-bit Windows).
|
opencv_videoio_ffmpeg_64.dll (version for 64-bit Windows).
|
||||||
|
|
||||||
The pre-built opencv_ffmpeg*.dll is:
|
The pre-built opencv_videoio_ffmpeg*.dll is:
|
||||||
* LGPL library, not BSD libraries.
|
* LGPL library, not BSD libraries.
|
||||||
* Loaded at runtime by opencv_videoio module.
|
* Loaded at runtime by opencv_videoio module.
|
||||||
If it succeeds, ffmpeg can be used to decode/encode videos;
|
If it succeeds, ffmpeg can be used to decode/encode videos;
|
||||||
@@ -30,7 +30,7 @@
|
|||||||
Or you can specify location of binary file via OPENH264_LIBRARY environment variable.
|
Or you can specify location of binary file via OPENH264_LIBRARY environment variable.
|
||||||
|
|
||||||
If LGPL/GPL software can not be supplied with your OpenCV-based product, simply exclude
|
If LGPL/GPL software can not be supplied with your OpenCV-based product, simply exclude
|
||||||
opencv_ffmpeg*.dll from your distribution; OpenCV will stay fully functional except for the ability to
|
opencv_videoio_ffmpeg*.dll from your distribution; OpenCV will stay fully functional except for the ability to
|
||||||
decode/encode videos using FFMPEG (though, it may still be able to do that using other API,
|
decode/encode videos using FFMPEG (though, it may still be able to do that using other API,
|
||||||
such as Video for Windows, Windows Media Foundation or our self-contained motion jpeg codec).
|
such as Video for Windows, Windows Media Foundation or our self-contained motion jpeg codec).
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,160 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2008-2020 The Khronos Group Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
******************************************************************************/
|
||||||
|
/*****************************************************************************\
|
||||||
|
|
||||||
|
Copyright (c) 2013-2019 Intel Corporation All Rights Reserved.
|
||||||
|
|
||||||
|
THESE MATERIALS ARE 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 INTEL OR ITS
|
||||||
|
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 THESE
|
||||||
|
MATERIALS, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
File Name: cl_va_api_media_sharing_intel.h
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
|
||||||
|
\*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __OPENCL_CL_VA_API_MEDIA_SHARING_INTEL_H
|
||||||
|
#define __OPENCL_CL_VA_API_MEDIA_SHARING_INTEL_H
|
||||||
|
|
||||||
|
#include <CL/cl.h>
|
||||||
|
#include <CL/cl_platform.h>
|
||||||
|
#include <va/va.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/******************************************
|
||||||
|
* cl_intel_va_api_media_sharing extension *
|
||||||
|
*******************************************/
|
||||||
|
|
||||||
|
#define cl_intel_va_api_media_sharing 1
|
||||||
|
|
||||||
|
/* error codes */
|
||||||
|
#define CL_INVALID_VA_API_MEDIA_ADAPTER_INTEL -1098
|
||||||
|
#define CL_INVALID_VA_API_MEDIA_SURFACE_INTEL -1099
|
||||||
|
#define CL_VA_API_MEDIA_SURFACE_ALREADY_ACQUIRED_INTEL -1100
|
||||||
|
#define CL_VA_API_MEDIA_SURFACE_NOT_ACQUIRED_INTEL -1101
|
||||||
|
|
||||||
|
/* cl_va_api_device_source_intel */
|
||||||
|
#define CL_VA_API_DISPLAY_INTEL 0x4094
|
||||||
|
|
||||||
|
/* cl_va_api_device_set_intel */
|
||||||
|
#define CL_PREFERRED_DEVICES_FOR_VA_API_INTEL 0x4095
|
||||||
|
#define CL_ALL_DEVICES_FOR_VA_API_INTEL 0x4096
|
||||||
|
|
||||||
|
/* cl_context_info */
|
||||||
|
#define CL_CONTEXT_VA_API_DISPLAY_INTEL 0x4097
|
||||||
|
|
||||||
|
/* cl_mem_info */
|
||||||
|
#define CL_MEM_VA_API_MEDIA_SURFACE_INTEL 0x4098
|
||||||
|
|
||||||
|
/* cl_image_info */
|
||||||
|
#define CL_IMAGE_VA_API_PLANE_INTEL 0x4099
|
||||||
|
|
||||||
|
/* cl_command_type */
|
||||||
|
#define CL_COMMAND_ACQUIRE_VA_API_MEDIA_SURFACES_INTEL 0x409A
|
||||||
|
#define CL_COMMAND_RELEASE_VA_API_MEDIA_SURFACES_INTEL 0x409B
|
||||||
|
|
||||||
|
typedef cl_uint cl_va_api_device_source_intel;
|
||||||
|
typedef cl_uint cl_va_api_device_set_intel;
|
||||||
|
|
||||||
|
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||||
|
clGetDeviceIDsFromVA_APIMediaAdapterINTEL(
|
||||||
|
cl_platform_id platform,
|
||||||
|
cl_va_api_device_source_intel media_adapter_type,
|
||||||
|
void* media_adapter,
|
||||||
|
cl_va_api_device_set_intel media_adapter_set,
|
||||||
|
cl_uint num_entries,
|
||||||
|
cl_device_id* devices,
|
||||||
|
cl_uint* num_devices) CL_EXT_SUFFIX__VERSION_1_2;
|
||||||
|
|
||||||
|
typedef CL_API_ENTRY cl_int (CL_API_CALL * clGetDeviceIDsFromVA_APIMediaAdapterINTEL_fn)(
|
||||||
|
cl_platform_id platform,
|
||||||
|
cl_va_api_device_source_intel media_adapter_type,
|
||||||
|
void* media_adapter,
|
||||||
|
cl_va_api_device_set_intel media_adapter_set,
|
||||||
|
cl_uint num_entries,
|
||||||
|
cl_device_id* devices,
|
||||||
|
cl_uint* num_devices) CL_EXT_SUFFIX__VERSION_1_2;
|
||||||
|
|
||||||
|
extern CL_API_ENTRY cl_mem CL_API_CALL
|
||||||
|
clCreateFromVA_APIMediaSurfaceINTEL(
|
||||||
|
cl_context context,
|
||||||
|
cl_mem_flags flags,
|
||||||
|
VASurfaceID* surface,
|
||||||
|
cl_uint plane,
|
||||||
|
cl_int* errcode_ret) CL_EXT_SUFFIX__VERSION_1_2;
|
||||||
|
|
||||||
|
typedef CL_API_ENTRY cl_mem (CL_API_CALL * clCreateFromVA_APIMediaSurfaceINTEL_fn)(
|
||||||
|
cl_context context,
|
||||||
|
cl_mem_flags flags,
|
||||||
|
VASurfaceID* surface,
|
||||||
|
cl_uint plane,
|
||||||
|
cl_int* errcode_ret) CL_EXT_SUFFIX__VERSION_1_2;
|
||||||
|
|
||||||
|
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||||
|
clEnqueueAcquireVA_APIMediaSurfacesINTEL(
|
||||||
|
cl_command_queue command_queue,
|
||||||
|
cl_uint num_objects,
|
||||||
|
const cl_mem* mem_objects,
|
||||||
|
cl_uint num_events_in_wait_list,
|
||||||
|
const cl_event* event_wait_list,
|
||||||
|
cl_event* event) CL_EXT_SUFFIX__VERSION_1_2;
|
||||||
|
|
||||||
|
typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueAcquireVA_APIMediaSurfacesINTEL_fn)(
|
||||||
|
cl_command_queue command_queue,
|
||||||
|
cl_uint num_objects,
|
||||||
|
const cl_mem* mem_objects,
|
||||||
|
cl_uint num_events_in_wait_list,
|
||||||
|
const cl_event* event_wait_list,
|
||||||
|
cl_event* event) CL_EXT_SUFFIX__VERSION_1_2;
|
||||||
|
|
||||||
|
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||||
|
clEnqueueReleaseVA_APIMediaSurfacesINTEL(
|
||||||
|
cl_command_queue command_queue,
|
||||||
|
cl_uint num_objects,
|
||||||
|
const cl_mem* mem_objects,
|
||||||
|
cl_uint num_events_in_wait_list,
|
||||||
|
const cl_event* event_wait_list,
|
||||||
|
cl_event* event) CL_EXT_SUFFIX__VERSION_1_2;
|
||||||
|
|
||||||
|
typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueReleaseVA_APIMediaSurfacesINTEL_fn)(
|
||||||
|
cl_command_queue command_queue,
|
||||||
|
cl_uint num_objects,
|
||||||
|
const cl_mem* mem_objects,
|
||||||
|
cl_uint num_events_in_wait_list,
|
||||||
|
const cl_event* event_wait_list,
|
||||||
|
cl_event* event) CL_EXT_SUFFIX__VERSION_1_2;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __OPENCL_CL_VA_API_MEDIA_SHARING_INTEL_H */
|
||||||
|
|
||||||
+92
@@ -0,0 +1,92 @@
|
|||||||
|
//
|
||||||
|
// File: vk_platform.h
|
||||||
|
//
|
||||||
|
/*
|
||||||
|
** Copyright (c) 2014-2017 The Khronos Group Inc.
|
||||||
|
**
|
||||||
|
** Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
** you may not use this file except in compliance with the License.
|
||||||
|
** You may obtain a copy of the License at
|
||||||
|
**
|
||||||
|
** http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
**
|
||||||
|
** Unless required by applicable law or agreed to in writing, software
|
||||||
|
** distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
** See the License for the specific language governing permissions and
|
||||||
|
** limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef VK_PLATFORM_H_
|
||||||
|
#define VK_PLATFORM_H_
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif // __cplusplus
|
||||||
|
|
||||||
|
/*
|
||||||
|
***************************************************************************************************
|
||||||
|
* Platform-specific directives and type declarations
|
||||||
|
***************************************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Platform-specific calling convention macros.
|
||||||
|
*
|
||||||
|
* Platforms should define these so that Vulkan clients call Vulkan commands
|
||||||
|
* with the same calling conventions that the Vulkan implementation expects.
|
||||||
|
*
|
||||||
|
* VKAPI_ATTR - Placed before the return type in function declarations.
|
||||||
|
* Useful for C++11 and GCC/Clang-style function attribute syntax.
|
||||||
|
* VKAPI_CALL - Placed after the return type in function declarations.
|
||||||
|
* Useful for MSVC-style calling convention syntax.
|
||||||
|
* VKAPI_PTR - Placed between the '(' and '*' in function pointer types.
|
||||||
|
*
|
||||||
|
* Function declaration: VKAPI_ATTR void VKAPI_CALL vkCommand(void);
|
||||||
|
* Function pointer type: typedef void (VKAPI_PTR *PFN_vkCommand)(void);
|
||||||
|
*/
|
||||||
|
#if defined(_WIN32)
|
||||||
|
// On Windows, Vulkan commands use the stdcall convention
|
||||||
|
#define VKAPI_ATTR
|
||||||
|
#define VKAPI_CALL __stdcall
|
||||||
|
#define VKAPI_PTR VKAPI_CALL
|
||||||
|
#elif defined(__ANDROID__) && defined(__ARM_ARCH) && __ARM_ARCH < 7
|
||||||
|
#error "Vulkan isn't supported for the 'armeabi' NDK ABI"
|
||||||
|
#elif defined(__ANDROID__) && defined(__ARM_ARCH) && __ARM_ARCH >= 7 && defined(__ARM_32BIT_STATE)
|
||||||
|
// On Android 32-bit ARM targets, Vulkan functions use the "hardfloat"
|
||||||
|
// calling convention, i.e. float parameters are passed in registers. This
|
||||||
|
// is true even if the rest of the application passes floats on the stack,
|
||||||
|
// as it does by default when compiling for the armeabi-v7a NDK ABI.
|
||||||
|
#define VKAPI_ATTR __attribute__((pcs("aapcs-vfp")))
|
||||||
|
#define VKAPI_CALL
|
||||||
|
#define VKAPI_PTR VKAPI_ATTR
|
||||||
|
#else
|
||||||
|
// On other platforms, use the default calling convention
|
||||||
|
#define VKAPI_ATTR
|
||||||
|
#define VKAPI_CALL
|
||||||
|
#define VKAPI_PTR
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
#if !defined(VK_NO_STDINT_H)
|
||||||
|
#if defined(_MSC_VER) && (_MSC_VER < 1600)
|
||||||
|
typedef signed __int8 int8_t;
|
||||||
|
typedef unsigned __int8 uint8_t;
|
||||||
|
typedef signed __int16 int16_t;
|
||||||
|
typedef unsigned __int16 uint16_t;
|
||||||
|
typedef signed __int32 int32_t;
|
||||||
|
typedef unsigned __int32 uint32_t;
|
||||||
|
typedef signed __int64 int64_t;
|
||||||
|
typedef unsigned __int64 uint64_t;
|
||||||
|
#else
|
||||||
|
#include <stdint.h>
|
||||||
|
#endif
|
||||||
|
#endif // !defined(VK_NO_STDINT_H)
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} // extern "C"
|
||||||
|
#endif // __cplusplus
|
||||||
|
|
||||||
|
#endif
|
||||||
Vendored
+83
@@ -0,0 +1,83 @@
|
|||||||
|
#ifndef VULKAN_H_
|
||||||
|
#define VULKAN_H_ 1
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Copyright (c) 2015-2018 The Khronos Group Inc.
|
||||||
|
**
|
||||||
|
** Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
** you may not use this file except in compliance with the License.
|
||||||
|
** You may obtain a copy of the License at
|
||||||
|
**
|
||||||
|
** http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
**
|
||||||
|
** Unless required by applicable law or agreed to in writing, software
|
||||||
|
** distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
** See the License for the specific language governing permissions and
|
||||||
|
** limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "vk_platform.h"
|
||||||
|
#include "vulkan_core.h"
|
||||||
|
|
||||||
|
#ifdef VK_USE_PLATFORM_ANDROID_KHR
|
||||||
|
#include "vulkan_android.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef VK_USE_PLATFORM_FUCHSIA
|
||||||
|
#include <zircon/types.h>
|
||||||
|
#include "vulkan_fuchsia.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef VK_USE_PLATFORM_IOS_MVK
|
||||||
|
#include "vulkan_ios.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef VK_USE_PLATFORM_MACOS_MVK
|
||||||
|
#include "vulkan_macos.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef VK_USE_PLATFORM_MIR_KHR
|
||||||
|
#include <mir_toolkit/client_types.h>
|
||||||
|
#include "vulkan_mir.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef VK_USE_PLATFORM_VI_NN
|
||||||
|
#include "vulkan_vi.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef VK_USE_PLATFORM_WAYLAND_KHR
|
||||||
|
#include <wayland-client.h>
|
||||||
|
#include "vulkan_wayland.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef VK_USE_PLATFORM_WIN32_KHR
|
||||||
|
#include <windows.h>
|
||||||
|
#include "vulkan_win32.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef VK_USE_PLATFORM_XCB_KHR
|
||||||
|
#include <xcb/xcb.h>
|
||||||
|
#include "vulkan_xcb.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef VK_USE_PLATFORM_XLIB_KHR
|
||||||
|
#include <X11/Xlib.h>
|
||||||
|
#include "vulkan_xlib.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef VK_USE_PLATFORM_XLIB_XRANDR_EXT
|
||||||
|
#include <X11/Xlib.h>
|
||||||
|
#include <X11/extensions/Xrandr.h>
|
||||||
|
#include "vulkan_xlib_xrandr.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // VULKAN_H_
|
||||||
+126
@@ -0,0 +1,126 @@
|
|||||||
|
#ifndef VULKAN_ANDROID_H_
|
||||||
|
#define VULKAN_ANDROID_H_ 1
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Copyright (c) 2015-2018 The Khronos Group Inc.
|
||||||
|
**
|
||||||
|
** Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
** you may not use this file except in compliance with the License.
|
||||||
|
** You may obtain a copy of the License at
|
||||||
|
**
|
||||||
|
** http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
**
|
||||||
|
** Unless required by applicable law or agreed to in writing, software
|
||||||
|
** distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
** See the License for the specific language governing permissions and
|
||||||
|
** limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
** This header is generated from the Khronos Vulkan XML API Registry.
|
||||||
|
**
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#define VK_KHR_android_surface 1
|
||||||
|
struct ANativeWindow;
|
||||||
|
|
||||||
|
#define VK_KHR_ANDROID_SURFACE_SPEC_VERSION 6
|
||||||
|
#define VK_KHR_ANDROID_SURFACE_EXTENSION_NAME "VK_KHR_android_surface"
|
||||||
|
|
||||||
|
typedef VkFlags VkAndroidSurfaceCreateFlagsKHR;
|
||||||
|
|
||||||
|
typedef struct VkAndroidSurfaceCreateInfoKHR {
|
||||||
|
VkStructureType sType;
|
||||||
|
const void* pNext;
|
||||||
|
VkAndroidSurfaceCreateFlagsKHR flags;
|
||||||
|
struct ANativeWindow* window;
|
||||||
|
} VkAndroidSurfaceCreateInfoKHR;
|
||||||
|
|
||||||
|
|
||||||
|
typedef VkResult (VKAPI_PTR *PFN_vkCreateAndroidSurfaceKHR)(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
|
||||||
|
|
||||||
|
#ifndef VK_NO_PROTOTYPES
|
||||||
|
VKAPI_ATTR VkResult VKAPI_CALL vkCreateAndroidSurfaceKHR(
|
||||||
|
VkInstance instance,
|
||||||
|
const VkAndroidSurfaceCreateInfoKHR* pCreateInfo,
|
||||||
|
const VkAllocationCallbacks* pAllocator,
|
||||||
|
VkSurfaceKHR* pSurface);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define VK_ANDROID_external_memory_android_hardware_buffer 1
|
||||||
|
struct AHardwareBuffer;
|
||||||
|
|
||||||
|
#define VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_SPEC_VERSION 3
|
||||||
|
#define VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME "VK_ANDROID_external_memory_android_hardware_buffer"
|
||||||
|
|
||||||
|
typedef struct VkAndroidHardwareBufferUsageANDROID {
|
||||||
|
VkStructureType sType;
|
||||||
|
void* pNext;
|
||||||
|
uint64_t androidHardwareBufferUsage;
|
||||||
|
} VkAndroidHardwareBufferUsageANDROID;
|
||||||
|
|
||||||
|
typedef struct VkAndroidHardwareBufferPropertiesANDROID {
|
||||||
|
VkStructureType sType;
|
||||||
|
void* pNext;
|
||||||
|
VkDeviceSize allocationSize;
|
||||||
|
uint32_t memoryTypeBits;
|
||||||
|
} VkAndroidHardwareBufferPropertiesANDROID;
|
||||||
|
|
||||||
|
typedef struct VkAndroidHardwareBufferFormatPropertiesANDROID {
|
||||||
|
VkStructureType sType;
|
||||||
|
void* pNext;
|
||||||
|
VkFormat format;
|
||||||
|
uint64_t externalFormat;
|
||||||
|
VkFormatFeatureFlags formatFeatures;
|
||||||
|
VkComponentMapping samplerYcbcrConversionComponents;
|
||||||
|
VkSamplerYcbcrModelConversion suggestedYcbcrModel;
|
||||||
|
VkSamplerYcbcrRange suggestedYcbcrRange;
|
||||||
|
VkChromaLocation suggestedXChromaOffset;
|
||||||
|
VkChromaLocation suggestedYChromaOffset;
|
||||||
|
} VkAndroidHardwareBufferFormatPropertiesANDROID;
|
||||||
|
|
||||||
|
typedef struct VkImportAndroidHardwareBufferInfoANDROID {
|
||||||
|
VkStructureType sType;
|
||||||
|
const void* pNext;
|
||||||
|
struct AHardwareBuffer* buffer;
|
||||||
|
} VkImportAndroidHardwareBufferInfoANDROID;
|
||||||
|
|
||||||
|
typedef struct VkMemoryGetAndroidHardwareBufferInfoANDROID {
|
||||||
|
VkStructureType sType;
|
||||||
|
const void* pNext;
|
||||||
|
VkDeviceMemory memory;
|
||||||
|
} VkMemoryGetAndroidHardwareBufferInfoANDROID;
|
||||||
|
|
||||||
|
typedef struct VkExternalFormatANDROID {
|
||||||
|
VkStructureType sType;
|
||||||
|
void* pNext;
|
||||||
|
uint64_t externalFormat;
|
||||||
|
} VkExternalFormatANDROID;
|
||||||
|
|
||||||
|
|
||||||
|
typedef VkResult (VKAPI_PTR *PFN_vkGetAndroidHardwareBufferPropertiesANDROID)(VkDevice device, const struct AHardwareBuffer* buffer, VkAndroidHardwareBufferPropertiesANDROID* pProperties);
|
||||||
|
typedef VkResult (VKAPI_PTR *PFN_vkGetMemoryAndroidHardwareBufferANDROID)(VkDevice device, const VkMemoryGetAndroidHardwareBufferInfoANDROID* pInfo, struct AHardwareBuffer** pBuffer);
|
||||||
|
|
||||||
|
#ifndef VK_NO_PROTOTYPES
|
||||||
|
VKAPI_ATTR VkResult VKAPI_CALL vkGetAndroidHardwareBufferPropertiesANDROID(
|
||||||
|
VkDevice device,
|
||||||
|
const struct AHardwareBuffer* buffer,
|
||||||
|
VkAndroidHardwareBufferPropertiesANDROID* pProperties);
|
||||||
|
|
||||||
|
VKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryAndroidHardwareBufferANDROID(
|
||||||
|
VkDevice device,
|
||||||
|
const VkMemoryGetAndroidHardwareBufferInfoANDROID* pInfo,
|
||||||
|
struct AHardwareBuffer** pBuffer);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
+8524
File diff suppressed because it is too large
Load Diff
+58
@@ -0,0 +1,58 @@
|
|||||||
|
#ifndef VULKAN_FUCHSIA_H_
|
||||||
|
#define VULKAN_FUCHSIA_H_ 1
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Copyright (c) 2015-2018 The Khronos Group Inc.
|
||||||
|
**
|
||||||
|
** Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
** you may not use this file except in compliance with the License.
|
||||||
|
** You may obtain a copy of the License at
|
||||||
|
**
|
||||||
|
** http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
**
|
||||||
|
** Unless required by applicable law or agreed to in writing, software
|
||||||
|
** distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
** See the License for the specific language governing permissions and
|
||||||
|
** limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
** This header is generated from the Khronos Vulkan XML API Registry.
|
||||||
|
**
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#define VK_FUCHSIA_imagepipe_surface 1
|
||||||
|
#define VK_FUCHSIA_IMAGEPIPE_SURFACE_SPEC_VERSION 1
|
||||||
|
#define VK_FUCHSIA_IMAGEPIPE_SURFACE_EXTENSION_NAME "VK_FUCHSIA_imagepipe_surface"
|
||||||
|
|
||||||
|
typedef VkFlags VkImagePipeSurfaceCreateFlagsFUCHSIA;
|
||||||
|
|
||||||
|
typedef struct VkImagePipeSurfaceCreateInfoFUCHSIA {
|
||||||
|
VkStructureType sType;
|
||||||
|
const void* pNext;
|
||||||
|
VkImagePipeSurfaceCreateFlagsFUCHSIA flags;
|
||||||
|
zx_handle_t imagePipeHandle;
|
||||||
|
} VkImagePipeSurfaceCreateInfoFUCHSIA;
|
||||||
|
|
||||||
|
|
||||||
|
typedef VkResult (VKAPI_PTR *PFN_vkCreateImagePipeSurfaceFUCHSIA)(VkInstance instance, const VkImagePipeSurfaceCreateInfoFUCHSIA* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
|
||||||
|
|
||||||
|
#ifndef VK_NO_PROTOTYPES
|
||||||
|
VKAPI_ATTR VkResult VKAPI_CALL vkCreateImagePipeSurfaceFUCHSIA(
|
||||||
|
VkInstance instance,
|
||||||
|
const VkImagePipeSurfaceCreateInfoFUCHSIA* pCreateInfo,
|
||||||
|
const VkAllocationCallbacks* pAllocator,
|
||||||
|
VkSurfaceKHR* pSurface);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
Vendored
+58
@@ -0,0 +1,58 @@
|
|||||||
|
#ifndef VULKAN_IOS_H_
|
||||||
|
#define VULKAN_IOS_H_ 1
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Copyright (c) 2015-2018 The Khronos Group Inc.
|
||||||
|
**
|
||||||
|
** Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
** you may not use this file except in compliance with the License.
|
||||||
|
** You may obtain a copy of the License at
|
||||||
|
**
|
||||||
|
** http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
**
|
||||||
|
** Unless required by applicable law or agreed to in writing, software
|
||||||
|
** distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
** See the License for the specific language governing permissions and
|
||||||
|
** limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
** This header is generated from the Khronos Vulkan XML API Registry.
|
||||||
|
**
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#define VK_MVK_ios_surface 1
|
||||||
|
#define VK_MVK_IOS_SURFACE_SPEC_VERSION 2
|
||||||
|
#define VK_MVK_IOS_SURFACE_EXTENSION_NAME "VK_MVK_ios_surface"
|
||||||
|
|
||||||
|
typedef VkFlags VkIOSSurfaceCreateFlagsMVK;
|
||||||
|
|
||||||
|
typedef struct VkIOSSurfaceCreateInfoMVK {
|
||||||
|
VkStructureType sType;
|
||||||
|
const void* pNext;
|
||||||
|
VkIOSSurfaceCreateFlagsMVK flags;
|
||||||
|
const void* pView;
|
||||||
|
} VkIOSSurfaceCreateInfoMVK;
|
||||||
|
|
||||||
|
|
||||||
|
typedef VkResult (VKAPI_PTR *PFN_vkCreateIOSSurfaceMVK)(VkInstance instance, const VkIOSSurfaceCreateInfoMVK* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
|
||||||
|
|
||||||
|
#ifndef VK_NO_PROTOTYPES
|
||||||
|
VKAPI_ATTR VkResult VKAPI_CALL vkCreateIOSSurfaceMVK(
|
||||||
|
VkInstance instance,
|
||||||
|
const VkIOSSurfaceCreateInfoMVK* pCreateInfo,
|
||||||
|
const VkAllocationCallbacks* pAllocator,
|
||||||
|
VkSurfaceKHR* pSurface);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
+58
@@ -0,0 +1,58 @@
|
|||||||
|
#ifndef VULKAN_MACOS_H_
|
||||||
|
#define VULKAN_MACOS_H_ 1
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Copyright (c) 2015-2018 The Khronos Group Inc.
|
||||||
|
**
|
||||||
|
** Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
** you may not use this file except in compliance with the License.
|
||||||
|
** You may obtain a copy of the License at
|
||||||
|
**
|
||||||
|
** http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
**
|
||||||
|
** Unless required by applicable law or agreed to in writing, software
|
||||||
|
** distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
** See the License for the specific language governing permissions and
|
||||||
|
** limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
** This header is generated from the Khronos Vulkan XML API Registry.
|
||||||
|
**
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#define VK_MVK_macos_surface 1
|
||||||
|
#define VK_MVK_MACOS_SURFACE_SPEC_VERSION 2
|
||||||
|
#define VK_MVK_MACOS_SURFACE_EXTENSION_NAME "VK_MVK_macos_surface"
|
||||||
|
|
||||||
|
typedef VkFlags VkMacOSSurfaceCreateFlagsMVK;
|
||||||
|
|
||||||
|
typedef struct VkMacOSSurfaceCreateInfoMVK {
|
||||||
|
VkStructureType sType;
|
||||||
|
const void* pNext;
|
||||||
|
VkMacOSSurfaceCreateFlagsMVK flags;
|
||||||
|
const void* pView;
|
||||||
|
} VkMacOSSurfaceCreateInfoMVK;
|
||||||
|
|
||||||
|
|
||||||
|
typedef VkResult (VKAPI_PTR *PFN_vkCreateMacOSSurfaceMVK)(VkInstance instance, const VkMacOSSurfaceCreateInfoMVK* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
|
||||||
|
|
||||||
|
#ifndef VK_NO_PROTOTYPES
|
||||||
|
VKAPI_ATTR VkResult VKAPI_CALL vkCreateMacOSSurfaceMVK(
|
||||||
|
VkInstance instance,
|
||||||
|
const VkMacOSSurfaceCreateInfoMVK* pCreateInfo,
|
||||||
|
const VkAllocationCallbacks* pAllocator,
|
||||||
|
VkSurfaceKHR* pSurface);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
Vendored
+65
@@ -0,0 +1,65 @@
|
|||||||
|
#ifndef VULKAN_MIR_H_
|
||||||
|
#define VULKAN_MIR_H_ 1
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Copyright (c) 2015-2018 The Khronos Group Inc.
|
||||||
|
**
|
||||||
|
** Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
** you may not use this file except in compliance with the License.
|
||||||
|
** You may obtain a copy of the License at
|
||||||
|
**
|
||||||
|
** http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
**
|
||||||
|
** Unless required by applicable law or agreed to in writing, software
|
||||||
|
** distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
** See the License for the specific language governing permissions and
|
||||||
|
** limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
** This header is generated from the Khronos Vulkan XML API Registry.
|
||||||
|
**
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#define VK_KHR_mir_surface 1
|
||||||
|
#define VK_KHR_MIR_SURFACE_SPEC_VERSION 4
|
||||||
|
#define VK_KHR_MIR_SURFACE_EXTENSION_NAME "VK_KHR_mir_surface"
|
||||||
|
|
||||||
|
typedef VkFlags VkMirSurfaceCreateFlagsKHR;
|
||||||
|
|
||||||
|
typedef struct VkMirSurfaceCreateInfoKHR {
|
||||||
|
VkStructureType sType;
|
||||||
|
const void* pNext;
|
||||||
|
VkMirSurfaceCreateFlagsKHR flags;
|
||||||
|
MirConnection* connection;
|
||||||
|
MirSurface* mirSurface;
|
||||||
|
} VkMirSurfaceCreateInfoKHR;
|
||||||
|
|
||||||
|
|
||||||
|
typedef VkResult (VKAPI_PTR *PFN_vkCreateMirSurfaceKHR)(VkInstance instance, const VkMirSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
|
||||||
|
typedef VkBool32 (VKAPI_PTR *PFN_vkGetPhysicalDeviceMirPresentationSupportKHR)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, MirConnection* connection);
|
||||||
|
|
||||||
|
#ifndef VK_NO_PROTOTYPES
|
||||||
|
VKAPI_ATTR VkResult VKAPI_CALL vkCreateMirSurfaceKHR(
|
||||||
|
VkInstance instance,
|
||||||
|
const VkMirSurfaceCreateInfoKHR* pCreateInfo,
|
||||||
|
const VkAllocationCallbacks* pAllocator,
|
||||||
|
VkSurfaceKHR* pSurface);
|
||||||
|
|
||||||
|
VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceMirPresentationSupportKHR(
|
||||||
|
VkPhysicalDevice physicalDevice,
|
||||||
|
uint32_t queueFamilyIndex,
|
||||||
|
MirConnection* connection);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
Vendored
+58
@@ -0,0 +1,58 @@
|
|||||||
|
#ifndef VULKAN_VI_H_
|
||||||
|
#define VULKAN_VI_H_ 1
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Copyright (c) 2015-2018 The Khronos Group Inc.
|
||||||
|
**
|
||||||
|
** Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
** you may not use this file except in compliance with the License.
|
||||||
|
** You may obtain a copy of the License at
|
||||||
|
**
|
||||||
|
** http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
**
|
||||||
|
** Unless required by applicable law or agreed to in writing, software
|
||||||
|
** distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
** See the License for the specific language governing permissions and
|
||||||
|
** limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
** This header is generated from the Khronos Vulkan XML API Registry.
|
||||||
|
**
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#define VK_NN_vi_surface 1
|
||||||
|
#define VK_NN_VI_SURFACE_SPEC_VERSION 1
|
||||||
|
#define VK_NN_VI_SURFACE_EXTENSION_NAME "VK_NN_vi_surface"
|
||||||
|
|
||||||
|
typedef VkFlags VkViSurfaceCreateFlagsNN;
|
||||||
|
|
||||||
|
typedef struct VkViSurfaceCreateInfoNN {
|
||||||
|
VkStructureType sType;
|
||||||
|
const void* pNext;
|
||||||
|
VkViSurfaceCreateFlagsNN flags;
|
||||||
|
void* window;
|
||||||
|
} VkViSurfaceCreateInfoNN;
|
||||||
|
|
||||||
|
|
||||||
|
typedef VkResult (VKAPI_PTR *PFN_vkCreateViSurfaceNN)(VkInstance instance, const VkViSurfaceCreateInfoNN* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
|
||||||
|
|
||||||
|
#ifndef VK_NO_PROTOTYPES
|
||||||
|
VKAPI_ATTR VkResult VKAPI_CALL vkCreateViSurfaceNN(
|
||||||
|
VkInstance instance,
|
||||||
|
const VkViSurfaceCreateInfoNN* pCreateInfo,
|
||||||
|
const VkAllocationCallbacks* pAllocator,
|
||||||
|
VkSurfaceKHR* pSurface);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
+65
@@ -0,0 +1,65 @@
|
|||||||
|
#ifndef VULKAN_WAYLAND_H_
|
||||||
|
#define VULKAN_WAYLAND_H_ 1
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Copyright (c) 2015-2018 The Khronos Group Inc.
|
||||||
|
**
|
||||||
|
** Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
** you may not use this file except in compliance with the License.
|
||||||
|
** You may obtain a copy of the License at
|
||||||
|
**
|
||||||
|
** http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
**
|
||||||
|
** Unless required by applicable law or agreed to in writing, software
|
||||||
|
** distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
** See the License for the specific language governing permissions and
|
||||||
|
** limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
** This header is generated from the Khronos Vulkan XML API Registry.
|
||||||
|
**
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#define VK_KHR_wayland_surface 1
|
||||||
|
#define VK_KHR_WAYLAND_SURFACE_SPEC_VERSION 6
|
||||||
|
#define VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME "VK_KHR_wayland_surface"
|
||||||
|
|
||||||
|
typedef VkFlags VkWaylandSurfaceCreateFlagsKHR;
|
||||||
|
|
||||||
|
typedef struct VkWaylandSurfaceCreateInfoKHR {
|
||||||
|
VkStructureType sType;
|
||||||
|
const void* pNext;
|
||||||
|
VkWaylandSurfaceCreateFlagsKHR flags;
|
||||||
|
struct wl_display* display;
|
||||||
|
struct wl_surface* surface;
|
||||||
|
} VkWaylandSurfaceCreateInfoKHR;
|
||||||
|
|
||||||
|
|
||||||
|
typedef VkResult (VKAPI_PTR *PFN_vkCreateWaylandSurfaceKHR)(VkInstance instance, const VkWaylandSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
|
||||||
|
typedef VkBool32 (VKAPI_PTR *PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, struct wl_display* display);
|
||||||
|
|
||||||
|
#ifndef VK_NO_PROTOTYPES
|
||||||
|
VKAPI_ATTR VkResult VKAPI_CALL vkCreateWaylandSurfaceKHR(
|
||||||
|
VkInstance instance,
|
||||||
|
const VkWaylandSurfaceCreateInfoKHR* pCreateInfo,
|
||||||
|
const VkAllocationCallbacks* pAllocator,
|
||||||
|
VkSurfaceKHR* pSurface);
|
||||||
|
|
||||||
|
VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceWaylandPresentationSupportKHR(
|
||||||
|
VkPhysicalDevice physicalDevice,
|
||||||
|
uint32_t queueFamilyIndex,
|
||||||
|
struct wl_display* display);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
+276
@@ -0,0 +1,276 @@
|
|||||||
|
#ifndef VULKAN_WIN32_H_
|
||||||
|
#define VULKAN_WIN32_H_ 1
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Copyright (c) 2015-2018 The Khronos Group Inc.
|
||||||
|
**
|
||||||
|
** Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
** you may not use this file except in compliance with the License.
|
||||||
|
** You may obtain a copy of the License at
|
||||||
|
**
|
||||||
|
** http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
**
|
||||||
|
** Unless required by applicable law or agreed to in writing, software
|
||||||
|
** distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
** See the License for the specific language governing permissions and
|
||||||
|
** limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
** This header is generated from the Khronos Vulkan XML API Registry.
|
||||||
|
**
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#define VK_KHR_win32_surface 1
|
||||||
|
#define VK_KHR_WIN32_SURFACE_SPEC_VERSION 6
|
||||||
|
#define VK_KHR_WIN32_SURFACE_EXTENSION_NAME "VK_KHR_win32_surface"
|
||||||
|
|
||||||
|
typedef VkFlags VkWin32SurfaceCreateFlagsKHR;
|
||||||
|
|
||||||
|
typedef struct VkWin32SurfaceCreateInfoKHR {
|
||||||
|
VkStructureType sType;
|
||||||
|
const void* pNext;
|
||||||
|
VkWin32SurfaceCreateFlagsKHR flags;
|
||||||
|
HINSTANCE hinstance;
|
||||||
|
HWND hwnd;
|
||||||
|
} VkWin32SurfaceCreateInfoKHR;
|
||||||
|
|
||||||
|
|
||||||
|
typedef VkResult (VKAPI_PTR *PFN_vkCreateWin32SurfaceKHR)(VkInstance instance, const VkWin32SurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
|
||||||
|
typedef VkBool32 (VKAPI_PTR *PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex);
|
||||||
|
|
||||||
|
#ifndef VK_NO_PROTOTYPES
|
||||||
|
VKAPI_ATTR VkResult VKAPI_CALL vkCreateWin32SurfaceKHR(
|
||||||
|
VkInstance instance,
|
||||||
|
const VkWin32SurfaceCreateInfoKHR* pCreateInfo,
|
||||||
|
const VkAllocationCallbacks* pAllocator,
|
||||||
|
VkSurfaceKHR* pSurface);
|
||||||
|
|
||||||
|
VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceWin32PresentationSupportKHR(
|
||||||
|
VkPhysicalDevice physicalDevice,
|
||||||
|
uint32_t queueFamilyIndex);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define VK_KHR_external_memory_win32 1
|
||||||
|
#define VK_KHR_EXTERNAL_MEMORY_WIN32_SPEC_VERSION 1
|
||||||
|
#define VK_KHR_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME "VK_KHR_external_memory_win32"
|
||||||
|
|
||||||
|
typedef struct VkImportMemoryWin32HandleInfoKHR {
|
||||||
|
VkStructureType sType;
|
||||||
|
const void* pNext;
|
||||||
|
VkExternalMemoryHandleTypeFlagBits handleType;
|
||||||
|
HANDLE handle;
|
||||||
|
LPCWSTR name;
|
||||||
|
} VkImportMemoryWin32HandleInfoKHR;
|
||||||
|
|
||||||
|
typedef struct VkExportMemoryWin32HandleInfoKHR {
|
||||||
|
VkStructureType sType;
|
||||||
|
const void* pNext;
|
||||||
|
const SECURITY_ATTRIBUTES* pAttributes;
|
||||||
|
DWORD dwAccess;
|
||||||
|
LPCWSTR name;
|
||||||
|
} VkExportMemoryWin32HandleInfoKHR;
|
||||||
|
|
||||||
|
typedef struct VkMemoryWin32HandlePropertiesKHR {
|
||||||
|
VkStructureType sType;
|
||||||
|
void* pNext;
|
||||||
|
uint32_t memoryTypeBits;
|
||||||
|
} VkMemoryWin32HandlePropertiesKHR;
|
||||||
|
|
||||||
|
typedef struct VkMemoryGetWin32HandleInfoKHR {
|
||||||
|
VkStructureType sType;
|
||||||
|
const void* pNext;
|
||||||
|
VkDeviceMemory memory;
|
||||||
|
VkExternalMemoryHandleTypeFlagBits handleType;
|
||||||
|
} VkMemoryGetWin32HandleInfoKHR;
|
||||||
|
|
||||||
|
|
||||||
|
typedef VkResult (VKAPI_PTR *PFN_vkGetMemoryWin32HandleKHR)(VkDevice device, const VkMemoryGetWin32HandleInfoKHR* pGetWin32HandleInfo, HANDLE* pHandle);
|
||||||
|
typedef VkResult (VKAPI_PTR *PFN_vkGetMemoryWin32HandlePropertiesKHR)(VkDevice device, VkExternalMemoryHandleTypeFlagBits handleType, HANDLE handle, VkMemoryWin32HandlePropertiesKHR* pMemoryWin32HandleProperties);
|
||||||
|
|
||||||
|
#ifndef VK_NO_PROTOTYPES
|
||||||
|
VKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryWin32HandleKHR(
|
||||||
|
VkDevice device,
|
||||||
|
const VkMemoryGetWin32HandleInfoKHR* pGetWin32HandleInfo,
|
||||||
|
HANDLE* pHandle);
|
||||||
|
|
||||||
|
VKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryWin32HandlePropertiesKHR(
|
||||||
|
VkDevice device,
|
||||||
|
VkExternalMemoryHandleTypeFlagBits handleType,
|
||||||
|
HANDLE handle,
|
||||||
|
VkMemoryWin32HandlePropertiesKHR* pMemoryWin32HandleProperties);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define VK_KHR_win32_keyed_mutex 1
|
||||||
|
#define VK_KHR_WIN32_KEYED_MUTEX_SPEC_VERSION 1
|
||||||
|
#define VK_KHR_WIN32_KEYED_MUTEX_EXTENSION_NAME "VK_KHR_win32_keyed_mutex"
|
||||||
|
|
||||||
|
typedef struct VkWin32KeyedMutexAcquireReleaseInfoKHR {
|
||||||
|
VkStructureType sType;
|
||||||
|
const void* pNext;
|
||||||
|
uint32_t acquireCount;
|
||||||
|
const VkDeviceMemory* pAcquireSyncs;
|
||||||
|
const uint64_t* pAcquireKeys;
|
||||||
|
const uint32_t* pAcquireTimeouts;
|
||||||
|
uint32_t releaseCount;
|
||||||
|
const VkDeviceMemory* pReleaseSyncs;
|
||||||
|
const uint64_t* pReleaseKeys;
|
||||||
|
} VkWin32KeyedMutexAcquireReleaseInfoKHR;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define VK_KHR_external_semaphore_win32 1
|
||||||
|
#define VK_KHR_EXTERNAL_SEMAPHORE_WIN32_SPEC_VERSION 1
|
||||||
|
#define VK_KHR_EXTERNAL_SEMAPHORE_WIN32_EXTENSION_NAME "VK_KHR_external_semaphore_win32"
|
||||||
|
|
||||||
|
typedef struct VkImportSemaphoreWin32HandleInfoKHR {
|
||||||
|
VkStructureType sType;
|
||||||
|
const void* pNext;
|
||||||
|
VkSemaphore semaphore;
|
||||||
|
VkSemaphoreImportFlags flags;
|
||||||
|
VkExternalSemaphoreHandleTypeFlagBits handleType;
|
||||||
|
HANDLE handle;
|
||||||
|
LPCWSTR name;
|
||||||
|
} VkImportSemaphoreWin32HandleInfoKHR;
|
||||||
|
|
||||||
|
typedef struct VkExportSemaphoreWin32HandleInfoKHR {
|
||||||
|
VkStructureType sType;
|
||||||
|
const void* pNext;
|
||||||
|
const SECURITY_ATTRIBUTES* pAttributes;
|
||||||
|
DWORD dwAccess;
|
||||||
|
LPCWSTR name;
|
||||||
|
} VkExportSemaphoreWin32HandleInfoKHR;
|
||||||
|
|
||||||
|
typedef struct VkD3D12FenceSubmitInfoKHR {
|
||||||
|
VkStructureType sType;
|
||||||
|
const void* pNext;
|
||||||
|
uint32_t waitSemaphoreValuesCount;
|
||||||
|
const uint64_t* pWaitSemaphoreValues;
|
||||||
|
uint32_t signalSemaphoreValuesCount;
|
||||||
|
const uint64_t* pSignalSemaphoreValues;
|
||||||
|
} VkD3D12FenceSubmitInfoKHR;
|
||||||
|
|
||||||
|
typedef struct VkSemaphoreGetWin32HandleInfoKHR {
|
||||||
|
VkStructureType sType;
|
||||||
|
const void* pNext;
|
||||||
|
VkSemaphore semaphore;
|
||||||
|
VkExternalSemaphoreHandleTypeFlagBits handleType;
|
||||||
|
} VkSemaphoreGetWin32HandleInfoKHR;
|
||||||
|
|
||||||
|
|
||||||
|
typedef VkResult (VKAPI_PTR *PFN_vkImportSemaphoreWin32HandleKHR)(VkDevice device, const VkImportSemaphoreWin32HandleInfoKHR* pImportSemaphoreWin32HandleInfo);
|
||||||
|
typedef VkResult (VKAPI_PTR *PFN_vkGetSemaphoreWin32HandleKHR)(VkDevice device, const VkSemaphoreGetWin32HandleInfoKHR* pGetWin32HandleInfo, HANDLE* pHandle);
|
||||||
|
|
||||||
|
#ifndef VK_NO_PROTOTYPES
|
||||||
|
VKAPI_ATTR VkResult VKAPI_CALL vkImportSemaphoreWin32HandleKHR(
|
||||||
|
VkDevice device,
|
||||||
|
const VkImportSemaphoreWin32HandleInfoKHR* pImportSemaphoreWin32HandleInfo);
|
||||||
|
|
||||||
|
VKAPI_ATTR VkResult VKAPI_CALL vkGetSemaphoreWin32HandleKHR(
|
||||||
|
VkDevice device,
|
||||||
|
const VkSemaphoreGetWin32HandleInfoKHR* pGetWin32HandleInfo,
|
||||||
|
HANDLE* pHandle);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define VK_KHR_external_fence_win32 1
|
||||||
|
#define VK_KHR_EXTERNAL_FENCE_WIN32_SPEC_VERSION 1
|
||||||
|
#define VK_KHR_EXTERNAL_FENCE_WIN32_EXTENSION_NAME "VK_KHR_external_fence_win32"
|
||||||
|
|
||||||
|
typedef struct VkImportFenceWin32HandleInfoKHR {
|
||||||
|
VkStructureType sType;
|
||||||
|
const void* pNext;
|
||||||
|
VkFence fence;
|
||||||
|
VkFenceImportFlags flags;
|
||||||
|
VkExternalFenceHandleTypeFlagBits handleType;
|
||||||
|
HANDLE handle;
|
||||||
|
LPCWSTR name;
|
||||||
|
} VkImportFenceWin32HandleInfoKHR;
|
||||||
|
|
||||||
|
typedef struct VkExportFenceWin32HandleInfoKHR {
|
||||||
|
VkStructureType sType;
|
||||||
|
const void* pNext;
|
||||||
|
const SECURITY_ATTRIBUTES* pAttributes;
|
||||||
|
DWORD dwAccess;
|
||||||
|
LPCWSTR name;
|
||||||
|
} VkExportFenceWin32HandleInfoKHR;
|
||||||
|
|
||||||
|
typedef struct VkFenceGetWin32HandleInfoKHR {
|
||||||
|
VkStructureType sType;
|
||||||
|
const void* pNext;
|
||||||
|
VkFence fence;
|
||||||
|
VkExternalFenceHandleTypeFlagBits handleType;
|
||||||
|
} VkFenceGetWin32HandleInfoKHR;
|
||||||
|
|
||||||
|
|
||||||
|
typedef VkResult (VKAPI_PTR *PFN_vkImportFenceWin32HandleKHR)(VkDevice device, const VkImportFenceWin32HandleInfoKHR* pImportFenceWin32HandleInfo);
|
||||||
|
typedef VkResult (VKAPI_PTR *PFN_vkGetFenceWin32HandleKHR)(VkDevice device, const VkFenceGetWin32HandleInfoKHR* pGetWin32HandleInfo, HANDLE* pHandle);
|
||||||
|
|
||||||
|
#ifndef VK_NO_PROTOTYPES
|
||||||
|
VKAPI_ATTR VkResult VKAPI_CALL vkImportFenceWin32HandleKHR(
|
||||||
|
VkDevice device,
|
||||||
|
const VkImportFenceWin32HandleInfoKHR* pImportFenceWin32HandleInfo);
|
||||||
|
|
||||||
|
VKAPI_ATTR VkResult VKAPI_CALL vkGetFenceWin32HandleKHR(
|
||||||
|
VkDevice device,
|
||||||
|
const VkFenceGetWin32HandleInfoKHR* pGetWin32HandleInfo,
|
||||||
|
HANDLE* pHandle);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define VK_NV_external_memory_win32 1
|
||||||
|
#define VK_NV_EXTERNAL_MEMORY_WIN32_SPEC_VERSION 1
|
||||||
|
#define VK_NV_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME "VK_NV_external_memory_win32"
|
||||||
|
|
||||||
|
typedef struct VkImportMemoryWin32HandleInfoNV {
|
||||||
|
VkStructureType sType;
|
||||||
|
const void* pNext;
|
||||||
|
VkExternalMemoryHandleTypeFlagsNV handleType;
|
||||||
|
HANDLE handle;
|
||||||
|
} VkImportMemoryWin32HandleInfoNV;
|
||||||
|
|
||||||
|
typedef struct VkExportMemoryWin32HandleInfoNV {
|
||||||
|
VkStructureType sType;
|
||||||
|
const void* pNext;
|
||||||
|
const SECURITY_ATTRIBUTES* pAttributes;
|
||||||
|
DWORD dwAccess;
|
||||||
|
} VkExportMemoryWin32HandleInfoNV;
|
||||||
|
|
||||||
|
|
||||||
|
typedef VkResult (VKAPI_PTR *PFN_vkGetMemoryWin32HandleNV)(VkDevice device, VkDeviceMemory memory, VkExternalMemoryHandleTypeFlagsNV handleType, HANDLE* pHandle);
|
||||||
|
|
||||||
|
#ifndef VK_NO_PROTOTYPES
|
||||||
|
VKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryWin32HandleNV(
|
||||||
|
VkDevice device,
|
||||||
|
VkDeviceMemory memory,
|
||||||
|
VkExternalMemoryHandleTypeFlagsNV handleType,
|
||||||
|
HANDLE* pHandle);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define VK_NV_win32_keyed_mutex 1
|
||||||
|
#define VK_NV_WIN32_KEYED_MUTEX_SPEC_VERSION 1
|
||||||
|
#define VK_NV_WIN32_KEYED_MUTEX_EXTENSION_NAME "VK_NV_win32_keyed_mutex"
|
||||||
|
|
||||||
|
typedef struct VkWin32KeyedMutexAcquireReleaseInfoNV {
|
||||||
|
VkStructureType sType;
|
||||||
|
const void* pNext;
|
||||||
|
uint32_t acquireCount;
|
||||||
|
const VkDeviceMemory* pAcquireSyncs;
|
||||||
|
const uint64_t* pAcquireKeys;
|
||||||
|
const uint32_t* pAcquireTimeoutMilliseconds;
|
||||||
|
uint32_t releaseCount;
|
||||||
|
const VkDeviceMemory* pReleaseSyncs;
|
||||||
|
const uint64_t* pReleaseKeys;
|
||||||
|
} VkWin32KeyedMutexAcquireReleaseInfoNV;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
Vendored
+66
@@ -0,0 +1,66 @@
|
|||||||
|
#ifndef VULKAN_XCB_H_
|
||||||
|
#define VULKAN_XCB_H_ 1
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Copyright (c) 2015-2018 The Khronos Group Inc.
|
||||||
|
**
|
||||||
|
** Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
** you may not use this file except in compliance with the License.
|
||||||
|
** You may obtain a copy of the License at
|
||||||
|
**
|
||||||
|
** http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
**
|
||||||
|
** Unless required by applicable law or agreed to in writing, software
|
||||||
|
** distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
** See the License for the specific language governing permissions and
|
||||||
|
** limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
** This header is generated from the Khronos Vulkan XML API Registry.
|
||||||
|
**
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#define VK_KHR_xcb_surface 1
|
||||||
|
#define VK_KHR_XCB_SURFACE_SPEC_VERSION 6
|
||||||
|
#define VK_KHR_XCB_SURFACE_EXTENSION_NAME "VK_KHR_xcb_surface"
|
||||||
|
|
||||||
|
typedef VkFlags VkXcbSurfaceCreateFlagsKHR;
|
||||||
|
|
||||||
|
typedef struct VkXcbSurfaceCreateInfoKHR {
|
||||||
|
VkStructureType sType;
|
||||||
|
const void* pNext;
|
||||||
|
VkXcbSurfaceCreateFlagsKHR flags;
|
||||||
|
xcb_connection_t* connection;
|
||||||
|
xcb_window_t window;
|
||||||
|
} VkXcbSurfaceCreateInfoKHR;
|
||||||
|
|
||||||
|
|
||||||
|
typedef VkResult (VKAPI_PTR *PFN_vkCreateXcbSurfaceKHR)(VkInstance instance, const VkXcbSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
|
||||||
|
typedef VkBool32 (VKAPI_PTR *PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, xcb_connection_t* connection, xcb_visualid_t visual_id);
|
||||||
|
|
||||||
|
#ifndef VK_NO_PROTOTYPES
|
||||||
|
VKAPI_ATTR VkResult VKAPI_CALL vkCreateXcbSurfaceKHR(
|
||||||
|
VkInstance instance,
|
||||||
|
const VkXcbSurfaceCreateInfoKHR* pCreateInfo,
|
||||||
|
const VkAllocationCallbacks* pAllocator,
|
||||||
|
VkSurfaceKHR* pSurface);
|
||||||
|
|
||||||
|
VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceXcbPresentationSupportKHR(
|
||||||
|
VkPhysicalDevice physicalDevice,
|
||||||
|
uint32_t queueFamilyIndex,
|
||||||
|
xcb_connection_t* connection,
|
||||||
|
xcb_visualid_t visual_id);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
+66
@@ -0,0 +1,66 @@
|
|||||||
|
#ifndef VULKAN_XLIB_H_
|
||||||
|
#define VULKAN_XLIB_H_ 1
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Copyright (c) 2015-2018 The Khronos Group Inc.
|
||||||
|
**
|
||||||
|
** Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
** you may not use this file except in compliance with the License.
|
||||||
|
** You may obtain a copy of the License at
|
||||||
|
**
|
||||||
|
** http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
**
|
||||||
|
** Unless required by applicable law or agreed to in writing, software
|
||||||
|
** distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
** See the License for the specific language governing permissions and
|
||||||
|
** limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
** This header is generated from the Khronos Vulkan XML API Registry.
|
||||||
|
**
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#define VK_KHR_xlib_surface 1
|
||||||
|
#define VK_KHR_XLIB_SURFACE_SPEC_VERSION 6
|
||||||
|
#define VK_KHR_XLIB_SURFACE_EXTENSION_NAME "VK_KHR_xlib_surface"
|
||||||
|
|
||||||
|
typedef VkFlags VkXlibSurfaceCreateFlagsKHR;
|
||||||
|
|
||||||
|
typedef struct VkXlibSurfaceCreateInfoKHR {
|
||||||
|
VkStructureType sType;
|
||||||
|
const void* pNext;
|
||||||
|
VkXlibSurfaceCreateFlagsKHR flags;
|
||||||
|
Display* dpy;
|
||||||
|
Window window;
|
||||||
|
} VkXlibSurfaceCreateInfoKHR;
|
||||||
|
|
||||||
|
|
||||||
|
typedef VkResult (VKAPI_PTR *PFN_vkCreateXlibSurfaceKHR)(VkInstance instance, const VkXlibSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface);
|
||||||
|
typedef VkBool32 (VKAPI_PTR *PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, Display* dpy, VisualID visualID);
|
||||||
|
|
||||||
|
#ifndef VK_NO_PROTOTYPES
|
||||||
|
VKAPI_ATTR VkResult VKAPI_CALL vkCreateXlibSurfaceKHR(
|
||||||
|
VkInstance instance,
|
||||||
|
const VkXlibSurfaceCreateInfoKHR* pCreateInfo,
|
||||||
|
const VkAllocationCallbacks* pAllocator,
|
||||||
|
VkSurfaceKHR* pSurface);
|
||||||
|
|
||||||
|
VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceXlibPresentationSupportKHR(
|
||||||
|
VkPhysicalDevice physicalDevice,
|
||||||
|
uint32_t queueFamilyIndex,
|
||||||
|
Display* dpy,
|
||||||
|
VisualID visualID);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
+54
@@ -0,0 +1,54 @@
|
|||||||
|
#ifndef VULKAN_XLIB_XRANDR_H_
|
||||||
|
#define VULKAN_XLIB_XRANDR_H_ 1
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Copyright (c) 2015-2018 The Khronos Group Inc.
|
||||||
|
**
|
||||||
|
** Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
** you may not use this file except in compliance with the License.
|
||||||
|
** You may obtain a copy of the License at
|
||||||
|
**
|
||||||
|
** http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
**
|
||||||
|
** Unless required by applicable law or agreed to in writing, software
|
||||||
|
** distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
** See the License for the specific language governing permissions and
|
||||||
|
** limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
** This header is generated from the Khronos Vulkan XML API Registry.
|
||||||
|
**
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#define VK_EXT_acquire_xlib_display 1
|
||||||
|
#define VK_EXT_ACQUIRE_XLIB_DISPLAY_SPEC_VERSION 1
|
||||||
|
#define VK_EXT_ACQUIRE_XLIB_DISPLAY_EXTENSION_NAME "VK_EXT_acquire_xlib_display"
|
||||||
|
|
||||||
|
typedef VkResult (VKAPI_PTR *PFN_vkAcquireXlibDisplayEXT)(VkPhysicalDevice physicalDevice, Display* dpy, VkDisplayKHR display);
|
||||||
|
typedef VkResult (VKAPI_PTR *PFN_vkGetRandROutputDisplayEXT)(VkPhysicalDevice physicalDevice, Display* dpy, RROutput rrOutput, VkDisplayKHR* pDisplay);
|
||||||
|
|
||||||
|
#ifndef VK_NO_PROTOTYPES
|
||||||
|
VKAPI_ATTR VkResult VKAPI_CALL vkAcquireXlibDisplayEXT(
|
||||||
|
VkPhysicalDevice physicalDevice,
|
||||||
|
Display* dpy,
|
||||||
|
VkDisplayKHR display);
|
||||||
|
|
||||||
|
VKAPI_ATTR VkResult VKAPI_CALL vkGetRandROutputDisplayEXT(
|
||||||
|
VkPhysicalDevice physicalDevice,
|
||||||
|
Display* dpy,
|
||||||
|
RROutput rrOutput,
|
||||||
|
VkDisplayKHR* pDisplay);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
Vendored
+1
@@ -54,6 +54,7 @@ set_target_properties(${ITT_LIBRARY} PROPERTIES
|
|||||||
)
|
)
|
||||||
|
|
||||||
ocv_warnings_disable(CMAKE_C_FLAGS -Wundef -Wsign-compare)
|
ocv_warnings_disable(CMAKE_C_FLAGS -Wundef -Wsign-compare)
|
||||||
|
ocv_warnings_disable(CMAKE_C_FLAGS -Wstrict-prototypes) # clang15
|
||||||
|
|
||||||
if(ENABLE_SOLUTION_FOLDERS)
|
if(ENABLE_SOLUTION_FOLDERS)
|
||||||
set_target_properties(${ITT_LIBRARY} PROPERTIES FOLDER "3rdparty")
|
set_target_properties(${ITT_LIBRARY} PROPERTIES FOLDER "3rdparty")
|
||||||
|
|||||||
+103
-15
@@ -3,10 +3,10 @@ project(${JPEG_LIBRARY} C)
|
|||||||
ocv_warnings_disable(CMAKE_C_FLAGS -Wunused-parameter -Wsign-compare -Wshorten-64-to-32 -Wimplicit-fallthrough)
|
ocv_warnings_disable(CMAKE_C_FLAGS -Wunused-parameter -Wsign-compare -Wshorten-64-to-32 -Wimplicit-fallthrough)
|
||||||
|
|
||||||
set(VERSION_MAJOR 2)
|
set(VERSION_MAJOR 2)
|
||||||
set(VERSION_MINOR 0)
|
set(VERSION_MINOR 1)
|
||||||
set(VERSION_REVISION 6)
|
set(VERSION_REVISION 3)
|
||||||
set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION})
|
set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION})
|
||||||
set(LIBJPEG_TURBO_VERSION_NUMBER 2000006)
|
set(LIBJPEG_TURBO_VERSION_NUMBER 2001003)
|
||||||
|
|
||||||
string(TIMESTAMP BUILD "opencv-${OPENCV_VERSION}-libjpeg-turbo")
|
string(TIMESTAMP BUILD "opencv-${OPENCV_VERSION}-libjpeg-turbo")
|
||||||
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||||
@@ -15,8 +15,53 @@ endif()
|
|||||||
|
|
||||||
message(STATUS "libjpeg-turbo: VERSION = ${VERSION}, BUILD = ${BUILD}")
|
message(STATUS "libjpeg-turbo: VERSION = ${VERSION}, BUILD = ${BUILD}")
|
||||||
|
|
||||||
|
math(EXPR BITS "${CMAKE_SIZEOF_VOID_P} * 8")
|
||||||
|
string(TOLOWER ${CMAKE_SYSTEM_PROCESSOR} CMAKE_SYSTEM_PROCESSOR_LC)
|
||||||
|
|
||||||
|
if(CMAKE_SYSTEM_PROCESSOR_LC MATCHES "x86_64" OR
|
||||||
|
CMAKE_SYSTEM_PROCESSOR_LC MATCHES "amd64" OR
|
||||||
|
CMAKE_SYSTEM_PROCESSOR_LC MATCHES "i[0-9]86" OR
|
||||||
|
CMAKE_SYSTEM_PROCESSOR_LC MATCHES "x86" OR
|
||||||
|
CMAKE_SYSTEM_PROCESSOR_LC MATCHES "ia32")
|
||||||
|
if(BITS EQUAL 64 OR CMAKE_C_COMPILER_ABI MATCHES "ELF X32")
|
||||||
|
set(CPU_TYPE x86_64)
|
||||||
|
else()
|
||||||
|
set(CPU_TYPE i386)
|
||||||
|
endif()
|
||||||
|
if(NOT CMAKE_SYSTEM_PROCESSOR STREQUAL ${CPU_TYPE})
|
||||||
|
set(CMAKE_SYSTEM_PROCESSOR ${CPU_TYPE})
|
||||||
|
endif()
|
||||||
|
elseif(CMAKE_SYSTEM_PROCESSOR_LC STREQUAL "aarch64" OR
|
||||||
|
CMAKE_SYSTEM_PROCESSOR_LC MATCHES "^arm")
|
||||||
|
if(BITS EQUAL 64)
|
||||||
|
set(CPU_TYPE arm64)
|
||||||
|
else()
|
||||||
|
set(CPU_TYPE arm)
|
||||||
|
endif()
|
||||||
|
elseif(CMAKE_SYSTEM_PROCESSOR_LC MATCHES "^ppc" OR
|
||||||
|
CMAKE_SYSTEM_PROCESSOR_LC MATCHES "^powerpc")
|
||||||
|
set(CPU_TYPE powerpc)
|
||||||
|
else()
|
||||||
|
set(CPU_TYPE ${CMAKE_SYSTEM_PROCESSOR_LC})
|
||||||
|
endif()
|
||||||
|
if(CMAKE_OSX_ARCHITECTURES MATCHES "x86_64" OR
|
||||||
|
CMAKE_OSX_ARCHITECTURES MATCHES "arm64" OR
|
||||||
|
CMAKE_OSX_ARCHITECTURES MATCHES "i386")
|
||||||
|
set(CPU_TYPE ${CMAKE_OSX_ARCHITECTURES})
|
||||||
|
endif()
|
||||||
|
if(CMAKE_OSX_ARCHITECTURES MATCHES "ppc")
|
||||||
|
set(CPU_TYPE powerpc)
|
||||||
|
endif()
|
||||||
|
if(MSVC_IDE AND CMAKE_GENERATOR_PLATFORM MATCHES "arm64")
|
||||||
|
set(CPU_TYPE arm64)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
OCV_OPTION(ENABLE_LIBJPEG_TURBO_SIMD "Include SIMD extensions for libjpeg-turbo, if available for this platform" (NOT CV_DISABLE_OPTIMIZATION)
|
||||||
|
VISIBLE_IF BUILD_JPEG)
|
||||||
option(WITH_ARITH_ENC "Include arithmetic encoding support when emulating the libjpeg v6b API/ABI" TRUE)
|
option(WITH_ARITH_ENC "Include arithmetic encoding support when emulating the libjpeg v6b API/ABI" TRUE)
|
||||||
option(WITH_ARITH_DEC "Include arithmetic decoding support when emulating the libjpeg v6b API/ABI" TRUE)
|
option(WITH_ARITH_DEC "Include arithmetic decoding support when emulating the libjpeg v6b API/ABI" TRUE)
|
||||||
|
set(WITH_SIMD 1)
|
||||||
|
set(HAVE_LIBJPEG_TURBO_SIMD 0 PARENT_SCOPE)
|
||||||
|
|
||||||
include(CheckCSourceCompiles)
|
include(CheckCSourceCompiles)
|
||||||
include(CheckIncludeFiles)
|
include(CheckIncludeFiles)
|
||||||
@@ -46,7 +91,6 @@ if(UNIX)
|
|||||||
ocv_update(HAVE_UNSIGNED_SHORT 1)
|
ocv_update(HAVE_UNSIGNED_SHORT 1)
|
||||||
# undef INCOMPLETE_TYPES_BROKEN
|
# undef INCOMPLETE_TYPES_BROKEN
|
||||||
ocv_update(RIGHT_SHIFT_IS_UNSIGNED 0)
|
ocv_update(RIGHT_SHIFT_IS_UNSIGNED 0)
|
||||||
ocv_update(__CHAR_UNSIGNED__ 0)
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
@@ -80,14 +124,13 @@ configure_file(jconfigint.h.in jconfigint.h)
|
|||||||
|
|
||||||
include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src)
|
include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src)
|
||||||
|
|
||||||
set(JPEG_SOURCES
|
set(JPEG_SOURCES jcapimin.c jcapistd.c jccoefct.c jccolor.c jcdctmgr.c jchuff.c
|
||||||
jcapimin.c jcapistd.c jccoefct.c jccolor.c jcdctmgr.c jchuff.c jcicc.c
|
jcicc.c jcinit.c jcmainct.c jcmarker.c jcmaster.c jcomapi.c jcparam.c
|
||||||
jcinit.c jcmainct.c jcmarker.c jcmaster.c jcomapi.c jcparam.c jcphuff.c
|
jcphuff.c jcprepct.c jcsample.c jctrans.c jdapimin.c jdapistd.c jdatadst.c
|
||||||
jcprepct.c jcsample.c jctrans.c jdapimin.c jdapistd.c jdatadst.c jdatasrc.c
|
jdatasrc.c jdcoefct.c jdcolor.c jddctmgr.c jdhuff.c jdicc.c jdinput.c
|
||||||
jdcoefct.c jdcolor.c jddctmgr.c jdhuff.c jdicc.c jdinput.c jdmainct.c jdmarker.c
|
jdmainct.c jdmarker.c jdmaster.c jdmerge.c jdphuff.c jdpostct.c jdsample.c
|
||||||
jdmaster.c jdmerge.c jdphuff.c jdpostct.c jdsample.c jdtrans.c jerror.c
|
jdtrans.c jerror.c jfdctflt.c jfdctfst.c jfdctint.c jidctflt.c jidctfst.c
|
||||||
jfdctflt.c jfdctfst.c jfdctint.c jidctflt.c jidctfst.c jidctint.c jidctred.c
|
jidctint.c jidctred.c jquant1.c jquant2.c jutils.c jmemmgr.c jmemnobs.c)
|
||||||
jquant1.c jquant2.c jutils.c jmemmgr.c jmemnobs.c)
|
|
||||||
|
|
||||||
if(WITH_ARITH_ENC OR WITH_ARITH_DEC)
|
if(WITH_ARITH_ENC OR WITH_ARITH_DEC)
|
||||||
set(JPEG_SOURCES ${JPEG_SOURCES} jaricom.c)
|
set(JPEG_SOURCES ${JPEG_SOURCES} jaricom.c)
|
||||||
@@ -101,12 +144,57 @@ if(WITH_ARITH_DEC)
|
|||||||
set(JPEG_SOURCES ${JPEG_SOURCES} jdarith.c)
|
set(JPEG_SOURCES ${JPEG_SOURCES} jdarith.c)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# No SIMD
|
if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_C_COMPILER_ID STREQUAL "Clang")
|
||||||
set(JPEG_SOURCES ${JPEG_SOURCES} jsimd_none.c)
|
# Use the maximum optimization level for release builds
|
||||||
|
foreach(var CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_RELWITHDEBINFO)
|
||||||
|
if(${var} MATCHES "-O2")
|
||||||
|
string(REGEX REPLACE "-O2" "-O3" ${var} "${${var}}")
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(CMAKE_SYSTEM_NAME STREQUAL "SunOS")
|
||||||
|
if(CMAKE_C_COMPILER_ID MATCHES "SunPro")
|
||||||
|
# Use the maximum optimization level for release builds
|
||||||
|
foreach(var CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_RELWITHDEBINFO)
|
||||||
|
if(${var} MATCHES "-xO3")
|
||||||
|
string(REGEX REPLACE "-xO3" "-xO5" ${var} "${${var}}")
|
||||||
|
endif()
|
||||||
|
if(${var} MATCHES "-xO2")
|
||||||
|
string(REGEX REPLACE "-xO2" "-xO5" ${var} "${${var}}")
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(ENABLE_LIBJPEG_TURBO_SIMD)
|
||||||
|
add_subdirectory(src/simd)
|
||||||
|
if(NEON_INTRINSICS)
|
||||||
|
add_definitions(-DNEON_INTRINSICS)
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
set(WITH_SIMD 0)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(WITH_SIMD)
|
||||||
|
message(STATUS "SIMD extensions: ${CPU_TYPE} (WITH_SIMD = ${WITH_SIMD})")
|
||||||
|
set(HAVE_LIBJPEG_TURBO_SIMD 1 PARENT_SCOPE)
|
||||||
|
if(MSVC_IDE OR XCODE)
|
||||||
|
set_source_files_properties(${SIMD_OBJS} PROPERTIES GENERATED 1)
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
add_library(jsimd OBJECT src/jsimd_none.c)
|
||||||
|
set_target_properties(jsimd PROPERTIES FOLDER "3rdparty")
|
||||||
|
if(NOT WIN32 AND (CMAKE_POSITION_INDEPENDENT_CODE OR ENABLE_SHARED))
|
||||||
|
set_target_properties(jsimd PROPERTIES POSITION_INDEPENDENT_CODE 1)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
ocv_list_add_prefix(JPEG_SOURCES src/)
|
ocv_list_add_prefix(JPEG_SOURCES src/)
|
||||||
|
|
||||||
add_library(${JPEG_LIBRARY} STATIC ${OPENCV_3RDPARTY_EXCLUDE_FROM_ALL} ${JPEG_SOURCES} ${SIMD_OBJS})
|
set(JPEG_SOURCES ${JPEG_SOURCES} ${SIMD_OBJS})
|
||||||
|
|
||||||
|
add_library(${JPEG_LIBRARY} STATIC ${OPENCV_3RDPARTY_EXCLUDE_FROM_ALL} ${JPEG_SOURCES} $<TARGET_OBJECTS:jsimd> ${SIMD_OBJS})
|
||||||
|
|
||||||
set_target_properties(${JPEG_LIBRARY}
|
set_target_properties(${JPEG_LIBRARY}
|
||||||
PROPERTIES OUTPUT_NAME ${JPEG_LIBRARY}
|
PROPERTIES OUTPUT_NAME ${JPEG_LIBRARY}
|
||||||
|
|||||||
Vendored
+1
-1
@@ -91,7 +91,7 @@ best of our understanding.
|
|||||||
The Modified (3-clause) BSD License
|
The Modified (3-clause) BSD License
|
||||||
===================================
|
===================================
|
||||||
|
|
||||||
Copyright (C)2009-2020 D. R. Commander. All Rights Reserved.
|
Copyright (C)2009-2022 D. R. Commander. All Rights Reserved.<br>
|
||||||
Copyright (C)2015 Viktor Szathmáry. All Rights Reserved.
|
Copyright (C)2015 Viktor Szathmáry. 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
|
||||||
|
|||||||
Vendored
+1
-14
@@ -128,7 +128,7 @@ with respect to this software, its quality, accuracy, merchantability, or
|
|||||||
fitness for a particular purpose. This software is provided "AS IS", and you,
|
fitness for a particular purpose. This software is provided "AS IS", and you,
|
||||||
its user, assume the entire risk as to its quality and accuracy.
|
its user, assume the entire risk as to its quality and accuracy.
|
||||||
|
|
||||||
This software is copyright (C) 1991-2016, Thomas G. Lane, Guido Vollbeding.
|
This software is copyright (C) 1991-2020, Thomas G. Lane, Guido Vollbeding.
|
||||||
All Rights Reserved except as specified below.
|
All Rights Reserved except as specified below.
|
||||||
|
|
||||||
Permission is hereby granted to use, copy, modify, and distribute this
|
Permission is hereby granted to use, copy, modify, and distribute this
|
||||||
@@ -159,19 +159,6 @@ commercial products, provided that all warranty or liability claims are
|
|||||||
assumed by the product vendor.
|
assumed by the product vendor.
|
||||||
|
|
||||||
|
|
||||||
The IJG distribution formerly included code to read and write GIF files.
|
|
||||||
To avoid entanglement with the Unisys LZW patent (now expired), GIF reading
|
|
||||||
support has been removed altogether, and the GIF writer has been simplified
|
|
||||||
to produce "uncompressed GIFs". This technique does not use the LZW
|
|
||||||
algorithm; the resulting GIF files are larger than usual, but are readable
|
|
||||||
by all standard GIF decoders.
|
|
||||||
|
|
||||||
We are required to state that
|
|
||||||
"The Graphics Interchange Format(c) is the Copyright property of
|
|
||||||
CompuServe Incorporated. GIF(sm) is a Service Mark property of
|
|
||||||
CompuServe Incorporated."
|
|
||||||
|
|
||||||
|
|
||||||
REFERENCES
|
REFERENCES
|
||||||
==========
|
==========
|
||||||
|
|
||||||
|
|||||||
Vendored
+1
-1
@@ -3,7 +3,7 @@ Background
|
|||||||
|
|
||||||
libjpeg-turbo is a JPEG image codec that uses SIMD instructions to accelerate
|
libjpeg-turbo is a JPEG image codec that uses SIMD instructions to accelerate
|
||||||
baseline JPEG compression and decompression on x86, x86-64, Arm, PowerPC, and
|
baseline JPEG compression and decompression on x86, x86-64, Arm, PowerPC, and
|
||||||
MIPS systems, as well as progressive JPEG compression on x86 and x86-64
|
MIPS systems, as well as progressive JPEG compression on x86, x86-64, and Arm
|
||||||
systems. On such systems, libjpeg-turbo is generally 2-6x as fast as libjpeg,
|
systems. On such systems, libjpeg-turbo is generally 2-6x as fast as libjpeg,
|
||||||
all else being equal. On other types of systems, libjpeg-turbo can still
|
all else being equal. On other types of systems, libjpeg-turbo can still
|
||||||
outperform libjpeg by a significant amount, by virtue of its highly-optimized
|
outperform libjpeg by a significant amount, by virtue of its highly-optimized
|
||||||
|
|||||||
Vendored
-5
@@ -61,11 +61,6 @@
|
|||||||
unsigned. */
|
unsigned. */
|
||||||
#cmakedefine RIGHT_SHIFT_IS_UNSIGNED 1
|
#cmakedefine RIGHT_SHIFT_IS_UNSIGNED 1
|
||||||
|
|
||||||
/* Define to 1 if type `char' is unsigned and you are not using gcc. */
|
|
||||||
#ifndef __CHAR_UNSIGNED__
|
|
||||||
#cmakedefine __CHAR_UNSIGNED__ 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Define to empty if `const' does not conform to ANSI C. */
|
/* Define to empty if `const' does not conform to ANSI C. */
|
||||||
/* #undef const */
|
/* #undef const */
|
||||||
|
|
||||||
|
|||||||
-1
@@ -18,7 +18,6 @@
|
|||||||
#define HAVE_UNSIGNED_SHORT
|
#define HAVE_UNSIGNED_SHORT
|
||||||
#undef INCOMPLETE_TYPES_BROKEN
|
#undef INCOMPLETE_TYPES_BROKEN
|
||||||
#undef RIGHT_SHIFT_IS_UNSIGNED
|
#undef RIGHT_SHIFT_IS_UNSIGNED
|
||||||
#undef __CHAR_UNSIGNED__
|
|
||||||
|
|
||||||
/* Define "boolean" as unsigned char, not int, per Windows custom */
|
/* Define "boolean" as unsigned char, not int, per Windows custom */
|
||||||
#ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */
|
#ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */
|
||||||
|
|||||||
+10
@@ -40,3 +40,13 @@
|
|||||||
#define HAVE_BITSCANFORWARD
|
#define HAVE_BITSCANFORWARD
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(__has_attribute)
|
||||||
|
#if __has_attribute(fallthrough)
|
||||||
|
#define FALLTHROUGH __attribute__((fallthrough));
|
||||||
|
#else
|
||||||
|
#define FALLTHROUGH
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#define FALLTHROUGH
|
||||||
|
#endif
|
||||||
|
|||||||
+3
-3
@@ -4,8 +4,8 @@
|
|||||||
* This file was part of the Independent JPEG Group's software:
|
* This file was part of the Independent JPEG Group's software:
|
||||||
* Copyright (C) 1994-1998, Thomas G. Lane.
|
* Copyright (C) 1994-1998, Thomas G. Lane.
|
||||||
* Modified 2003-2010 by Guido Vollbeding.
|
* Modified 2003-2010 by Guido Vollbeding.
|
||||||
* It was modified by The libjpeg-turbo Project to include only code relevant
|
* libjpeg-turbo Modifications:
|
||||||
* to libjpeg-turbo.
|
* Copyright (C) 2022, D. R. Commander.
|
||||||
* For conditions of distribution and use, see the accompanying README.ijg
|
* For conditions of distribution and use, see the accompanying README.ijg
|
||||||
* file.
|
* file.
|
||||||
*
|
*
|
||||||
@@ -52,7 +52,7 @@ jpeg_CreateCompress(j_compress_ptr cinfo, int version, size_t structsize)
|
|||||||
{
|
{
|
||||||
struct jpeg_error_mgr *err = cinfo->err;
|
struct jpeg_error_mgr *err = cinfo->err;
|
||||||
void *client_data = cinfo->client_data; /* ignore Purify complaint here */
|
void *client_data = cinfo->client_data; /* ignore Purify complaint here */
|
||||||
MEMZERO(cinfo, sizeof(struct jpeg_compress_struct));
|
memset(cinfo, 0, sizeof(struct jpeg_compress_struct));
|
||||||
cinfo->err = err;
|
cinfo->err = err;
|
||||||
cinfo->client_data = client_data;
|
cinfo->client_data = client_data;
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+6
-6
@@ -4,7 +4,7 @@
|
|||||||
* This file was part of the Independent JPEG Group's software:
|
* This file was part of the Independent JPEG Group's software:
|
||||||
* Developed 1997-2009 by Guido Vollbeding.
|
* Developed 1997-2009 by Guido Vollbeding.
|
||||||
* libjpeg-turbo Modifications:
|
* libjpeg-turbo Modifications:
|
||||||
* Copyright (C) 2015, 2018, D. R. Commander.
|
* Copyright (C) 2015, 2018, 2021-2022, D. R. Commander.
|
||||||
* For conditions of distribution and use, see the accompanying README.ijg
|
* For conditions of distribution and use, see the accompanying README.ijg
|
||||||
* file.
|
* file.
|
||||||
*
|
*
|
||||||
@@ -338,14 +338,14 @@ emit_restart(j_compress_ptr cinfo, int restart_num)
|
|||||||
compptr = cinfo->cur_comp_info[ci];
|
compptr = cinfo->cur_comp_info[ci];
|
||||||
/* DC needs no table for refinement scan */
|
/* DC needs no table for refinement scan */
|
||||||
if (cinfo->progressive_mode == 0 || (cinfo->Ss == 0 && cinfo->Ah == 0)) {
|
if (cinfo->progressive_mode == 0 || (cinfo->Ss == 0 && cinfo->Ah == 0)) {
|
||||||
MEMZERO(entropy->dc_stats[compptr->dc_tbl_no], DC_STAT_BINS);
|
memset(entropy->dc_stats[compptr->dc_tbl_no], 0, DC_STAT_BINS);
|
||||||
/* Reset DC predictions to 0 */
|
/* Reset DC predictions to 0 */
|
||||||
entropy->last_dc_val[ci] = 0;
|
entropy->last_dc_val[ci] = 0;
|
||||||
entropy->dc_context[ci] = 0;
|
entropy->dc_context[ci] = 0;
|
||||||
}
|
}
|
||||||
/* AC needs no table when not present */
|
/* AC needs no table when not present */
|
||||||
if (cinfo->progressive_mode == 0 || cinfo->Se) {
|
if (cinfo->progressive_mode == 0 || cinfo->Se) {
|
||||||
MEMZERO(entropy->ac_stats[compptr->ac_tbl_no], AC_STAT_BINS);
|
memset(entropy->ac_stats[compptr->ac_tbl_no], 0, AC_STAT_BINS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -836,7 +836,7 @@ start_pass(j_compress_ptr cinfo, boolean gather_statistics)
|
|||||||
* We are fully adaptive here and need no extra
|
* We are fully adaptive here and need no extra
|
||||||
* statistics gathering pass!
|
* statistics gathering pass!
|
||||||
*/
|
*/
|
||||||
ERREXIT(cinfo, JERR_NOT_COMPILED);
|
ERREXIT(cinfo, JERR_NOTIMPL);
|
||||||
|
|
||||||
/* We assume jcmaster.c already validated the progressive scan parameters. */
|
/* We assume jcmaster.c already validated the progressive scan parameters. */
|
||||||
|
|
||||||
@@ -867,7 +867,7 @@ start_pass(j_compress_ptr cinfo, boolean gather_statistics)
|
|||||||
if (entropy->dc_stats[tbl] == NULL)
|
if (entropy->dc_stats[tbl] == NULL)
|
||||||
entropy->dc_stats[tbl] = (unsigned char *)(*cinfo->mem->alloc_small)
|
entropy->dc_stats[tbl] = (unsigned char *)(*cinfo->mem->alloc_small)
|
||||||
((j_common_ptr)cinfo, JPOOL_IMAGE, DC_STAT_BINS);
|
((j_common_ptr)cinfo, JPOOL_IMAGE, DC_STAT_BINS);
|
||||||
MEMZERO(entropy->dc_stats[tbl], DC_STAT_BINS);
|
memset(entropy->dc_stats[tbl], 0, DC_STAT_BINS);
|
||||||
/* Initialize DC predictions to 0 */
|
/* Initialize DC predictions to 0 */
|
||||||
entropy->last_dc_val[ci] = 0;
|
entropy->last_dc_val[ci] = 0;
|
||||||
entropy->dc_context[ci] = 0;
|
entropy->dc_context[ci] = 0;
|
||||||
@@ -880,7 +880,7 @@ start_pass(j_compress_ptr cinfo, boolean gather_statistics)
|
|||||||
if (entropy->ac_stats[tbl] == NULL)
|
if (entropy->ac_stats[tbl] == NULL)
|
||||||
entropy->ac_stats[tbl] = (unsigned char *)(*cinfo->mem->alloc_small)
|
entropy->ac_stats[tbl] = (unsigned char *)(*cinfo->mem->alloc_small)
|
||||||
((j_common_ptr)cinfo, JPOOL_IMAGE, AC_STAT_BINS);
|
((j_common_ptr)cinfo, JPOOL_IMAGE, AC_STAT_BINS);
|
||||||
MEMZERO(entropy->ac_stats[tbl], AC_STAT_BINS);
|
memset(entropy->ac_stats[tbl], 0, AC_STAT_BINS);
|
||||||
#ifdef CALCULATE_SPECTRAL_CONDITIONING
|
#ifdef CALCULATE_SPECTRAL_CONDITIONING
|
||||||
if (cinfo->progressive_mode)
|
if (cinfo->progressive_mode)
|
||||||
/* Section G.1.3.2: Set appropriate arithmetic conditioning value Kx */
|
/* Section G.1.3.2: Set appropriate arithmetic conditioning value Kx */
|
||||||
|
|||||||
+9
-9
@@ -48,9 +48,9 @@ rgb_ycc_convert_internal(j_compress_ptr cinfo, JSAMPARRAY input_buf,
|
|||||||
outptr2 = output_buf[2][output_row];
|
outptr2 = output_buf[2][output_row];
|
||||||
output_row++;
|
output_row++;
|
||||||
for (col = 0; col < num_cols; col++) {
|
for (col = 0; col < num_cols; col++) {
|
||||||
r = GETJSAMPLE(inptr[RGB_RED]);
|
r = inptr[RGB_RED];
|
||||||
g = GETJSAMPLE(inptr[RGB_GREEN]);
|
g = inptr[RGB_GREEN];
|
||||||
b = GETJSAMPLE(inptr[RGB_BLUE]);
|
b = inptr[RGB_BLUE];
|
||||||
inptr += RGB_PIXELSIZE;
|
inptr += RGB_PIXELSIZE;
|
||||||
/* If the inputs are 0..MAXJSAMPLE, the outputs of these equations
|
/* If the inputs are 0..MAXJSAMPLE, the outputs of these equations
|
||||||
* must be too; we do not need an explicit range-limiting operation.
|
* must be too; we do not need an explicit range-limiting operation.
|
||||||
@@ -100,9 +100,9 @@ rgb_gray_convert_internal(j_compress_ptr cinfo, JSAMPARRAY input_buf,
|
|||||||
outptr = output_buf[0][output_row];
|
outptr = output_buf[0][output_row];
|
||||||
output_row++;
|
output_row++;
|
||||||
for (col = 0; col < num_cols; col++) {
|
for (col = 0; col < num_cols; col++) {
|
||||||
r = GETJSAMPLE(inptr[RGB_RED]);
|
r = inptr[RGB_RED];
|
||||||
g = GETJSAMPLE(inptr[RGB_GREEN]);
|
g = inptr[RGB_GREEN];
|
||||||
b = GETJSAMPLE(inptr[RGB_BLUE]);
|
b = inptr[RGB_BLUE];
|
||||||
inptr += RGB_PIXELSIZE;
|
inptr += RGB_PIXELSIZE;
|
||||||
/* Y */
|
/* Y */
|
||||||
outptr[col] = (JSAMPLE)((ctab[r + R_Y_OFF] + ctab[g + G_Y_OFF] +
|
outptr[col] = (JSAMPLE)((ctab[r + R_Y_OFF] + ctab[g + G_Y_OFF] +
|
||||||
@@ -135,9 +135,9 @@ rgb_rgb_convert_internal(j_compress_ptr cinfo, JSAMPARRAY input_buf,
|
|||||||
outptr2 = output_buf[2][output_row];
|
outptr2 = output_buf[2][output_row];
|
||||||
output_row++;
|
output_row++;
|
||||||
for (col = 0; col < num_cols; col++) {
|
for (col = 0; col < num_cols; col++) {
|
||||||
outptr0[col] = GETJSAMPLE(inptr[RGB_RED]);
|
outptr0[col] = inptr[RGB_RED];
|
||||||
outptr1[col] = GETJSAMPLE(inptr[RGB_GREEN]);
|
outptr1[col] = inptr[RGB_GREEN];
|
||||||
outptr2[col] = GETJSAMPLE(inptr[RGB_BLUE]);
|
outptr2[col] = inptr[RGB_BLUE];
|
||||||
inptr += RGB_PIXELSIZE;
|
inptr += RGB_PIXELSIZE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+6
-6
@@ -392,11 +392,11 @@ cmyk_ycck_convert(j_compress_ptr cinfo, JSAMPARRAY input_buf,
|
|||||||
outptr3 = output_buf[3][output_row];
|
outptr3 = output_buf[3][output_row];
|
||||||
output_row++;
|
output_row++;
|
||||||
for (col = 0; col < num_cols; col++) {
|
for (col = 0; col < num_cols; col++) {
|
||||||
r = MAXJSAMPLE - GETJSAMPLE(inptr[0]);
|
r = MAXJSAMPLE - inptr[0];
|
||||||
g = MAXJSAMPLE - GETJSAMPLE(inptr[1]);
|
g = MAXJSAMPLE - inptr[1];
|
||||||
b = MAXJSAMPLE - GETJSAMPLE(inptr[2]);
|
b = MAXJSAMPLE - inptr[2];
|
||||||
/* K passes through as-is */
|
/* K passes through as-is */
|
||||||
outptr3[col] = inptr[3]; /* don't need GETJSAMPLE here */
|
outptr3[col] = inptr[3];
|
||||||
inptr += 4;
|
inptr += 4;
|
||||||
/* If the inputs are 0..MAXJSAMPLE, the outputs of these equations
|
/* If the inputs are 0..MAXJSAMPLE, the outputs of these equations
|
||||||
* must be too; we do not need an explicit range-limiting operation.
|
* must be too; we do not need an explicit range-limiting operation.
|
||||||
@@ -438,7 +438,7 @@ grayscale_convert(j_compress_ptr cinfo, JSAMPARRAY input_buf,
|
|||||||
outptr = output_buf[0][output_row];
|
outptr = output_buf[0][output_row];
|
||||||
output_row++;
|
output_row++;
|
||||||
for (col = 0; col < num_cols; col++) {
|
for (col = 0; col < num_cols; col++) {
|
||||||
outptr[col] = inptr[0]; /* don't need GETJSAMPLE() here */
|
outptr[col] = inptr[0];
|
||||||
inptr += instride;
|
inptr += instride;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -497,7 +497,7 @@ null_convert(j_compress_ptr cinfo, JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
|
|||||||
inptr = *input_buf;
|
inptr = *input_buf;
|
||||||
outptr = output_buf[ci][output_row];
|
outptr = output_buf[ci][output_row];
|
||||||
for (col = 0; col < num_cols; col++) {
|
for (col = 0; col < num_cols; col++) {
|
||||||
outptr[col] = inptr[ci]; /* don't need GETJSAMPLE() here */
|
outptr[col] = inptr[ci];
|
||||||
inptr += nc;
|
inptr += nc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+18
-19
@@ -381,19 +381,19 @@ convsamp(JSAMPARRAY sample_data, JDIMENSION start_col, DCTELEM *workspace)
|
|||||||
elemptr = sample_data[elemr] + start_col;
|
elemptr = sample_data[elemr] + start_col;
|
||||||
|
|
||||||
#if DCTSIZE == 8 /* unroll the inner loop */
|
#if DCTSIZE == 8 /* unroll the inner loop */
|
||||||
*workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
|
*workspaceptr++ = (*elemptr++) - CENTERJSAMPLE;
|
||||||
*workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
|
*workspaceptr++ = (*elemptr++) - CENTERJSAMPLE;
|
||||||
*workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
|
*workspaceptr++ = (*elemptr++) - CENTERJSAMPLE;
|
||||||
*workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
|
*workspaceptr++ = (*elemptr++) - CENTERJSAMPLE;
|
||||||
*workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
|
*workspaceptr++ = (*elemptr++) - CENTERJSAMPLE;
|
||||||
*workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
|
*workspaceptr++ = (*elemptr++) - CENTERJSAMPLE;
|
||||||
*workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
|
*workspaceptr++ = (*elemptr++) - CENTERJSAMPLE;
|
||||||
*workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
|
*workspaceptr++ = (*elemptr++) - CENTERJSAMPLE;
|
||||||
#else
|
#else
|
||||||
{
|
{
|
||||||
register int elemc;
|
register int elemc;
|
||||||
for (elemc = DCTSIZE; elemc > 0; elemc--)
|
for (elemc = DCTSIZE; elemc > 0; elemc--)
|
||||||
*workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
|
*workspaceptr++ = (*elemptr++) - CENTERJSAMPLE;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -533,20 +533,19 @@ convsamp_float(JSAMPARRAY sample_data, JDIMENSION start_col,
|
|||||||
for (elemr = 0; elemr < DCTSIZE; elemr++) {
|
for (elemr = 0; elemr < DCTSIZE; elemr++) {
|
||||||
elemptr = sample_data[elemr] + start_col;
|
elemptr = sample_data[elemr] + start_col;
|
||||||
#if DCTSIZE == 8 /* unroll the inner loop */
|
#if DCTSIZE == 8 /* unroll the inner loop */
|
||||||
*workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
|
*workspaceptr++ = (FAST_FLOAT)((*elemptr++) - CENTERJSAMPLE);
|
||||||
*workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
|
*workspaceptr++ = (FAST_FLOAT)((*elemptr++) - CENTERJSAMPLE);
|
||||||
*workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
|
*workspaceptr++ = (FAST_FLOAT)((*elemptr++) - CENTERJSAMPLE);
|
||||||
*workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
|
*workspaceptr++ = (FAST_FLOAT)((*elemptr++) - CENTERJSAMPLE);
|
||||||
*workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
|
*workspaceptr++ = (FAST_FLOAT)((*elemptr++) - CENTERJSAMPLE);
|
||||||
*workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
|
*workspaceptr++ = (FAST_FLOAT)((*elemptr++) - CENTERJSAMPLE);
|
||||||
*workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
|
*workspaceptr++ = (FAST_FLOAT)((*elemptr++) - CENTERJSAMPLE);
|
||||||
*workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
|
*workspaceptr++ = (FAST_FLOAT)((*elemptr++) - CENTERJSAMPLE);
|
||||||
#else
|
#else
|
||||||
{
|
{
|
||||||
register int elemc;
|
register int elemc;
|
||||||
for (elemc = DCTSIZE; elemc > 0; elemc--)
|
for (elemc = DCTSIZE; elemc > 0; elemc--)
|
||||||
*workspaceptr++ = (FAST_FLOAT)
|
*workspaceptr++ = (FAST_FLOAT)((*elemptr++) - CENTERJSAMPLE);
|
||||||
(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+229
-188
@@ -4,8 +4,10 @@
|
|||||||
* This file was part of the Independent JPEG Group's software:
|
* This file was part of the Independent JPEG Group's software:
|
||||||
* Copyright (C) 1991-1997, Thomas G. Lane.
|
* Copyright (C) 1991-1997, Thomas G. Lane.
|
||||||
* libjpeg-turbo Modifications:
|
* libjpeg-turbo Modifications:
|
||||||
* Copyright (C) 2009-2011, 2014-2016, 2018-2019, D. R. Commander.
|
* Copyright (C) 2009-2011, 2014-2016, 2018-2022, D. R. Commander.
|
||||||
* Copyright (C) 2015, Matthieu Darbois.
|
* Copyright (C) 2015, Matthieu Darbois.
|
||||||
|
* Copyright (C) 2018, Matthias Räncker.
|
||||||
|
* Copyright (C) 2020, Arm Limited.
|
||||||
* For conditions of distribution and use, see the accompanying README.ijg
|
* For conditions of distribution and use, see the accompanying README.ijg
|
||||||
* file.
|
* file.
|
||||||
*
|
*
|
||||||
@@ -43,14 +45,19 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* NOTE: Both GCC and Clang define __GNUC__ */
|
/* NOTE: Both GCC and Clang define __GNUC__ */
|
||||||
#if defined(__GNUC__) && (defined(__arm__) || defined(__aarch64__))
|
#if (defined(__GNUC__) && (defined(__arm__) || defined(__aarch64__))) || \
|
||||||
|
defined(_M_ARM) || defined(_M_ARM64)
|
||||||
#if !defined(__thumb__) || defined(__thumb2__)
|
#if !defined(__thumb__) || defined(__thumb2__)
|
||||||
#define USE_CLZ_INTRINSIC
|
#define USE_CLZ_INTRINSIC
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef USE_CLZ_INTRINSIC
|
#ifdef USE_CLZ_INTRINSIC
|
||||||
|
#if defined(_MSC_VER) && !defined(__clang__)
|
||||||
|
#define JPEG_NBITS_NONZERO(x) (32 - _CountLeadingZeros(x))
|
||||||
|
#else
|
||||||
#define JPEG_NBITS_NONZERO(x) (32 - __builtin_clz(x))
|
#define JPEG_NBITS_NONZERO(x) (32 - __builtin_clz(x))
|
||||||
|
#endif
|
||||||
#define JPEG_NBITS(x) (x ? JPEG_NBITS_NONZERO(x) : 0)
|
#define JPEG_NBITS(x) (x ? JPEG_NBITS_NONZERO(x) : 0)
|
||||||
#else
|
#else
|
||||||
#include "jpeg_nbits_table.h"
|
#include "jpeg_nbits_table.h"
|
||||||
@@ -65,32 +72,43 @@
|
|||||||
* but must not be updated permanently until we complete the MCU.
|
* but must not be updated permanently until we complete the MCU.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#if defined(__x86_64__) && defined(__ILP32__)
|
||||||
|
typedef unsigned long long bit_buf_type;
|
||||||
|
#else
|
||||||
|
typedef size_t bit_buf_type;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* NOTE: The more optimal Huffman encoding algorithm is only used by the
|
||||||
|
* intrinsics implementation of the Arm Neon SIMD extensions, which is why we
|
||||||
|
* retain the old Huffman encoder behavior when using the GAS implementation.
|
||||||
|
*/
|
||||||
|
#if defined(WITH_SIMD) && !(defined(__arm__) || defined(__aarch64__) || \
|
||||||
|
defined(_M_ARM) || defined(_M_ARM64))
|
||||||
|
typedef unsigned long long simd_bit_buf_type;
|
||||||
|
#else
|
||||||
|
typedef bit_buf_type simd_bit_buf_type;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(SIZEOF_SIZE_T) && SIZEOF_SIZE_T == 8) || defined(_WIN64) || \
|
||||||
|
(defined(__x86_64__) && defined(__ILP32__))
|
||||||
|
#define BIT_BUF_SIZE 64
|
||||||
|
#elif (defined(SIZEOF_SIZE_T) && SIZEOF_SIZE_T == 4) || defined(_WIN32)
|
||||||
|
#define BIT_BUF_SIZE 32
|
||||||
|
#else
|
||||||
|
#error Cannot determine word size
|
||||||
|
#endif
|
||||||
|
#define SIMD_BIT_BUF_SIZE (sizeof(simd_bit_buf_type) * 8)
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
size_t put_buffer; /* current bit-accumulation buffer */
|
union {
|
||||||
int put_bits; /* # of bits now in it */
|
bit_buf_type c;
|
||||||
|
simd_bit_buf_type simd;
|
||||||
|
} put_buffer; /* current bit accumulation buffer */
|
||||||
|
int free_bits; /* # of bits available in it */
|
||||||
|
/* (Neon GAS: # of bits now in it) */
|
||||||
int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */
|
int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */
|
||||||
} savable_state;
|
} savable_state;
|
||||||
|
|
||||||
/* This macro is to work around compilers with missing or broken
|
|
||||||
* structure assignment. You'll need to fix this code if you have
|
|
||||||
* such a compiler and you change MAX_COMPS_IN_SCAN.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef NO_STRUCT_ASSIGN
|
|
||||||
#define ASSIGN_STATE(dest, src) ((dest) = (src))
|
|
||||||
#else
|
|
||||||
#if MAX_COMPS_IN_SCAN == 4
|
|
||||||
#define ASSIGN_STATE(dest, src) \
|
|
||||||
((dest).put_buffer = (src).put_buffer, \
|
|
||||||
(dest).put_bits = (src).put_bits, \
|
|
||||||
(dest).last_dc_val[0] = (src).last_dc_val[0], \
|
|
||||||
(dest).last_dc_val[1] = (src).last_dc_val[1], \
|
|
||||||
(dest).last_dc_val[2] = (src).last_dc_val[2], \
|
|
||||||
(dest).last_dc_val[3] = (src).last_dc_val[3])
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
struct jpeg_entropy_encoder pub; /* public fields */
|
struct jpeg_entropy_encoder pub; /* public fields */
|
||||||
|
|
||||||
@@ -123,6 +141,7 @@ typedef struct {
|
|||||||
size_t free_in_buffer; /* # of byte spaces remaining in buffer */
|
size_t free_in_buffer; /* # of byte spaces remaining in buffer */
|
||||||
savable_state cur; /* Current bit buffer & DC state */
|
savable_state cur; /* Current bit buffer & DC state */
|
||||||
j_compress_ptr cinfo; /* dump_buffer needs access to this */
|
j_compress_ptr cinfo; /* dump_buffer needs access to this */
|
||||||
|
int simd;
|
||||||
} working_state;
|
} working_state;
|
||||||
|
|
||||||
|
|
||||||
@@ -181,12 +200,12 @@ start_pass_huff(j_compress_ptr cinfo, boolean gather_statistics)
|
|||||||
entropy->dc_count_ptrs[dctbl] = (long *)
|
entropy->dc_count_ptrs[dctbl] = (long *)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
|
(*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
|
||||||
257 * sizeof(long));
|
257 * sizeof(long));
|
||||||
MEMZERO(entropy->dc_count_ptrs[dctbl], 257 * sizeof(long));
|
memset(entropy->dc_count_ptrs[dctbl], 0, 257 * sizeof(long));
|
||||||
if (entropy->ac_count_ptrs[actbl] == NULL)
|
if (entropy->ac_count_ptrs[actbl] == NULL)
|
||||||
entropy->ac_count_ptrs[actbl] = (long *)
|
entropy->ac_count_ptrs[actbl] = (long *)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
|
(*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
|
||||||
257 * sizeof(long));
|
257 * sizeof(long));
|
||||||
MEMZERO(entropy->ac_count_ptrs[actbl], 257 * sizeof(long));
|
memset(entropy->ac_count_ptrs[actbl], 0, 257 * sizeof(long));
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
/* Compute derived values for Huffman tables */
|
/* Compute derived values for Huffman tables */
|
||||||
@@ -201,8 +220,17 @@ start_pass_huff(j_compress_ptr cinfo, boolean gather_statistics)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize bit buffer to empty */
|
/* Initialize bit buffer to empty */
|
||||||
entropy->saved.put_buffer = 0;
|
if (entropy->simd) {
|
||||||
entropy->saved.put_bits = 0;
|
entropy->saved.put_buffer.simd = 0;
|
||||||
|
#if defined(__aarch64__) && !defined(NEON_INTRINSICS)
|
||||||
|
entropy->saved.free_bits = 0;
|
||||||
|
#else
|
||||||
|
entropy->saved.free_bits = SIMD_BIT_BUF_SIZE;
|
||||||
|
#endif
|
||||||
|
} else {
|
||||||
|
entropy->saved.put_buffer.c = 0;
|
||||||
|
entropy->saved.free_bits = BIT_BUF_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
/* Initialize restart stuff */
|
/* Initialize restart stuff */
|
||||||
entropy->restarts_to_go = cinfo->restart_interval;
|
entropy->restarts_to_go = cinfo->restart_interval;
|
||||||
@@ -287,7 +315,8 @@ jpeg_make_c_derived_tbl(j_compress_ptr cinfo, boolean isDC, int tblno,
|
|||||||
* this lets us detect duplicate VAL entries here, and later
|
* this lets us detect duplicate VAL entries here, and later
|
||||||
* allows emit_bits to detect any attempt to emit such symbols.
|
* allows emit_bits to detect any attempt to emit such symbols.
|
||||||
*/
|
*/
|
||||||
MEMZERO(dtbl->ehufsi, sizeof(dtbl->ehufsi));
|
memset(dtbl->ehufco, 0, sizeof(dtbl->ehufco));
|
||||||
|
memset(dtbl->ehufsi, 0, sizeof(dtbl->ehufsi));
|
||||||
|
|
||||||
/* This is also a convenient place to check for out-of-range
|
/* This is also a convenient place to check for out-of-range
|
||||||
* and duplicated VAL entries. We allow 0..255 for AC symbols
|
* and duplicated VAL entries. We allow 0..255 for AC symbols
|
||||||
@@ -334,94 +363,94 @@ dump_buffer(working_state *state)
|
|||||||
|
|
||||||
/* Outputting bits to the file */
|
/* Outputting bits to the file */
|
||||||
|
|
||||||
/* These macros perform the same task as the emit_bits() function in the
|
/* Output byte b and, speculatively, an additional 0 byte. 0xFF must be
|
||||||
* original libjpeg code. In addition to reducing overhead by explicitly
|
* encoded as 0xFF 0x00, so the output buffer pointer is advanced by 2 if the
|
||||||
* inlining the code, additional performance is achieved by taking into
|
* byte is 0xFF. Otherwise, the output buffer pointer is advanced by 1, and
|
||||||
* account the size of the bit buffer and waiting until it is almost full
|
* the speculative 0 byte will be overwritten by the next byte.
|
||||||
* before emptying it. This mostly benefits 64-bit platforms, since 6
|
|
||||||
* bytes can be stored in a 64-bit bit buffer before it has to be emptied.
|
|
||||||
*/
|
*/
|
||||||
|
#define EMIT_BYTE(b) { \
|
||||||
#define EMIT_BYTE() { \
|
buffer[0] = (JOCTET)(b); \
|
||||||
JOCTET c; \
|
buffer[1] = 0; \
|
||||||
put_bits -= 8; \
|
buffer -= -2 + ((JOCTET)(b) < 0xFF); \
|
||||||
c = (JOCTET)GETJOCTET(put_buffer >> put_bits); \
|
|
||||||
*buffer++ = c; \
|
|
||||||
if (c == 0xFF) /* need to stuff a zero byte? */ \
|
|
||||||
*buffer++ = 0; \
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#define PUT_BITS(code, size) { \
|
/* Output the entire bit buffer. If there are no 0xFF bytes in it, then write
|
||||||
put_bits += size; \
|
* directly to the output buffer. Otherwise, use the EMIT_BYTE() macro to
|
||||||
put_buffer = (put_buffer << size) | code; \
|
* encode 0xFF as 0xFF 0x00.
|
||||||
}
|
*/
|
||||||
|
#if BIT_BUF_SIZE == 64
|
||||||
|
|
||||||
#if SIZEOF_SIZE_T != 8 && !defined(_WIN64)
|
#define FLUSH() { \
|
||||||
|
if (put_buffer & 0x8080808080808080 & ~(put_buffer + 0x0101010101010101)) { \
|
||||||
#define CHECKBUF15() { \
|
EMIT_BYTE(put_buffer >> 56) \
|
||||||
if (put_bits > 15) { \
|
EMIT_BYTE(put_buffer >> 48) \
|
||||||
EMIT_BYTE() \
|
EMIT_BYTE(put_buffer >> 40) \
|
||||||
EMIT_BYTE() \
|
EMIT_BYTE(put_buffer >> 32) \
|
||||||
|
EMIT_BYTE(put_buffer >> 24) \
|
||||||
|
EMIT_BYTE(put_buffer >> 16) \
|
||||||
|
EMIT_BYTE(put_buffer >> 8) \
|
||||||
|
EMIT_BYTE(put_buffer ) \
|
||||||
|
} else { \
|
||||||
|
buffer[0] = (JOCTET)(put_buffer >> 56); \
|
||||||
|
buffer[1] = (JOCTET)(put_buffer >> 48); \
|
||||||
|
buffer[2] = (JOCTET)(put_buffer >> 40); \
|
||||||
|
buffer[3] = (JOCTET)(put_buffer >> 32); \
|
||||||
|
buffer[4] = (JOCTET)(put_buffer >> 24); \
|
||||||
|
buffer[5] = (JOCTET)(put_buffer >> 16); \
|
||||||
|
buffer[6] = (JOCTET)(put_buffer >> 8); \
|
||||||
|
buffer[7] = (JOCTET)(put_buffer); \
|
||||||
|
buffer += 8; \
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define CHECKBUF31() { \
|
|
||||||
if (put_bits > 31) { \
|
|
||||||
EMIT_BYTE() \
|
|
||||||
EMIT_BYTE() \
|
|
||||||
EMIT_BYTE() \
|
|
||||||
EMIT_BYTE() \
|
|
||||||
} \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define CHECKBUF47() { \
|
|
||||||
if (put_bits > 47) { \
|
|
||||||
EMIT_BYTE() \
|
|
||||||
EMIT_BYTE() \
|
|
||||||
EMIT_BYTE() \
|
|
||||||
EMIT_BYTE() \
|
|
||||||
EMIT_BYTE() \
|
|
||||||
EMIT_BYTE() \
|
|
||||||
} \
|
|
||||||
}
|
|
||||||
|
|
||||||
#if !defined(_WIN32) && !defined(SIZEOF_SIZE_T)
|
|
||||||
#error Cannot determine word size
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if SIZEOF_SIZE_T == 8 || defined(_WIN64)
|
|
||||||
|
|
||||||
#define EMIT_BITS(code, size) { \
|
|
||||||
CHECKBUF47() \
|
|
||||||
PUT_BITS(code, size) \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define EMIT_CODE(code, size) { \
|
|
||||||
temp2 &= (((JLONG)1) << nbits) - 1; \
|
|
||||||
CHECKBUF31() \
|
|
||||||
PUT_BITS(code, size) \
|
|
||||||
PUT_BITS(temp2, nbits) \
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#define EMIT_BITS(code, size) { \
|
#define FLUSH() { \
|
||||||
PUT_BITS(code, size) \
|
if (put_buffer & 0x80808080 & ~(put_buffer + 0x01010101)) { \
|
||||||
CHECKBUF15() \
|
EMIT_BYTE(put_buffer >> 24) \
|
||||||
}
|
EMIT_BYTE(put_buffer >> 16) \
|
||||||
|
EMIT_BYTE(put_buffer >> 8) \
|
||||||
#define EMIT_CODE(code, size) { \
|
EMIT_BYTE(put_buffer ) \
|
||||||
temp2 &= (((JLONG)1) << nbits) - 1; \
|
} else { \
|
||||||
PUT_BITS(code, size) \
|
buffer[0] = (JOCTET)(put_buffer >> 24); \
|
||||||
CHECKBUF15() \
|
buffer[1] = (JOCTET)(put_buffer >> 16); \
|
||||||
PUT_BITS(temp2, nbits) \
|
buffer[2] = (JOCTET)(put_buffer >> 8); \
|
||||||
CHECKBUF15() \
|
buffer[3] = (JOCTET)(put_buffer); \
|
||||||
|
buffer += 4; \
|
||||||
|
} \
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Fill the bit buffer to capacity with the leading bits from code, then output
|
||||||
|
* the bit buffer and put the remaining bits from code into the bit buffer.
|
||||||
|
*/
|
||||||
|
#define PUT_AND_FLUSH(code, size) { \
|
||||||
|
put_buffer = (put_buffer << (size + free_bits)) | (code >> -free_bits); \
|
||||||
|
FLUSH() \
|
||||||
|
free_bits += BIT_BUF_SIZE; \
|
||||||
|
put_buffer = code; \
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Insert code into the bit buffer and output the bit buffer if needed.
|
||||||
|
* NOTE: We can't flush with free_bits == 0, since the left shift in
|
||||||
|
* PUT_AND_FLUSH() would have undefined behavior.
|
||||||
|
*/
|
||||||
|
#define PUT_BITS(code, size) { \
|
||||||
|
free_bits -= size; \
|
||||||
|
if (free_bits < 0) \
|
||||||
|
PUT_AND_FLUSH(code, size) \
|
||||||
|
else \
|
||||||
|
put_buffer = (put_buffer << size) | code; \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define PUT_CODE(code, size) { \
|
||||||
|
temp &= (((JLONG)1) << nbits) - 1; \
|
||||||
|
temp |= code << nbits; \
|
||||||
|
nbits += size; \
|
||||||
|
PUT_BITS(temp, nbits) \
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Although it is exceedingly rare, it is possible for a Huffman-encoded
|
/* Although it is exceedingly rare, it is possible for a Huffman-encoded
|
||||||
* coefficient block to be larger than the 128-byte unencoded block. For each
|
* coefficient block to be larger than the 128-byte unencoded block. For each
|
||||||
@@ -444,11 +473,12 @@ dump_buffer(working_state *state)
|
|||||||
|
|
||||||
#define STORE_BUFFER() { \
|
#define STORE_BUFFER() { \
|
||||||
if (localbuf) { \
|
if (localbuf) { \
|
||||||
|
size_t bytes, bytestocopy; \
|
||||||
bytes = buffer - _buffer; \
|
bytes = buffer - _buffer; \
|
||||||
buffer = _buffer; \
|
buffer = _buffer; \
|
||||||
while (bytes > 0) { \
|
while (bytes > 0) { \
|
||||||
bytestocopy = MIN(bytes, state->free_in_buffer); \
|
bytestocopy = MIN(bytes, state->free_in_buffer); \
|
||||||
MEMCOPY(state->next_output_byte, buffer, bytestocopy); \
|
memcpy(state->next_output_byte, buffer, bytestocopy); \
|
||||||
state->next_output_byte += bytestocopy; \
|
state->next_output_byte += bytestocopy; \
|
||||||
buffer += bytestocopy; \
|
buffer += bytestocopy; \
|
||||||
state->free_in_buffer -= bytestocopy; \
|
state->free_in_buffer -= bytestocopy; \
|
||||||
@@ -466,20 +496,46 @@ dump_buffer(working_state *state)
|
|||||||
LOCAL(boolean)
|
LOCAL(boolean)
|
||||||
flush_bits(working_state *state)
|
flush_bits(working_state *state)
|
||||||
{
|
{
|
||||||
JOCTET _buffer[BUFSIZE], *buffer;
|
JOCTET _buffer[BUFSIZE], *buffer, temp;
|
||||||
size_t put_buffer; int put_bits;
|
simd_bit_buf_type put_buffer; int put_bits;
|
||||||
size_t bytes, bytestocopy; int localbuf = 0;
|
int localbuf = 0;
|
||||||
|
|
||||||
|
if (state->simd) {
|
||||||
|
#if defined(__aarch64__) && !defined(NEON_INTRINSICS)
|
||||||
|
put_bits = state->cur.free_bits;
|
||||||
|
#else
|
||||||
|
put_bits = SIMD_BIT_BUF_SIZE - state->cur.free_bits;
|
||||||
|
#endif
|
||||||
|
put_buffer = state->cur.put_buffer.simd;
|
||||||
|
} else {
|
||||||
|
put_bits = BIT_BUF_SIZE - state->cur.free_bits;
|
||||||
|
put_buffer = state->cur.put_buffer.c;
|
||||||
|
}
|
||||||
|
|
||||||
put_buffer = state->cur.put_buffer;
|
|
||||||
put_bits = state->cur.put_bits;
|
|
||||||
LOAD_BUFFER()
|
LOAD_BUFFER()
|
||||||
|
|
||||||
/* fill any partial byte with ones */
|
while (put_bits >= 8) {
|
||||||
PUT_BITS(0x7F, 7)
|
put_bits -= 8;
|
||||||
while (put_bits >= 8) EMIT_BYTE()
|
temp = (JOCTET)(put_buffer >> put_bits);
|
||||||
|
EMIT_BYTE(temp)
|
||||||
|
}
|
||||||
|
if (put_bits) {
|
||||||
|
/* fill partial byte with ones */
|
||||||
|
temp = (JOCTET)((put_buffer << (8 - put_bits)) | (0xFF >> put_bits));
|
||||||
|
EMIT_BYTE(temp)
|
||||||
|
}
|
||||||
|
|
||||||
state->cur.put_buffer = 0; /* and reset bit-buffer to empty */
|
if (state->simd) { /* and reset bit buffer to empty */
|
||||||
state->cur.put_bits = 0;
|
state->cur.put_buffer.simd = 0;
|
||||||
|
#if defined(__aarch64__) && !defined(NEON_INTRINSICS)
|
||||||
|
state->cur.free_bits = 0;
|
||||||
|
#else
|
||||||
|
state->cur.free_bits = SIMD_BIT_BUF_SIZE;
|
||||||
|
#endif
|
||||||
|
} else {
|
||||||
|
state->cur.put_buffer.c = 0;
|
||||||
|
state->cur.free_bits = BIT_BUF_SIZE;
|
||||||
|
}
|
||||||
STORE_BUFFER()
|
STORE_BUFFER()
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@@ -493,7 +549,7 @@ encode_one_block_simd(working_state *state, JCOEFPTR block, int last_dc_val,
|
|||||||
c_derived_tbl *dctbl, c_derived_tbl *actbl)
|
c_derived_tbl *dctbl, c_derived_tbl *actbl)
|
||||||
{
|
{
|
||||||
JOCTET _buffer[BUFSIZE], *buffer;
|
JOCTET _buffer[BUFSIZE], *buffer;
|
||||||
size_t bytes, bytestocopy; int localbuf = 0;
|
int localbuf = 0;
|
||||||
|
|
||||||
LOAD_BUFFER()
|
LOAD_BUFFER()
|
||||||
|
|
||||||
@@ -509,53 +565,41 @@ LOCAL(boolean)
|
|||||||
encode_one_block(working_state *state, JCOEFPTR block, int last_dc_val,
|
encode_one_block(working_state *state, JCOEFPTR block, int last_dc_val,
|
||||||
c_derived_tbl *dctbl, c_derived_tbl *actbl)
|
c_derived_tbl *dctbl, c_derived_tbl *actbl)
|
||||||
{
|
{
|
||||||
int temp, temp2, temp3;
|
int temp, nbits, free_bits;
|
||||||
int nbits;
|
bit_buf_type put_buffer;
|
||||||
int r, code, size;
|
|
||||||
JOCTET _buffer[BUFSIZE], *buffer;
|
JOCTET _buffer[BUFSIZE], *buffer;
|
||||||
size_t put_buffer; int put_bits;
|
int localbuf = 0;
|
||||||
int code_0xf0 = actbl->ehufco[0xf0], size_0xf0 = actbl->ehufsi[0xf0];
|
|
||||||
size_t bytes, bytestocopy; int localbuf = 0;
|
|
||||||
|
|
||||||
put_buffer = state->cur.put_buffer;
|
free_bits = state->cur.free_bits;
|
||||||
put_bits = state->cur.put_bits;
|
put_buffer = state->cur.put_buffer.c;
|
||||||
LOAD_BUFFER()
|
LOAD_BUFFER()
|
||||||
|
|
||||||
/* Encode the DC coefficient difference per section F.1.2.1 */
|
/* Encode the DC coefficient difference per section F.1.2.1 */
|
||||||
|
|
||||||
temp = temp2 = block[0] - last_dc_val;
|
temp = block[0] - last_dc_val;
|
||||||
|
|
||||||
/* This is a well-known technique for obtaining the absolute value without a
|
/* This is a well-known technique for obtaining the absolute value without a
|
||||||
* branch. It is derived from an assembly language technique presented in
|
* branch. It is derived from an assembly language technique presented in
|
||||||
* "How to Optimize for the Pentium Processors", Copyright (c) 1996, 1997 by
|
* "How to Optimize for the Pentium Processors", Copyright (c) 1996, 1997 by
|
||||||
* Agner Fog.
|
* Agner Fog. This code assumes we are on a two's complement machine.
|
||||||
*/
|
*/
|
||||||
temp3 = temp >> (CHAR_BIT * sizeof(int) - 1);
|
nbits = temp >> (CHAR_BIT * sizeof(int) - 1);
|
||||||
temp ^= temp3;
|
temp += nbits;
|
||||||
temp -= temp3;
|
nbits ^= temp;
|
||||||
|
|
||||||
/* For a negative input, want temp2 = bitwise complement of abs(input) */
|
|
||||||
/* This code assumes we are on a two's complement machine */
|
|
||||||
temp2 += temp3;
|
|
||||||
|
|
||||||
/* Find the number of bits needed for the magnitude of the coefficient */
|
/* Find the number of bits needed for the magnitude of the coefficient */
|
||||||
nbits = JPEG_NBITS(temp);
|
nbits = JPEG_NBITS(nbits);
|
||||||
|
|
||||||
/* Emit the Huffman-coded symbol for the number of bits */
|
/* Emit the Huffman-coded symbol for the number of bits.
|
||||||
code = dctbl->ehufco[nbits];
|
* Emit that number of bits of the value, if positive,
|
||||||
size = dctbl->ehufsi[nbits];
|
* or the complement of its magnitude, if negative.
|
||||||
EMIT_BITS(code, size)
|
*/
|
||||||
|
PUT_CODE(dctbl->ehufco[nbits], dctbl->ehufsi[nbits])
|
||||||
/* Mask off any extra bits in code */
|
|
||||||
temp2 &= (((JLONG)1) << nbits) - 1;
|
|
||||||
|
|
||||||
/* Emit that number of bits of the value, if positive, */
|
|
||||||
/* or the complement of its magnitude, if negative. */
|
|
||||||
EMIT_BITS(temp2, nbits)
|
|
||||||
|
|
||||||
/* Encode the AC coefficients per section F.1.2.2 */
|
/* Encode the AC coefficients per section F.1.2.2 */
|
||||||
|
|
||||||
r = 0; /* r = run length of zeros */
|
{
|
||||||
|
int r = 0; /* r = run length of zeros */
|
||||||
|
|
||||||
/* Manually unroll the k loop to eliminate the counter variable. This
|
/* Manually unroll the k loop to eliminate the counter variable. This
|
||||||
* improves performance greatly on systems with a limited number of
|
* improves performance greatly on systems with a limited number of
|
||||||
@@ -563,51 +607,46 @@ encode_one_block(working_state *state, JCOEFPTR block, int last_dc_val,
|
|||||||
*/
|
*/
|
||||||
#define kloop(jpeg_natural_order_of_k) { \
|
#define kloop(jpeg_natural_order_of_k) { \
|
||||||
if ((temp = block[jpeg_natural_order_of_k]) == 0) { \
|
if ((temp = block[jpeg_natural_order_of_k]) == 0) { \
|
||||||
r++; \
|
r += 16; \
|
||||||
} else { \
|
} else { \
|
||||||
temp2 = temp; \
|
|
||||||
/* Branch-less absolute value, bitwise complement, etc., same as above */ \
|
/* Branch-less absolute value, bitwise complement, etc., same as above */ \
|
||||||
temp3 = temp >> (CHAR_BIT * sizeof(int) - 1); \
|
nbits = temp >> (CHAR_BIT * sizeof(int) - 1); \
|
||||||
temp ^= temp3; \
|
temp += nbits; \
|
||||||
temp -= temp3; \
|
nbits ^= temp; \
|
||||||
temp2 += temp3; \
|
nbits = JPEG_NBITS_NONZERO(nbits); \
|
||||||
nbits = JPEG_NBITS_NONZERO(temp); \
|
|
||||||
/* if run length > 15, must emit special run-length-16 codes (0xF0) */ \
|
/* if run length > 15, must emit special run-length-16 codes (0xF0) */ \
|
||||||
while (r > 15) { \
|
while (r >= 16 * 16) { \
|
||||||
EMIT_BITS(code_0xf0, size_0xf0) \
|
r -= 16 * 16; \
|
||||||
r -= 16; \
|
PUT_BITS(actbl->ehufco[0xf0], actbl->ehufsi[0xf0]) \
|
||||||
} \
|
} \
|
||||||
/* Emit Huffman symbol for run length / number of bits */ \
|
/* Emit Huffman symbol for run length / number of bits */ \
|
||||||
temp3 = (r << 4) + nbits; \
|
r += nbits; \
|
||||||
code = actbl->ehufco[temp3]; \
|
PUT_CODE(actbl->ehufco[r], actbl->ehufsi[r]) \
|
||||||
size = actbl->ehufsi[temp3]; \
|
|
||||||
EMIT_CODE(code, size) \
|
|
||||||
r = 0; \
|
r = 0; \
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
|
||||||
/* One iteration for each value in jpeg_natural_order[] */
|
/* One iteration for each value in jpeg_natural_order[] */
|
||||||
kloop(1); kloop(8); kloop(16); kloop(9); kloop(2); kloop(3);
|
kloop(1); kloop(8); kloop(16); kloop(9); kloop(2); kloop(3);
|
||||||
kloop(10); kloop(17); kloop(24); kloop(32); kloop(25); kloop(18);
|
kloop(10); kloop(17); kloop(24); kloop(32); kloop(25); kloop(18);
|
||||||
kloop(11); kloop(4); kloop(5); kloop(12); kloop(19); kloop(26);
|
kloop(11); kloop(4); kloop(5); kloop(12); kloop(19); kloop(26);
|
||||||
kloop(33); kloop(40); kloop(48); kloop(41); kloop(34); kloop(27);
|
kloop(33); kloop(40); kloop(48); kloop(41); kloop(34); kloop(27);
|
||||||
kloop(20); kloop(13); kloop(6); kloop(7); kloop(14); kloop(21);
|
kloop(20); kloop(13); kloop(6); kloop(7); kloop(14); kloop(21);
|
||||||
kloop(28); kloop(35); kloop(42); kloop(49); kloop(56); kloop(57);
|
kloop(28); kloop(35); kloop(42); kloop(49); kloop(56); kloop(57);
|
||||||
kloop(50); kloop(43); kloop(36); kloop(29); kloop(22); kloop(15);
|
kloop(50); kloop(43); kloop(36); kloop(29); kloop(22); kloop(15);
|
||||||
kloop(23); kloop(30); kloop(37); kloop(44); kloop(51); kloop(58);
|
kloop(23); kloop(30); kloop(37); kloop(44); kloop(51); kloop(58);
|
||||||
kloop(59); kloop(52); kloop(45); kloop(38); kloop(31); kloop(39);
|
kloop(59); kloop(52); kloop(45); kloop(38); kloop(31); kloop(39);
|
||||||
kloop(46); kloop(53); kloop(60); kloop(61); kloop(54); kloop(47);
|
kloop(46); kloop(53); kloop(60); kloop(61); kloop(54); kloop(47);
|
||||||
kloop(55); kloop(62); kloop(63);
|
kloop(55); kloop(62); kloop(63);
|
||||||
|
|
||||||
/* If the last coef(s) were zero, emit an end-of-block code */
|
/* If the last coef(s) were zero, emit an end-of-block code */
|
||||||
if (r > 0) {
|
if (r > 0) {
|
||||||
code = actbl->ehufco[0];
|
PUT_BITS(actbl->ehufco[0], actbl->ehufsi[0])
|
||||||
size = actbl->ehufsi[0];
|
}
|
||||||
EMIT_BITS(code, size)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
state->cur.put_buffer = put_buffer;
|
state->cur.put_buffer.c = put_buffer;
|
||||||
state->cur.put_bits = put_bits;
|
state->cur.free_bits = free_bits;
|
||||||
STORE_BUFFER()
|
STORE_BUFFER()
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@@ -654,8 +693,9 @@ encode_mcu_huff(j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
/* Load up working state */
|
/* Load up working state */
|
||||||
state.next_output_byte = cinfo->dest->next_output_byte;
|
state.next_output_byte = cinfo->dest->next_output_byte;
|
||||||
state.free_in_buffer = cinfo->dest->free_in_buffer;
|
state.free_in_buffer = cinfo->dest->free_in_buffer;
|
||||||
ASSIGN_STATE(state.cur, entropy->saved);
|
state.cur = entropy->saved;
|
||||||
state.cinfo = cinfo;
|
state.cinfo = cinfo;
|
||||||
|
state.simd = entropy->simd;
|
||||||
|
|
||||||
/* Emit restart marker if needed */
|
/* Emit restart marker if needed */
|
||||||
if (cinfo->restart_interval) {
|
if (cinfo->restart_interval) {
|
||||||
@@ -694,7 +734,7 @@ encode_mcu_huff(j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
/* Completed MCU, so update state */
|
/* Completed MCU, so update state */
|
||||||
cinfo->dest->next_output_byte = state.next_output_byte;
|
cinfo->dest->next_output_byte = state.next_output_byte;
|
||||||
cinfo->dest->free_in_buffer = state.free_in_buffer;
|
cinfo->dest->free_in_buffer = state.free_in_buffer;
|
||||||
ASSIGN_STATE(entropy->saved, state.cur);
|
entropy->saved = state.cur;
|
||||||
|
|
||||||
/* Update restart-interval state too */
|
/* Update restart-interval state too */
|
||||||
if (cinfo->restart_interval) {
|
if (cinfo->restart_interval) {
|
||||||
@@ -723,8 +763,9 @@ finish_pass_huff(j_compress_ptr cinfo)
|
|||||||
/* Load up working state ... flush_bits needs it */
|
/* Load up working state ... flush_bits needs it */
|
||||||
state.next_output_byte = cinfo->dest->next_output_byte;
|
state.next_output_byte = cinfo->dest->next_output_byte;
|
||||||
state.free_in_buffer = cinfo->dest->free_in_buffer;
|
state.free_in_buffer = cinfo->dest->free_in_buffer;
|
||||||
ASSIGN_STATE(state.cur, entropy->saved);
|
state.cur = entropy->saved;
|
||||||
state.cinfo = cinfo;
|
state.cinfo = cinfo;
|
||||||
|
state.simd = entropy->simd;
|
||||||
|
|
||||||
/* Flush out the last data */
|
/* Flush out the last data */
|
||||||
if (!flush_bits(&state))
|
if (!flush_bits(&state))
|
||||||
@@ -733,7 +774,7 @@ finish_pass_huff(j_compress_ptr cinfo)
|
|||||||
/* Update state */
|
/* Update state */
|
||||||
cinfo->dest->next_output_byte = state.next_output_byte;
|
cinfo->dest->next_output_byte = state.next_output_byte;
|
||||||
cinfo->dest->free_in_buffer = state.free_in_buffer;
|
cinfo->dest->free_in_buffer = state.free_in_buffer;
|
||||||
ASSIGN_STATE(entropy->saved, state.cur);
|
entropy->saved = state.cur;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -900,8 +941,8 @@ jpeg_gen_optimal_table(j_compress_ptr cinfo, JHUFF_TBL *htbl, long freq[])
|
|||||||
|
|
||||||
/* This algorithm is explained in section K.2 of the JPEG standard */
|
/* This algorithm is explained in section K.2 of the JPEG standard */
|
||||||
|
|
||||||
MEMZERO(bits, sizeof(bits));
|
memset(bits, 0, sizeof(bits));
|
||||||
MEMZERO(codesize, sizeof(codesize));
|
memset(codesize, 0, sizeof(codesize));
|
||||||
for (i = 0; i < 257; i++)
|
for (i = 0; i < 257; i++)
|
||||||
others[i] = -1; /* init links to empty */
|
others[i] = -1; /* init links to empty */
|
||||||
|
|
||||||
@@ -1003,7 +1044,7 @@ jpeg_gen_optimal_table(j_compress_ptr cinfo, JHUFF_TBL *htbl, long freq[])
|
|||||||
bits[i]--;
|
bits[i]--;
|
||||||
|
|
||||||
/* Return final symbol counts (only for lengths 0..16) */
|
/* Return final symbol counts (only for lengths 0..16) */
|
||||||
MEMCOPY(htbl->bits, bits, sizeof(htbl->bits));
|
memcpy(htbl->bits, bits, sizeof(htbl->bits));
|
||||||
|
|
||||||
/* Return a list of the symbols sorted by code length */
|
/* Return a list of the symbols sorted by code length */
|
||||||
/* It's not real clear to me why we don't need to consider the codelength
|
/* It's not real clear to me why we don't need to consider the codelength
|
||||||
@@ -1042,8 +1083,8 @@ finish_pass_gather(j_compress_ptr cinfo)
|
|||||||
/* It's important not to apply jpeg_gen_optimal_table more than once
|
/* It's important not to apply jpeg_gen_optimal_table more than once
|
||||||
* per table, because it clobbers the input frequency counts!
|
* per table, because it clobbers the input frequency counts!
|
||||||
*/
|
*/
|
||||||
MEMZERO(did_dc, sizeof(did_dc));
|
memset(did_dc, 0, sizeof(did_dc));
|
||||||
MEMZERO(did_ac, sizeof(did_ac));
|
memset(did_ac, 0, sizeof(did_ac));
|
||||||
|
|
||||||
for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
|
for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
|
||||||
compptr = cinfo->cur_comp_info[ci];
|
compptr = cinfo->cur_comp_info[ci];
|
||||||
|
|||||||
+1
-1
@@ -493,7 +493,7 @@ prepare_for_pass(j_compress_ptr cinfo)
|
|||||||
master->pass_type = output_pass;
|
master->pass_type = output_pass;
|
||||||
master->pass_number++;
|
master->pass_number++;
|
||||||
#endif
|
#endif
|
||||||
/*FALLTHROUGH*/
|
FALLTHROUGH /*FALLTHROUGH*/
|
||||||
case output_pass:
|
case output_pass:
|
||||||
/* Do a data-output pass. */
|
/* Do a data-output pass. */
|
||||||
/* We need not repeat per-scan setup if prior optimization pass did it. */
|
/* We need not repeat per-scan setup if prior optimization pass did it. */
|
||||||
|
|||||||
Vendored
+23
-14
@@ -4,8 +4,10 @@
|
|||||||
* This file was part of the Independent JPEG Group's software:
|
* This file was part of the Independent JPEG Group's software:
|
||||||
* Copyright (C) 1995-1997, Thomas G. Lane.
|
* Copyright (C) 1995-1997, Thomas G. Lane.
|
||||||
* libjpeg-turbo Modifications:
|
* libjpeg-turbo Modifications:
|
||||||
* Copyright (C) 2011, 2015, 2018, D. R. Commander.
|
* Copyright (C) 2011, 2015, 2018, 2021-2022, D. R. Commander.
|
||||||
* Copyright (C) 2016, 2018, Matthieu Darbois.
|
* Copyright (C) 2016, 2018, Matthieu Darbois.
|
||||||
|
* Copyright (C) 2020, Arm Limited.
|
||||||
|
* Copyright (C) 2021, Alex Richardson.
|
||||||
* For conditions of distribution and use, see the accompanying README.ijg
|
* For conditions of distribution and use, see the accompanying README.ijg
|
||||||
* file.
|
* file.
|
||||||
*
|
*
|
||||||
@@ -52,14 +54,19 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* NOTE: Both GCC and Clang define __GNUC__ */
|
/* NOTE: Both GCC and Clang define __GNUC__ */
|
||||||
#if defined(__GNUC__) && (defined(__arm__) || defined(__aarch64__))
|
#if (defined(__GNUC__) && (defined(__arm__) || defined(__aarch64__))) || \
|
||||||
|
defined(_M_ARM) || defined(_M_ARM64)
|
||||||
#if !defined(__thumb__) || defined(__thumb2__)
|
#if !defined(__thumb__) || defined(__thumb2__)
|
||||||
#define USE_CLZ_INTRINSIC
|
#define USE_CLZ_INTRINSIC
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef USE_CLZ_INTRINSIC
|
#ifdef USE_CLZ_INTRINSIC
|
||||||
|
#if defined(_MSC_VER) && !defined(__clang__)
|
||||||
|
#define JPEG_NBITS_NONZERO(x) (32 - _CountLeadingZeros(x))
|
||||||
|
#else
|
||||||
#define JPEG_NBITS_NONZERO(x) (32 - __builtin_clz(x))
|
#define JPEG_NBITS_NONZERO(x) (32 - __builtin_clz(x))
|
||||||
|
#endif
|
||||||
#define JPEG_NBITS(x) (x ? JPEG_NBITS_NONZERO(x) : 0)
|
#define JPEG_NBITS(x) (x ? JPEG_NBITS_NONZERO(x) : 0)
|
||||||
#else
|
#else
|
||||||
#include "jpeg_nbits_table.h"
|
#include "jpeg_nbits_table.h"
|
||||||
@@ -169,24 +176,26 @@ INLINE
|
|||||||
METHODDEF(int)
|
METHODDEF(int)
|
||||||
count_zeroes(size_t *x)
|
count_zeroes(size_t *x)
|
||||||
{
|
{
|
||||||
int result;
|
|
||||||
#if defined(HAVE_BUILTIN_CTZL)
|
#if defined(HAVE_BUILTIN_CTZL)
|
||||||
|
int result;
|
||||||
result = __builtin_ctzl(*x);
|
result = __builtin_ctzl(*x);
|
||||||
*x >>= result;
|
*x >>= result;
|
||||||
#elif defined(HAVE_BITSCANFORWARD64)
|
#elif defined(HAVE_BITSCANFORWARD64)
|
||||||
|
unsigned long result;
|
||||||
_BitScanForward64(&result, *x);
|
_BitScanForward64(&result, *x);
|
||||||
*x >>= result;
|
*x >>= result;
|
||||||
#elif defined(HAVE_BITSCANFORWARD)
|
#elif defined(HAVE_BITSCANFORWARD)
|
||||||
|
unsigned long result;
|
||||||
_BitScanForward(&result, *x);
|
_BitScanForward(&result, *x);
|
||||||
*x >>= result;
|
*x >>= result;
|
||||||
#else
|
#else
|
||||||
result = 0;
|
int result = 0;
|
||||||
while ((*x & 1) == 0) {
|
while ((*x & 1) == 0) {
|
||||||
++result;
|
++result;
|
||||||
*x >>= 1;
|
*x >>= 1;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
return result;
|
return (int)result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -266,7 +275,7 @@ start_pass_phuff(j_compress_ptr cinfo, boolean gather_statistics)
|
|||||||
entropy->count_ptrs[tbl] = (long *)
|
entropy->count_ptrs[tbl] = (long *)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
|
(*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
|
||||||
257 * sizeof(long));
|
257 * sizeof(long));
|
||||||
MEMZERO(entropy->count_ptrs[tbl], 257 * sizeof(long));
|
memset(entropy->count_ptrs[tbl], 0, 257 * sizeof(long));
|
||||||
} else {
|
} else {
|
||||||
/* Compute derived values for Huffman table */
|
/* Compute derived values for Huffman table */
|
||||||
/* We may do this more than once for a table, but it's not expensive */
|
/* We may do this more than once for a table, but it's not expensive */
|
||||||
@@ -575,8 +584,8 @@ encode_mcu_DC_first(j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
continue; \
|
continue; \
|
||||||
/* For a negative coef, want temp2 = bitwise complement of abs(coef) */ \
|
/* For a negative coef, want temp2 = bitwise complement of abs(coef) */ \
|
||||||
temp2 ^= temp; \
|
temp2 ^= temp; \
|
||||||
values[k] = temp; \
|
values[k] = (JCOEF)temp; \
|
||||||
values[k + DCTSIZE2] = temp2; \
|
values[k + DCTSIZE2] = (JCOEF)temp2; \
|
||||||
zerobits |= ((size_t)1U) << k; \
|
zerobits |= ((size_t)1U) << k; \
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
@@ -672,7 +681,7 @@ encode_mcu_AC_first(j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
emit_restart(entropy, entropy->next_restart_num);
|
emit_restart(entropy, entropy->next_restart_num);
|
||||||
|
|
||||||
#ifdef WITH_SIMD
|
#ifdef WITH_SIMD
|
||||||
cvalue = values = (JCOEF *)PAD((size_t)values_unaligned, 16);
|
cvalue = values = (JCOEF *)PAD((JUINTPTR)values_unaligned, 16);
|
||||||
#else
|
#else
|
||||||
/* Not using SIMD, so alignment is not needed */
|
/* Not using SIMD, so alignment is not needed */
|
||||||
cvalue = values = values_unaligned;
|
cvalue = values = values_unaligned;
|
||||||
@@ -860,7 +869,7 @@ encode_mcu_AC_refine_prepare(const JCOEF *block,
|
|||||||
|
|
||||||
#define ENCODE_COEFS_AC_REFINE(label) { \
|
#define ENCODE_COEFS_AC_REFINE(label) { \
|
||||||
while (zerobits) { \
|
while (zerobits) { \
|
||||||
int idx = count_zeroes(&zerobits); \
|
idx = count_zeroes(&zerobits); \
|
||||||
r += idx; \
|
r += idx; \
|
||||||
cabsvalue += idx; \
|
cabsvalue += idx; \
|
||||||
signbits >>= idx; \
|
signbits >>= idx; \
|
||||||
@@ -917,7 +926,7 @@ METHODDEF(boolean)
|
|||||||
encode_mcu_AC_refine(j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
encode_mcu_AC_refine(j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
{
|
{
|
||||||
phuff_entropy_ptr entropy = (phuff_entropy_ptr)cinfo->entropy;
|
phuff_entropy_ptr entropy = (phuff_entropy_ptr)cinfo->entropy;
|
||||||
register int temp, r;
|
register int temp, r, idx;
|
||||||
char *BR_buffer;
|
char *BR_buffer;
|
||||||
unsigned int BR;
|
unsigned int BR;
|
||||||
int Sl = cinfo->Se - cinfo->Ss + 1;
|
int Sl = cinfo->Se - cinfo->Ss + 1;
|
||||||
@@ -937,7 +946,7 @@ encode_mcu_AC_refine(j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
emit_restart(entropy, entropy->next_restart_num);
|
emit_restart(entropy, entropy->next_restart_num);
|
||||||
|
|
||||||
#ifdef WITH_SIMD
|
#ifdef WITH_SIMD
|
||||||
cabsvalue = absvalues = (JCOEF *)PAD((size_t)absvalues_unaligned, 16);
|
cabsvalue = absvalues = (JCOEF *)PAD((JUINTPTR)absvalues_unaligned, 16);
|
||||||
#else
|
#else
|
||||||
/* Not using SIMD, so alignment is not needed */
|
/* Not using SIMD, so alignment is not needed */
|
||||||
cabsvalue = absvalues = absvalues_unaligned;
|
cabsvalue = absvalues = absvalues_unaligned;
|
||||||
@@ -968,7 +977,7 @@ encode_mcu_AC_refine(j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
|
|
||||||
if (zerobits) {
|
if (zerobits) {
|
||||||
int diff = ((absvalues + DCTSIZE2 / 2) - cabsvalue);
|
int diff = ((absvalues + DCTSIZE2 / 2) - cabsvalue);
|
||||||
int idx = count_zeroes(&zerobits);
|
idx = count_zeroes(&zerobits);
|
||||||
signbits >>= idx;
|
signbits >>= idx;
|
||||||
idx += diff;
|
idx += diff;
|
||||||
r += idx;
|
r += idx;
|
||||||
@@ -1053,7 +1062,7 @@ finish_pass_gather_phuff(j_compress_ptr cinfo)
|
|||||||
/* It's important not to apply jpeg_gen_optimal_table more than once
|
/* It's important not to apply jpeg_gen_optimal_table more than once
|
||||||
* per table, because it clobbers the input frequency counts!
|
* per table, because it clobbers the input frequency counts!
|
||||||
*/
|
*/
|
||||||
MEMZERO(did, sizeof(did));
|
memset(did, 0, sizeof(did));
|
||||||
|
|
||||||
for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
|
for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
|
||||||
compptr = cinfo->cur_comp_info[ci];
|
compptr = cinfo->cur_comp_info[ci];
|
||||||
|
|||||||
+4
-4
@@ -3,8 +3,8 @@
|
|||||||
*
|
*
|
||||||
* This file is part of the Independent JPEG Group's software:
|
* This file is part of the Independent JPEG Group's software:
|
||||||
* Copyright (C) 1994-1996, Thomas G. Lane.
|
* Copyright (C) 1994-1996, Thomas G. Lane.
|
||||||
* It was modified by The libjpeg-turbo Project to include only code relevant
|
* libjpeg-turbo Modifications:
|
||||||
* to libjpeg-turbo.
|
* Copyright (C) 2022, D. R. Commander.
|
||||||
* For conditions of distribution and use, see the accompanying README.ijg
|
* For conditions of distribution and use, see the accompanying README.ijg
|
||||||
* file.
|
* file.
|
||||||
*
|
*
|
||||||
@@ -289,8 +289,8 @@ create_context_buffer(j_compress_ptr cinfo)
|
|||||||
cinfo->max_h_samp_factor) / compptr->h_samp_factor),
|
cinfo->max_h_samp_factor) / compptr->h_samp_factor),
|
||||||
(JDIMENSION)(3 * rgroup_height));
|
(JDIMENSION)(3 * rgroup_height));
|
||||||
/* Copy true buffer row pointers into the middle of the fake row array */
|
/* Copy true buffer row pointers into the middle of the fake row array */
|
||||||
MEMCOPY(fake_buffer + rgroup_height, true_buffer,
|
memcpy(fake_buffer + rgroup_height, true_buffer,
|
||||||
3 * rgroup_height * sizeof(JSAMPROW));
|
3 * rgroup_height * sizeof(JSAMPROW));
|
||||||
/* Fill in the above and below wraparound pointers */
|
/* Fill in the above and below wraparound pointers */
|
||||||
for (i = 0; i < rgroup_height; i++) {
|
for (i = 0; i < rgroup_height; i++) {
|
||||||
fake_buffer[i] = true_buffer[2 * rgroup_height + i];
|
fake_buffer[i] = true_buffer[2 * rgroup_height + i];
|
||||||
|
|||||||
+23
-40
@@ -6,7 +6,7 @@
|
|||||||
* libjpeg-turbo Modifications:
|
* libjpeg-turbo Modifications:
|
||||||
* Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB
|
* Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB
|
||||||
* Copyright (C) 2014, MIPS Technologies, Inc., California.
|
* Copyright (C) 2014, MIPS Technologies, Inc., California.
|
||||||
* Copyright (C) 2015, D. R. Commander.
|
* Copyright (C) 2015, 2019, D. R. Commander.
|
||||||
* For conditions of distribution and use, see the accompanying README.ijg
|
* For conditions of distribution and use, see the accompanying README.ijg
|
||||||
* file.
|
* file.
|
||||||
*
|
*
|
||||||
@@ -103,7 +103,7 @@ expand_right_edge(JSAMPARRAY image_data, int num_rows, JDIMENSION input_cols,
|
|||||||
if (numcols > 0) {
|
if (numcols > 0) {
|
||||||
for (row = 0; row < num_rows; row++) {
|
for (row = 0; row < num_rows; row++) {
|
||||||
ptr = image_data[row] + input_cols;
|
ptr = image_data[row] + input_cols;
|
||||||
pixval = ptr[-1]; /* don't need GETJSAMPLE() here */
|
pixval = ptr[-1];
|
||||||
for (count = numcols; count > 0; count--)
|
for (count = numcols; count > 0; count--)
|
||||||
*ptr++ = pixval;
|
*ptr++ = pixval;
|
||||||
}
|
}
|
||||||
@@ -174,7 +174,7 @@ int_downsample(j_compress_ptr cinfo, jpeg_component_info *compptr,
|
|||||||
for (v = 0; v < v_expand; v++) {
|
for (v = 0; v < v_expand; v++) {
|
||||||
inptr = input_data[inrow + v] + outcol_h;
|
inptr = input_data[inrow + v] + outcol_h;
|
||||||
for (h = 0; h < h_expand; h++) {
|
for (h = 0; h < h_expand; h++) {
|
||||||
outvalue += (JLONG)GETJSAMPLE(*inptr++);
|
outvalue += (JLONG)(*inptr++);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*outptr++ = (JSAMPLE)((outvalue + numpix2) / numpix);
|
*outptr++ = (JSAMPLE)((outvalue + numpix2) / numpix);
|
||||||
@@ -237,8 +237,7 @@ h2v1_downsample(j_compress_ptr cinfo, jpeg_component_info *compptr,
|
|||||||
inptr = input_data[outrow];
|
inptr = input_data[outrow];
|
||||||
bias = 0; /* bias = 0,1,0,1,... for successive samples */
|
bias = 0; /* bias = 0,1,0,1,... for successive samples */
|
||||||
for (outcol = 0; outcol < output_cols; outcol++) {
|
for (outcol = 0; outcol < output_cols; outcol++) {
|
||||||
*outptr++ =
|
*outptr++ = (JSAMPLE)((inptr[0] + inptr[1] + bias) >> 1);
|
||||||
(JSAMPLE)((GETJSAMPLE(*inptr) + GETJSAMPLE(inptr[1]) + bias) >> 1);
|
|
||||||
bias ^= 1; /* 0=>1, 1=>0 */
|
bias ^= 1; /* 0=>1, 1=>0 */
|
||||||
inptr += 2;
|
inptr += 2;
|
||||||
}
|
}
|
||||||
@@ -277,8 +276,7 @@ h2v2_downsample(j_compress_ptr cinfo, jpeg_component_info *compptr,
|
|||||||
bias = 1; /* bias = 1,2,1,2,... for successive samples */
|
bias = 1; /* bias = 1,2,1,2,... for successive samples */
|
||||||
for (outcol = 0; outcol < output_cols; outcol++) {
|
for (outcol = 0; outcol < output_cols; outcol++) {
|
||||||
*outptr++ =
|
*outptr++ =
|
||||||
(JSAMPLE)((GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) +
|
(JSAMPLE)((inptr0[0] + inptr0[1] + inptr1[0] + inptr1[1] + bias) >> 2);
|
||||||
GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]) + bias) >> 2);
|
|
||||||
bias ^= 3; /* 1=>2, 2=>1 */
|
bias ^= 3; /* 1=>2, 2=>1 */
|
||||||
inptr0 += 2; inptr1 += 2;
|
inptr0 += 2; inptr1 += 2;
|
||||||
}
|
}
|
||||||
@@ -337,33 +335,25 @@ h2v2_smooth_downsample(j_compress_ptr cinfo, jpeg_component_info *compptr,
|
|||||||
below_ptr = input_data[inrow + 2];
|
below_ptr = input_data[inrow + 2];
|
||||||
|
|
||||||
/* Special case for first column: pretend column -1 is same as column 0 */
|
/* Special case for first column: pretend column -1 is same as column 0 */
|
||||||
membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) +
|
membersum = inptr0[0] + inptr0[1] + inptr1[0] + inptr1[1];
|
||||||
GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]);
|
neighsum = above_ptr[0] + above_ptr[1] + below_ptr[0] + below_ptr[1] +
|
||||||
neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) +
|
inptr0[0] + inptr0[2] + inptr1[0] + inptr1[2];
|
||||||
GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) +
|
|
||||||
GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[2]) +
|
|
||||||
GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[2]);
|
|
||||||
neighsum += neighsum;
|
neighsum += neighsum;
|
||||||
neighsum += GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[2]) +
|
neighsum += above_ptr[0] + above_ptr[2] + below_ptr[0] + below_ptr[2];
|
||||||
GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[2]);
|
|
||||||
membersum = membersum * memberscale + neighsum * neighscale;
|
membersum = membersum * memberscale + neighsum * neighscale;
|
||||||
*outptr++ = (JSAMPLE)((membersum + 32768) >> 16);
|
*outptr++ = (JSAMPLE)((membersum + 32768) >> 16);
|
||||||
inptr0 += 2; inptr1 += 2; above_ptr += 2; below_ptr += 2;
|
inptr0 += 2; inptr1 += 2; above_ptr += 2; below_ptr += 2;
|
||||||
|
|
||||||
for (colctr = output_cols - 2; colctr > 0; colctr--) {
|
for (colctr = output_cols - 2; colctr > 0; colctr--) {
|
||||||
/* sum of pixels directly mapped to this output element */
|
/* sum of pixels directly mapped to this output element */
|
||||||
membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) +
|
membersum = inptr0[0] + inptr0[1] + inptr1[0] + inptr1[1];
|
||||||
GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]);
|
|
||||||
/* sum of edge-neighbor pixels */
|
/* sum of edge-neighbor pixels */
|
||||||
neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) +
|
neighsum = above_ptr[0] + above_ptr[1] + below_ptr[0] + below_ptr[1] +
|
||||||
GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) +
|
inptr0[-1] + inptr0[2] + inptr1[-1] + inptr1[2];
|
||||||
GETJSAMPLE(inptr0[-1]) + GETJSAMPLE(inptr0[2]) +
|
|
||||||
GETJSAMPLE(inptr1[-1]) + GETJSAMPLE(inptr1[2]);
|
|
||||||
/* The edge-neighbors count twice as much as corner-neighbors */
|
/* The edge-neighbors count twice as much as corner-neighbors */
|
||||||
neighsum += neighsum;
|
neighsum += neighsum;
|
||||||
/* Add in the corner-neighbors */
|
/* Add in the corner-neighbors */
|
||||||
neighsum += GETJSAMPLE(above_ptr[-1]) + GETJSAMPLE(above_ptr[2]) +
|
neighsum += above_ptr[-1] + above_ptr[2] + below_ptr[-1] + below_ptr[2];
|
||||||
GETJSAMPLE(below_ptr[-1]) + GETJSAMPLE(below_ptr[2]);
|
|
||||||
/* form final output scaled up by 2^16 */
|
/* form final output scaled up by 2^16 */
|
||||||
membersum = membersum * memberscale + neighsum * neighscale;
|
membersum = membersum * memberscale + neighsum * neighscale;
|
||||||
/* round, descale and output it */
|
/* round, descale and output it */
|
||||||
@@ -372,15 +362,11 @@ h2v2_smooth_downsample(j_compress_ptr cinfo, jpeg_component_info *compptr,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Special case for last column */
|
/* Special case for last column */
|
||||||
membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) +
|
membersum = inptr0[0] + inptr0[1] + inptr1[0] + inptr1[1];
|
||||||
GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]);
|
neighsum = above_ptr[0] + above_ptr[1] + below_ptr[0] + below_ptr[1] +
|
||||||
neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) +
|
inptr0[-1] + inptr0[1] + inptr1[-1] + inptr1[1];
|
||||||
GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) +
|
|
||||||
GETJSAMPLE(inptr0[-1]) + GETJSAMPLE(inptr0[1]) +
|
|
||||||
GETJSAMPLE(inptr1[-1]) + GETJSAMPLE(inptr1[1]);
|
|
||||||
neighsum += neighsum;
|
neighsum += neighsum;
|
||||||
neighsum += GETJSAMPLE(above_ptr[-1]) + GETJSAMPLE(above_ptr[1]) +
|
neighsum += above_ptr[-1] + above_ptr[1] + below_ptr[-1] + below_ptr[1];
|
||||||
GETJSAMPLE(below_ptr[-1]) + GETJSAMPLE(below_ptr[1]);
|
|
||||||
membersum = membersum * memberscale + neighsum * neighscale;
|
membersum = membersum * memberscale + neighsum * neighscale;
|
||||||
*outptr = (JSAMPLE)((membersum + 32768) >> 16);
|
*outptr = (JSAMPLE)((membersum + 32768) >> 16);
|
||||||
|
|
||||||
@@ -429,21 +415,18 @@ fullsize_smooth_downsample(j_compress_ptr cinfo, jpeg_component_info *compptr,
|
|||||||
below_ptr = input_data[outrow + 1];
|
below_ptr = input_data[outrow + 1];
|
||||||
|
|
||||||
/* Special case for first column */
|
/* Special case for first column */
|
||||||
colsum = GETJSAMPLE(*above_ptr++) + GETJSAMPLE(*below_ptr++) +
|
colsum = (*above_ptr++) + (*below_ptr++) + inptr[0];
|
||||||
GETJSAMPLE(*inptr);
|
membersum = *inptr++;
|
||||||
membersum = GETJSAMPLE(*inptr++);
|
nextcolsum = above_ptr[0] + below_ptr[0] + inptr[0];
|
||||||
nextcolsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(*below_ptr) +
|
|
||||||
GETJSAMPLE(*inptr);
|
|
||||||
neighsum = colsum + (colsum - membersum) + nextcolsum;
|
neighsum = colsum + (colsum - membersum) + nextcolsum;
|
||||||
membersum = membersum * memberscale + neighsum * neighscale;
|
membersum = membersum * memberscale + neighsum * neighscale;
|
||||||
*outptr++ = (JSAMPLE)((membersum + 32768) >> 16);
|
*outptr++ = (JSAMPLE)((membersum + 32768) >> 16);
|
||||||
lastcolsum = colsum; colsum = nextcolsum;
|
lastcolsum = colsum; colsum = nextcolsum;
|
||||||
|
|
||||||
for (colctr = output_cols - 2; colctr > 0; colctr--) {
|
for (colctr = output_cols - 2; colctr > 0; colctr--) {
|
||||||
membersum = GETJSAMPLE(*inptr++);
|
membersum = *inptr++;
|
||||||
above_ptr++; below_ptr++;
|
above_ptr++; below_ptr++;
|
||||||
nextcolsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(*below_ptr) +
|
nextcolsum = above_ptr[0] + below_ptr[0] + inptr[0];
|
||||||
GETJSAMPLE(*inptr);
|
|
||||||
neighsum = lastcolsum + (colsum - membersum) + nextcolsum;
|
neighsum = lastcolsum + (colsum - membersum) + nextcolsum;
|
||||||
membersum = membersum * memberscale + neighsum * neighscale;
|
membersum = membersum * memberscale + neighsum * neighscale;
|
||||||
*outptr++ = (JSAMPLE)((membersum + 32768) >> 16);
|
*outptr++ = (JSAMPLE)((membersum + 32768) >> 16);
|
||||||
@@ -451,7 +434,7 @@ fullsize_smooth_downsample(j_compress_ptr cinfo, jpeg_component_info *compptr,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Special case for last column */
|
/* Special case for last column */
|
||||||
membersum = GETJSAMPLE(*inptr);
|
membersum = *inptr;
|
||||||
neighsum = lastcolsum + (colsum - membersum) + colsum;
|
neighsum = lastcolsum + (colsum - membersum) + colsum;
|
||||||
membersum = membersum * memberscale + neighsum * neighscale;
|
membersum = membersum * memberscale + neighsum * neighscale;
|
||||||
*outptr = (JSAMPLE)((membersum + 32768) >> 16);
|
*outptr = (JSAMPLE)((membersum + 32768) >> 16);
|
||||||
|
|||||||
Vendored
+3
-3
@@ -5,7 +5,7 @@
|
|||||||
* Copyright (C) 1995-1998, Thomas G. Lane.
|
* Copyright (C) 1995-1998, Thomas G. Lane.
|
||||||
* Modified 2000-2009 by Guido Vollbeding.
|
* Modified 2000-2009 by Guido Vollbeding.
|
||||||
* libjpeg-turbo Modifications:
|
* libjpeg-turbo Modifications:
|
||||||
* Copyright (C) 2020, D. R. Commander.
|
* Copyright (C) 2020, 2022, D. R. Commander.
|
||||||
* For conditions of distribution and use, see the accompanying README.ijg
|
* For conditions of distribution and use, see the accompanying README.ijg
|
||||||
* file.
|
* file.
|
||||||
*
|
*
|
||||||
@@ -100,8 +100,8 @@ jpeg_copy_critical_parameters(j_decompress_ptr srcinfo, j_compress_ptr dstinfo)
|
|||||||
qtblptr = &dstinfo->quant_tbl_ptrs[tblno];
|
qtblptr = &dstinfo->quant_tbl_ptrs[tblno];
|
||||||
if (*qtblptr == NULL)
|
if (*qtblptr == NULL)
|
||||||
*qtblptr = jpeg_alloc_quant_table((j_common_ptr)dstinfo);
|
*qtblptr = jpeg_alloc_quant_table((j_common_ptr)dstinfo);
|
||||||
MEMCOPY((*qtblptr)->quantval, srcinfo->quant_tbl_ptrs[tblno]->quantval,
|
memcpy((*qtblptr)->quantval, srcinfo->quant_tbl_ptrs[tblno]->quantval,
|
||||||
sizeof((*qtblptr)->quantval));
|
sizeof((*qtblptr)->quantval));
|
||||||
(*qtblptr)->sent_table = FALSE;
|
(*qtblptr)->sent_table = FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-4
@@ -4,7 +4,7 @@
|
|||||||
* This file was part of the Independent JPEG Group's software:
|
* This file was part of the Independent JPEG Group's software:
|
||||||
* Copyright (C) 1994-1998, Thomas G. Lane.
|
* Copyright (C) 1994-1998, Thomas G. Lane.
|
||||||
* libjpeg-turbo Modifications:
|
* libjpeg-turbo Modifications:
|
||||||
* Copyright (C) 2016, D. R. Commander.
|
* Copyright (C) 2016, 2022, D. R. Commander.
|
||||||
* For conditions of distribution and use, see the accompanying README.ijg
|
* For conditions of distribution and use, see the accompanying README.ijg
|
||||||
* file.
|
* file.
|
||||||
*
|
*
|
||||||
@@ -23,6 +23,7 @@
|
|||||||
#include "jinclude.h"
|
#include "jinclude.h"
|
||||||
#include "jpeglib.h"
|
#include "jpeglib.h"
|
||||||
#include "jdmaster.h"
|
#include "jdmaster.h"
|
||||||
|
#include "jconfigint.h"
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -52,7 +53,7 @@ jpeg_CreateDecompress(j_decompress_ptr cinfo, int version, size_t structsize)
|
|||||||
{
|
{
|
||||||
struct jpeg_error_mgr *err = cinfo->err;
|
struct jpeg_error_mgr *err = cinfo->err;
|
||||||
void *client_data = cinfo->client_data; /* ignore Purify complaint here */
|
void *client_data = cinfo->client_data; /* ignore Purify complaint here */
|
||||||
MEMZERO(cinfo, sizeof(struct jpeg_decompress_struct));
|
memset(cinfo, 0, sizeof(struct jpeg_decompress_struct));
|
||||||
cinfo->err = err;
|
cinfo->err = err;
|
||||||
cinfo->client_data = client_data;
|
cinfo->client_data = client_data;
|
||||||
}
|
}
|
||||||
@@ -91,7 +92,7 @@ jpeg_CreateDecompress(j_decompress_ptr cinfo, int version, size_t structsize)
|
|||||||
cinfo->master = (struct jpeg_decomp_master *)
|
cinfo->master = (struct jpeg_decomp_master *)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_PERMANENT,
|
(*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_PERMANENT,
|
||||||
sizeof(my_decomp_master));
|
sizeof(my_decomp_master));
|
||||||
MEMZERO(cinfo->master, sizeof(my_decomp_master));
|
memset(cinfo->master, 0, sizeof(my_decomp_master));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -308,7 +309,7 @@ jpeg_consume_input(j_decompress_ptr cinfo)
|
|||||||
/* Initialize application's data source module */
|
/* Initialize application's data source module */
|
||||||
(*cinfo->src->init_source) (cinfo);
|
(*cinfo->src->init_source) (cinfo);
|
||||||
cinfo->global_state = DSTATE_INHEADER;
|
cinfo->global_state = DSTATE_INHEADER;
|
||||||
/*FALLTHROUGH*/
|
FALLTHROUGH /*FALLTHROUGH*/
|
||||||
case DSTATE_INHEADER:
|
case DSTATE_INHEADER:
|
||||||
retcode = (*cinfo->inputctl->consume_input) (cinfo);
|
retcode = (*cinfo->inputctl->consume_input) (cinfo);
|
||||||
if (retcode == JPEG_REACHED_SOS) { /* Found SOS, prepare to decompress */
|
if (retcode == JPEG_REACHED_SOS) { /* Found SOS, prepare to decompress */
|
||||||
|
|||||||
+15
-1
@@ -4,7 +4,7 @@
|
|||||||
* This file was part of the Independent JPEG Group's software:
|
* This file was part of the Independent JPEG Group's software:
|
||||||
* Copyright (C) 1994-1996, Thomas G. Lane.
|
* Copyright (C) 1994-1996, Thomas G. Lane.
|
||||||
* libjpeg-turbo Modifications:
|
* libjpeg-turbo Modifications:
|
||||||
* Copyright (C) 2010, 2015-2018, 2020, D. R. Commander.
|
* Copyright (C) 2010, 2015-2020, 2022, D. R. Commander.
|
||||||
* Copyright (C) 2015, Google, Inc.
|
* Copyright (C) 2015, Google, Inc.
|
||||||
* For conditions of distribution and use, see the accompanying README.ijg
|
* For conditions of distribution and use, see the accompanying README.ijg
|
||||||
* file.
|
* file.
|
||||||
@@ -159,6 +159,7 @@ jpeg_crop_scanline(j_decompress_ptr cinfo, JDIMENSION *xoffset,
|
|||||||
JDIMENSION input_xoffset;
|
JDIMENSION input_xoffset;
|
||||||
boolean reinit_upsampler = FALSE;
|
boolean reinit_upsampler = FALSE;
|
||||||
jpeg_component_info *compptr;
|
jpeg_component_info *compptr;
|
||||||
|
my_master_ptr master = (my_master_ptr)cinfo->master;
|
||||||
|
|
||||||
if (cinfo->global_state != DSTATE_SCANNING || cinfo->output_scanline != 0)
|
if (cinfo->global_state != DSTATE_SCANNING || cinfo->output_scanline != 0)
|
||||||
ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
|
ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
|
||||||
@@ -208,6 +209,11 @@ jpeg_crop_scanline(j_decompress_ptr cinfo, JDIMENSION *xoffset,
|
|||||||
*/
|
*/
|
||||||
*width = *width + input_xoffset - *xoffset;
|
*width = *width + input_xoffset - *xoffset;
|
||||||
cinfo->output_width = *width;
|
cinfo->output_width = *width;
|
||||||
|
if (master->using_merged_upsample && cinfo->max_v_samp_factor == 2) {
|
||||||
|
my_merged_upsample_ptr upsample = (my_merged_upsample_ptr)cinfo->upsample;
|
||||||
|
upsample->out_row_width =
|
||||||
|
cinfo->output_width * cinfo->out_color_components;
|
||||||
|
}
|
||||||
|
|
||||||
/* Set the first and last iMCU columns that we must decompress. These values
|
/* Set the first and last iMCU columns that we must decompress. These values
|
||||||
* will be used in single-scan decompressions.
|
* will be used in single-scan decompressions.
|
||||||
@@ -319,6 +325,8 @@ read_and_discard_scanlines(j_decompress_ptr cinfo, JDIMENSION num_lines)
|
|||||||
{
|
{
|
||||||
JDIMENSION n;
|
JDIMENSION n;
|
||||||
my_master_ptr master = (my_master_ptr)cinfo->master;
|
my_master_ptr master = (my_master_ptr)cinfo->master;
|
||||||
|
JSAMPLE dummy_sample[1] = { 0 };
|
||||||
|
JSAMPROW dummy_row = dummy_sample;
|
||||||
JSAMPARRAY scanlines = NULL;
|
JSAMPARRAY scanlines = NULL;
|
||||||
void (*color_convert) (j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
|
void (*color_convert) (j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
|
||||||
JDIMENSION input_row, JSAMPARRAY output_buf,
|
JDIMENSION input_row, JSAMPARRAY output_buf,
|
||||||
@@ -329,6 +337,10 @@ read_and_discard_scanlines(j_decompress_ptr cinfo, JDIMENSION num_lines)
|
|||||||
if (cinfo->cconvert && cinfo->cconvert->color_convert) {
|
if (cinfo->cconvert && cinfo->cconvert->color_convert) {
|
||||||
color_convert = cinfo->cconvert->color_convert;
|
color_convert = cinfo->cconvert->color_convert;
|
||||||
cinfo->cconvert->color_convert = noop_convert;
|
cinfo->cconvert->color_convert = noop_convert;
|
||||||
|
/* This just prevents UBSan from complaining about adding 0 to a NULL
|
||||||
|
* pointer. The pointer isn't actually used.
|
||||||
|
*/
|
||||||
|
scanlines = &dummy_row;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cinfo->cquantize && cinfo->cquantize->color_quantize) {
|
if (cinfo->cquantize && cinfo->cquantize->color_quantize) {
|
||||||
@@ -532,6 +544,8 @@ jpeg_skip_scanlines(j_decompress_ptr cinfo, JDIMENSION num_lines)
|
|||||||
* decoded coefficients. This is ~5% faster for large subsets, but
|
* decoded coefficients. This is ~5% faster for large subsets, but
|
||||||
* it's tough to tell a difference for smaller images.
|
* it's tough to tell a difference for smaller images.
|
||||||
*/
|
*/
|
||||||
|
if (!cinfo->entropy->insufficient_data)
|
||||||
|
cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
|
||||||
(*cinfo->entropy->decode_mcu) (cinfo, NULL);
|
(*cinfo->entropy->decode_mcu) (cinfo, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+22
-13
@@ -4,7 +4,7 @@
|
|||||||
* This file was part of the Independent JPEG Group's software:
|
* This file was part of the Independent JPEG Group's software:
|
||||||
* Developed 1997-2015 by Guido Vollbeding.
|
* Developed 1997-2015 by Guido Vollbeding.
|
||||||
* libjpeg-turbo Modifications:
|
* libjpeg-turbo Modifications:
|
||||||
* Copyright (C) 2015-2018, D. R. Commander.
|
* Copyright (C) 2015-2020, 2022, D. R. Commander.
|
||||||
* For conditions of distribution and use, see the accompanying README.ijg
|
* For conditions of distribution and use, see the accompanying README.ijg
|
||||||
* file.
|
* file.
|
||||||
*
|
*
|
||||||
@@ -80,7 +80,7 @@ get_byte(j_decompress_ptr cinfo)
|
|||||||
if (!(*src->fill_input_buffer) (cinfo))
|
if (!(*src->fill_input_buffer) (cinfo))
|
||||||
ERREXIT(cinfo, JERR_CANT_SUSPEND);
|
ERREXIT(cinfo, JERR_CANT_SUSPEND);
|
||||||
src->bytes_in_buffer--;
|
src->bytes_in_buffer--;
|
||||||
return GETJOCTET(*src->next_input_byte++);
|
return *src->next_input_byte++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -210,13 +210,13 @@ process_restart(j_decompress_ptr cinfo)
|
|||||||
for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
|
for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
|
||||||
compptr = cinfo->cur_comp_info[ci];
|
compptr = cinfo->cur_comp_info[ci];
|
||||||
if (!cinfo->progressive_mode || (cinfo->Ss == 0 && cinfo->Ah == 0)) {
|
if (!cinfo->progressive_mode || (cinfo->Ss == 0 && cinfo->Ah == 0)) {
|
||||||
MEMZERO(entropy->dc_stats[compptr->dc_tbl_no], DC_STAT_BINS);
|
memset(entropy->dc_stats[compptr->dc_tbl_no], 0, DC_STAT_BINS);
|
||||||
/* Reset DC predictions to 0 */
|
/* Reset DC predictions to 0 */
|
||||||
entropy->last_dc_val[ci] = 0;
|
entropy->last_dc_val[ci] = 0;
|
||||||
entropy->dc_context[ci] = 0;
|
entropy->dc_context[ci] = 0;
|
||||||
}
|
}
|
||||||
if (!cinfo->progressive_mode || cinfo->Ss) {
|
if (!cinfo->progressive_mode || cinfo->Ss) {
|
||||||
MEMZERO(entropy->ac_stats[compptr->ac_tbl_no], AC_STAT_BINS);
|
memset(entropy->ac_stats[compptr->ac_tbl_no], 0, AC_STAT_BINS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -471,17 +471,17 @@ decode_mcu_AC_refine(j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
if (*thiscoef) { /* previously nonzero coef */
|
if (*thiscoef) { /* previously nonzero coef */
|
||||||
if (arith_decode(cinfo, st + 2)) {
|
if (arith_decode(cinfo, st + 2)) {
|
||||||
if (*thiscoef < 0)
|
if (*thiscoef < 0)
|
||||||
*thiscoef += m1;
|
*thiscoef += (JCOEF)m1;
|
||||||
else
|
else
|
||||||
*thiscoef += p1;
|
*thiscoef += (JCOEF)p1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (arith_decode(cinfo, st + 1)) { /* newly nonzero coef */
|
if (arith_decode(cinfo, st + 1)) { /* newly nonzero coef */
|
||||||
if (arith_decode(cinfo, entropy->fixed_bin))
|
if (arith_decode(cinfo, entropy->fixed_bin))
|
||||||
*thiscoef = m1;
|
*thiscoef = (JCOEF)m1;
|
||||||
else
|
else
|
||||||
*thiscoef = p1;
|
*thiscoef = (JCOEF)p1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
st += 3; k++;
|
st += 3; k++;
|
||||||
@@ -665,8 +665,16 @@ bad:
|
|||||||
for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
|
for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
|
||||||
int coefi, cindex = cinfo->cur_comp_info[ci]->component_index;
|
int coefi, cindex = cinfo->cur_comp_info[ci]->component_index;
|
||||||
int *coef_bit_ptr = &cinfo->coef_bits[cindex][0];
|
int *coef_bit_ptr = &cinfo->coef_bits[cindex][0];
|
||||||
|
int *prev_coef_bit_ptr =
|
||||||
|
&cinfo->coef_bits[cindex + cinfo->num_components][0];
|
||||||
if (cinfo->Ss && coef_bit_ptr[0] < 0) /* AC without prior DC scan */
|
if (cinfo->Ss && coef_bit_ptr[0] < 0) /* AC without prior DC scan */
|
||||||
WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, 0);
|
WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, 0);
|
||||||
|
for (coefi = MIN(cinfo->Ss, 1); coefi <= MAX(cinfo->Se, 9); coefi++) {
|
||||||
|
if (cinfo->input_scan_number > 1)
|
||||||
|
prev_coef_bit_ptr[coefi] = coef_bit_ptr[coefi];
|
||||||
|
else
|
||||||
|
prev_coef_bit_ptr[coefi] = 0;
|
||||||
|
}
|
||||||
for (coefi = cinfo->Ss; coefi <= cinfo->Se; coefi++) {
|
for (coefi = cinfo->Ss; coefi <= cinfo->Se; coefi++) {
|
||||||
int expected = (coef_bit_ptr[coefi] < 0) ? 0 : coef_bit_ptr[coefi];
|
int expected = (coef_bit_ptr[coefi] < 0) ? 0 : coef_bit_ptr[coefi];
|
||||||
if (cinfo->Ah != expected)
|
if (cinfo->Ah != expected)
|
||||||
@@ -690,8 +698,8 @@ bad:
|
|||||||
/* Check that the scan parameters Ss, Se, Ah/Al are OK for sequential JPEG.
|
/* Check that the scan parameters Ss, Se, Ah/Al are OK for sequential JPEG.
|
||||||
* This ought to be an error condition, but we make it a warning.
|
* This ought to be an error condition, but we make it a warning.
|
||||||
*/
|
*/
|
||||||
if (cinfo->Ss != 0 || cinfo->Ah != 0 || cinfo->Al != 0 ||
|
if (cinfo->Ss != 0 || cinfo->Se != DCTSIZE2 - 1 ||
|
||||||
(cinfo->Se < DCTSIZE2 && cinfo->Se != DCTSIZE2 - 1))
|
cinfo->Ah != 0 || cinfo->Al != 0)
|
||||||
WARNMS(cinfo, JWRN_NOT_SEQUENTIAL);
|
WARNMS(cinfo, JWRN_NOT_SEQUENTIAL);
|
||||||
/* Select MCU decoding routine */
|
/* Select MCU decoding routine */
|
||||||
entropy->pub.decode_mcu = decode_mcu;
|
entropy->pub.decode_mcu = decode_mcu;
|
||||||
@@ -707,7 +715,7 @@ bad:
|
|||||||
if (entropy->dc_stats[tbl] == NULL)
|
if (entropy->dc_stats[tbl] == NULL)
|
||||||
entropy->dc_stats[tbl] = (unsigned char *)(*cinfo->mem->alloc_small)
|
entropy->dc_stats[tbl] = (unsigned char *)(*cinfo->mem->alloc_small)
|
||||||
((j_common_ptr)cinfo, JPOOL_IMAGE, DC_STAT_BINS);
|
((j_common_ptr)cinfo, JPOOL_IMAGE, DC_STAT_BINS);
|
||||||
MEMZERO(entropy->dc_stats[tbl], DC_STAT_BINS);
|
memset(entropy->dc_stats[tbl], 0, DC_STAT_BINS);
|
||||||
/* Initialize DC predictions to 0 */
|
/* Initialize DC predictions to 0 */
|
||||||
entropy->last_dc_val[ci] = 0;
|
entropy->last_dc_val[ci] = 0;
|
||||||
entropy->dc_context[ci] = 0;
|
entropy->dc_context[ci] = 0;
|
||||||
@@ -719,7 +727,7 @@ bad:
|
|||||||
if (entropy->ac_stats[tbl] == NULL)
|
if (entropy->ac_stats[tbl] == NULL)
|
||||||
entropy->ac_stats[tbl] = (unsigned char *)(*cinfo->mem->alloc_small)
|
entropy->ac_stats[tbl] = (unsigned char *)(*cinfo->mem->alloc_small)
|
||||||
((j_common_ptr)cinfo, JPOOL_IMAGE, AC_STAT_BINS);
|
((j_common_ptr)cinfo, JPOOL_IMAGE, AC_STAT_BINS);
|
||||||
MEMZERO(entropy->ac_stats[tbl], AC_STAT_BINS);
|
memset(entropy->ac_stats[tbl], 0, AC_STAT_BINS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -727,6 +735,7 @@ bad:
|
|||||||
entropy->c = 0;
|
entropy->c = 0;
|
||||||
entropy->a = 0;
|
entropy->a = 0;
|
||||||
entropy->ct = -16; /* force reading 2 initial bytes to fill C */
|
entropy->ct = -16; /* force reading 2 initial bytes to fill C */
|
||||||
|
entropy->pub.insufficient_data = FALSE;
|
||||||
|
|
||||||
/* Initialize restart counter */
|
/* Initialize restart counter */
|
||||||
entropy->restarts_to_go = cinfo->restart_interval;
|
entropy->restarts_to_go = cinfo->restart_interval;
|
||||||
@@ -763,7 +772,7 @@ jinit_arith_decoder(j_decompress_ptr cinfo)
|
|||||||
int *coef_bit_ptr, ci;
|
int *coef_bit_ptr, ci;
|
||||||
cinfo->coef_bits = (int (*)[DCTSIZE2])
|
cinfo->coef_bits = (int (*)[DCTSIZE2])
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
|
(*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
|
||||||
cinfo->num_components * DCTSIZE2 *
|
cinfo->num_components * 2 * DCTSIZE2 *
|
||||||
sizeof(int));
|
sizeof(int));
|
||||||
coef_bit_ptr = &cinfo->coef_bits[0][0];
|
coef_bit_ptr = &cinfo->coef_bits[0][0];
|
||||||
for (ci = 0; ci < cinfo->num_components; ci++)
|
for (ci = 0; ci < cinfo->num_components; ci++)
|
||||||
|
|||||||
+4
-9
@@ -5,7 +5,7 @@
|
|||||||
* Copyright (C) 1994-1996, Thomas G. Lane.
|
* Copyright (C) 1994-1996, Thomas G. Lane.
|
||||||
* Modified 2009-2012 by Guido Vollbeding.
|
* Modified 2009-2012 by Guido Vollbeding.
|
||||||
* libjpeg-turbo Modifications:
|
* libjpeg-turbo Modifications:
|
||||||
* Copyright (C) 2013, 2016, D. R. Commander.
|
* Copyright (C) 2013, 2016, 2022, D. R. Commander.
|
||||||
* For conditions of distribution and use, see the accompanying README.ijg
|
* For conditions of distribution and use, see the accompanying README.ijg
|
||||||
* file.
|
* file.
|
||||||
*
|
*
|
||||||
@@ -23,11 +23,6 @@
|
|||||||
#include "jpeglib.h"
|
#include "jpeglib.h"
|
||||||
#include "jerror.h"
|
#include "jerror.h"
|
||||||
|
|
||||||
#ifndef HAVE_STDLIB_H /* <stdlib.h> should declare malloc(),free() */
|
|
||||||
extern void *malloc(size_t size);
|
|
||||||
extern void free(void *ptr);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* Expanded data destination object for stdio output */
|
/* Expanded data destination object for stdio output */
|
||||||
|
|
||||||
@@ -116,7 +111,7 @@ empty_output_buffer(j_compress_ptr cinfo)
|
|||||||
{
|
{
|
||||||
my_dest_ptr dest = (my_dest_ptr)cinfo->dest;
|
my_dest_ptr dest = (my_dest_ptr)cinfo->dest;
|
||||||
|
|
||||||
if (JFWRITE(dest->outfile, dest->buffer, OUTPUT_BUF_SIZE) !=
|
if (fwrite(dest->buffer, 1, OUTPUT_BUF_SIZE, dest->outfile) !=
|
||||||
(size_t)OUTPUT_BUF_SIZE)
|
(size_t)OUTPUT_BUF_SIZE)
|
||||||
ERREXIT(cinfo, JERR_FILE_WRITE);
|
ERREXIT(cinfo, JERR_FILE_WRITE);
|
||||||
|
|
||||||
@@ -141,7 +136,7 @@ empty_mem_output_buffer(j_compress_ptr cinfo)
|
|||||||
if (nextbuffer == NULL)
|
if (nextbuffer == NULL)
|
||||||
ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 10);
|
ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 10);
|
||||||
|
|
||||||
MEMCOPY(nextbuffer, dest->buffer, dest->bufsize);
|
memcpy(nextbuffer, dest->buffer, dest->bufsize);
|
||||||
|
|
||||||
free(dest->newbuffer);
|
free(dest->newbuffer);
|
||||||
|
|
||||||
@@ -175,7 +170,7 @@ term_destination(j_compress_ptr cinfo)
|
|||||||
|
|
||||||
/* Write any data remaining in the buffer */
|
/* Write any data remaining in the buffer */
|
||||||
if (datacount > 0) {
|
if (datacount > 0) {
|
||||||
if (JFWRITE(dest->outfile, dest->buffer, datacount) != datacount)
|
if (fwrite(dest->buffer, 1, datacount, dest->outfile) != datacount)
|
||||||
ERREXIT(cinfo, JERR_FILE_WRITE);
|
ERREXIT(cinfo, JERR_FILE_WRITE);
|
||||||
}
|
}
|
||||||
fflush(dest->outfile);
|
fflush(dest->outfile);
|
||||||
|
|||||||
+2
-2
@@ -5,7 +5,7 @@
|
|||||||
* Copyright (C) 1994-1996, Thomas G. Lane.
|
* Copyright (C) 1994-1996, Thomas G. Lane.
|
||||||
* Modified 2009-2011 by Guido Vollbeding.
|
* Modified 2009-2011 by Guido Vollbeding.
|
||||||
* libjpeg-turbo Modifications:
|
* libjpeg-turbo Modifications:
|
||||||
* Copyright (C) 2013, 2016, D. R. Commander.
|
* Copyright (C) 2013, 2016, 2022, D. R. Commander.
|
||||||
* For conditions of distribution and use, see the accompanying README.ijg
|
* For conditions of distribution and use, see the accompanying README.ijg
|
||||||
* file.
|
* file.
|
||||||
*
|
*
|
||||||
@@ -104,7 +104,7 @@ fill_input_buffer(j_decompress_ptr cinfo)
|
|||||||
my_src_ptr src = (my_src_ptr)cinfo->src;
|
my_src_ptr src = (my_src_ptr)cinfo->src;
|
||||||
size_t nbytes;
|
size_t nbytes;
|
||||||
|
|
||||||
nbytes = JFREAD(src->infile, src->buffer, INPUT_BUF_SIZE);
|
nbytes = fread(src->buffer, 1, INPUT_BUF_SIZE, src->infile);
|
||||||
|
|
||||||
if (nbytes <= 0) {
|
if (nbytes <= 0) {
|
||||||
if (src->start_of_file) /* Treat empty input file as fatal error */
|
if (src->start_of_file) /* Treat empty input file as fatal error */
|
||||||
|
|||||||
+237
-53
@@ -5,7 +5,7 @@
|
|||||||
* Copyright (C) 1994-1997, Thomas G. Lane.
|
* Copyright (C) 1994-1997, Thomas G. Lane.
|
||||||
* libjpeg-turbo Modifications:
|
* libjpeg-turbo Modifications:
|
||||||
* Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB
|
* Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB
|
||||||
* Copyright (C) 2010, 2015-2016, D. R. Commander.
|
* Copyright (C) 2010, 2015-2016, 2019-2020, D. R. Commander.
|
||||||
* Copyright (C) 2015, 2020, Google, Inc.
|
* Copyright (C) 2015, 2020, Google, Inc.
|
||||||
* For conditions of distribution and use, see the accompanying README.ijg
|
* For conditions of distribution and use, see the accompanying README.ijg
|
||||||
* file.
|
* file.
|
||||||
@@ -102,6 +102,8 @@ decompress_onepass(j_decompress_ptr cinfo, JSAMPIMAGE output_buf)
|
|||||||
/* Try to fetch an MCU. Entropy decoder expects buffer to be zeroed. */
|
/* Try to fetch an MCU. Entropy decoder expects buffer to be zeroed. */
|
||||||
jzero_far((void *)coef->MCU_buffer[0],
|
jzero_far((void *)coef->MCU_buffer[0],
|
||||||
(size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
|
(size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
|
||||||
|
if (!cinfo->entropy->insufficient_data)
|
||||||
|
cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
|
||||||
if (!(*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
|
if (!(*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
|
||||||
/* Suspension forced; update state counters and exit */
|
/* Suspension forced; update state counters and exit */
|
||||||
coef->MCU_vert_offset = yoffset;
|
coef->MCU_vert_offset = yoffset;
|
||||||
@@ -227,6 +229,8 @@ consume_data(j_decompress_ptr cinfo)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!cinfo->entropy->insufficient_data)
|
||||||
|
cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
|
||||||
/* Try to fetch the MCU. */
|
/* Try to fetch the MCU. */
|
||||||
if (!(*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
|
if (!(*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
|
||||||
/* Suspension forced; update state counters and exit */
|
/* Suspension forced; update state counters and exit */
|
||||||
@@ -326,19 +330,22 @@ decompress_data(j_decompress_ptr cinfo, JSAMPIMAGE output_buf)
|
|||||||
#ifdef BLOCK_SMOOTHING_SUPPORTED
|
#ifdef BLOCK_SMOOTHING_SUPPORTED
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This code applies interblock smoothing as described by section K.8
|
* This code applies interblock smoothing; the first 9 AC coefficients are
|
||||||
* of the JPEG standard: the first 5 AC coefficients are estimated from
|
* estimated from the DC values of a DCT block and its 24 neighboring blocks.
|
||||||
* the DC values of a DCT block and its 8 neighboring blocks.
|
|
||||||
* We apply smoothing only for progressive JPEG decoding, and only if
|
* We apply smoothing only for progressive JPEG decoding, and only if
|
||||||
* the coefficients it can estimate are not yet known to full precision.
|
* the coefficients it can estimate are not yet known to full precision.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Natural-order array positions of the first 5 zigzag-order coefficients */
|
/* Natural-order array positions of the first 9 zigzag-order coefficients */
|
||||||
#define Q01_POS 1
|
#define Q01_POS 1
|
||||||
#define Q10_POS 8
|
#define Q10_POS 8
|
||||||
#define Q20_POS 16
|
#define Q20_POS 16
|
||||||
#define Q11_POS 9
|
#define Q11_POS 9
|
||||||
#define Q02_POS 2
|
#define Q02_POS 2
|
||||||
|
#define Q03_POS 3
|
||||||
|
#define Q12_POS 10
|
||||||
|
#define Q21_POS 17
|
||||||
|
#define Q30_POS 24
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Determine whether block smoothing is applicable and safe.
|
* Determine whether block smoothing is applicable and safe.
|
||||||
@@ -356,8 +363,8 @@ smoothing_ok(j_decompress_ptr cinfo)
|
|||||||
int ci, coefi;
|
int ci, coefi;
|
||||||
jpeg_component_info *compptr;
|
jpeg_component_info *compptr;
|
||||||
JQUANT_TBL *qtable;
|
JQUANT_TBL *qtable;
|
||||||
int *coef_bits;
|
int *coef_bits, *prev_coef_bits;
|
||||||
int *coef_bits_latch;
|
int *coef_bits_latch, *prev_coef_bits_latch;
|
||||||
|
|
||||||
if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
|
if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@@ -366,34 +373,47 @@ smoothing_ok(j_decompress_ptr cinfo)
|
|||||||
if (coef->coef_bits_latch == NULL)
|
if (coef->coef_bits_latch == NULL)
|
||||||
coef->coef_bits_latch = (int *)
|
coef->coef_bits_latch = (int *)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
|
(*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
|
||||||
cinfo->num_components *
|
cinfo->num_components * 2 *
|
||||||
(SAVED_COEFS * sizeof(int)));
|
(SAVED_COEFS * sizeof(int)));
|
||||||
coef_bits_latch = coef->coef_bits_latch;
|
coef_bits_latch = coef->coef_bits_latch;
|
||||||
|
prev_coef_bits_latch =
|
||||||
|
&coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
|
||||||
|
|
||||||
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
|
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
|
||||||
ci++, compptr++) {
|
ci++, compptr++) {
|
||||||
/* All components' quantization values must already be latched. */
|
/* All components' quantization values must already be latched. */
|
||||||
if ((qtable = compptr->quant_table) == NULL)
|
if ((qtable = compptr->quant_table) == NULL)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
/* Verify DC & first 5 AC quantizers are nonzero to avoid zero-divide. */
|
/* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
|
||||||
if (qtable->quantval[0] == 0 ||
|
if (qtable->quantval[0] == 0 ||
|
||||||
qtable->quantval[Q01_POS] == 0 ||
|
qtable->quantval[Q01_POS] == 0 ||
|
||||||
qtable->quantval[Q10_POS] == 0 ||
|
qtable->quantval[Q10_POS] == 0 ||
|
||||||
qtable->quantval[Q20_POS] == 0 ||
|
qtable->quantval[Q20_POS] == 0 ||
|
||||||
qtable->quantval[Q11_POS] == 0 ||
|
qtable->quantval[Q11_POS] == 0 ||
|
||||||
qtable->quantval[Q02_POS] == 0)
|
qtable->quantval[Q02_POS] == 0 ||
|
||||||
|
qtable->quantval[Q03_POS] == 0 ||
|
||||||
|
qtable->quantval[Q12_POS] == 0 ||
|
||||||
|
qtable->quantval[Q21_POS] == 0 ||
|
||||||
|
qtable->quantval[Q30_POS] == 0)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
/* DC values must be at least partly known for all components. */
|
/* DC values must be at least partly known for all components. */
|
||||||
coef_bits = cinfo->coef_bits[ci];
|
coef_bits = cinfo->coef_bits[ci];
|
||||||
|
prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
|
||||||
if (coef_bits[0] < 0)
|
if (coef_bits[0] < 0)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
coef_bits_latch[0] = coef_bits[0];
|
||||||
/* Block smoothing is helpful if some AC coefficients remain inaccurate. */
|
/* Block smoothing is helpful if some AC coefficients remain inaccurate. */
|
||||||
for (coefi = 1; coefi <= 5; coefi++) {
|
for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
|
||||||
|
if (cinfo->input_scan_number > 1)
|
||||||
|
prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
|
||||||
|
else
|
||||||
|
prev_coef_bits_latch[coefi] = -1;
|
||||||
coef_bits_latch[coefi] = coef_bits[coefi];
|
coef_bits_latch[coefi] = coef_bits[coefi];
|
||||||
if (coef_bits[coefi] != 0)
|
if (coef_bits[coefi] != 0)
|
||||||
smoothing_useful = TRUE;
|
smoothing_useful = TRUE;
|
||||||
}
|
}
|
||||||
coef_bits_latch += SAVED_COEFS;
|
coef_bits_latch += SAVED_COEFS;
|
||||||
|
prev_coef_bits_latch += SAVED_COEFS;
|
||||||
}
|
}
|
||||||
|
|
||||||
return smoothing_useful;
|
return smoothing_useful;
|
||||||
@@ -412,17 +432,20 @@ decompress_smooth_data(j_decompress_ptr cinfo, JSAMPIMAGE output_buf)
|
|||||||
JDIMENSION block_num, last_block_column;
|
JDIMENSION block_num, last_block_column;
|
||||||
int ci, block_row, block_rows, access_rows;
|
int ci, block_row, block_rows, access_rows;
|
||||||
JBLOCKARRAY buffer;
|
JBLOCKARRAY buffer;
|
||||||
JBLOCKROW buffer_ptr, prev_block_row, next_block_row;
|
JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
|
||||||
|
JBLOCKROW next_block_row, next_next_block_row;
|
||||||
JSAMPARRAY output_ptr;
|
JSAMPARRAY output_ptr;
|
||||||
JDIMENSION output_col;
|
JDIMENSION output_col;
|
||||||
jpeg_component_info *compptr;
|
jpeg_component_info *compptr;
|
||||||
inverse_DCT_method_ptr inverse_DCT;
|
inverse_DCT_method_ptr inverse_DCT;
|
||||||
boolean first_row, last_row;
|
boolean change_dc;
|
||||||
JCOEF *workspace;
|
JCOEF *workspace;
|
||||||
int *coef_bits;
|
int *coef_bits;
|
||||||
JQUANT_TBL *quanttbl;
|
JQUANT_TBL *quanttbl;
|
||||||
JLONG Q00, Q01, Q02, Q10, Q11, Q20, num;
|
JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
|
||||||
int DC1, DC2, DC3, DC4, DC5, DC6, DC7, DC8, DC9;
|
int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
|
||||||
|
DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
|
||||||
|
DC25;
|
||||||
int Al, pred;
|
int Al, pred;
|
||||||
|
|
||||||
/* Keep a local variable to avoid looking it up more than once */
|
/* Keep a local variable to avoid looking it up more than once */
|
||||||
@@ -434,10 +457,10 @@ decompress_smooth_data(j_decompress_ptr cinfo, JSAMPIMAGE output_buf)
|
|||||||
if (cinfo->input_scan_number == cinfo->output_scan_number) {
|
if (cinfo->input_scan_number == cinfo->output_scan_number) {
|
||||||
/* If input is working on current scan, we ordinarily want it to
|
/* If input is working on current scan, we ordinarily want it to
|
||||||
* have completed the current row. But if input scan is DC,
|
* have completed the current row. But if input scan is DC,
|
||||||
* we want it to keep one row ahead so that next block row's DC
|
* we want it to keep two rows ahead so that next two block rows' DC
|
||||||
* values are up to date.
|
* values are up to date.
|
||||||
*/
|
*/
|
||||||
JDIMENSION delta = (cinfo->Ss == 0) ? 1 : 0;
|
JDIMENSION delta = (cinfo->Ss == 0) ? 2 : 0;
|
||||||
if (cinfo->input_iMCU_row > cinfo->output_iMCU_row + delta)
|
if (cinfo->input_iMCU_row > cinfo->output_iMCU_row + delta)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -452,34 +475,53 @@ decompress_smooth_data(j_decompress_ptr cinfo, JSAMPIMAGE output_buf)
|
|||||||
if (!compptr->component_needed)
|
if (!compptr->component_needed)
|
||||||
continue;
|
continue;
|
||||||
/* Count non-dummy DCT block rows in this iMCU row. */
|
/* Count non-dummy DCT block rows in this iMCU row. */
|
||||||
if (cinfo->output_iMCU_row < last_iMCU_row) {
|
if (cinfo->output_iMCU_row < last_iMCU_row - 1) {
|
||||||
|
block_rows = compptr->v_samp_factor;
|
||||||
|
access_rows = block_rows * 3; /* this and next two iMCU rows */
|
||||||
|
} else if (cinfo->output_iMCU_row < last_iMCU_row) {
|
||||||
block_rows = compptr->v_samp_factor;
|
block_rows = compptr->v_samp_factor;
|
||||||
access_rows = block_rows * 2; /* this and next iMCU row */
|
access_rows = block_rows * 2; /* this and next iMCU row */
|
||||||
last_row = FALSE;
|
|
||||||
} else {
|
} else {
|
||||||
/* NB: can't use last_row_height here; it is input-side-dependent! */
|
/* NB: can't use last_row_height here; it is input-side-dependent! */
|
||||||
block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
|
block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
|
||||||
if (block_rows == 0) block_rows = compptr->v_samp_factor;
|
if (block_rows == 0) block_rows = compptr->v_samp_factor;
|
||||||
access_rows = block_rows; /* this iMCU row only */
|
access_rows = block_rows; /* this iMCU row only */
|
||||||
last_row = TRUE;
|
|
||||||
}
|
}
|
||||||
/* Align the virtual buffer for this component. */
|
/* Align the virtual buffer for this component. */
|
||||||
if (cinfo->output_iMCU_row > 0) {
|
if (cinfo->output_iMCU_row > 1) {
|
||||||
access_rows += compptr->v_samp_factor; /* prior iMCU row too */
|
access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
|
||||||
|
buffer = (*cinfo->mem->access_virt_barray)
|
||||||
|
((j_common_ptr)cinfo, coef->whole_image[ci],
|
||||||
|
(cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
|
||||||
|
(JDIMENSION)access_rows, FALSE);
|
||||||
|
buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
|
||||||
|
} else if (cinfo->output_iMCU_row > 0) {
|
||||||
buffer = (*cinfo->mem->access_virt_barray)
|
buffer = (*cinfo->mem->access_virt_barray)
|
||||||
((j_common_ptr)cinfo, coef->whole_image[ci],
|
((j_common_ptr)cinfo, coef->whole_image[ci],
|
||||||
(cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
|
(cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
|
||||||
(JDIMENSION)access_rows, FALSE);
|
(JDIMENSION)access_rows, FALSE);
|
||||||
buffer += compptr->v_samp_factor; /* point to current iMCU row */
|
buffer += compptr->v_samp_factor; /* point to current iMCU row */
|
||||||
first_row = FALSE;
|
|
||||||
} else {
|
} else {
|
||||||
buffer = (*cinfo->mem->access_virt_barray)
|
buffer = (*cinfo->mem->access_virt_barray)
|
||||||
((j_common_ptr)cinfo, coef->whole_image[ci],
|
((j_common_ptr)cinfo, coef->whole_image[ci],
|
||||||
(JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
|
(JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
|
||||||
first_row = TRUE;
|
|
||||||
}
|
}
|
||||||
/* Fetch component-dependent info */
|
/* Fetch component-dependent info.
|
||||||
coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
|
* If the current scan is incomplete, then we use the component-dependent
|
||||||
|
* info from the previous scan.
|
||||||
|
*/
|
||||||
|
if (cinfo->output_iMCU_row > cinfo->master->last_good_iMCU_row)
|
||||||
|
coef_bits =
|
||||||
|
coef->coef_bits_latch + ((ci + cinfo->num_components) * SAVED_COEFS);
|
||||||
|
else
|
||||||
|
coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
|
||||||
|
|
||||||
|
/* We only do DC interpolation if no AC coefficient data is available. */
|
||||||
|
change_dc =
|
||||||
|
coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
|
||||||
|
coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
|
||||||
|
coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
|
||||||
|
|
||||||
quanttbl = compptr->quant_table;
|
quanttbl = compptr->quant_table;
|
||||||
Q00 = quanttbl->quantval[0];
|
Q00 = quanttbl->quantval[0];
|
||||||
Q01 = quanttbl->quantval[Q01_POS];
|
Q01 = quanttbl->quantval[Q01_POS];
|
||||||
@@ -487,27 +529,51 @@ decompress_smooth_data(j_decompress_ptr cinfo, JSAMPIMAGE output_buf)
|
|||||||
Q20 = quanttbl->quantval[Q20_POS];
|
Q20 = quanttbl->quantval[Q20_POS];
|
||||||
Q11 = quanttbl->quantval[Q11_POS];
|
Q11 = quanttbl->quantval[Q11_POS];
|
||||||
Q02 = quanttbl->quantval[Q02_POS];
|
Q02 = quanttbl->quantval[Q02_POS];
|
||||||
|
if (change_dc) {
|
||||||
|
Q03 = quanttbl->quantval[Q03_POS];
|
||||||
|
Q12 = quanttbl->quantval[Q12_POS];
|
||||||
|
Q21 = quanttbl->quantval[Q21_POS];
|
||||||
|
Q30 = quanttbl->quantval[Q30_POS];
|
||||||
|
}
|
||||||
inverse_DCT = cinfo->idct->inverse_DCT[ci];
|
inverse_DCT = cinfo->idct->inverse_DCT[ci];
|
||||||
output_ptr = output_buf[ci];
|
output_ptr = output_buf[ci];
|
||||||
/* Loop over all DCT blocks to be processed. */
|
/* Loop over all DCT blocks to be processed. */
|
||||||
for (block_row = 0; block_row < block_rows; block_row++) {
|
for (block_row = 0; block_row < block_rows; block_row++) {
|
||||||
buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
|
buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
|
||||||
if (first_row && block_row == 0)
|
|
||||||
|
if (block_row > 0 || cinfo->output_iMCU_row > 0)
|
||||||
|
prev_block_row =
|
||||||
|
buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
|
||||||
|
else
|
||||||
prev_block_row = buffer_ptr;
|
prev_block_row = buffer_ptr;
|
||||||
|
|
||||||
|
if (block_row > 1 || cinfo->output_iMCU_row > 1)
|
||||||
|
prev_prev_block_row =
|
||||||
|
buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
|
||||||
|
else
|
||||||
|
prev_prev_block_row = prev_block_row;
|
||||||
|
|
||||||
|
if (block_row < block_rows - 1 || cinfo->output_iMCU_row < last_iMCU_row)
|
||||||
|
next_block_row =
|
||||||
|
buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
|
||||||
else
|
else
|
||||||
prev_block_row = buffer[block_row - 1] +
|
|
||||||
cinfo->master->first_MCU_col[ci];
|
|
||||||
if (last_row && block_row == block_rows - 1)
|
|
||||||
next_block_row = buffer_ptr;
|
next_block_row = buffer_ptr;
|
||||||
|
|
||||||
|
if (block_row < block_rows - 2 ||
|
||||||
|
cinfo->output_iMCU_row < last_iMCU_row - 1)
|
||||||
|
next_next_block_row =
|
||||||
|
buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
|
||||||
else
|
else
|
||||||
next_block_row = buffer[block_row + 1] +
|
next_next_block_row = next_block_row;
|
||||||
cinfo->master->first_MCU_col[ci];
|
|
||||||
/* We fetch the surrounding DC values using a sliding-register approach.
|
/* We fetch the surrounding DC values using a sliding-register approach.
|
||||||
* Initialize all nine here so as to do the right thing on narrow pics.
|
* Initialize all 25 here so as to do the right thing on narrow pics.
|
||||||
*/
|
*/
|
||||||
DC1 = DC2 = DC3 = (int)prev_block_row[0][0];
|
DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
|
||||||
DC4 = DC5 = DC6 = (int)buffer_ptr[0][0];
|
DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
|
||||||
DC7 = DC8 = DC9 = (int)next_block_row[0][0];
|
DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
|
||||||
|
DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
|
||||||
|
DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
|
||||||
output_col = 0;
|
output_col = 0;
|
||||||
last_block_column = compptr->width_in_blocks - 1;
|
last_block_column = compptr->width_in_blocks - 1;
|
||||||
for (block_num = cinfo->master->first_MCU_col[ci];
|
for (block_num = cinfo->master->first_MCU_col[ci];
|
||||||
@@ -515,18 +581,39 @@ decompress_smooth_data(j_decompress_ptr cinfo, JSAMPIMAGE output_buf)
|
|||||||
/* Fetch current DCT block into workspace so we can modify it. */
|
/* Fetch current DCT block into workspace so we can modify it. */
|
||||||
jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
|
jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
|
||||||
/* Update DC values */
|
/* Update DC values */
|
||||||
if (block_num < last_block_column) {
|
if (block_num == cinfo->master->first_MCU_col[ci] &&
|
||||||
DC3 = (int)prev_block_row[1][0];
|
block_num < last_block_column) {
|
||||||
DC6 = (int)buffer_ptr[1][0];
|
DC04 = (int)prev_prev_block_row[1][0];
|
||||||
DC9 = (int)next_block_row[1][0];
|
DC09 = (int)prev_block_row[1][0];
|
||||||
|
DC14 = (int)buffer_ptr[1][0];
|
||||||
|
DC19 = (int)next_block_row[1][0];
|
||||||
|
DC24 = (int)next_next_block_row[1][0];
|
||||||
}
|
}
|
||||||
/* Compute coefficient estimates per K.8.
|
if (block_num + 1 < last_block_column) {
|
||||||
* An estimate is applied only if coefficient is still zero,
|
DC05 = (int)prev_prev_block_row[2][0];
|
||||||
* and is not known to be fully accurate.
|
DC10 = (int)prev_block_row[2][0];
|
||||||
|
DC15 = (int)buffer_ptr[2][0];
|
||||||
|
DC20 = (int)next_block_row[2][0];
|
||||||
|
DC25 = (int)next_next_block_row[2][0];
|
||||||
|
}
|
||||||
|
/* If DC interpolation is enabled, compute coefficient estimates using
|
||||||
|
* a Gaussian-like kernel, keeping the averages of the DC values.
|
||||||
|
*
|
||||||
|
* If DC interpolation is disabled, compute coefficient estimates using
|
||||||
|
* an algorithm similar to the one described in Section K.8 of the JPEG
|
||||||
|
* standard, except applied to a 5x5 window rather than a 3x3 window.
|
||||||
|
*
|
||||||
|
* An estimate is applied only if the coefficient is still zero and is
|
||||||
|
* not known to be fully accurate.
|
||||||
*/
|
*/
|
||||||
/* AC01 */
|
/* AC01 */
|
||||||
if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
|
if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
|
||||||
num = 36 * Q00 * (DC4 - DC6);
|
num = Q00 * (change_dc ?
|
||||||
|
(-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
|
||||||
|
13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
|
||||||
|
3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
|
||||||
|
DC21 - DC22 + DC24 + DC25) :
|
||||||
|
(-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
|
||||||
if (num >= 0) {
|
if (num >= 0) {
|
||||||
pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
|
pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
|
||||||
if (Al > 0 && pred >= (1 << Al))
|
if (Al > 0 && pred >= (1 << Al))
|
||||||
@@ -541,7 +628,12 @@ decompress_smooth_data(j_decompress_ptr cinfo, JSAMPIMAGE output_buf)
|
|||||||
}
|
}
|
||||||
/* AC10 */
|
/* AC10 */
|
||||||
if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
|
if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
|
||||||
num = 36 * Q00 * (DC2 - DC8);
|
num = Q00 * (change_dc ?
|
||||||
|
(-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
|
||||||
|
13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
|
||||||
|
13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
|
||||||
|
3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
|
||||||
|
(-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
|
||||||
if (num >= 0) {
|
if (num >= 0) {
|
||||||
pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
|
pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
|
||||||
if (Al > 0 && pred >= (1 << Al))
|
if (Al > 0 && pred >= (1 << Al))
|
||||||
@@ -556,7 +648,10 @@ decompress_smooth_data(j_decompress_ptr cinfo, JSAMPIMAGE output_buf)
|
|||||||
}
|
}
|
||||||
/* AC20 */
|
/* AC20 */
|
||||||
if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
|
if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
|
||||||
num = 9 * Q00 * (DC2 + DC8 - 2 * DC5);
|
num = Q00 * (change_dc ?
|
||||||
|
(DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
|
||||||
|
5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
|
||||||
|
(-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
|
||||||
if (num >= 0) {
|
if (num >= 0) {
|
||||||
pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
|
pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
|
||||||
if (Al > 0 && pred >= (1 << Al))
|
if (Al > 0 && pred >= (1 << Al))
|
||||||
@@ -571,7 +666,11 @@ decompress_smooth_data(j_decompress_ptr cinfo, JSAMPIMAGE output_buf)
|
|||||||
}
|
}
|
||||||
/* AC11 */
|
/* AC11 */
|
||||||
if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
|
if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
|
||||||
num = 5 * Q00 * (DC1 - DC3 - DC7 + DC9);
|
num = Q00 * (change_dc ?
|
||||||
|
(-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
|
||||||
|
9 * DC19 + DC21 - DC25) :
|
||||||
|
(DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
|
||||||
|
DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
|
||||||
if (num >= 0) {
|
if (num >= 0) {
|
||||||
pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
|
pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
|
||||||
if (Al > 0 && pred >= (1 << Al))
|
if (Al > 0 && pred >= (1 << Al))
|
||||||
@@ -586,7 +685,10 @@ decompress_smooth_data(j_decompress_ptr cinfo, JSAMPIMAGE output_buf)
|
|||||||
}
|
}
|
||||||
/* AC02 */
|
/* AC02 */
|
||||||
if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
|
if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
|
||||||
num = 9 * Q00 * (DC4 + DC6 - 2 * DC5);
|
num = Q00 * (change_dc ?
|
||||||
|
(2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
|
||||||
|
7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
|
||||||
|
(-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
|
||||||
if (num >= 0) {
|
if (num >= 0) {
|
||||||
pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
|
pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
|
||||||
if (Al > 0 && pred >= (1 << Al))
|
if (Al > 0 && pred >= (1 << Al))
|
||||||
@@ -599,14 +701,96 @@ decompress_smooth_data(j_decompress_ptr cinfo, JSAMPIMAGE output_buf)
|
|||||||
}
|
}
|
||||||
workspace[2] = (JCOEF)pred;
|
workspace[2] = (JCOEF)pred;
|
||||||
}
|
}
|
||||||
|
if (change_dc) {
|
||||||
|
/* AC03 */
|
||||||
|
if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
|
||||||
|
num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
|
||||||
|
if (num >= 0) {
|
||||||
|
pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
|
||||||
|
if (Al > 0 && pred >= (1 << Al))
|
||||||
|
pred = (1 << Al) - 1;
|
||||||
|
} else {
|
||||||
|
pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
|
||||||
|
if (Al > 0 && pred >= (1 << Al))
|
||||||
|
pred = (1 << Al) - 1;
|
||||||
|
pred = -pred;
|
||||||
|
}
|
||||||
|
workspace[3] = (JCOEF)pred;
|
||||||
|
}
|
||||||
|
/* AC12 */
|
||||||
|
if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
|
||||||
|
num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
|
||||||
|
if (num >= 0) {
|
||||||
|
pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
|
||||||
|
if (Al > 0 && pred >= (1 << Al))
|
||||||
|
pred = (1 << Al) - 1;
|
||||||
|
} else {
|
||||||
|
pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
|
||||||
|
if (Al > 0 && pred >= (1 << Al))
|
||||||
|
pred = (1 << Al) - 1;
|
||||||
|
pred = -pred;
|
||||||
|
}
|
||||||
|
workspace[10] = (JCOEF)pred;
|
||||||
|
}
|
||||||
|
/* AC21 */
|
||||||
|
if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
|
||||||
|
num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
|
||||||
|
if (num >= 0) {
|
||||||
|
pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
|
||||||
|
if (Al > 0 && pred >= (1 << Al))
|
||||||
|
pred = (1 << Al) - 1;
|
||||||
|
} else {
|
||||||
|
pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
|
||||||
|
if (Al > 0 && pred >= (1 << Al))
|
||||||
|
pred = (1 << Al) - 1;
|
||||||
|
pred = -pred;
|
||||||
|
}
|
||||||
|
workspace[17] = (JCOEF)pred;
|
||||||
|
}
|
||||||
|
/* AC30 */
|
||||||
|
if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
|
||||||
|
num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
|
||||||
|
if (num >= 0) {
|
||||||
|
pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
|
||||||
|
if (Al > 0 && pred >= (1 << Al))
|
||||||
|
pred = (1 << Al) - 1;
|
||||||
|
} else {
|
||||||
|
pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
|
||||||
|
if (Al > 0 && pred >= (1 << Al))
|
||||||
|
pred = (1 << Al) - 1;
|
||||||
|
pred = -pred;
|
||||||
|
}
|
||||||
|
workspace[24] = (JCOEF)pred;
|
||||||
|
}
|
||||||
|
/* coef_bits[0] is non-negative. Otherwise this function would not
|
||||||
|
* be called.
|
||||||
|
*/
|
||||||
|
num = Q00 *
|
||||||
|
(-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
|
||||||
|
6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
|
||||||
|
8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
|
||||||
|
6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
|
||||||
|
2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
|
||||||
|
if (num >= 0) {
|
||||||
|
pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
|
||||||
|
} else {
|
||||||
|
pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
|
||||||
|
pred = -pred;
|
||||||
|
}
|
||||||
|
workspace[0] = (JCOEF)pred;
|
||||||
|
} /* change_dc */
|
||||||
|
|
||||||
/* OK, do the IDCT */
|
/* OK, do the IDCT */
|
||||||
(*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
|
(*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
|
||||||
output_col);
|
output_col);
|
||||||
/* Advance for next column */
|
/* Advance for next column */
|
||||||
DC1 = DC2; DC2 = DC3;
|
DC01 = DC02; DC02 = DC03; DC03 = DC04; DC04 = DC05;
|
||||||
DC4 = DC5; DC5 = DC6;
|
DC06 = DC07; DC07 = DC08; DC08 = DC09; DC09 = DC10;
|
||||||
DC7 = DC8; DC8 = DC9;
|
DC11 = DC12; DC12 = DC13; DC13 = DC14; DC14 = DC15;
|
||||||
buffer_ptr++, prev_block_row++, next_block_row++;
|
DC16 = DC17; DC17 = DC18; DC18 = DC19; DC19 = DC20;
|
||||||
|
DC21 = DC22; DC22 = DC23; DC23 = DC24; DC24 = DC25;
|
||||||
|
buffer_ptr++, prev_block_row++, next_block_row++,
|
||||||
|
prev_prev_block_row++, next_next_block_row++;
|
||||||
output_col += compptr->_DCT_scaled_size;
|
output_col += compptr->_DCT_scaled_size;
|
||||||
}
|
}
|
||||||
output_ptr += compptr->_DCT_scaled_size;
|
output_ptr += compptr->_DCT_scaled_size;
|
||||||
@@ -655,7 +839,7 @@ jinit_d_coef_controller(j_decompress_ptr cinfo, boolean need_full_buffer)
|
|||||||
#ifdef BLOCK_SMOOTHING_SUPPORTED
|
#ifdef BLOCK_SMOOTHING_SUPPORTED
|
||||||
/* If block smoothing could be used, need a bigger window */
|
/* If block smoothing could be used, need a bigger window */
|
||||||
if (cinfo->progressive_mode)
|
if (cinfo->progressive_mode)
|
||||||
access_rows *= 3;
|
access_rows *= 5;
|
||||||
#endif
|
#endif
|
||||||
coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
|
coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
|
||||||
((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
|
((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
|
||||||
|
|||||||
+2
-1
@@ -5,6 +5,7 @@
|
|||||||
* Copyright (C) 1994-1997, Thomas G. Lane.
|
* Copyright (C) 1994-1997, Thomas G. Lane.
|
||||||
* libjpeg-turbo Modifications:
|
* libjpeg-turbo Modifications:
|
||||||
* Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB
|
* Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB
|
||||||
|
* Copyright (C) 2020, Google, Inc.
|
||||||
* For conditions of distribution and use, see the accompanying README.ijg
|
* For conditions of distribution and use, see the accompanying README.ijg
|
||||||
* file.
|
* file.
|
||||||
*/
|
*/
|
||||||
@@ -51,7 +52,7 @@ typedef struct {
|
|||||||
#ifdef BLOCK_SMOOTHING_SUPPORTED
|
#ifdef BLOCK_SMOOTHING_SUPPORTED
|
||||||
/* When doing block smoothing, we latch coefficient Al values here */
|
/* When doing block smoothing, we latch coefficient Al values here */
|
||||||
int *coef_bits_latch;
|
int *coef_bits_latch;
|
||||||
#define SAVED_COEFS 6 /* we save coef_bits[0..5] */
|
#define SAVED_COEFS 10 /* we save coef_bits[0..9] */
|
||||||
#endif
|
#endif
|
||||||
} my_coef_controller;
|
} my_coef_controller;
|
||||||
|
|
||||||
|
|||||||
+48
-48
@@ -45,9 +45,9 @@ ycc_rgb565_convert_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
|
|||||||
outptr = *output_buf++;
|
outptr = *output_buf++;
|
||||||
|
|
||||||
if (PACK_NEED_ALIGNMENT(outptr)) {
|
if (PACK_NEED_ALIGNMENT(outptr)) {
|
||||||
y = GETJSAMPLE(*inptr0++);
|
y = *inptr0++;
|
||||||
cb = GETJSAMPLE(*inptr1++);
|
cb = *inptr1++;
|
||||||
cr = GETJSAMPLE(*inptr2++);
|
cr = *inptr2++;
|
||||||
r = range_limit[y + Crrtab[cr]];
|
r = range_limit[y + Crrtab[cr]];
|
||||||
g = range_limit[y + ((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
|
g = range_limit[y + ((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
|
||||||
SCALEBITS))];
|
SCALEBITS))];
|
||||||
@@ -58,18 +58,18 @@ ycc_rgb565_convert_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
|
|||||||
num_cols--;
|
num_cols--;
|
||||||
}
|
}
|
||||||
for (col = 0; col < (num_cols >> 1); col++) {
|
for (col = 0; col < (num_cols >> 1); col++) {
|
||||||
y = GETJSAMPLE(*inptr0++);
|
y = *inptr0++;
|
||||||
cb = GETJSAMPLE(*inptr1++);
|
cb = *inptr1++;
|
||||||
cr = GETJSAMPLE(*inptr2++);
|
cr = *inptr2++;
|
||||||
r = range_limit[y + Crrtab[cr]];
|
r = range_limit[y + Crrtab[cr]];
|
||||||
g = range_limit[y + ((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
|
g = range_limit[y + ((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
|
||||||
SCALEBITS))];
|
SCALEBITS))];
|
||||||
b = range_limit[y + Cbbtab[cb]];
|
b = range_limit[y + Cbbtab[cb]];
|
||||||
rgb = PACK_SHORT_565(r, g, b);
|
rgb = PACK_SHORT_565(r, g, b);
|
||||||
|
|
||||||
y = GETJSAMPLE(*inptr0++);
|
y = *inptr0++;
|
||||||
cb = GETJSAMPLE(*inptr1++);
|
cb = *inptr1++;
|
||||||
cr = GETJSAMPLE(*inptr2++);
|
cr = *inptr2++;
|
||||||
r = range_limit[y + Crrtab[cr]];
|
r = range_limit[y + Crrtab[cr]];
|
||||||
g = range_limit[y + ((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
|
g = range_limit[y + ((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
|
||||||
SCALEBITS))];
|
SCALEBITS))];
|
||||||
@@ -80,9 +80,9 @@ ycc_rgb565_convert_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
|
|||||||
outptr += 4;
|
outptr += 4;
|
||||||
}
|
}
|
||||||
if (num_cols & 1) {
|
if (num_cols & 1) {
|
||||||
y = GETJSAMPLE(*inptr0);
|
y = *inptr0;
|
||||||
cb = GETJSAMPLE(*inptr1);
|
cb = *inptr1;
|
||||||
cr = GETJSAMPLE(*inptr2);
|
cr = *inptr2;
|
||||||
r = range_limit[y + Crrtab[cr]];
|
r = range_limit[y + Crrtab[cr]];
|
||||||
g = range_limit[y + ((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
|
g = range_limit[y + ((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
|
||||||
SCALEBITS))];
|
SCALEBITS))];
|
||||||
@@ -125,9 +125,9 @@ ycc_rgb565D_convert_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
|
|||||||
input_row++;
|
input_row++;
|
||||||
outptr = *output_buf++;
|
outptr = *output_buf++;
|
||||||
if (PACK_NEED_ALIGNMENT(outptr)) {
|
if (PACK_NEED_ALIGNMENT(outptr)) {
|
||||||
y = GETJSAMPLE(*inptr0++);
|
y = *inptr0++;
|
||||||
cb = GETJSAMPLE(*inptr1++);
|
cb = *inptr1++;
|
||||||
cr = GETJSAMPLE(*inptr2++);
|
cr = *inptr2++;
|
||||||
r = range_limit[DITHER_565_R(y + Crrtab[cr], d0)];
|
r = range_limit[DITHER_565_R(y + Crrtab[cr], d0)];
|
||||||
g = range_limit[DITHER_565_G(y +
|
g = range_limit[DITHER_565_G(y +
|
||||||
((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
|
((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
|
||||||
@@ -139,9 +139,9 @@ ycc_rgb565D_convert_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
|
|||||||
num_cols--;
|
num_cols--;
|
||||||
}
|
}
|
||||||
for (col = 0; col < (num_cols >> 1); col++) {
|
for (col = 0; col < (num_cols >> 1); col++) {
|
||||||
y = GETJSAMPLE(*inptr0++);
|
y = *inptr0++;
|
||||||
cb = GETJSAMPLE(*inptr1++);
|
cb = *inptr1++;
|
||||||
cr = GETJSAMPLE(*inptr2++);
|
cr = *inptr2++;
|
||||||
r = range_limit[DITHER_565_R(y + Crrtab[cr], d0)];
|
r = range_limit[DITHER_565_R(y + Crrtab[cr], d0)];
|
||||||
g = range_limit[DITHER_565_G(y +
|
g = range_limit[DITHER_565_G(y +
|
||||||
((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
|
((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
|
||||||
@@ -150,9 +150,9 @@ ycc_rgb565D_convert_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
|
|||||||
d0 = DITHER_ROTATE(d0);
|
d0 = DITHER_ROTATE(d0);
|
||||||
rgb = PACK_SHORT_565(r, g, b);
|
rgb = PACK_SHORT_565(r, g, b);
|
||||||
|
|
||||||
y = GETJSAMPLE(*inptr0++);
|
y = *inptr0++;
|
||||||
cb = GETJSAMPLE(*inptr1++);
|
cb = *inptr1++;
|
||||||
cr = GETJSAMPLE(*inptr2++);
|
cr = *inptr2++;
|
||||||
r = range_limit[DITHER_565_R(y + Crrtab[cr], d0)];
|
r = range_limit[DITHER_565_R(y + Crrtab[cr], d0)];
|
||||||
g = range_limit[DITHER_565_G(y +
|
g = range_limit[DITHER_565_G(y +
|
||||||
((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
|
((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
|
||||||
@@ -165,9 +165,9 @@ ycc_rgb565D_convert_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
|
|||||||
outptr += 4;
|
outptr += 4;
|
||||||
}
|
}
|
||||||
if (num_cols & 1) {
|
if (num_cols & 1) {
|
||||||
y = GETJSAMPLE(*inptr0);
|
y = *inptr0;
|
||||||
cb = GETJSAMPLE(*inptr1);
|
cb = *inptr1;
|
||||||
cr = GETJSAMPLE(*inptr2);
|
cr = *inptr2;
|
||||||
r = range_limit[DITHER_565_R(y + Crrtab[cr], d0)];
|
r = range_limit[DITHER_565_R(y + Crrtab[cr], d0)];
|
||||||
g = range_limit[DITHER_565_G(y +
|
g = range_limit[DITHER_565_G(y +
|
||||||
((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
|
((int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
|
||||||
@@ -202,32 +202,32 @@ rgb_rgb565_convert_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
|
|||||||
input_row++;
|
input_row++;
|
||||||
outptr = *output_buf++;
|
outptr = *output_buf++;
|
||||||
if (PACK_NEED_ALIGNMENT(outptr)) {
|
if (PACK_NEED_ALIGNMENT(outptr)) {
|
||||||
r = GETJSAMPLE(*inptr0++);
|
r = *inptr0++;
|
||||||
g = GETJSAMPLE(*inptr1++);
|
g = *inptr1++;
|
||||||
b = GETJSAMPLE(*inptr2++);
|
b = *inptr2++;
|
||||||
rgb = PACK_SHORT_565(r, g, b);
|
rgb = PACK_SHORT_565(r, g, b);
|
||||||
*(INT16 *)outptr = (INT16)rgb;
|
*(INT16 *)outptr = (INT16)rgb;
|
||||||
outptr += 2;
|
outptr += 2;
|
||||||
num_cols--;
|
num_cols--;
|
||||||
}
|
}
|
||||||
for (col = 0; col < (num_cols >> 1); col++) {
|
for (col = 0; col < (num_cols >> 1); col++) {
|
||||||
r = GETJSAMPLE(*inptr0++);
|
r = *inptr0++;
|
||||||
g = GETJSAMPLE(*inptr1++);
|
g = *inptr1++;
|
||||||
b = GETJSAMPLE(*inptr2++);
|
b = *inptr2++;
|
||||||
rgb = PACK_SHORT_565(r, g, b);
|
rgb = PACK_SHORT_565(r, g, b);
|
||||||
|
|
||||||
r = GETJSAMPLE(*inptr0++);
|
r = *inptr0++;
|
||||||
g = GETJSAMPLE(*inptr1++);
|
g = *inptr1++;
|
||||||
b = GETJSAMPLE(*inptr2++);
|
b = *inptr2++;
|
||||||
rgb = PACK_TWO_PIXELS(rgb, PACK_SHORT_565(r, g, b));
|
rgb = PACK_TWO_PIXELS(rgb, PACK_SHORT_565(r, g, b));
|
||||||
|
|
||||||
WRITE_TWO_ALIGNED_PIXELS(outptr, rgb);
|
WRITE_TWO_ALIGNED_PIXELS(outptr, rgb);
|
||||||
outptr += 4;
|
outptr += 4;
|
||||||
}
|
}
|
||||||
if (num_cols & 1) {
|
if (num_cols & 1) {
|
||||||
r = GETJSAMPLE(*inptr0);
|
r = *inptr0;
|
||||||
g = GETJSAMPLE(*inptr1);
|
g = *inptr1;
|
||||||
b = GETJSAMPLE(*inptr2);
|
b = *inptr2;
|
||||||
rgb = PACK_SHORT_565(r, g, b);
|
rgb = PACK_SHORT_565(r, g, b);
|
||||||
*(INT16 *)outptr = (INT16)rgb;
|
*(INT16 *)outptr = (INT16)rgb;
|
||||||
}
|
}
|
||||||
@@ -259,24 +259,24 @@ rgb_rgb565D_convert_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
|
|||||||
input_row++;
|
input_row++;
|
||||||
outptr = *output_buf++;
|
outptr = *output_buf++;
|
||||||
if (PACK_NEED_ALIGNMENT(outptr)) {
|
if (PACK_NEED_ALIGNMENT(outptr)) {
|
||||||
r = range_limit[DITHER_565_R(GETJSAMPLE(*inptr0++), d0)];
|
r = range_limit[DITHER_565_R(*inptr0++, d0)];
|
||||||
g = range_limit[DITHER_565_G(GETJSAMPLE(*inptr1++), d0)];
|
g = range_limit[DITHER_565_G(*inptr1++, d0)];
|
||||||
b = range_limit[DITHER_565_B(GETJSAMPLE(*inptr2++), d0)];
|
b = range_limit[DITHER_565_B(*inptr2++, d0)];
|
||||||
rgb = PACK_SHORT_565(r, g, b);
|
rgb = PACK_SHORT_565(r, g, b);
|
||||||
*(INT16 *)outptr = (INT16)rgb;
|
*(INT16 *)outptr = (INT16)rgb;
|
||||||
outptr += 2;
|
outptr += 2;
|
||||||
num_cols--;
|
num_cols--;
|
||||||
}
|
}
|
||||||
for (col = 0; col < (num_cols >> 1); col++) {
|
for (col = 0; col < (num_cols >> 1); col++) {
|
||||||
r = range_limit[DITHER_565_R(GETJSAMPLE(*inptr0++), d0)];
|
r = range_limit[DITHER_565_R(*inptr0++, d0)];
|
||||||
g = range_limit[DITHER_565_G(GETJSAMPLE(*inptr1++), d0)];
|
g = range_limit[DITHER_565_G(*inptr1++, d0)];
|
||||||
b = range_limit[DITHER_565_B(GETJSAMPLE(*inptr2++), d0)];
|
b = range_limit[DITHER_565_B(*inptr2++, d0)];
|
||||||
d0 = DITHER_ROTATE(d0);
|
d0 = DITHER_ROTATE(d0);
|
||||||
rgb = PACK_SHORT_565(r, g, b);
|
rgb = PACK_SHORT_565(r, g, b);
|
||||||
|
|
||||||
r = range_limit[DITHER_565_R(GETJSAMPLE(*inptr0++), d0)];
|
r = range_limit[DITHER_565_R(*inptr0++, d0)];
|
||||||
g = range_limit[DITHER_565_G(GETJSAMPLE(*inptr1++), d0)];
|
g = range_limit[DITHER_565_G(*inptr1++, d0)];
|
||||||
b = range_limit[DITHER_565_B(GETJSAMPLE(*inptr2++), d0)];
|
b = range_limit[DITHER_565_B(*inptr2++, d0)];
|
||||||
d0 = DITHER_ROTATE(d0);
|
d0 = DITHER_ROTATE(d0);
|
||||||
rgb = PACK_TWO_PIXELS(rgb, PACK_SHORT_565(r, g, b));
|
rgb = PACK_TWO_PIXELS(rgb, PACK_SHORT_565(r, g, b));
|
||||||
|
|
||||||
@@ -284,9 +284,9 @@ rgb_rgb565D_convert_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
|
|||||||
outptr += 4;
|
outptr += 4;
|
||||||
}
|
}
|
||||||
if (num_cols & 1) {
|
if (num_cols & 1) {
|
||||||
r = range_limit[DITHER_565_R(GETJSAMPLE(*inptr0), d0)];
|
r = range_limit[DITHER_565_R(*inptr0, d0)];
|
||||||
g = range_limit[DITHER_565_G(GETJSAMPLE(*inptr1), d0)];
|
g = range_limit[DITHER_565_G(*inptr1, d0)];
|
||||||
b = range_limit[DITHER_565_B(GETJSAMPLE(*inptr2), d0)];
|
b = range_limit[DITHER_565_B(*inptr2, d0)];
|
||||||
rgb = PACK_SHORT_565(r, g, b);
|
rgb = PACK_SHORT_565(r, g, b);
|
||||||
*(INT16 *)outptr = (INT16)rgb;
|
*(INT16 *)outptr = (INT16)rgb;
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-5
@@ -53,9 +53,9 @@ ycc_rgb_convert_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
|
|||||||
input_row++;
|
input_row++;
|
||||||
outptr = *output_buf++;
|
outptr = *output_buf++;
|
||||||
for (col = 0; col < num_cols; col++) {
|
for (col = 0; col < num_cols; col++) {
|
||||||
y = GETJSAMPLE(inptr0[col]);
|
y = inptr0[col];
|
||||||
cb = GETJSAMPLE(inptr1[col]);
|
cb = inptr1[col];
|
||||||
cr = GETJSAMPLE(inptr2[col]);
|
cr = inptr2[col];
|
||||||
/* Range-limiting is essential due to noise introduced by DCT losses. */
|
/* Range-limiting is essential due to noise introduced by DCT losses. */
|
||||||
outptr[RGB_RED] = range_limit[y + Crrtab[cr]];
|
outptr[RGB_RED] = range_limit[y + Crrtab[cr]];
|
||||||
outptr[RGB_GREEN] = range_limit[y +
|
outptr[RGB_GREEN] = range_limit[y +
|
||||||
@@ -93,7 +93,6 @@ gray_rgb_convert_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
|
|||||||
inptr = input_buf[0][input_row++];
|
inptr = input_buf[0][input_row++];
|
||||||
outptr = *output_buf++;
|
outptr = *output_buf++;
|
||||||
for (col = 0; col < num_cols; col++) {
|
for (col = 0; col < num_cols; col++) {
|
||||||
/* We can dispense with GETJSAMPLE() here */
|
|
||||||
outptr[RGB_RED] = outptr[RGB_GREEN] = outptr[RGB_BLUE] = inptr[col];
|
outptr[RGB_RED] = outptr[RGB_GREEN] = outptr[RGB_BLUE] = inptr[col];
|
||||||
/* Set unused byte to 0xFF so it can be interpreted as an opaque */
|
/* Set unused byte to 0xFF so it can be interpreted as an opaque */
|
||||||
/* alpha channel value */
|
/* alpha channel value */
|
||||||
@@ -128,7 +127,6 @@ rgb_rgb_convert_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
|
|||||||
input_row++;
|
input_row++;
|
||||||
outptr = *output_buf++;
|
outptr = *output_buf++;
|
||||||
for (col = 0; col < num_cols; col++) {
|
for (col = 0; col < num_cols; col++) {
|
||||||
/* We can dispense with GETJSAMPLE() here */
|
|
||||||
outptr[RGB_RED] = inptr0[col];
|
outptr[RGB_RED] = inptr0[col];
|
||||||
outptr[RGB_GREEN] = inptr1[col];
|
outptr[RGB_GREEN] = inptr1[col];
|
||||||
outptr[RGB_BLUE] = inptr2[col];
|
outptr[RGB_BLUE] = inptr2[col];
|
||||||
|
|||||||
Vendored
+7
-7
@@ -341,9 +341,9 @@ rgb_gray_convert(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
|
|||||||
input_row++;
|
input_row++;
|
||||||
outptr = *output_buf++;
|
outptr = *output_buf++;
|
||||||
for (col = 0; col < num_cols; col++) {
|
for (col = 0; col < num_cols; col++) {
|
||||||
r = GETJSAMPLE(inptr0[col]);
|
r = inptr0[col];
|
||||||
g = GETJSAMPLE(inptr1[col]);
|
g = inptr1[col];
|
||||||
b = GETJSAMPLE(inptr2[col]);
|
b = inptr2[col];
|
||||||
/* Y */
|
/* Y */
|
||||||
outptr[col] = (JSAMPLE)((ctab[r + R_Y_OFF] + ctab[g + G_Y_OFF] +
|
outptr[col] = (JSAMPLE)((ctab[r + R_Y_OFF] + ctab[g + G_Y_OFF] +
|
||||||
ctab[b + B_Y_OFF]) >> SCALEBITS);
|
ctab[b + B_Y_OFF]) >> SCALEBITS);
|
||||||
@@ -550,9 +550,9 @@ ycck_cmyk_convert(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
|
|||||||
input_row++;
|
input_row++;
|
||||||
outptr = *output_buf++;
|
outptr = *output_buf++;
|
||||||
for (col = 0; col < num_cols; col++) {
|
for (col = 0; col < num_cols; col++) {
|
||||||
y = GETJSAMPLE(inptr0[col]);
|
y = inptr0[col];
|
||||||
cb = GETJSAMPLE(inptr1[col]);
|
cb = inptr1[col];
|
||||||
cr = GETJSAMPLE(inptr2[col]);
|
cr = inptr2[col];
|
||||||
/* Range-limiting is essential due to noise introduced by DCT losses. */
|
/* Range-limiting is essential due to noise introduced by DCT losses. */
|
||||||
outptr[0] = range_limit[MAXJSAMPLE - (y + Crrtab[cr])]; /* red */
|
outptr[0] = range_limit[MAXJSAMPLE - (y + Crrtab[cr])]; /* red */
|
||||||
outptr[1] = range_limit[MAXJSAMPLE - (y + /* green */
|
outptr[1] = range_limit[MAXJSAMPLE - (y + /* green */
|
||||||
@@ -560,7 +560,7 @@ ycck_cmyk_convert(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
|
|||||||
SCALEBITS)))];
|
SCALEBITS)))];
|
||||||
outptr[2] = range_limit[MAXJSAMPLE - (y + Cbbtab[cb])]; /* blue */
|
outptr[2] = range_limit[MAXJSAMPLE - (y + Cbbtab[cb])]; /* blue */
|
||||||
/* K passes through unchanged */
|
/* K passes through unchanged */
|
||||||
outptr[3] = inptr3[col]; /* don't need GETJSAMPLE here */
|
outptr[3] = inptr3[col];
|
||||||
outptr += 4;
|
outptr += 4;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -6,7 +6,7 @@
|
|||||||
* Modified 2002-2010 by Guido Vollbeding.
|
* Modified 2002-2010 by Guido Vollbeding.
|
||||||
* libjpeg-turbo Modifications:
|
* libjpeg-turbo Modifications:
|
||||||
* Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB
|
* Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB
|
||||||
* Copyright (C) 2010, 2015, D. R. Commander.
|
* Copyright (C) 2010, 2015, 2022, D. R. Commander.
|
||||||
* Copyright (C) 2013, MIPS Technologies, Inc., California.
|
* Copyright (C) 2013, MIPS Technologies, Inc., California.
|
||||||
* For conditions of distribution and use, see the accompanying README.ijg
|
* For conditions of distribution and use, see the accompanying README.ijg
|
||||||
* file.
|
* file.
|
||||||
@@ -345,7 +345,7 @@ jinit_inverse_dct(j_decompress_ptr cinfo)
|
|||||||
compptr->dct_table =
|
compptr->dct_table =
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
|
(*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
|
||||||
sizeof(multiplier_table));
|
sizeof(multiplier_table));
|
||||||
MEMZERO(compptr->dct_table, sizeof(multiplier_table));
|
memset(compptr->dct_table, 0, sizeof(multiplier_table));
|
||||||
/* Mark multiplier table not yet set up for any method */
|
/* Mark multiplier table not yet set up for any method */
|
||||||
idct->cur_method[ci] = -1;
|
idct->cur_method[ci] = -1;
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+36
-33
@@ -5,6 +5,7 @@
|
|||||||
* Copyright (C) 1991-1997, Thomas G. Lane.
|
* Copyright (C) 1991-1997, Thomas G. Lane.
|
||||||
* libjpeg-turbo Modifications:
|
* libjpeg-turbo Modifications:
|
||||||
* Copyright (C) 2009-2011, 2016, 2018-2019, D. R. Commander.
|
* Copyright (C) 2009-2011, 2016, 2018-2019, D. R. Commander.
|
||||||
|
* Copyright (C) 2018, Matthias Räncker.
|
||||||
* For conditions of distribution and use, see the accompanying README.ijg
|
* For conditions of distribution and use, see the accompanying README.ijg
|
||||||
* file.
|
* file.
|
||||||
*
|
*
|
||||||
@@ -39,24 +40,6 @@ typedef struct {
|
|||||||
int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */
|
int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */
|
||||||
} savable_state;
|
} savable_state;
|
||||||
|
|
||||||
/* This macro is to work around compilers with missing or broken
|
|
||||||
* structure assignment. You'll need to fix this code if you have
|
|
||||||
* such a compiler and you change MAX_COMPS_IN_SCAN.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef NO_STRUCT_ASSIGN
|
|
||||||
#define ASSIGN_STATE(dest, src) ((dest) = (src))
|
|
||||||
#else
|
|
||||||
#if MAX_COMPS_IN_SCAN == 4
|
|
||||||
#define ASSIGN_STATE(dest, src) \
|
|
||||||
((dest).last_dc_val[0] = (src).last_dc_val[0], \
|
|
||||||
(dest).last_dc_val[1] = (src).last_dc_val[1], \
|
|
||||||
(dest).last_dc_val[2] = (src).last_dc_val[2], \
|
|
||||||
(dest).last_dc_val[3] = (src).last_dc_val[3])
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
struct jpeg_entropy_decoder pub; /* public fields */
|
struct jpeg_entropy_decoder pub; /* public fields */
|
||||||
|
|
||||||
@@ -325,7 +308,7 @@ jpeg_fill_bit_buffer(bitread_working_state *state,
|
|||||||
bytes_in_buffer = cinfo->src->bytes_in_buffer;
|
bytes_in_buffer = cinfo->src->bytes_in_buffer;
|
||||||
}
|
}
|
||||||
bytes_in_buffer--;
|
bytes_in_buffer--;
|
||||||
c = GETJOCTET(*next_input_byte++);
|
c = *next_input_byte++;
|
||||||
|
|
||||||
/* If it's 0xFF, check and discard stuffed zero byte */
|
/* If it's 0xFF, check and discard stuffed zero byte */
|
||||||
if (c == 0xFF) {
|
if (c == 0xFF) {
|
||||||
@@ -342,7 +325,7 @@ jpeg_fill_bit_buffer(bitread_working_state *state,
|
|||||||
bytes_in_buffer = cinfo->src->bytes_in_buffer;
|
bytes_in_buffer = cinfo->src->bytes_in_buffer;
|
||||||
}
|
}
|
||||||
bytes_in_buffer--;
|
bytes_in_buffer--;
|
||||||
c = GETJOCTET(*next_input_byte++);
|
c = *next_input_byte++;
|
||||||
} while (c == 0xFF);
|
} while (c == 0xFF);
|
||||||
|
|
||||||
if (c == 0) {
|
if (c == 0) {
|
||||||
@@ -405,8 +388,8 @@ no_more_bytes:
|
|||||||
|
|
||||||
#define GET_BYTE { \
|
#define GET_BYTE { \
|
||||||
register int c0, c1; \
|
register int c0, c1; \
|
||||||
c0 = GETJOCTET(*buffer++); \
|
c0 = *buffer++; \
|
||||||
c1 = GETJOCTET(*buffer); \
|
c1 = *buffer; \
|
||||||
/* Pre-execute most common case */ \
|
/* Pre-execute most common case */ \
|
||||||
get_buffer = (get_buffer << 8) | c0; \
|
get_buffer = (get_buffer << 8) | c0; \
|
||||||
bits_left += 8; \
|
bits_left += 8; \
|
||||||
@@ -423,7 +406,7 @@ no_more_bytes:
|
|||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
|
||||||
#if SIZEOF_SIZE_T == 8 || defined(_WIN64)
|
#if SIZEOF_SIZE_T == 8 || defined(_WIN64) || (defined(__x86_64__) && defined(__ILP32__))
|
||||||
|
|
||||||
/* Pre-fetch 48 bytes, because the holding register is 64-bit */
|
/* Pre-fetch 48 bytes, because the holding register is 64-bit */
|
||||||
#define FILL_BIT_BUFFER_FAST \
|
#define FILL_BIT_BUFFER_FAST \
|
||||||
@@ -557,6 +540,12 @@ process_restart(j_decompress_ptr cinfo)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(__has_feature)
|
||||||
|
#if __has_feature(undefined_behavior_sanitizer)
|
||||||
|
__attribute__((no_sanitize("signed-integer-overflow"),
|
||||||
|
no_sanitize("unsigned-integer-overflow")))
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
LOCAL(boolean)
|
LOCAL(boolean)
|
||||||
decode_mcu_slow(j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
decode_mcu_slow(j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
{
|
{
|
||||||
@@ -568,7 +557,7 @@ decode_mcu_slow(j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
|
|
||||||
/* Load up working state */
|
/* Load up working state */
|
||||||
BITREAD_LOAD_STATE(cinfo, entropy->bitstate);
|
BITREAD_LOAD_STATE(cinfo, entropy->bitstate);
|
||||||
ASSIGN_STATE(state, entropy->saved);
|
state = entropy->saved;
|
||||||
|
|
||||||
for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
|
for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
|
||||||
JBLOCKROW block = MCU_data ? MCU_data[blkn] : NULL;
|
JBLOCKROW block = MCU_data ? MCU_data[blkn] : NULL;
|
||||||
@@ -589,11 +578,15 @@ decode_mcu_slow(j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
if (entropy->dc_needed[blkn]) {
|
if (entropy->dc_needed[blkn]) {
|
||||||
/* Convert DC difference to actual value, update last_dc_val */
|
/* Convert DC difference to actual value, update last_dc_val */
|
||||||
int ci = cinfo->MCU_membership[blkn];
|
int ci = cinfo->MCU_membership[blkn];
|
||||||
/* This is really just
|
/* Certain malformed JPEG images produce repeated DC coefficient
|
||||||
* s += state.last_dc_val[ci];
|
* differences of 2047 or -2047, which causes state.last_dc_val[ci] to
|
||||||
* It is written this way in order to shut up UBSan.
|
* grow until it overflows or underflows a 32-bit signed integer. This
|
||||||
|
* behavior is, to the best of our understanding, innocuous, and it is
|
||||||
|
* unclear how to work around it without potentially affecting
|
||||||
|
* performance. Thus, we (hopefully temporarily) suppress UBSan integer
|
||||||
|
* overflow errors for this function and decode_mcu_fast().
|
||||||
*/
|
*/
|
||||||
s = (int)((unsigned int)s + (unsigned int)state.last_dc_val[ci]);
|
s += state.last_dc_val[ci];
|
||||||
state.last_dc_val[ci] = s;
|
state.last_dc_val[ci] = s;
|
||||||
if (block) {
|
if (block) {
|
||||||
/* Output the DC coefficient (assumes jpeg_natural_order[0] = 0) */
|
/* Output the DC coefficient (assumes jpeg_natural_order[0] = 0) */
|
||||||
@@ -653,11 +646,17 @@ decode_mcu_slow(j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
|
|
||||||
/* Completed MCU, so update state */
|
/* Completed MCU, so update state */
|
||||||
BITREAD_SAVE_STATE(cinfo, entropy->bitstate);
|
BITREAD_SAVE_STATE(cinfo, entropy->bitstate);
|
||||||
ASSIGN_STATE(entropy->saved, state);
|
entropy->saved = state;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(__has_feature)
|
||||||
|
#if __has_feature(undefined_behavior_sanitizer)
|
||||||
|
__attribute__((no_sanitize("signed-integer-overflow"),
|
||||||
|
no_sanitize("unsigned-integer-overflow")))
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
LOCAL(boolean)
|
LOCAL(boolean)
|
||||||
decode_mcu_fast(j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
decode_mcu_fast(j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
{
|
{
|
||||||
@@ -671,7 +670,7 @@ decode_mcu_fast(j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
/* Load up working state */
|
/* Load up working state */
|
||||||
BITREAD_LOAD_STATE(cinfo, entropy->bitstate);
|
BITREAD_LOAD_STATE(cinfo, entropy->bitstate);
|
||||||
buffer = (JOCTET *)br_state.next_input_byte;
|
buffer = (JOCTET *)br_state.next_input_byte;
|
||||||
ASSIGN_STATE(state, entropy->saved);
|
state = entropy->saved;
|
||||||
|
|
||||||
for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
|
for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
|
||||||
JBLOCKROW block = MCU_data ? MCU_data[blkn] : NULL;
|
JBLOCKROW block = MCU_data ? MCU_data[blkn] : NULL;
|
||||||
@@ -688,7 +687,10 @@ decode_mcu_fast(j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
|
|
||||||
if (entropy->dc_needed[blkn]) {
|
if (entropy->dc_needed[blkn]) {
|
||||||
int ci = cinfo->MCU_membership[blkn];
|
int ci = cinfo->MCU_membership[blkn];
|
||||||
s = (int)((unsigned int)s + (unsigned int)state.last_dc_val[ci]);
|
/* Refer to the comment in decode_mcu_slow() regarding the supression of
|
||||||
|
* a UBSan integer overflow error in this line of code.
|
||||||
|
*/
|
||||||
|
s += state.last_dc_val[ci];
|
||||||
state.last_dc_val[ci] = s;
|
state.last_dc_val[ci] = s;
|
||||||
if (block)
|
if (block)
|
||||||
(*block)[0] = (JCOEF)s;
|
(*block)[0] = (JCOEF)s;
|
||||||
@@ -740,7 +742,7 @@ decode_mcu_fast(j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
br_state.bytes_in_buffer -= (buffer - br_state.next_input_byte);
|
br_state.bytes_in_buffer -= (buffer - br_state.next_input_byte);
|
||||||
br_state.next_input_byte = buffer;
|
br_state.next_input_byte = buffer;
|
||||||
BITREAD_SAVE_STATE(cinfo, entropy->bitstate);
|
BITREAD_SAVE_STATE(cinfo, entropy->bitstate);
|
||||||
ASSIGN_STATE(entropy->saved, state);
|
entropy->saved = state;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -795,7 +797,8 @@ use_slow:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Account for restart interval (no-op if not using restarts) */
|
/* Account for restart interval (no-op if not using restarts) */
|
||||||
entropy->restarts_to_go--;
|
if (cinfo->restart_interval)
|
||||||
|
entropy->restarts_to_go--;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+11
-2
@@ -4,7 +4,8 @@
|
|||||||
* This file was part of the Independent JPEG Group's software:
|
* This file was part of the Independent JPEG Group's software:
|
||||||
* Copyright (C) 1991-1997, Thomas G. Lane.
|
* Copyright (C) 1991-1997, Thomas G. Lane.
|
||||||
* libjpeg-turbo Modifications:
|
* libjpeg-turbo Modifications:
|
||||||
* Copyright (C) 2010-2011, 2015-2016, D. R. Commander.
|
* Copyright (C) 2010-2011, 2015-2016, 2021, D. R. Commander.
|
||||||
|
* Copyright (C) 2018, Matthias Räncker.
|
||||||
* For conditions of distribution and use, see the accompanying README.ijg
|
* For conditions of distribution and use, see the accompanying README.ijg
|
||||||
* file.
|
* file.
|
||||||
*
|
*
|
||||||
@@ -78,6 +79,11 @@ EXTERN(void) jpeg_make_d_derived_tbl(j_decompress_ptr cinfo, boolean isDC,
|
|||||||
typedef size_t bit_buf_type; /* type of bit-extraction buffer */
|
typedef size_t bit_buf_type; /* type of bit-extraction buffer */
|
||||||
#define BIT_BUF_SIZE 64 /* size of buffer in bits */
|
#define BIT_BUF_SIZE 64 /* size of buffer in bits */
|
||||||
|
|
||||||
|
#elif defined(__x86_64__) && defined(__ILP32__)
|
||||||
|
|
||||||
|
typedef unsigned long long bit_buf_type; /* type of bit-extraction buffer */
|
||||||
|
#define BIT_BUF_SIZE 64 /* size of buffer in bits */
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
typedef unsigned long bit_buf_type; /* type of bit-extraction buffer */
|
typedef unsigned long bit_buf_type; /* type of bit-extraction buffer */
|
||||||
@@ -228,7 +234,10 @@ slowlabel: \
|
|||||||
s |= GET_BITS(1); \
|
s |= GET_BITS(1); \
|
||||||
nb++; \
|
nb++; \
|
||||||
} \
|
} \
|
||||||
s = htbl->pub->huffval[(int)(s + htbl->valoffset[nb]) & 0xFF]; \
|
if (nb > 16) \
|
||||||
|
s = 0; \
|
||||||
|
else \
|
||||||
|
s = htbl->pub->huffval[(int)(s + htbl->valoffset[nb]) & 0xFF]; \
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Out-of-line case for Huffman code fetching */
|
/* Out-of-line case for Huffman code fetching */
|
||||||
|
|||||||
Vendored
+16
-20
@@ -18,10 +18,6 @@
|
|||||||
#include "jpeglib.h"
|
#include "jpeglib.h"
|
||||||
#include "jerror.h"
|
#include "jerror.h"
|
||||||
|
|
||||||
#ifndef HAVE_STDLIB_H /* <stdlib.h> should declare malloc() */
|
|
||||||
extern void *malloc(size_t size);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#define ICC_MARKER (JPEG_APP0 + 2) /* JPEG marker code for ICC */
|
#define ICC_MARKER (JPEG_APP0 + 2) /* JPEG marker code for ICC */
|
||||||
#define ICC_OVERHEAD_LEN 14 /* size of non-profile data in APP2 */
|
#define ICC_OVERHEAD_LEN 14 /* size of non-profile data in APP2 */
|
||||||
@@ -38,18 +34,18 @@ marker_is_icc(jpeg_saved_marker_ptr marker)
|
|||||||
marker->marker == ICC_MARKER &&
|
marker->marker == ICC_MARKER &&
|
||||||
marker->data_length >= ICC_OVERHEAD_LEN &&
|
marker->data_length >= ICC_OVERHEAD_LEN &&
|
||||||
/* verify the identifying string */
|
/* verify the identifying string */
|
||||||
GETJOCTET(marker->data[0]) == 0x49 &&
|
marker->data[0] == 0x49 &&
|
||||||
GETJOCTET(marker->data[1]) == 0x43 &&
|
marker->data[1] == 0x43 &&
|
||||||
GETJOCTET(marker->data[2]) == 0x43 &&
|
marker->data[2] == 0x43 &&
|
||||||
GETJOCTET(marker->data[3]) == 0x5F &&
|
marker->data[3] == 0x5F &&
|
||||||
GETJOCTET(marker->data[4]) == 0x50 &&
|
marker->data[4] == 0x50 &&
|
||||||
GETJOCTET(marker->data[5]) == 0x52 &&
|
marker->data[5] == 0x52 &&
|
||||||
GETJOCTET(marker->data[6]) == 0x4F &&
|
marker->data[6] == 0x4F &&
|
||||||
GETJOCTET(marker->data[7]) == 0x46 &&
|
marker->data[7] == 0x46 &&
|
||||||
GETJOCTET(marker->data[8]) == 0x49 &&
|
marker->data[8] == 0x49 &&
|
||||||
GETJOCTET(marker->data[9]) == 0x4C &&
|
marker->data[9] == 0x4C &&
|
||||||
GETJOCTET(marker->data[10]) == 0x45 &&
|
marker->data[10] == 0x45 &&
|
||||||
GETJOCTET(marker->data[11]) == 0x0;
|
marker->data[11] == 0x0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -102,12 +98,12 @@ jpeg_read_icc_profile(j_decompress_ptr cinfo, JOCTET **icc_data_ptr,
|
|||||||
for (marker = cinfo->marker_list; marker != NULL; marker = marker->next) {
|
for (marker = cinfo->marker_list; marker != NULL; marker = marker->next) {
|
||||||
if (marker_is_icc(marker)) {
|
if (marker_is_icc(marker)) {
|
||||||
if (num_markers == 0)
|
if (num_markers == 0)
|
||||||
num_markers = GETJOCTET(marker->data[13]);
|
num_markers = marker->data[13];
|
||||||
else if (num_markers != GETJOCTET(marker->data[13])) {
|
else if (num_markers != marker->data[13]) {
|
||||||
WARNMS(cinfo, JWRN_BOGUS_ICC); /* inconsistent num_markers fields */
|
WARNMS(cinfo, JWRN_BOGUS_ICC); /* inconsistent num_markers fields */
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
seq_no = GETJOCTET(marker->data[12]);
|
seq_no = marker->data[12];
|
||||||
if (seq_no <= 0 || seq_no > num_markers) {
|
if (seq_no <= 0 || seq_no > num_markers) {
|
||||||
WARNMS(cinfo, JWRN_BOGUS_ICC); /* bogus sequence number */
|
WARNMS(cinfo, JWRN_BOGUS_ICC); /* bogus sequence number */
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@@ -154,7 +150,7 @@ jpeg_read_icc_profile(j_decompress_ptr cinfo, JOCTET **icc_data_ptr,
|
|||||||
JOCTET FAR *src_ptr;
|
JOCTET FAR *src_ptr;
|
||||||
JOCTET *dst_ptr;
|
JOCTET *dst_ptr;
|
||||||
unsigned int length;
|
unsigned int length;
|
||||||
seq_no = GETJOCTET(marker->data[12]);
|
seq_no = marker->data[12];
|
||||||
dst_ptr = icc_data + data_offset[seq_no];
|
dst_ptr = icc_data + data_offset[seq_no];
|
||||||
src_ptr = marker->data + ICC_OVERHEAD_LEN;
|
src_ptr = marker->data + ICC_OVERHEAD_LEN;
|
||||||
length = data_length[seq_no];
|
length = data_length[seq_no];
|
||||||
|
|||||||
Vendored
+2
-2
@@ -4,7 +4,7 @@
|
|||||||
* This file was part of the Independent JPEG Group's software:
|
* This file was part of the Independent JPEG Group's software:
|
||||||
* Copyright (C) 1991-1997, Thomas G. Lane.
|
* Copyright (C) 1991-1997, Thomas G. Lane.
|
||||||
* libjpeg-turbo Modifications:
|
* libjpeg-turbo Modifications:
|
||||||
* Copyright (C) 2010, 2016, 2018, D. R. Commander.
|
* Copyright (C) 2010, 2016, 2018, 2022, D. R. Commander.
|
||||||
* Copyright (C) 2015, Google, Inc.
|
* Copyright (C) 2015, Google, Inc.
|
||||||
* For conditions of distribution and use, see the accompanying README.ijg
|
* For conditions of distribution and use, see the accompanying README.ijg
|
||||||
* file.
|
* file.
|
||||||
@@ -264,7 +264,7 @@ latch_quant_tables(j_decompress_ptr cinfo)
|
|||||||
qtbl = (JQUANT_TBL *)
|
qtbl = (JQUANT_TBL *)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
|
(*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
|
||||||
sizeof(JQUANT_TBL));
|
sizeof(JQUANT_TBL));
|
||||||
MEMCOPY(qtbl, cinfo->quant_tbl_ptrs[qtblno], sizeof(JQUANT_TBL));
|
memcpy(qtbl, cinfo->quant_tbl_ptrs[qtblno], sizeof(JQUANT_TBL));
|
||||||
compptr->quant_table = qtbl;
|
compptr->quant_table = qtbl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-2
@@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
#include "jinclude.h"
|
#include "jinclude.h"
|
||||||
#include "jdmainct.h"
|
#include "jdmainct.h"
|
||||||
|
#include "jconfigint.h"
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -360,7 +361,7 @@ process_data_context_main(j_decompress_ptr cinfo, JSAMPARRAY output_buf,
|
|||||||
main_ptr->context_state = CTX_PREPARE_FOR_IMCU;
|
main_ptr->context_state = CTX_PREPARE_FOR_IMCU;
|
||||||
if (*out_row_ctr >= out_rows_avail)
|
if (*out_row_ctr >= out_rows_avail)
|
||||||
return; /* Postprocessor exactly filled output buf */
|
return; /* Postprocessor exactly filled output buf */
|
||||||
/*FALLTHROUGH*/
|
FALLTHROUGH /*FALLTHROUGH*/
|
||||||
case CTX_PREPARE_FOR_IMCU:
|
case CTX_PREPARE_FOR_IMCU:
|
||||||
/* Prepare to process first M-1 row groups of this iMCU row */
|
/* Prepare to process first M-1 row groups of this iMCU row */
|
||||||
main_ptr->rowgroup_ctr = 0;
|
main_ptr->rowgroup_ctr = 0;
|
||||||
@@ -371,7 +372,7 @@ process_data_context_main(j_decompress_ptr cinfo, JSAMPARRAY output_buf,
|
|||||||
if (main_ptr->iMCU_row_ctr == cinfo->total_iMCU_rows)
|
if (main_ptr->iMCU_row_ctr == cinfo->total_iMCU_rows)
|
||||||
set_bottom_pointers(cinfo);
|
set_bottom_pointers(cinfo);
|
||||||
main_ptr->context_state = CTX_PROCESS_IMCU;
|
main_ptr->context_state = CTX_PROCESS_IMCU;
|
||||||
/*FALLTHROUGH*/
|
FALLTHROUGH /*FALLTHROUGH*/
|
||||||
case CTX_PROCESS_IMCU:
|
case CTX_PROCESS_IMCU:
|
||||||
/* Call postprocessor using previously set pointers */
|
/* Call postprocessor using previously set pointers */
|
||||||
(*cinfo->post->post_process_data) (cinfo,
|
(*cinfo->post->post_process_data) (cinfo,
|
||||||
|
|||||||
+36
-39
@@ -4,7 +4,7 @@
|
|||||||
* This file was part of the Independent JPEG Group's software:
|
* This file was part of the Independent JPEG Group's software:
|
||||||
* Copyright (C) 1991-1998, Thomas G. Lane.
|
* Copyright (C) 1991-1998, Thomas G. Lane.
|
||||||
* libjpeg-turbo Modifications:
|
* libjpeg-turbo Modifications:
|
||||||
* Copyright (C) 2012, 2015, D. R. Commander.
|
* Copyright (C) 2012, 2015, 2022, D. R. Commander.
|
||||||
* For conditions of distribution and use, see the accompanying README.ijg
|
* For conditions of distribution and use, see the accompanying README.ijg
|
||||||
* file.
|
* file.
|
||||||
*
|
*
|
||||||
@@ -151,7 +151,7 @@ typedef my_marker_reader *my_marker_ptr;
|
|||||||
#define INPUT_BYTE(cinfo, V, action) \
|
#define INPUT_BYTE(cinfo, V, action) \
|
||||||
MAKESTMT( MAKE_BYTE_AVAIL(cinfo, action); \
|
MAKESTMT( MAKE_BYTE_AVAIL(cinfo, action); \
|
||||||
bytes_in_buffer--; \
|
bytes_in_buffer--; \
|
||||||
V = GETJOCTET(*next_input_byte++); )
|
V = *next_input_byte++; )
|
||||||
|
|
||||||
/* As above, but read two bytes interpreted as an unsigned 16-bit integer.
|
/* As above, but read two bytes interpreted as an unsigned 16-bit integer.
|
||||||
* V should be declared unsigned int or perhaps JLONG.
|
* V should be declared unsigned int or perhaps JLONG.
|
||||||
@@ -159,10 +159,10 @@ typedef my_marker_reader *my_marker_ptr;
|
|||||||
#define INPUT_2BYTES(cinfo, V, action) \
|
#define INPUT_2BYTES(cinfo, V, action) \
|
||||||
MAKESTMT( MAKE_BYTE_AVAIL(cinfo, action); \
|
MAKESTMT( MAKE_BYTE_AVAIL(cinfo, action); \
|
||||||
bytes_in_buffer--; \
|
bytes_in_buffer--; \
|
||||||
V = ((unsigned int)GETJOCTET(*next_input_byte++)) << 8; \
|
V = ((unsigned int)(*next_input_byte++)) << 8; \
|
||||||
MAKE_BYTE_AVAIL(cinfo, action); \
|
MAKE_BYTE_AVAIL(cinfo, action); \
|
||||||
bytes_in_buffer--; \
|
bytes_in_buffer--; \
|
||||||
V += GETJOCTET(*next_input_byte++); )
|
V += *next_input_byte++; )
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -473,7 +473,7 @@ get_dht(j_decompress_ptr cinfo)
|
|||||||
for (i = 0; i < count; i++)
|
for (i = 0; i < count; i++)
|
||||||
INPUT_BYTE(cinfo, huffval[i], return FALSE);
|
INPUT_BYTE(cinfo, huffval[i], return FALSE);
|
||||||
|
|
||||||
MEMZERO(&huffval[count], (256 - count) * sizeof(UINT8));
|
memset(&huffval[count], 0, (256 - count) * sizeof(UINT8));
|
||||||
|
|
||||||
length -= count;
|
length -= count;
|
||||||
|
|
||||||
@@ -491,8 +491,8 @@ get_dht(j_decompress_ptr cinfo)
|
|||||||
if (*htblptr == NULL)
|
if (*htblptr == NULL)
|
||||||
*htblptr = jpeg_alloc_huff_table((j_common_ptr)cinfo);
|
*htblptr = jpeg_alloc_huff_table((j_common_ptr)cinfo);
|
||||||
|
|
||||||
MEMCOPY((*htblptr)->bits, bits, sizeof((*htblptr)->bits));
|
memcpy((*htblptr)->bits, bits, sizeof((*htblptr)->bits));
|
||||||
MEMCOPY((*htblptr)->huffval, huffval, sizeof((*htblptr)->huffval));
|
memcpy((*htblptr)->huffval, huffval, sizeof((*htblptr)->huffval));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (length != 0)
|
if (length != 0)
|
||||||
@@ -608,18 +608,18 @@ examine_app0(j_decompress_ptr cinfo, JOCTET *data, unsigned int datalen,
|
|||||||
JLONG totallen = (JLONG)datalen + remaining;
|
JLONG totallen = (JLONG)datalen + remaining;
|
||||||
|
|
||||||
if (datalen >= APP0_DATA_LEN &&
|
if (datalen >= APP0_DATA_LEN &&
|
||||||
GETJOCTET(data[0]) == 0x4A &&
|
data[0] == 0x4A &&
|
||||||
GETJOCTET(data[1]) == 0x46 &&
|
data[1] == 0x46 &&
|
||||||
GETJOCTET(data[2]) == 0x49 &&
|
data[2] == 0x49 &&
|
||||||
GETJOCTET(data[3]) == 0x46 &&
|
data[3] == 0x46 &&
|
||||||
GETJOCTET(data[4]) == 0) {
|
data[4] == 0) {
|
||||||
/* Found JFIF APP0 marker: save info */
|
/* Found JFIF APP0 marker: save info */
|
||||||
cinfo->saw_JFIF_marker = TRUE;
|
cinfo->saw_JFIF_marker = TRUE;
|
||||||
cinfo->JFIF_major_version = GETJOCTET(data[5]);
|
cinfo->JFIF_major_version = data[5];
|
||||||
cinfo->JFIF_minor_version = GETJOCTET(data[6]);
|
cinfo->JFIF_minor_version = data[6];
|
||||||
cinfo->density_unit = GETJOCTET(data[7]);
|
cinfo->density_unit = data[7];
|
||||||
cinfo->X_density = (GETJOCTET(data[8]) << 8) + GETJOCTET(data[9]);
|
cinfo->X_density = (data[8] << 8) + data[9];
|
||||||
cinfo->Y_density = (GETJOCTET(data[10]) << 8) + GETJOCTET(data[11]);
|
cinfo->Y_density = (data[10] << 8) + data[11];
|
||||||
/* Check version.
|
/* Check version.
|
||||||
* Major version must be 1, anything else signals an incompatible change.
|
* Major version must be 1, anything else signals an incompatible change.
|
||||||
* (We used to treat this as an error, but now it's a nonfatal warning,
|
* (We used to treat this as an error, but now it's a nonfatal warning,
|
||||||
@@ -634,24 +634,22 @@ examine_app0(j_decompress_ptr cinfo, JOCTET *data, unsigned int datalen,
|
|||||||
cinfo->JFIF_major_version, cinfo->JFIF_minor_version,
|
cinfo->JFIF_major_version, cinfo->JFIF_minor_version,
|
||||||
cinfo->X_density, cinfo->Y_density, cinfo->density_unit);
|
cinfo->X_density, cinfo->Y_density, cinfo->density_unit);
|
||||||
/* Validate thumbnail dimensions and issue appropriate messages */
|
/* Validate thumbnail dimensions and issue appropriate messages */
|
||||||
if (GETJOCTET(data[12]) | GETJOCTET(data[13]))
|
if (data[12] | data[13])
|
||||||
TRACEMS2(cinfo, 1, JTRC_JFIF_THUMBNAIL,
|
TRACEMS2(cinfo, 1, JTRC_JFIF_THUMBNAIL, data[12], data[13]);
|
||||||
GETJOCTET(data[12]), GETJOCTET(data[13]));
|
|
||||||
totallen -= APP0_DATA_LEN;
|
totallen -= APP0_DATA_LEN;
|
||||||
if (totallen !=
|
if (totallen != ((JLONG)data[12] * (JLONG)data[13] * (JLONG)3))
|
||||||
((JLONG)GETJOCTET(data[12]) * (JLONG)GETJOCTET(data[13]) * (JLONG)3))
|
|
||||||
TRACEMS1(cinfo, 1, JTRC_JFIF_BADTHUMBNAILSIZE, (int)totallen);
|
TRACEMS1(cinfo, 1, JTRC_JFIF_BADTHUMBNAILSIZE, (int)totallen);
|
||||||
} else if (datalen >= 6 &&
|
} else if (datalen >= 6 &&
|
||||||
GETJOCTET(data[0]) == 0x4A &&
|
data[0] == 0x4A &&
|
||||||
GETJOCTET(data[1]) == 0x46 &&
|
data[1] == 0x46 &&
|
||||||
GETJOCTET(data[2]) == 0x58 &&
|
data[2] == 0x58 &&
|
||||||
GETJOCTET(data[3]) == 0x58 &&
|
data[3] == 0x58 &&
|
||||||
GETJOCTET(data[4]) == 0) {
|
data[4] == 0) {
|
||||||
/* Found JFIF "JFXX" extension APP0 marker */
|
/* Found JFIF "JFXX" extension APP0 marker */
|
||||||
/* The library doesn't actually do anything with these,
|
/* The library doesn't actually do anything with these,
|
||||||
* but we try to produce a helpful trace message.
|
* but we try to produce a helpful trace message.
|
||||||
*/
|
*/
|
||||||
switch (GETJOCTET(data[5])) {
|
switch (data[5]) {
|
||||||
case 0x10:
|
case 0x10:
|
||||||
TRACEMS1(cinfo, 1, JTRC_THUMB_JPEG, (int)totallen);
|
TRACEMS1(cinfo, 1, JTRC_THUMB_JPEG, (int)totallen);
|
||||||
break;
|
break;
|
||||||
@@ -662,8 +660,7 @@ examine_app0(j_decompress_ptr cinfo, JOCTET *data, unsigned int datalen,
|
|||||||
TRACEMS1(cinfo, 1, JTRC_THUMB_RGB, (int)totallen);
|
TRACEMS1(cinfo, 1, JTRC_THUMB_RGB, (int)totallen);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
TRACEMS2(cinfo, 1, JTRC_JFIF_EXTENSION,
|
TRACEMS2(cinfo, 1, JTRC_JFIF_EXTENSION, data[5], (int)totallen);
|
||||||
GETJOCTET(data[5]), (int)totallen);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -684,16 +681,16 @@ examine_app14(j_decompress_ptr cinfo, JOCTET *data, unsigned int datalen,
|
|||||||
unsigned int version, flags0, flags1, transform;
|
unsigned int version, flags0, flags1, transform;
|
||||||
|
|
||||||
if (datalen >= APP14_DATA_LEN &&
|
if (datalen >= APP14_DATA_LEN &&
|
||||||
GETJOCTET(data[0]) == 0x41 &&
|
data[0] == 0x41 &&
|
||||||
GETJOCTET(data[1]) == 0x64 &&
|
data[1] == 0x64 &&
|
||||||
GETJOCTET(data[2]) == 0x6F &&
|
data[2] == 0x6F &&
|
||||||
GETJOCTET(data[3]) == 0x62 &&
|
data[3] == 0x62 &&
|
||||||
GETJOCTET(data[4]) == 0x65) {
|
data[4] == 0x65) {
|
||||||
/* Found Adobe APP14 marker */
|
/* Found Adobe APP14 marker */
|
||||||
version = (GETJOCTET(data[5]) << 8) + GETJOCTET(data[6]);
|
version = (data[5] << 8) + data[6];
|
||||||
flags0 = (GETJOCTET(data[7]) << 8) + GETJOCTET(data[8]);
|
flags0 = (data[7] << 8) + data[8];
|
||||||
flags1 = (GETJOCTET(data[9]) << 8) + GETJOCTET(data[10]);
|
flags1 = (data[9] << 8) + data[10];
|
||||||
transform = GETJOCTET(data[11]);
|
transform = data[11];
|
||||||
TRACEMS4(cinfo, 1, JTRC_ADOBE, version, flags0, flags1, transform);
|
TRACEMS4(cinfo, 1, JTRC_ADOBE, version, flags0, flags1, transform);
|
||||||
cinfo->saw_Adobe_marker = TRUE;
|
cinfo->saw_Adobe_marker = TRUE;
|
||||||
cinfo->Adobe_transform = (UINT8)transform;
|
cinfo->Adobe_transform = (UINT8)transform;
|
||||||
|
|||||||
+7
-18
@@ -5,7 +5,7 @@
|
|||||||
* Copyright (C) 1991-1997, Thomas G. Lane.
|
* Copyright (C) 1991-1997, Thomas G. Lane.
|
||||||
* Modified 2002-2009 by Guido Vollbeding.
|
* Modified 2002-2009 by Guido Vollbeding.
|
||||||
* libjpeg-turbo Modifications:
|
* libjpeg-turbo Modifications:
|
||||||
* Copyright (C) 2009-2011, 2016, D. R. Commander.
|
* Copyright (C) 2009-2011, 2016, 2019, 2022, D. R. Commander.
|
||||||
* Copyright (C) 2013, Linaro Limited.
|
* Copyright (C) 2013, Linaro Limited.
|
||||||
* Copyright (C) 2015, Google, Inc.
|
* Copyright (C) 2015, Google, Inc.
|
||||||
* For conditions of distribution and use, see the accompanying README.ijg
|
* For conditions of distribution and use, see the accompanying README.ijg
|
||||||
@@ -22,7 +22,6 @@
|
|||||||
#include "jpeglib.h"
|
#include "jpeglib.h"
|
||||||
#include "jpegcomp.h"
|
#include "jpegcomp.h"
|
||||||
#include "jdmaster.h"
|
#include "jdmaster.h"
|
||||||
#include "jsimd.h"
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -70,17 +69,6 @@ use_merged_upsample(j_decompress_ptr cinfo)
|
|||||||
cinfo->comp_info[1]._DCT_scaled_size != cinfo->_min_DCT_scaled_size ||
|
cinfo->comp_info[1]._DCT_scaled_size != cinfo->_min_DCT_scaled_size ||
|
||||||
cinfo->comp_info[2]._DCT_scaled_size != cinfo->_min_DCT_scaled_size)
|
cinfo->comp_info[2]._DCT_scaled_size != cinfo->_min_DCT_scaled_size)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
#ifdef WITH_SIMD
|
|
||||||
/* If YCbCr-to-RGB color conversion is SIMD-accelerated but merged upsampling
|
|
||||||
isn't, then disabling merged upsampling is likely to be faster when
|
|
||||||
decompressing YCbCr JPEG images. */
|
|
||||||
if (!jsimd_can_h2v2_merged_upsample() && !jsimd_can_h2v1_merged_upsample() &&
|
|
||||||
jsimd_can_ycc_rgb() && cinfo->jpeg_color_space == JCS_YCbCr &&
|
|
||||||
(cinfo->out_color_space == JCS_RGB ||
|
|
||||||
(cinfo->out_color_space >= JCS_EXT_RGB &&
|
|
||||||
cinfo->out_color_space <= JCS_EXT_ARGB)))
|
|
||||||
return FALSE;
|
|
||||||
#endif
|
|
||||||
/* ??? also need to test for upsample-time rescaling, when & if supported */
|
/* ??? also need to test for upsample-time rescaling, when & if supported */
|
||||||
return TRUE; /* by golly, it'll work... */
|
return TRUE; /* by golly, it'll work... */
|
||||||
#else
|
#else
|
||||||
@@ -429,7 +417,7 @@ prepare_range_limit_table(j_decompress_ptr cinfo)
|
|||||||
table += (MAXJSAMPLE + 1); /* allow negative subscripts of simple table */
|
table += (MAXJSAMPLE + 1); /* allow negative subscripts of simple table */
|
||||||
cinfo->sample_range_limit = table;
|
cinfo->sample_range_limit = table;
|
||||||
/* First segment of "simple" table: limit[x] = 0 for x < 0 */
|
/* First segment of "simple" table: limit[x] = 0 for x < 0 */
|
||||||
MEMZERO(table - (MAXJSAMPLE + 1), (MAXJSAMPLE + 1) * sizeof(JSAMPLE));
|
memset(table - (MAXJSAMPLE + 1), 0, (MAXJSAMPLE + 1) * sizeof(JSAMPLE));
|
||||||
/* Main part of "simple" table: limit[x] = x */
|
/* Main part of "simple" table: limit[x] = x */
|
||||||
for (i = 0; i <= MAXJSAMPLE; i++)
|
for (i = 0; i <= MAXJSAMPLE; i++)
|
||||||
table[i] = (JSAMPLE)i;
|
table[i] = (JSAMPLE)i;
|
||||||
@@ -438,10 +426,10 @@ prepare_range_limit_table(j_decompress_ptr cinfo)
|
|||||||
for (i = CENTERJSAMPLE; i < 2 * (MAXJSAMPLE + 1); i++)
|
for (i = CENTERJSAMPLE; i < 2 * (MAXJSAMPLE + 1); i++)
|
||||||
table[i] = MAXJSAMPLE;
|
table[i] = MAXJSAMPLE;
|
||||||
/* Second half of post-IDCT table */
|
/* Second half of post-IDCT table */
|
||||||
MEMZERO(table + (2 * (MAXJSAMPLE + 1)),
|
memset(table + (2 * (MAXJSAMPLE + 1)), 0,
|
||||||
(2 * (MAXJSAMPLE + 1) - CENTERJSAMPLE) * sizeof(JSAMPLE));
|
(2 * (MAXJSAMPLE + 1) - CENTERJSAMPLE) * sizeof(JSAMPLE));
|
||||||
MEMCOPY(table + (4 * (MAXJSAMPLE + 1) - CENTERJSAMPLE),
|
memcpy(table + (4 * (MAXJSAMPLE + 1) - CENTERJSAMPLE),
|
||||||
cinfo->sample_range_limit, CENTERJSAMPLE * sizeof(JSAMPLE));
|
cinfo->sample_range_limit, CENTERJSAMPLE * sizeof(JSAMPLE));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -580,6 +568,7 @@ master_selection(j_decompress_ptr cinfo)
|
|||||||
*/
|
*/
|
||||||
cinfo->master->first_iMCU_col = 0;
|
cinfo->master->first_iMCU_col = 0;
|
||||||
cinfo->master->last_iMCU_col = cinfo->MCUs_per_row - 1;
|
cinfo->master->last_iMCU_col = cinfo->MCUs_per_row - 1;
|
||||||
|
cinfo->master->last_good_iMCU_row = 0;
|
||||||
|
|
||||||
#ifdef D_MULTISCAN_FILES_SUPPORTED
|
#ifdef D_MULTISCAN_FILES_SUPPORTED
|
||||||
/* If jpeg_start_decompress will read the whole file, initialize
|
/* If jpeg_start_decompress will read the whole file, initialize
|
||||||
|
|||||||
+34
-34
@@ -43,20 +43,20 @@ h2v1_merged_upsample_565_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
|
|||||||
/* Loop for each pair of output pixels */
|
/* Loop for each pair of output pixels */
|
||||||
for (col = cinfo->output_width >> 1; col > 0; col--) {
|
for (col = cinfo->output_width >> 1; col > 0; col--) {
|
||||||
/* Do the chroma part of the calculation */
|
/* Do the chroma part of the calculation */
|
||||||
cb = GETJSAMPLE(*inptr1++);
|
cb = *inptr1++;
|
||||||
cr = GETJSAMPLE(*inptr2++);
|
cr = *inptr2++;
|
||||||
cred = Crrtab[cr];
|
cred = Crrtab[cr];
|
||||||
cgreen = (int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
|
cgreen = (int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
|
||||||
cblue = Cbbtab[cb];
|
cblue = Cbbtab[cb];
|
||||||
|
|
||||||
/* Fetch 2 Y values and emit 2 pixels */
|
/* Fetch 2 Y values and emit 2 pixels */
|
||||||
y = GETJSAMPLE(*inptr0++);
|
y = *inptr0++;
|
||||||
r = range_limit[y + cred];
|
r = range_limit[y + cred];
|
||||||
g = range_limit[y + cgreen];
|
g = range_limit[y + cgreen];
|
||||||
b = range_limit[y + cblue];
|
b = range_limit[y + cblue];
|
||||||
rgb = PACK_SHORT_565(r, g, b);
|
rgb = PACK_SHORT_565(r, g, b);
|
||||||
|
|
||||||
y = GETJSAMPLE(*inptr0++);
|
y = *inptr0++;
|
||||||
r = range_limit[y + cred];
|
r = range_limit[y + cred];
|
||||||
g = range_limit[y + cgreen];
|
g = range_limit[y + cgreen];
|
||||||
b = range_limit[y + cblue];
|
b = range_limit[y + cblue];
|
||||||
@@ -68,12 +68,12 @@ h2v1_merged_upsample_565_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
|
|||||||
|
|
||||||
/* If image width is odd, do the last output column separately */
|
/* If image width is odd, do the last output column separately */
|
||||||
if (cinfo->output_width & 1) {
|
if (cinfo->output_width & 1) {
|
||||||
cb = GETJSAMPLE(*inptr1);
|
cb = *inptr1;
|
||||||
cr = GETJSAMPLE(*inptr2);
|
cr = *inptr2;
|
||||||
cred = Crrtab[cr];
|
cred = Crrtab[cr];
|
||||||
cgreen = (int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
|
cgreen = (int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
|
||||||
cblue = Cbbtab[cb];
|
cblue = Cbbtab[cb];
|
||||||
y = GETJSAMPLE(*inptr0);
|
y = *inptr0;
|
||||||
r = range_limit[y + cred];
|
r = range_limit[y + cred];
|
||||||
g = range_limit[y + cgreen];
|
g = range_limit[y + cgreen];
|
||||||
b = range_limit[y + cblue];
|
b = range_limit[y + cblue];
|
||||||
@@ -115,21 +115,21 @@ h2v1_merged_upsample_565D_internal(j_decompress_ptr cinfo,
|
|||||||
/* Loop for each pair of output pixels */
|
/* Loop for each pair of output pixels */
|
||||||
for (col = cinfo->output_width >> 1; col > 0; col--) {
|
for (col = cinfo->output_width >> 1; col > 0; col--) {
|
||||||
/* Do the chroma part of the calculation */
|
/* Do the chroma part of the calculation */
|
||||||
cb = GETJSAMPLE(*inptr1++);
|
cb = *inptr1++;
|
||||||
cr = GETJSAMPLE(*inptr2++);
|
cr = *inptr2++;
|
||||||
cred = Crrtab[cr];
|
cred = Crrtab[cr];
|
||||||
cgreen = (int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
|
cgreen = (int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
|
||||||
cblue = Cbbtab[cb];
|
cblue = Cbbtab[cb];
|
||||||
|
|
||||||
/* Fetch 2 Y values and emit 2 pixels */
|
/* Fetch 2 Y values and emit 2 pixels */
|
||||||
y = GETJSAMPLE(*inptr0++);
|
y = *inptr0++;
|
||||||
r = range_limit[DITHER_565_R(y + cred, d0)];
|
r = range_limit[DITHER_565_R(y + cred, d0)];
|
||||||
g = range_limit[DITHER_565_G(y + cgreen, d0)];
|
g = range_limit[DITHER_565_G(y + cgreen, d0)];
|
||||||
b = range_limit[DITHER_565_B(y + cblue, d0)];
|
b = range_limit[DITHER_565_B(y + cblue, d0)];
|
||||||
d0 = DITHER_ROTATE(d0);
|
d0 = DITHER_ROTATE(d0);
|
||||||
rgb = PACK_SHORT_565(r, g, b);
|
rgb = PACK_SHORT_565(r, g, b);
|
||||||
|
|
||||||
y = GETJSAMPLE(*inptr0++);
|
y = *inptr0++;
|
||||||
r = range_limit[DITHER_565_R(y + cred, d0)];
|
r = range_limit[DITHER_565_R(y + cred, d0)];
|
||||||
g = range_limit[DITHER_565_G(y + cgreen, d0)];
|
g = range_limit[DITHER_565_G(y + cgreen, d0)];
|
||||||
b = range_limit[DITHER_565_B(y + cblue, d0)];
|
b = range_limit[DITHER_565_B(y + cblue, d0)];
|
||||||
@@ -142,12 +142,12 @@ h2v1_merged_upsample_565D_internal(j_decompress_ptr cinfo,
|
|||||||
|
|
||||||
/* If image width is odd, do the last output column separately */
|
/* If image width is odd, do the last output column separately */
|
||||||
if (cinfo->output_width & 1) {
|
if (cinfo->output_width & 1) {
|
||||||
cb = GETJSAMPLE(*inptr1);
|
cb = *inptr1;
|
||||||
cr = GETJSAMPLE(*inptr2);
|
cr = *inptr2;
|
||||||
cred = Crrtab[cr];
|
cred = Crrtab[cr];
|
||||||
cgreen = (int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
|
cgreen = (int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
|
||||||
cblue = Cbbtab[cb];
|
cblue = Cbbtab[cb];
|
||||||
y = GETJSAMPLE(*inptr0);
|
y = *inptr0;
|
||||||
r = range_limit[DITHER_565_R(y + cred, d0)];
|
r = range_limit[DITHER_565_R(y + cred, d0)];
|
||||||
g = range_limit[DITHER_565_G(y + cgreen, d0)];
|
g = range_limit[DITHER_565_G(y + cgreen, d0)];
|
||||||
b = range_limit[DITHER_565_B(y + cblue, d0)];
|
b = range_limit[DITHER_565_B(y + cblue, d0)];
|
||||||
@@ -189,20 +189,20 @@ h2v2_merged_upsample_565_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
|
|||||||
/* Loop for each group of output pixels */
|
/* Loop for each group of output pixels */
|
||||||
for (col = cinfo->output_width >> 1; col > 0; col--) {
|
for (col = cinfo->output_width >> 1; col > 0; col--) {
|
||||||
/* Do the chroma part of the calculation */
|
/* Do the chroma part of the calculation */
|
||||||
cb = GETJSAMPLE(*inptr1++);
|
cb = *inptr1++;
|
||||||
cr = GETJSAMPLE(*inptr2++);
|
cr = *inptr2++;
|
||||||
cred = Crrtab[cr];
|
cred = Crrtab[cr];
|
||||||
cgreen = (int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
|
cgreen = (int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
|
||||||
cblue = Cbbtab[cb];
|
cblue = Cbbtab[cb];
|
||||||
|
|
||||||
/* Fetch 4 Y values and emit 4 pixels */
|
/* Fetch 4 Y values and emit 4 pixels */
|
||||||
y = GETJSAMPLE(*inptr00++);
|
y = *inptr00++;
|
||||||
r = range_limit[y + cred];
|
r = range_limit[y + cred];
|
||||||
g = range_limit[y + cgreen];
|
g = range_limit[y + cgreen];
|
||||||
b = range_limit[y + cblue];
|
b = range_limit[y + cblue];
|
||||||
rgb = PACK_SHORT_565(r, g, b);
|
rgb = PACK_SHORT_565(r, g, b);
|
||||||
|
|
||||||
y = GETJSAMPLE(*inptr00++);
|
y = *inptr00++;
|
||||||
r = range_limit[y + cred];
|
r = range_limit[y + cred];
|
||||||
g = range_limit[y + cgreen];
|
g = range_limit[y + cgreen];
|
||||||
b = range_limit[y + cblue];
|
b = range_limit[y + cblue];
|
||||||
@@ -211,13 +211,13 @@ h2v2_merged_upsample_565_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
|
|||||||
WRITE_TWO_PIXELS(outptr0, rgb);
|
WRITE_TWO_PIXELS(outptr0, rgb);
|
||||||
outptr0 += 4;
|
outptr0 += 4;
|
||||||
|
|
||||||
y = GETJSAMPLE(*inptr01++);
|
y = *inptr01++;
|
||||||
r = range_limit[y + cred];
|
r = range_limit[y + cred];
|
||||||
g = range_limit[y + cgreen];
|
g = range_limit[y + cgreen];
|
||||||
b = range_limit[y + cblue];
|
b = range_limit[y + cblue];
|
||||||
rgb = PACK_SHORT_565(r, g, b);
|
rgb = PACK_SHORT_565(r, g, b);
|
||||||
|
|
||||||
y = GETJSAMPLE(*inptr01++);
|
y = *inptr01++;
|
||||||
r = range_limit[y + cred];
|
r = range_limit[y + cred];
|
||||||
g = range_limit[y + cgreen];
|
g = range_limit[y + cgreen];
|
||||||
b = range_limit[y + cblue];
|
b = range_limit[y + cblue];
|
||||||
@@ -229,20 +229,20 @@ h2v2_merged_upsample_565_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
|
|||||||
|
|
||||||
/* If image width is odd, do the last output column separately */
|
/* If image width is odd, do the last output column separately */
|
||||||
if (cinfo->output_width & 1) {
|
if (cinfo->output_width & 1) {
|
||||||
cb = GETJSAMPLE(*inptr1);
|
cb = *inptr1;
|
||||||
cr = GETJSAMPLE(*inptr2);
|
cr = *inptr2;
|
||||||
cred = Crrtab[cr];
|
cred = Crrtab[cr];
|
||||||
cgreen = (int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
|
cgreen = (int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
|
||||||
cblue = Cbbtab[cb];
|
cblue = Cbbtab[cb];
|
||||||
|
|
||||||
y = GETJSAMPLE(*inptr00);
|
y = *inptr00;
|
||||||
r = range_limit[y + cred];
|
r = range_limit[y + cred];
|
||||||
g = range_limit[y + cgreen];
|
g = range_limit[y + cgreen];
|
||||||
b = range_limit[y + cblue];
|
b = range_limit[y + cblue];
|
||||||
rgb = PACK_SHORT_565(r, g, b);
|
rgb = PACK_SHORT_565(r, g, b);
|
||||||
*(INT16 *)outptr0 = (INT16)rgb;
|
*(INT16 *)outptr0 = (INT16)rgb;
|
||||||
|
|
||||||
y = GETJSAMPLE(*inptr01);
|
y = *inptr01;
|
||||||
r = range_limit[y + cred];
|
r = range_limit[y + cred];
|
||||||
g = range_limit[y + cgreen];
|
g = range_limit[y + cgreen];
|
||||||
b = range_limit[y + cblue];
|
b = range_limit[y + cblue];
|
||||||
@@ -287,21 +287,21 @@ h2v2_merged_upsample_565D_internal(j_decompress_ptr cinfo,
|
|||||||
/* Loop for each group of output pixels */
|
/* Loop for each group of output pixels */
|
||||||
for (col = cinfo->output_width >> 1; col > 0; col--) {
|
for (col = cinfo->output_width >> 1; col > 0; col--) {
|
||||||
/* Do the chroma part of the calculation */
|
/* Do the chroma part of the calculation */
|
||||||
cb = GETJSAMPLE(*inptr1++);
|
cb = *inptr1++;
|
||||||
cr = GETJSAMPLE(*inptr2++);
|
cr = *inptr2++;
|
||||||
cred = Crrtab[cr];
|
cred = Crrtab[cr];
|
||||||
cgreen = (int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
|
cgreen = (int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
|
||||||
cblue = Cbbtab[cb];
|
cblue = Cbbtab[cb];
|
||||||
|
|
||||||
/* Fetch 4 Y values and emit 4 pixels */
|
/* Fetch 4 Y values and emit 4 pixels */
|
||||||
y = GETJSAMPLE(*inptr00++);
|
y = *inptr00++;
|
||||||
r = range_limit[DITHER_565_R(y + cred, d0)];
|
r = range_limit[DITHER_565_R(y + cred, d0)];
|
||||||
g = range_limit[DITHER_565_G(y + cgreen, d0)];
|
g = range_limit[DITHER_565_G(y + cgreen, d0)];
|
||||||
b = range_limit[DITHER_565_B(y + cblue, d0)];
|
b = range_limit[DITHER_565_B(y + cblue, d0)];
|
||||||
d0 = DITHER_ROTATE(d0);
|
d0 = DITHER_ROTATE(d0);
|
||||||
rgb = PACK_SHORT_565(r, g, b);
|
rgb = PACK_SHORT_565(r, g, b);
|
||||||
|
|
||||||
y = GETJSAMPLE(*inptr00++);
|
y = *inptr00++;
|
||||||
r = range_limit[DITHER_565_R(y + cred, d0)];
|
r = range_limit[DITHER_565_R(y + cred, d0)];
|
||||||
g = range_limit[DITHER_565_G(y + cgreen, d0)];
|
g = range_limit[DITHER_565_G(y + cgreen, d0)];
|
||||||
b = range_limit[DITHER_565_B(y + cblue, d0)];
|
b = range_limit[DITHER_565_B(y + cblue, d0)];
|
||||||
@@ -311,14 +311,14 @@ h2v2_merged_upsample_565D_internal(j_decompress_ptr cinfo,
|
|||||||
WRITE_TWO_PIXELS(outptr0, rgb);
|
WRITE_TWO_PIXELS(outptr0, rgb);
|
||||||
outptr0 += 4;
|
outptr0 += 4;
|
||||||
|
|
||||||
y = GETJSAMPLE(*inptr01++);
|
y = *inptr01++;
|
||||||
r = range_limit[DITHER_565_R(y + cred, d1)];
|
r = range_limit[DITHER_565_R(y + cred, d1)];
|
||||||
g = range_limit[DITHER_565_G(y + cgreen, d1)];
|
g = range_limit[DITHER_565_G(y + cgreen, d1)];
|
||||||
b = range_limit[DITHER_565_B(y + cblue, d1)];
|
b = range_limit[DITHER_565_B(y + cblue, d1)];
|
||||||
d1 = DITHER_ROTATE(d1);
|
d1 = DITHER_ROTATE(d1);
|
||||||
rgb = PACK_SHORT_565(r, g, b);
|
rgb = PACK_SHORT_565(r, g, b);
|
||||||
|
|
||||||
y = GETJSAMPLE(*inptr01++);
|
y = *inptr01++;
|
||||||
r = range_limit[DITHER_565_R(y + cred, d1)];
|
r = range_limit[DITHER_565_R(y + cred, d1)];
|
||||||
g = range_limit[DITHER_565_G(y + cgreen, d1)];
|
g = range_limit[DITHER_565_G(y + cgreen, d1)];
|
||||||
b = range_limit[DITHER_565_B(y + cblue, d1)];
|
b = range_limit[DITHER_565_B(y + cblue, d1)];
|
||||||
@@ -331,20 +331,20 @@ h2v2_merged_upsample_565D_internal(j_decompress_ptr cinfo,
|
|||||||
|
|
||||||
/* If image width is odd, do the last output column separately */
|
/* If image width is odd, do the last output column separately */
|
||||||
if (cinfo->output_width & 1) {
|
if (cinfo->output_width & 1) {
|
||||||
cb = GETJSAMPLE(*inptr1);
|
cb = *inptr1;
|
||||||
cr = GETJSAMPLE(*inptr2);
|
cr = *inptr2;
|
||||||
cred = Crrtab[cr];
|
cred = Crrtab[cr];
|
||||||
cgreen = (int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
|
cgreen = (int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
|
||||||
cblue = Cbbtab[cb];
|
cblue = Cbbtab[cb];
|
||||||
|
|
||||||
y = GETJSAMPLE(*inptr00);
|
y = *inptr00;
|
||||||
r = range_limit[DITHER_565_R(y + cred, d0)];
|
r = range_limit[DITHER_565_R(y + cred, d0)];
|
||||||
g = range_limit[DITHER_565_G(y + cgreen, d0)];
|
g = range_limit[DITHER_565_G(y + cgreen, d0)];
|
||||||
b = range_limit[DITHER_565_B(y + cblue, d0)];
|
b = range_limit[DITHER_565_B(y + cblue, d0)];
|
||||||
rgb = PACK_SHORT_565(r, g, b);
|
rgb = PACK_SHORT_565(r, g, b);
|
||||||
*(INT16 *)outptr0 = (INT16)rgb;
|
*(INT16 *)outptr0 = (INT16)rgb;
|
||||||
|
|
||||||
y = GETJSAMPLE(*inptr01);
|
y = *inptr01;
|
||||||
r = range_limit[DITHER_565_R(y + cred, d1)];
|
r = range_limit[DITHER_565_R(y + cred, d1)];
|
||||||
g = range_limit[DITHER_565_G(y + cgreen, d1)];
|
g = range_limit[DITHER_565_G(y + cgreen, d1)];
|
||||||
b = range_limit[DITHER_565_B(y + cblue, d1)];
|
b = range_limit[DITHER_565_B(y + cblue, d1)];
|
||||||
|
|||||||
+17
-17
@@ -46,13 +46,13 @@ h2v1_merged_upsample_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
|
|||||||
/* Loop for each pair of output pixels */
|
/* Loop for each pair of output pixels */
|
||||||
for (col = cinfo->output_width >> 1; col > 0; col--) {
|
for (col = cinfo->output_width >> 1; col > 0; col--) {
|
||||||
/* Do the chroma part of the calculation */
|
/* Do the chroma part of the calculation */
|
||||||
cb = GETJSAMPLE(*inptr1++);
|
cb = *inptr1++;
|
||||||
cr = GETJSAMPLE(*inptr2++);
|
cr = *inptr2++;
|
||||||
cred = Crrtab[cr];
|
cred = Crrtab[cr];
|
||||||
cgreen = (int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
|
cgreen = (int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
|
||||||
cblue = Cbbtab[cb];
|
cblue = Cbbtab[cb];
|
||||||
/* Fetch 2 Y values and emit 2 pixels */
|
/* Fetch 2 Y values and emit 2 pixels */
|
||||||
y = GETJSAMPLE(*inptr0++);
|
y = *inptr0++;
|
||||||
outptr[RGB_RED] = range_limit[y + cred];
|
outptr[RGB_RED] = range_limit[y + cred];
|
||||||
outptr[RGB_GREEN] = range_limit[y + cgreen];
|
outptr[RGB_GREEN] = range_limit[y + cgreen];
|
||||||
outptr[RGB_BLUE] = range_limit[y + cblue];
|
outptr[RGB_BLUE] = range_limit[y + cblue];
|
||||||
@@ -60,7 +60,7 @@ h2v1_merged_upsample_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
|
|||||||
outptr[RGB_ALPHA] = 0xFF;
|
outptr[RGB_ALPHA] = 0xFF;
|
||||||
#endif
|
#endif
|
||||||
outptr += RGB_PIXELSIZE;
|
outptr += RGB_PIXELSIZE;
|
||||||
y = GETJSAMPLE(*inptr0++);
|
y = *inptr0++;
|
||||||
outptr[RGB_RED] = range_limit[y + cred];
|
outptr[RGB_RED] = range_limit[y + cred];
|
||||||
outptr[RGB_GREEN] = range_limit[y + cgreen];
|
outptr[RGB_GREEN] = range_limit[y + cgreen];
|
||||||
outptr[RGB_BLUE] = range_limit[y + cblue];
|
outptr[RGB_BLUE] = range_limit[y + cblue];
|
||||||
@@ -71,12 +71,12 @@ h2v1_merged_upsample_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
|
|||||||
}
|
}
|
||||||
/* If image width is odd, do the last output column separately */
|
/* If image width is odd, do the last output column separately */
|
||||||
if (cinfo->output_width & 1) {
|
if (cinfo->output_width & 1) {
|
||||||
cb = GETJSAMPLE(*inptr1);
|
cb = *inptr1;
|
||||||
cr = GETJSAMPLE(*inptr2);
|
cr = *inptr2;
|
||||||
cred = Crrtab[cr];
|
cred = Crrtab[cr];
|
||||||
cgreen = (int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
|
cgreen = (int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
|
||||||
cblue = Cbbtab[cb];
|
cblue = Cbbtab[cb];
|
||||||
y = GETJSAMPLE(*inptr0);
|
y = *inptr0;
|
||||||
outptr[RGB_RED] = range_limit[y + cred];
|
outptr[RGB_RED] = range_limit[y + cred];
|
||||||
outptr[RGB_GREEN] = range_limit[y + cgreen];
|
outptr[RGB_GREEN] = range_limit[y + cgreen];
|
||||||
outptr[RGB_BLUE] = range_limit[y + cblue];
|
outptr[RGB_BLUE] = range_limit[y + cblue];
|
||||||
@@ -120,13 +120,13 @@ h2v2_merged_upsample_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
|
|||||||
/* Loop for each group of output pixels */
|
/* Loop for each group of output pixels */
|
||||||
for (col = cinfo->output_width >> 1; col > 0; col--) {
|
for (col = cinfo->output_width >> 1; col > 0; col--) {
|
||||||
/* Do the chroma part of the calculation */
|
/* Do the chroma part of the calculation */
|
||||||
cb = GETJSAMPLE(*inptr1++);
|
cb = *inptr1++;
|
||||||
cr = GETJSAMPLE(*inptr2++);
|
cr = *inptr2++;
|
||||||
cred = Crrtab[cr];
|
cred = Crrtab[cr];
|
||||||
cgreen = (int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
|
cgreen = (int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
|
||||||
cblue = Cbbtab[cb];
|
cblue = Cbbtab[cb];
|
||||||
/* Fetch 4 Y values and emit 4 pixels */
|
/* Fetch 4 Y values and emit 4 pixels */
|
||||||
y = GETJSAMPLE(*inptr00++);
|
y = *inptr00++;
|
||||||
outptr0[RGB_RED] = range_limit[y + cred];
|
outptr0[RGB_RED] = range_limit[y + cred];
|
||||||
outptr0[RGB_GREEN] = range_limit[y + cgreen];
|
outptr0[RGB_GREEN] = range_limit[y + cgreen];
|
||||||
outptr0[RGB_BLUE] = range_limit[y + cblue];
|
outptr0[RGB_BLUE] = range_limit[y + cblue];
|
||||||
@@ -134,7 +134,7 @@ h2v2_merged_upsample_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
|
|||||||
outptr0[RGB_ALPHA] = 0xFF;
|
outptr0[RGB_ALPHA] = 0xFF;
|
||||||
#endif
|
#endif
|
||||||
outptr0 += RGB_PIXELSIZE;
|
outptr0 += RGB_PIXELSIZE;
|
||||||
y = GETJSAMPLE(*inptr00++);
|
y = *inptr00++;
|
||||||
outptr0[RGB_RED] = range_limit[y + cred];
|
outptr0[RGB_RED] = range_limit[y + cred];
|
||||||
outptr0[RGB_GREEN] = range_limit[y + cgreen];
|
outptr0[RGB_GREEN] = range_limit[y + cgreen];
|
||||||
outptr0[RGB_BLUE] = range_limit[y + cblue];
|
outptr0[RGB_BLUE] = range_limit[y + cblue];
|
||||||
@@ -142,7 +142,7 @@ h2v2_merged_upsample_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
|
|||||||
outptr0[RGB_ALPHA] = 0xFF;
|
outptr0[RGB_ALPHA] = 0xFF;
|
||||||
#endif
|
#endif
|
||||||
outptr0 += RGB_PIXELSIZE;
|
outptr0 += RGB_PIXELSIZE;
|
||||||
y = GETJSAMPLE(*inptr01++);
|
y = *inptr01++;
|
||||||
outptr1[RGB_RED] = range_limit[y + cred];
|
outptr1[RGB_RED] = range_limit[y + cred];
|
||||||
outptr1[RGB_GREEN] = range_limit[y + cgreen];
|
outptr1[RGB_GREEN] = range_limit[y + cgreen];
|
||||||
outptr1[RGB_BLUE] = range_limit[y + cblue];
|
outptr1[RGB_BLUE] = range_limit[y + cblue];
|
||||||
@@ -150,7 +150,7 @@ h2v2_merged_upsample_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
|
|||||||
outptr1[RGB_ALPHA] = 0xFF;
|
outptr1[RGB_ALPHA] = 0xFF;
|
||||||
#endif
|
#endif
|
||||||
outptr1 += RGB_PIXELSIZE;
|
outptr1 += RGB_PIXELSIZE;
|
||||||
y = GETJSAMPLE(*inptr01++);
|
y = *inptr01++;
|
||||||
outptr1[RGB_RED] = range_limit[y + cred];
|
outptr1[RGB_RED] = range_limit[y + cred];
|
||||||
outptr1[RGB_GREEN] = range_limit[y + cgreen];
|
outptr1[RGB_GREEN] = range_limit[y + cgreen];
|
||||||
outptr1[RGB_BLUE] = range_limit[y + cblue];
|
outptr1[RGB_BLUE] = range_limit[y + cblue];
|
||||||
@@ -161,19 +161,19 @@ h2v2_merged_upsample_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
|
|||||||
}
|
}
|
||||||
/* If image width is odd, do the last output column separately */
|
/* If image width is odd, do the last output column separately */
|
||||||
if (cinfo->output_width & 1) {
|
if (cinfo->output_width & 1) {
|
||||||
cb = GETJSAMPLE(*inptr1);
|
cb = *inptr1;
|
||||||
cr = GETJSAMPLE(*inptr2);
|
cr = *inptr2;
|
||||||
cred = Crrtab[cr];
|
cred = Crrtab[cr];
|
||||||
cgreen = (int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
|
cgreen = (int)RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
|
||||||
cblue = Cbbtab[cb];
|
cblue = Cbbtab[cb];
|
||||||
y = GETJSAMPLE(*inptr00);
|
y = *inptr00;
|
||||||
outptr0[RGB_RED] = range_limit[y + cred];
|
outptr0[RGB_RED] = range_limit[y + cred];
|
||||||
outptr0[RGB_GREEN] = range_limit[y + cgreen];
|
outptr0[RGB_GREEN] = range_limit[y + cgreen];
|
||||||
outptr0[RGB_BLUE] = range_limit[y + cblue];
|
outptr0[RGB_BLUE] = range_limit[y + cblue];
|
||||||
#ifdef RGB_ALPHA
|
#ifdef RGB_ALPHA
|
||||||
outptr0[RGB_ALPHA] = 0xFF;
|
outptr0[RGB_ALPHA] = 0xFF;
|
||||||
#endif
|
#endif
|
||||||
y = GETJSAMPLE(*inptr01);
|
y = *inptr01;
|
||||||
outptr1[RGB_RED] = range_limit[y + cred];
|
outptr1[RGB_RED] = range_limit[y + cred];
|
||||||
outptr1[RGB_GREEN] = range_limit[y + cgreen];
|
outptr1[RGB_GREEN] = range_limit[y + cgreen];
|
||||||
outptr1[RGB_BLUE] = range_limit[y + cblue];
|
outptr1[RGB_BLUE] = range_limit[y + cblue];
|
||||||
|
|||||||
Vendored
+24
-32
@@ -4,7 +4,7 @@
|
|||||||
* This file was part of the Independent JPEG Group's software:
|
* This file was part of the Independent JPEG Group's software:
|
||||||
* Copyright (C) 1995-1997, Thomas G. Lane.
|
* Copyright (C) 1995-1997, Thomas G. Lane.
|
||||||
* libjpeg-turbo Modifications:
|
* libjpeg-turbo Modifications:
|
||||||
* Copyright (C) 2015-2016, 2018, D. R. Commander.
|
* Copyright (C) 2015-2016, 2018-2022, D. R. Commander.
|
||||||
* For conditions of distribution and use, see the accompanying README.ijg
|
* For conditions of distribution and use, see the accompanying README.ijg
|
||||||
* file.
|
* file.
|
||||||
*
|
*
|
||||||
@@ -41,25 +41,6 @@ typedef struct {
|
|||||||
int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */
|
int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */
|
||||||
} savable_state;
|
} savable_state;
|
||||||
|
|
||||||
/* This macro is to work around compilers with missing or broken
|
|
||||||
* structure assignment. You'll need to fix this code if you have
|
|
||||||
* such a compiler and you change MAX_COMPS_IN_SCAN.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef NO_STRUCT_ASSIGN
|
|
||||||
#define ASSIGN_STATE(dest, src) ((dest) = (src))
|
|
||||||
#else
|
|
||||||
#if MAX_COMPS_IN_SCAN == 4
|
|
||||||
#define ASSIGN_STATE(dest, src) \
|
|
||||||
((dest).EOBRUN = (src).EOBRUN, \
|
|
||||||
(dest).last_dc_val[0] = (src).last_dc_val[0], \
|
|
||||||
(dest).last_dc_val[1] = (src).last_dc_val[1], \
|
|
||||||
(dest).last_dc_val[2] = (src).last_dc_val[2], \
|
|
||||||
(dest).last_dc_val[3] = (src).last_dc_val[3])
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
struct jpeg_entropy_decoder pub; /* public fields */
|
struct jpeg_entropy_decoder pub; /* public fields */
|
||||||
|
|
||||||
@@ -102,7 +83,7 @@ start_pass_phuff_decoder(j_decompress_ptr cinfo)
|
|||||||
boolean is_DC_band, bad;
|
boolean is_DC_band, bad;
|
||||||
int ci, coefi, tbl;
|
int ci, coefi, tbl;
|
||||||
d_derived_tbl **pdtbl;
|
d_derived_tbl **pdtbl;
|
||||||
int *coef_bit_ptr;
|
int *coef_bit_ptr, *prev_coef_bit_ptr;
|
||||||
jpeg_component_info *compptr;
|
jpeg_component_info *compptr;
|
||||||
|
|
||||||
is_DC_band = (cinfo->Ss == 0);
|
is_DC_band = (cinfo->Ss == 0);
|
||||||
@@ -143,8 +124,15 @@ start_pass_phuff_decoder(j_decompress_ptr cinfo)
|
|||||||
for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
|
for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
|
||||||
int cindex = cinfo->cur_comp_info[ci]->component_index;
|
int cindex = cinfo->cur_comp_info[ci]->component_index;
|
||||||
coef_bit_ptr = &cinfo->coef_bits[cindex][0];
|
coef_bit_ptr = &cinfo->coef_bits[cindex][0];
|
||||||
|
prev_coef_bit_ptr = &cinfo->coef_bits[cindex + cinfo->num_components][0];
|
||||||
if (!is_DC_band && coef_bit_ptr[0] < 0) /* AC without prior DC scan */
|
if (!is_DC_band && coef_bit_ptr[0] < 0) /* AC without prior DC scan */
|
||||||
WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, 0);
|
WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, 0);
|
||||||
|
for (coefi = MIN(cinfo->Ss, 1); coefi <= MAX(cinfo->Se, 9); coefi++) {
|
||||||
|
if (cinfo->input_scan_number > 1)
|
||||||
|
prev_coef_bit_ptr[coefi] = coef_bit_ptr[coefi];
|
||||||
|
else
|
||||||
|
prev_coef_bit_ptr[coefi] = 0;
|
||||||
|
}
|
||||||
for (coefi = cinfo->Ss; coefi <= cinfo->Se; coefi++) {
|
for (coefi = cinfo->Ss; coefi <= cinfo->Se; coefi++) {
|
||||||
int expected = (coef_bit_ptr[coefi] < 0) ? 0 : coef_bit_ptr[coefi];
|
int expected = (coef_bit_ptr[coefi] < 0) ? 0 : coef_bit_ptr[coefi];
|
||||||
if (cinfo->Ah != expected)
|
if (cinfo->Ah != expected)
|
||||||
@@ -323,7 +311,7 @@ decode_mcu_DC_first(j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
|
|
||||||
/* Load up working state */
|
/* Load up working state */
|
||||||
BITREAD_LOAD_STATE(cinfo, entropy->bitstate);
|
BITREAD_LOAD_STATE(cinfo, entropy->bitstate);
|
||||||
ASSIGN_STATE(state, entropy->saved);
|
state = entropy->saved;
|
||||||
|
|
||||||
/* Outer loop handles each block in the MCU */
|
/* Outer loop handles each block in the MCU */
|
||||||
|
|
||||||
@@ -356,11 +344,12 @@ decode_mcu_DC_first(j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
|
|
||||||
/* Completed MCU, so update state */
|
/* Completed MCU, so update state */
|
||||||
BITREAD_SAVE_STATE(cinfo, entropy->bitstate);
|
BITREAD_SAVE_STATE(cinfo, entropy->bitstate);
|
||||||
ASSIGN_STATE(entropy->saved, state);
|
entropy->saved = state;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Account for restart interval (no-op if not using restarts) */
|
/* Account for restart interval (no-op if not using restarts) */
|
||||||
entropy->restarts_to_go--;
|
if (cinfo->restart_interval)
|
||||||
|
entropy->restarts_to_go--;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@@ -444,7 +433,8 @@ decode_mcu_AC_first(j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Account for restart interval (no-op if not using restarts) */
|
/* Account for restart interval (no-op if not using restarts) */
|
||||||
entropy->restarts_to_go--;
|
if (cinfo->restart_interval)
|
||||||
|
entropy->restarts_to_go--;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@@ -495,7 +485,8 @@ decode_mcu_DC_refine(j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
BITREAD_SAVE_STATE(cinfo, entropy->bitstate);
|
BITREAD_SAVE_STATE(cinfo, entropy->bitstate);
|
||||||
|
|
||||||
/* Account for restart interval (no-op if not using restarts) */
|
/* Account for restart interval (no-op if not using restarts) */
|
||||||
entropy->restarts_to_go--;
|
if (cinfo->restart_interval)
|
||||||
|
entropy->restarts_to_go--;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@@ -587,9 +578,9 @@ decode_mcu_AC_refine(j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
if (GET_BITS(1)) {
|
if (GET_BITS(1)) {
|
||||||
if ((*thiscoef & p1) == 0) { /* do nothing if already set it */
|
if ((*thiscoef & p1) == 0) { /* do nothing if already set it */
|
||||||
if (*thiscoef >= 0)
|
if (*thiscoef >= 0)
|
||||||
*thiscoef += p1;
|
*thiscoef += (JCOEF)p1;
|
||||||
else
|
else
|
||||||
*thiscoef += m1;
|
*thiscoef += (JCOEF)m1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -621,9 +612,9 @@ decode_mcu_AC_refine(j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
if (GET_BITS(1)) {
|
if (GET_BITS(1)) {
|
||||||
if ((*thiscoef & p1) == 0) { /* do nothing if already changed it */
|
if ((*thiscoef & p1) == 0) { /* do nothing if already changed it */
|
||||||
if (*thiscoef >= 0)
|
if (*thiscoef >= 0)
|
||||||
*thiscoef += p1;
|
*thiscoef += (JCOEF)p1;
|
||||||
else
|
else
|
||||||
*thiscoef += m1;
|
*thiscoef += (JCOEF)m1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -638,7 +629,8 @@ decode_mcu_AC_refine(j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Account for restart interval (no-op if not using restarts) */
|
/* Account for restart interval (no-op if not using restarts) */
|
||||||
entropy->restarts_to_go--;
|
if (cinfo->restart_interval)
|
||||||
|
entropy->restarts_to_go--;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
@@ -676,7 +668,7 @@ jinit_phuff_decoder(j_decompress_ptr cinfo)
|
|||||||
/* Create progression status table */
|
/* Create progression status table */
|
||||||
cinfo->coef_bits = (int (*)[DCTSIZE2])
|
cinfo->coef_bits = (int (*)[DCTSIZE2])
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
|
(*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
|
||||||
cinfo->num_components * DCTSIZE2 *
|
cinfo->num_components * 2 * DCTSIZE2 *
|
||||||
sizeof(int));
|
sizeof(int));
|
||||||
coef_bit_ptr = &cinfo->coef_bits[0][0];
|
coef_bit_ptr = &cinfo->coef_bits[0][0];
|
||||||
for (ci = 0; ci < cinfo->num_components; ci++)
|
for (ci = 0; ci < cinfo->num_components; ci++)
|
||||||
|
|||||||
+22
-16
@@ -8,7 +8,7 @@
|
|||||||
* Copyright (C) 2010, 2015-2016, D. R. Commander.
|
* Copyright (C) 2010, 2015-2016, D. R. Commander.
|
||||||
* Copyright (C) 2014, MIPS Technologies, Inc., California.
|
* Copyright (C) 2014, MIPS Technologies, Inc., California.
|
||||||
* Copyright (C) 2015, Google, Inc.
|
* Copyright (C) 2015, Google, Inc.
|
||||||
* Copyright (C) 2019, Arm Limited.
|
* Copyright (C) 2019-2020, Arm Limited.
|
||||||
* For conditions of distribution and use, see the accompanying README.ijg
|
* For conditions of distribution and use, see the accompanying README.ijg
|
||||||
* file.
|
* file.
|
||||||
*
|
*
|
||||||
@@ -177,7 +177,7 @@ int_upsample(j_decompress_ptr cinfo, jpeg_component_info *compptr,
|
|||||||
outptr = output_data[outrow];
|
outptr = output_data[outrow];
|
||||||
outend = outptr + cinfo->output_width;
|
outend = outptr + cinfo->output_width;
|
||||||
while (outptr < outend) {
|
while (outptr < outend) {
|
||||||
invalue = *inptr++; /* don't need GETJSAMPLE() here */
|
invalue = *inptr++;
|
||||||
for (h = h_expand; h > 0; h--) {
|
for (h = h_expand; h > 0; h--) {
|
||||||
*outptr++ = invalue;
|
*outptr++ = invalue;
|
||||||
}
|
}
|
||||||
@@ -213,7 +213,7 @@ h2v1_upsample(j_decompress_ptr cinfo, jpeg_component_info *compptr,
|
|||||||
outptr = output_data[inrow];
|
outptr = output_data[inrow];
|
||||||
outend = outptr + cinfo->output_width;
|
outend = outptr + cinfo->output_width;
|
||||||
while (outptr < outend) {
|
while (outptr < outend) {
|
||||||
invalue = *inptr++; /* don't need GETJSAMPLE() here */
|
invalue = *inptr++;
|
||||||
*outptr++ = invalue;
|
*outptr++ = invalue;
|
||||||
*outptr++ = invalue;
|
*outptr++ = invalue;
|
||||||
}
|
}
|
||||||
@@ -242,7 +242,7 @@ h2v2_upsample(j_decompress_ptr cinfo, jpeg_component_info *compptr,
|
|||||||
outptr = output_data[outrow];
|
outptr = output_data[outrow];
|
||||||
outend = outptr + cinfo->output_width;
|
outend = outptr + cinfo->output_width;
|
||||||
while (outptr < outend) {
|
while (outptr < outend) {
|
||||||
invalue = *inptr++; /* don't need GETJSAMPLE() here */
|
invalue = *inptr++;
|
||||||
*outptr++ = invalue;
|
*outptr++ = invalue;
|
||||||
*outptr++ = invalue;
|
*outptr++ = invalue;
|
||||||
}
|
}
|
||||||
@@ -283,20 +283,20 @@ h2v1_fancy_upsample(j_decompress_ptr cinfo, jpeg_component_info *compptr,
|
|||||||
inptr = input_data[inrow];
|
inptr = input_data[inrow];
|
||||||
outptr = output_data[inrow];
|
outptr = output_data[inrow];
|
||||||
/* Special case for first column */
|
/* Special case for first column */
|
||||||
invalue = GETJSAMPLE(*inptr++);
|
invalue = *inptr++;
|
||||||
*outptr++ = (JSAMPLE)invalue;
|
*outptr++ = (JSAMPLE)invalue;
|
||||||
*outptr++ = (JSAMPLE)((invalue * 3 + GETJSAMPLE(*inptr) + 2) >> 2);
|
*outptr++ = (JSAMPLE)((invalue * 3 + inptr[0] + 2) >> 2);
|
||||||
|
|
||||||
for (colctr = compptr->downsampled_width - 2; colctr > 0; colctr--) {
|
for (colctr = compptr->downsampled_width - 2; colctr > 0; colctr--) {
|
||||||
/* General case: 3/4 * nearer pixel + 1/4 * further pixel */
|
/* General case: 3/4 * nearer pixel + 1/4 * further pixel */
|
||||||
invalue = GETJSAMPLE(*inptr++) * 3;
|
invalue = (*inptr++) * 3;
|
||||||
*outptr++ = (JSAMPLE)((invalue + GETJSAMPLE(inptr[-2]) + 1) >> 2);
|
*outptr++ = (JSAMPLE)((invalue + inptr[-2] + 1) >> 2);
|
||||||
*outptr++ = (JSAMPLE)((invalue + GETJSAMPLE(*inptr) + 2) >> 2);
|
*outptr++ = (JSAMPLE)((invalue + inptr[0] + 2) >> 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Special case for last column */
|
/* Special case for last column */
|
||||||
invalue = GETJSAMPLE(*inptr);
|
invalue = *inptr;
|
||||||
*outptr++ = (JSAMPLE)((invalue * 3 + GETJSAMPLE(inptr[-1]) + 1) >> 2);
|
*outptr++ = (JSAMPLE)((invalue * 3 + inptr[-1] + 1) >> 2);
|
||||||
*outptr++ = (JSAMPLE)invalue;
|
*outptr++ = (JSAMPLE)invalue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -338,7 +338,7 @@ h1v2_fancy_upsample(j_decompress_ptr cinfo, jpeg_component_info *compptr,
|
|||||||
outptr = output_data[outrow++];
|
outptr = output_data[outrow++];
|
||||||
|
|
||||||
for (colctr = 0; colctr < compptr->downsampled_width; colctr++) {
|
for (colctr = 0; colctr < compptr->downsampled_width; colctr++) {
|
||||||
thiscolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++);
|
thiscolsum = (*inptr0++) * 3 + (*inptr1++);
|
||||||
*outptr++ = (JSAMPLE)((thiscolsum + bias) >> 2);
|
*outptr++ = (JSAMPLE)((thiscolsum + bias) >> 2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -381,8 +381,8 @@ h2v2_fancy_upsample(j_decompress_ptr cinfo, jpeg_component_info *compptr,
|
|||||||
outptr = output_data[outrow++];
|
outptr = output_data[outrow++];
|
||||||
|
|
||||||
/* Special case for first column */
|
/* Special case for first column */
|
||||||
thiscolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++);
|
thiscolsum = (*inptr0++) * 3 + (*inptr1++);
|
||||||
nextcolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++);
|
nextcolsum = (*inptr0++) * 3 + (*inptr1++);
|
||||||
*outptr++ = (JSAMPLE)((thiscolsum * 4 + 8) >> 4);
|
*outptr++ = (JSAMPLE)((thiscolsum * 4 + 8) >> 4);
|
||||||
*outptr++ = (JSAMPLE)((thiscolsum * 3 + nextcolsum + 7) >> 4);
|
*outptr++ = (JSAMPLE)((thiscolsum * 3 + nextcolsum + 7) >> 4);
|
||||||
lastcolsum = thiscolsum; thiscolsum = nextcolsum;
|
lastcolsum = thiscolsum; thiscolsum = nextcolsum;
|
||||||
@@ -390,7 +390,7 @@ h2v2_fancy_upsample(j_decompress_ptr cinfo, jpeg_component_info *compptr,
|
|||||||
for (colctr = compptr->downsampled_width - 2; colctr > 0; colctr--) {
|
for (colctr = compptr->downsampled_width - 2; colctr > 0; colctr--) {
|
||||||
/* General case: 3/4 * nearer pixel + 1/4 * further pixel in each */
|
/* General case: 3/4 * nearer pixel + 1/4 * further pixel in each */
|
||||||
/* dimension, thus 9/16, 3/16, 3/16, 1/16 overall */
|
/* dimension, thus 9/16, 3/16, 3/16, 1/16 overall */
|
||||||
nextcolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++);
|
nextcolsum = (*inptr0++) * 3 + (*inptr1++);
|
||||||
*outptr++ = (JSAMPLE)((thiscolsum * 3 + lastcolsum + 8) >> 4);
|
*outptr++ = (JSAMPLE)((thiscolsum * 3 + lastcolsum + 8) >> 4);
|
||||||
*outptr++ = (JSAMPLE)((thiscolsum * 3 + nextcolsum + 7) >> 4);
|
*outptr++ = (JSAMPLE)((thiscolsum * 3 + nextcolsum + 7) >> 4);
|
||||||
lastcolsum = thiscolsum; thiscolsum = nextcolsum;
|
lastcolsum = thiscolsum; thiscolsum = nextcolsum;
|
||||||
@@ -477,7 +477,13 @@ jinit_upsampler(j_decompress_ptr cinfo)
|
|||||||
} else if (h_in_group == h_out_group &&
|
} else if (h_in_group == h_out_group &&
|
||||||
v_in_group * 2 == v_out_group && do_fancy) {
|
v_in_group * 2 == v_out_group && do_fancy) {
|
||||||
/* Non-fancy upsampling is handled by the generic method */
|
/* Non-fancy upsampling is handled by the generic method */
|
||||||
upsample->methods[ci] = h1v2_fancy_upsample;
|
#if defined(__arm__) || defined(__aarch64__) || \
|
||||||
|
defined(_M_ARM) || defined(_M_ARM64)
|
||||||
|
if (jsimd_can_h1v2_fancy_upsample())
|
||||||
|
upsample->methods[ci] = jsimd_h1v2_fancy_upsample;
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
upsample->methods[ci] = h1v2_fancy_upsample;
|
||||||
upsample->pub.need_context_rows = TRUE;
|
upsample->pub.need_context_rows = TRUE;
|
||||||
} else if (h_in_group * 2 == h_out_group &&
|
} else if (h_in_group * 2 == h_out_group &&
|
||||||
v_in_group * 2 == v_out_group) {
|
v_in_group * 2 == v_out_group) {
|
||||||
|
|||||||
Vendored
+8
-8
@@ -3,8 +3,8 @@
|
|||||||
*
|
*
|
||||||
* This file was part of the Independent JPEG Group's software:
|
* This file was part of the Independent JPEG Group's software:
|
||||||
* Copyright (C) 1991-1998, Thomas G. Lane.
|
* Copyright (C) 1991-1998, Thomas G. Lane.
|
||||||
* It was modified by The libjpeg-turbo Project to include only code relevant
|
* libjpeg-turbo Modifications:
|
||||||
* to libjpeg-turbo.
|
* Copyright (C) 2022, D. R. Commander.
|
||||||
* For conditions of distribution and use, see the accompanying README.ijg
|
* For conditions of distribution and use, see the accompanying README.ijg
|
||||||
* file.
|
* file.
|
||||||
*
|
*
|
||||||
@@ -189,13 +189,13 @@ format_message(j_common_ptr cinfo, char *buffer)
|
|||||||
|
|
||||||
/* Format the message into the passed buffer */
|
/* Format the message into the passed buffer */
|
||||||
if (isstring)
|
if (isstring)
|
||||||
sprintf(buffer, msgtext, err->msg_parm.s);
|
snprintf(buffer, JMSG_LENGTH_MAX, msgtext, err->msg_parm.s);
|
||||||
else
|
else
|
||||||
sprintf(buffer, msgtext,
|
snprintf(buffer, JMSG_LENGTH_MAX, msgtext,
|
||||||
err->msg_parm.i[0], err->msg_parm.i[1],
|
err->msg_parm.i[0], err->msg_parm.i[1],
|
||||||
err->msg_parm.i[2], err->msg_parm.i[3],
|
err->msg_parm.i[2], err->msg_parm.i[3],
|
||||||
err->msg_parm.i[4], err->msg_parm.i[5],
|
err->msg_parm.i[4], err->msg_parm.i[5],
|
||||||
err->msg_parm.i[6], err->msg_parm.i[7]);
|
err->msg_parm.i[6], err->msg_parm.i[7]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Vendored
+17
-2
@@ -5,7 +5,7 @@
|
|||||||
* Copyright (C) 1994-1997, Thomas G. Lane.
|
* Copyright (C) 1994-1997, Thomas G. Lane.
|
||||||
* Modified 1997-2009 by Guido Vollbeding.
|
* Modified 1997-2009 by Guido Vollbeding.
|
||||||
* libjpeg-turbo Modifications:
|
* libjpeg-turbo Modifications:
|
||||||
* Copyright (C) 2014, 2017, D. R. Commander.
|
* Copyright (C) 2014, 2017, 2021-2022, D. R. Commander.
|
||||||
* For conditions of distribution and use, see the accompanying README.ijg
|
* For conditions of distribution and use, see the accompanying README.ijg
|
||||||
* file.
|
* file.
|
||||||
*
|
*
|
||||||
@@ -103,7 +103,7 @@ JMESSAGE(JERR_MISMATCHED_QUANT_TABLE,
|
|||||||
"Cannot transcode due to multiple use of quantization table %d")
|
"Cannot transcode due to multiple use of quantization table %d")
|
||||||
JMESSAGE(JERR_MISSING_DATA, "Scan script does not transmit all data")
|
JMESSAGE(JERR_MISSING_DATA, "Scan script does not transmit all data")
|
||||||
JMESSAGE(JERR_MODE_CHANGE, "Invalid color quantization mode change")
|
JMESSAGE(JERR_MODE_CHANGE, "Invalid color quantization mode change")
|
||||||
JMESSAGE(JERR_NOTIMPL, "Not implemented yet")
|
JMESSAGE(JERR_NOTIMPL, "Requested features are incompatible")
|
||||||
JMESSAGE(JERR_NOT_COMPILED, "Requested feature was omitted at compile time")
|
JMESSAGE(JERR_NOT_COMPILED, "Requested feature was omitted at compile time")
|
||||||
#if JPEG_LIB_VERSION >= 70
|
#if JPEG_LIB_VERSION >= 70
|
||||||
JMESSAGE(JERR_NO_ARITH_TABLE, "Arithmetic table 0x%02x was not defined")
|
JMESSAGE(JERR_NO_ARITH_TABLE, "Arithmetic table 0x%02x was not defined")
|
||||||
@@ -207,6 +207,10 @@ JMESSAGE(JWRN_ARITH_BAD_CODE, "Corrupt JPEG data: bad arithmetic code")
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
JMESSAGE(JWRN_BOGUS_ICC, "Corrupt JPEG data: bad ICC marker")
|
JMESSAGE(JWRN_BOGUS_ICC, "Corrupt JPEG data: bad ICC marker")
|
||||||
|
#if JPEG_LIB_VERSION < 70
|
||||||
|
JMESSAGE(JERR_BAD_DROP_SAMPLING,
|
||||||
|
"Component index %d: mismatching sampling ratio %d:%d, %d:%d, %c")
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef JMAKE_ENUM_LIST
|
#ifdef JMAKE_ENUM_LIST
|
||||||
|
|
||||||
@@ -252,9 +256,19 @@ JMESSAGE(JWRN_BOGUS_ICC, "Corrupt JPEG data: bad ICC marker")
|
|||||||
(cinfo)->err->msg_parm.i[2] = (p3), \
|
(cinfo)->err->msg_parm.i[2] = (p3), \
|
||||||
(cinfo)->err->msg_parm.i[3] = (p4), \
|
(cinfo)->err->msg_parm.i[3] = (p4), \
|
||||||
(*(cinfo)->err->error_exit) ((j_common_ptr)(cinfo)))
|
(*(cinfo)->err->error_exit) ((j_common_ptr)(cinfo)))
|
||||||
|
#define ERREXIT6(cinfo, code, p1, p2, p3, p4, p5, p6) \
|
||||||
|
((cinfo)->err->msg_code = (code), \
|
||||||
|
(cinfo)->err->msg_parm.i[0] = (p1), \
|
||||||
|
(cinfo)->err->msg_parm.i[1] = (p2), \
|
||||||
|
(cinfo)->err->msg_parm.i[2] = (p3), \
|
||||||
|
(cinfo)->err->msg_parm.i[3] = (p4), \
|
||||||
|
(cinfo)->err->msg_parm.i[4] = (p5), \
|
||||||
|
(cinfo)->err->msg_parm.i[5] = (p6), \
|
||||||
|
(*(cinfo)->err->error_exit) ((j_common_ptr)(cinfo)))
|
||||||
#define ERREXITS(cinfo, code, str) \
|
#define ERREXITS(cinfo, code, str) \
|
||||||
((cinfo)->err->msg_code = (code), \
|
((cinfo)->err->msg_code = (code), \
|
||||||
strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \
|
strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \
|
||||||
|
(cinfo)->err->msg_parm.s[JMSG_STR_PARM_MAX - 1] = '\0', \
|
||||||
(*(cinfo)->err->error_exit) ((j_common_ptr)(cinfo)))
|
(*(cinfo)->err->error_exit) ((j_common_ptr)(cinfo)))
|
||||||
|
|
||||||
#define MAKESTMT(stuff) do { stuff } while (0)
|
#define MAKESTMT(stuff) do { stuff } while (0)
|
||||||
@@ -311,6 +325,7 @@ JMESSAGE(JWRN_BOGUS_ICC, "Corrupt JPEG data: bad ICC marker")
|
|||||||
#define TRACEMSS(cinfo, lvl, code, str) \
|
#define TRACEMSS(cinfo, lvl, code, str) \
|
||||||
((cinfo)->err->msg_code = (code), \
|
((cinfo)->err->msg_code = (code), \
|
||||||
strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \
|
strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \
|
||||||
|
(cinfo)->err->msg_parm.s[JMSG_STR_PARM_MAX - 1] = '\0', \
|
||||||
(*(cinfo)->err->emit_message) ((j_common_ptr)(cinfo), (lvl)))
|
(*(cinfo)->err->emit_message) ((j_common_ptr)(cinfo), (lvl)))
|
||||||
|
|
||||||
#endif /* JERROR_H */
|
#endif /* JERROR_H */
|
||||||
|
|||||||
+4
-4
@@ -3,7 +3,7 @@
|
|||||||
*
|
*
|
||||||
* This file was part of the Independent JPEG Group's software:
|
* This file was part of the Independent JPEG Group's software:
|
||||||
* Copyright (C) 1991-1998, Thomas G. Lane.
|
* Copyright (C) 1991-1998, Thomas G. Lane.
|
||||||
* Modification developed 2002-2009 by Guido Vollbeding.
|
* Modification developed 2002-2018 by Guido Vollbeding.
|
||||||
* libjpeg-turbo Modifications:
|
* libjpeg-turbo Modifications:
|
||||||
* Copyright (C) 2015, 2020, D. R. Commander.
|
* Copyright (C) 2015, 2020, D. R. Commander.
|
||||||
* For conditions of distribution and use, see the accompanying README.ijg
|
* For conditions of distribution and use, see the accompanying README.ijg
|
||||||
@@ -417,7 +417,7 @@ jpeg_idct_islow(j_decompress_ptr cinfo, jpeg_component_info *compptr,
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Perform dequantization and inverse DCT on one block of coefficients,
|
* Perform dequantization and inverse DCT on one block of coefficients,
|
||||||
* producing a 7x7 output block.
|
* producing a reduced-size 7x7 output block.
|
||||||
*
|
*
|
||||||
* Optimized algorithm with 12 multiplications in the 1-D kernel.
|
* Optimized algorithm with 12 multiplications in the 1-D kernel.
|
||||||
* cK represents sqrt(2) * cos(K*pi/14).
|
* cK represents sqrt(2) * cos(K*pi/14).
|
||||||
@@ -1258,7 +1258,7 @@ jpeg_idct_10x10(j_decompress_ptr cinfo, jpeg_component_info *compptr,
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Perform dequantization and inverse DCT on one block of coefficients,
|
* Perform dequantization and inverse DCT on one block of coefficients,
|
||||||
* producing a 11x11 output block.
|
* producing an 11x11 output block.
|
||||||
*
|
*
|
||||||
* Optimized algorithm with 24 multiplications in the 1-D kernel.
|
* Optimized algorithm with 24 multiplications in the 1-D kernel.
|
||||||
* cK represents sqrt(2) * cos(K*pi/22).
|
* cK represents sqrt(2) * cos(K*pi/22).
|
||||||
@@ -2398,7 +2398,7 @@ jpeg_idct_16x16(j_decompress_ptr cinfo, jpeg_component_info *compptr,
|
|||||||
tmp0 = DEQUANTIZE(inptr[DCTSIZE * 0], quantptr[DCTSIZE * 0]);
|
tmp0 = DEQUANTIZE(inptr[DCTSIZE * 0], quantptr[DCTSIZE * 0]);
|
||||||
tmp0 = LEFT_SHIFT(tmp0, CONST_BITS);
|
tmp0 = LEFT_SHIFT(tmp0, CONST_BITS);
|
||||||
/* Add fudge factor here for final descale. */
|
/* Add fudge factor here for final descale. */
|
||||||
tmp0 += 1 << (CONST_BITS - PASS1_BITS - 1);
|
tmp0 += ONE << (CONST_BITS - PASS1_BITS - 1);
|
||||||
|
|
||||||
z1 = DEQUANTIZE(inptr[DCTSIZE * 4], quantptr[DCTSIZE * 4]);
|
z1 = DEQUANTIZE(inptr[DCTSIZE * 4], quantptr[DCTSIZE * 4]);
|
||||||
tmp1 = MULTIPLY(z1, FIX(1.306562965)); /* c4[16] = c2[8] */
|
tmp1 = MULTIPLY(z1, FIX(1.306562965)); /* c4[16] = c2[8] */
|
||||||
|
|||||||
+95
-50
@@ -3,8 +3,8 @@
|
|||||||
*
|
*
|
||||||
* This file was part of the Independent JPEG Group's software:
|
* This file was part of the Independent JPEG Group's software:
|
||||||
* Copyright (C) 1991-1994, Thomas G. Lane.
|
* Copyright (C) 1991-1994, Thomas G. Lane.
|
||||||
* It was modified by The libjpeg-turbo Project to include only code relevant
|
* libjpeg-turbo Modifications:
|
||||||
* to libjpeg-turbo.
|
* Copyright (C) 2022, D. R. Commander.
|
||||||
* For conditions of distribution and use, see the accompanying README.ijg
|
* For conditions of distribution and use, see the accompanying README.ijg
|
||||||
* file.
|
* file.
|
||||||
*
|
*
|
||||||
@@ -17,72 +17,117 @@
|
|||||||
* JPEG library. Most applications need only include jpeglib.h.
|
* JPEG library. Most applications need only include jpeglib.h.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifndef __JINCLUDE_H__
|
||||||
|
#define __JINCLUDE_H__
|
||||||
|
|
||||||
/* Include auto-config file to find out which system include files we need. */
|
/* Include auto-config file to find out which system include files we need. */
|
||||||
|
|
||||||
#include "jconfig.h" /* auto configuration options */
|
#include "jconfig.h" /* auto configuration options */
|
||||||
|
#include "jconfigint.h"
|
||||||
#define JCONFIG_INCLUDED /* so that jpeglib.h doesn't do it again */
|
#define JCONFIG_INCLUDED /* so that jpeglib.h doesn't do it again */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We need the NULL macro and size_t typedef.
|
|
||||||
* On an ANSI-conforming system it is sufficient to include <stddef.h>.
|
|
||||||
* Otherwise, we get them from <stdlib.h> or <stdio.h>; we may have to
|
|
||||||
* pull in <sys/types.h> as well.
|
|
||||||
* Note that the core JPEG library does not require <stdio.h>;
|
* Note that the core JPEG library does not require <stdio.h>;
|
||||||
* only the default error handler and data source/destination modules do.
|
* only the default error handler and data source/destination modules do.
|
||||||
* But we must pull it in because of the references to FILE in jpeglib.h.
|
* But we must pull it in because of the references to FILE in jpeglib.h.
|
||||||
* You can remove those references if you want to compile without <stdio.h>.
|
* You can remove those references if you want to compile without <stdio.h>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef HAVE_STDDEF_H
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_STDLIB_H
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef NEED_SYS_TYPES_H
|
|
||||||
#include <sys/types.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
/*
|
|
||||||
* We need memory copying and zeroing functions, plus strncpy().
|
|
||||||
* ANSI and System V implementations declare these in <string.h>.
|
|
||||||
* BSD doesn't have the mem() functions, but it does have bcopy()/bzero().
|
|
||||||
* Some systems may declare memset and memcpy in <memory.h>.
|
|
||||||
*
|
|
||||||
* NOTE: we assume the size parameters to these functions are of type size_t.
|
|
||||||
* Change the casts in these macros if not!
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef NEED_BSD_STRINGS
|
|
||||||
|
|
||||||
#include <strings.h>
|
|
||||||
#define MEMZERO(target, size) \
|
|
||||||
bzero((void *)(target), (size_t)(size))
|
|
||||||
#define MEMCOPY(dest, src, size) \
|
|
||||||
bcopy((const void *)(src), (void *)(dest), (size_t)(size))
|
|
||||||
|
|
||||||
#else /* not BSD, assume ANSI/SysV string lib */
|
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#define MEMZERO(target, size) \
|
|
||||||
memset((void *)(target), 0, (size_t)(size))
|
|
||||||
#define MEMCOPY(dest, src, size) \
|
|
||||||
memcpy((void *)(dest), (const void *)(src), (size_t)(size))
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The modules that use fread() and fwrite() always invoke them through
|
* These macros/inline functions facilitate using Microsoft's "safe string"
|
||||||
* these macros. On some systems you may need to twiddle the argument casts.
|
* functions with Visual Studio builds without the need to scatter #ifdefs
|
||||||
* CAUTION: argument order is different from underlying functions!
|
* throughout the code base.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define JFREAD(file, buf, sizeofbuf) \
|
|
||||||
((size_t)fread((void *)(buf), (size_t)1, (size_t)(sizeofbuf), (file)))
|
#ifndef NO_GETENV
|
||||||
#define JFWRITE(file, buf, sizeofbuf) \
|
|
||||||
((size_t)fwrite((const void *)(buf), (size_t)1, (size_t)(sizeofbuf), (file)))
|
#ifdef _MSC_VER
|
||||||
|
|
||||||
|
static INLINE int GETENV_S(char *buffer, size_t buffer_size, const char *name)
|
||||||
|
{
|
||||||
|
size_t required_size;
|
||||||
|
|
||||||
|
return (int)getenv_s(&required_size, buffer, buffer_size, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
#else /* _MSC_VER */
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
/* This provides a similar interface to the Microsoft/C11 getenv_s() function,
|
||||||
|
* but other than parameter validation, it has no advantages over getenv().
|
||||||
|
*/
|
||||||
|
|
||||||
|
static INLINE int GETENV_S(char *buffer, size_t buffer_size, const char *name)
|
||||||
|
{
|
||||||
|
char *env;
|
||||||
|
|
||||||
|
if (!buffer) {
|
||||||
|
if (buffer_size == 0)
|
||||||
|
return 0;
|
||||||
|
else
|
||||||
|
return (errno = EINVAL);
|
||||||
|
}
|
||||||
|
if (buffer_size == 0)
|
||||||
|
return (errno = EINVAL);
|
||||||
|
if (!name) {
|
||||||
|
*buffer = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
env = getenv(name);
|
||||||
|
if (!env)
|
||||||
|
{
|
||||||
|
*buffer = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strlen(env) + 1 > buffer_size) {
|
||||||
|
*buffer = 0;
|
||||||
|
return ERANGE;
|
||||||
|
}
|
||||||
|
|
||||||
|
strncpy(buffer, env, buffer_size);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* _MSC_VER */
|
||||||
|
|
||||||
|
#endif /* NO_GETENV */
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef NO_PUTENV
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
|
||||||
|
#define PUTENV_S(name, value) _putenv_s(name, value)
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/* This provides a similar interface to the Microsoft _putenv_s() function, but
|
||||||
|
* other than parameter validation, it has no advantages over setenv().
|
||||||
|
*/
|
||||||
|
|
||||||
|
static INLINE int PUTENV_S(const char *name, const char *value)
|
||||||
|
{
|
||||||
|
if (!name || !value)
|
||||||
|
return (errno = EINVAL);
|
||||||
|
|
||||||
|
setenv(name, value, 1);
|
||||||
|
|
||||||
|
return errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* _WIN32 */
|
||||||
|
|
||||||
|
#endif /* NO_PUTENV */
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* JINCLUDE_H */
|
||||||
|
|||||||
Vendored
+9
-11
@@ -4,7 +4,7 @@
|
|||||||
* This file was part of the Independent JPEG Group's software:
|
* This file was part of the Independent JPEG Group's software:
|
||||||
* Copyright (C) 1991-1997, Thomas G. Lane.
|
* Copyright (C) 1991-1997, Thomas G. Lane.
|
||||||
* libjpeg-turbo Modifications:
|
* libjpeg-turbo Modifications:
|
||||||
* Copyright (C) 2016, D. R. Commander.
|
* Copyright (C) 2016, 2021-2022, D. R. Commander.
|
||||||
* For conditions of distribution and use, see the accompanying README.ijg
|
* For conditions of distribution and use, see the accompanying README.ijg
|
||||||
* file.
|
* file.
|
||||||
*
|
*
|
||||||
@@ -37,12 +37,6 @@
|
|||||||
#endif
|
#endif
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
|
||||||
#ifndef NO_GETENV
|
|
||||||
#ifndef HAVE_STDLIB_H /* <stdlib.h> should declare getenv() */
|
|
||||||
extern char *getenv(const char *name);
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
LOCAL(size_t)
|
LOCAL(size_t)
|
||||||
round_up_pow2(size_t a, size_t b)
|
round_up_pow2(size_t a, size_t b)
|
||||||
@@ -1032,7 +1026,7 @@ free_pool(j_common_ptr cinfo, int pool_id)
|
|||||||
large_pool_ptr next_lhdr_ptr = lhdr_ptr->next;
|
large_pool_ptr next_lhdr_ptr = lhdr_ptr->next;
|
||||||
space_freed = lhdr_ptr->bytes_used +
|
space_freed = lhdr_ptr->bytes_used +
|
||||||
lhdr_ptr->bytes_left +
|
lhdr_ptr->bytes_left +
|
||||||
sizeof(large_pool_hdr);
|
sizeof(large_pool_hdr) + ALIGN_SIZE - 1;
|
||||||
jpeg_free_large(cinfo, (void *)lhdr_ptr, space_freed);
|
jpeg_free_large(cinfo, (void *)lhdr_ptr, space_freed);
|
||||||
mem->total_space_allocated -= space_freed;
|
mem->total_space_allocated -= space_freed;
|
||||||
lhdr_ptr = next_lhdr_ptr;
|
lhdr_ptr = next_lhdr_ptr;
|
||||||
@@ -1045,7 +1039,7 @@ free_pool(j_common_ptr cinfo, int pool_id)
|
|||||||
while (shdr_ptr != NULL) {
|
while (shdr_ptr != NULL) {
|
||||||
small_pool_ptr next_shdr_ptr = shdr_ptr->next;
|
small_pool_ptr next_shdr_ptr = shdr_ptr->next;
|
||||||
space_freed = shdr_ptr->bytes_used + shdr_ptr->bytes_left +
|
space_freed = shdr_ptr->bytes_used + shdr_ptr->bytes_left +
|
||||||
sizeof(small_pool_hdr);
|
sizeof(small_pool_hdr) + ALIGN_SIZE - 1;
|
||||||
jpeg_free_small(cinfo, (void *)shdr_ptr, space_freed);
|
jpeg_free_small(cinfo, (void *)shdr_ptr, space_freed);
|
||||||
mem->total_space_allocated -= space_freed;
|
mem->total_space_allocated -= space_freed;
|
||||||
shdr_ptr = next_shdr_ptr;
|
shdr_ptr = next_shdr_ptr;
|
||||||
@@ -1162,12 +1156,16 @@ jinit_memory_mgr(j_common_ptr cinfo)
|
|||||||
*/
|
*/
|
||||||
#ifndef NO_GETENV
|
#ifndef NO_GETENV
|
||||||
{
|
{
|
||||||
char *memenv;
|
char memenv[30] = { 0 };
|
||||||
|
|
||||||
if ((memenv = getenv("JPEGMEM")) != NULL) {
|
if (!GETENV_S(memenv, 30, "JPEGMEM") && strlen(memenv) > 0) {
|
||||||
char ch = 'x';
|
char ch = 'x';
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
if (sscanf_s(memenv, "%ld%c", &max_to_use, &ch, 1) > 0) {
|
||||||
|
#else
|
||||||
if (sscanf(memenv, "%ld%c", &max_to_use, &ch) > 0) {
|
if (sscanf(memenv, "%ld%c", &max_to_use, &ch) > 0) {
|
||||||
|
#endif
|
||||||
if (ch == 'm' || ch == 'M')
|
if (ch == 'm' || ch == 'M')
|
||||||
max_to_use *= 1000L;
|
max_to_use *= 1000L;
|
||||||
mem->pub.max_memory_to_use = max_to_use * 1000L;
|
mem->pub.max_memory_to_use = max_to_use * 1000L;
|
||||||
|
|||||||
-5
@@ -22,11 +22,6 @@
|
|||||||
#include "jpeglib.h"
|
#include "jpeglib.h"
|
||||||
#include "jmemsys.h" /* import the system-dependent declarations */
|
#include "jmemsys.h" /* import the system-dependent declarations */
|
||||||
|
|
||||||
#ifndef HAVE_STDLIB_H /* <stdlib.h> should declare malloc(),free() */
|
|
||||||
extern void *malloc(size_t size);
|
|
||||||
extern void free(void *ptr);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Memory allocation and freeing are controlled by the regular library
|
* Memory allocation and freeing are controlled by the regular library
|
||||||
|
|||||||
-39
@@ -43,25 +43,11 @@
|
|||||||
|
|
||||||
#if BITS_IN_JSAMPLE == 8
|
#if BITS_IN_JSAMPLE == 8
|
||||||
/* JSAMPLE should be the smallest type that will hold the values 0..255.
|
/* JSAMPLE should be the smallest type that will hold the values 0..255.
|
||||||
* You can use a signed char by having GETJSAMPLE mask it with 0xFF.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef HAVE_UNSIGNED_CHAR
|
|
||||||
|
|
||||||
typedef unsigned char JSAMPLE;
|
typedef unsigned char JSAMPLE;
|
||||||
#define GETJSAMPLE(value) ((int)(value))
|
#define GETJSAMPLE(value) ((int)(value))
|
||||||
|
|
||||||
#else /* not HAVE_UNSIGNED_CHAR */
|
|
||||||
|
|
||||||
typedef char JSAMPLE;
|
|
||||||
#ifdef __CHAR_UNSIGNED__
|
|
||||||
#define GETJSAMPLE(value) ((int)(value))
|
|
||||||
#else
|
|
||||||
#define GETJSAMPLE(value) ((int)(value) & 0xFF)
|
|
||||||
#endif /* __CHAR_UNSIGNED__ */
|
|
||||||
|
|
||||||
#endif /* HAVE_UNSIGNED_CHAR */
|
|
||||||
|
|
||||||
#define MAXJSAMPLE 255
|
#define MAXJSAMPLE 255
|
||||||
#define CENTERJSAMPLE 128
|
#define CENTERJSAMPLE 128
|
||||||
|
|
||||||
@@ -97,22 +83,9 @@ typedef short JCOEF;
|
|||||||
* managers, this is also the data type passed to fread/fwrite.
|
* managers, this is also the data type passed to fread/fwrite.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef HAVE_UNSIGNED_CHAR
|
|
||||||
|
|
||||||
typedef unsigned char JOCTET;
|
typedef unsigned char JOCTET;
|
||||||
#define GETJOCTET(value) (value)
|
#define GETJOCTET(value) (value)
|
||||||
|
|
||||||
#else /* not HAVE_UNSIGNED_CHAR */
|
|
||||||
|
|
||||||
typedef char JOCTET;
|
|
||||||
#ifdef __CHAR_UNSIGNED__
|
|
||||||
#define GETJOCTET(value) (value)
|
|
||||||
#else
|
|
||||||
#define GETJOCTET(value) ((value) & 0xFF)
|
|
||||||
#endif /* __CHAR_UNSIGNED__ */
|
|
||||||
|
|
||||||
#endif /* HAVE_UNSIGNED_CHAR */
|
|
||||||
|
|
||||||
|
|
||||||
/* These typedefs are used for various table entries and so forth.
|
/* These typedefs are used for various table entries and so forth.
|
||||||
* They must be at least as wide as specified; but making them too big
|
* They must be at least as wide as specified; but making them too big
|
||||||
@@ -123,23 +96,11 @@ typedef char JOCTET;
|
|||||||
|
|
||||||
/* UINT8 must hold at least the values 0..255. */
|
/* UINT8 must hold at least the values 0..255. */
|
||||||
|
|
||||||
#ifdef HAVE_UNSIGNED_CHAR
|
|
||||||
typedef unsigned char UINT8;
|
typedef unsigned char UINT8;
|
||||||
#else /* not HAVE_UNSIGNED_CHAR */
|
|
||||||
#ifdef __CHAR_UNSIGNED__
|
|
||||||
typedef char UINT8;
|
|
||||||
#else /* not __CHAR_UNSIGNED__ */
|
|
||||||
typedef short UINT8;
|
|
||||||
#endif /* __CHAR_UNSIGNED__ */
|
|
||||||
#endif /* HAVE_UNSIGNED_CHAR */
|
|
||||||
|
|
||||||
/* UINT16 must hold at least the values 0..65535. */
|
/* UINT16 must hold at least the values 0..65535. */
|
||||||
|
|
||||||
#ifdef HAVE_UNSIGNED_SHORT
|
|
||||||
typedef unsigned short UINT16;
|
typedef unsigned short UINT16;
|
||||||
#else /* not HAVE_UNSIGNED_SHORT */
|
|
||||||
typedef unsigned int UINT16;
|
|
||||||
#endif /* HAVE_UNSIGNED_SHORT */
|
|
||||||
|
|
||||||
/* INT16 must hold at least the values -32768..32767. */
|
/* INT16 must hold at least the values -32768..32767. */
|
||||||
|
|
||||||
|
|||||||
Vendored
+17
-10
@@ -5,8 +5,9 @@
|
|||||||
* Copyright (C) 1991-1997, Thomas G. Lane.
|
* Copyright (C) 1991-1997, Thomas G. Lane.
|
||||||
* Modified 1997-2009 by Guido Vollbeding.
|
* Modified 1997-2009 by Guido Vollbeding.
|
||||||
* libjpeg-turbo Modifications:
|
* libjpeg-turbo Modifications:
|
||||||
* Copyright (C) 2015-2016, D. R. Commander.
|
* Copyright (C) 2015-2016, 2019, 2021, D. R. Commander.
|
||||||
* Copyright (C) 2015, Google, Inc.
|
* Copyright (C) 2015, Google, Inc.
|
||||||
|
* Copyright (C) 2021, Alex Richardson.
|
||||||
* For conditions of distribution and use, see the accompanying README.ijg
|
* For conditions of distribution and use, see the accompanying README.ijg
|
||||||
* file.
|
* file.
|
||||||
*
|
*
|
||||||
@@ -47,6 +48,18 @@ typedef enum { /* Operating modes for buffer controllers */
|
|||||||
/* JLONG must hold at least signed 32-bit values. */
|
/* JLONG must hold at least signed 32-bit values. */
|
||||||
typedef long JLONG;
|
typedef long JLONG;
|
||||||
|
|
||||||
|
/* JUINTPTR must hold pointer values. */
|
||||||
|
#ifdef __UINTPTR_TYPE__
|
||||||
|
/*
|
||||||
|
* __UINTPTR_TYPE__ is GNU-specific and available in GCC 4.6+ and Clang 3.0+.
|
||||||
|
* Fortunately, that is sufficient to support the few architectures for which
|
||||||
|
* sizeof(void *) != sizeof(size_t). The only other options would require C99
|
||||||
|
* or Clang-specific builtins.
|
||||||
|
*/
|
||||||
|
typedef __UINTPTR_TYPE__ JUINTPTR;
|
||||||
|
#else
|
||||||
|
typedef size_t JUINTPTR;
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Left shift macro that handles a negative operand without causing any
|
* Left shift macro that handles a negative operand without causing any
|
||||||
@@ -158,6 +171,9 @@ struct jpeg_decomp_master {
|
|||||||
JDIMENSION first_MCU_col[MAX_COMPONENTS];
|
JDIMENSION first_MCU_col[MAX_COMPONENTS];
|
||||||
JDIMENSION last_MCU_col[MAX_COMPONENTS];
|
JDIMENSION last_MCU_col[MAX_COMPONENTS];
|
||||||
boolean jinit_upsampler_no_alloc;
|
boolean jinit_upsampler_no_alloc;
|
||||||
|
|
||||||
|
/* Last iMCU row that was successfully decoded */
|
||||||
|
JDIMENSION last_good_iMCU_row;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Input control module */
|
/* Input control module */
|
||||||
@@ -357,12 +373,3 @@ extern const int jpeg_natural_order[]; /* zigzag coef order to natural order */
|
|||||||
|
|
||||||
/* Arithmetic coding probability estimation tables in jaricom.c */
|
/* Arithmetic coding probability estimation tables in jaricom.c */
|
||||||
extern const JLONG jpeg_aritab[];
|
extern const JLONG jpeg_aritab[];
|
||||||
|
|
||||||
/* Suppress undefined-structure complaints if necessary. */
|
|
||||||
|
|
||||||
#ifdef INCOMPLETE_TYPES_BROKEN
|
|
||||||
#ifndef AM_MEMORY_MANAGER /* only jmemmgr.c defines these */
|
|
||||||
struct jvirt_sarray_control { long dummy; };
|
|
||||||
struct jvirt_barray_control { long dummy; };
|
|
||||||
#endif
|
|
||||||
#endif /* INCOMPLETE_TYPES_BROKEN */
|
|
||||||
|
|||||||
Vendored
+12
-15
@@ -479,7 +479,7 @@ color_quantize(j_decompress_ptr cinfo, JSAMPARRAY input_buf,
|
|||||||
for (col = width; col > 0; col--) {
|
for (col = width; col > 0; col--) {
|
||||||
pixcode = 0;
|
pixcode = 0;
|
||||||
for (ci = 0; ci < nc; ci++) {
|
for (ci = 0; ci < nc; ci++) {
|
||||||
pixcode += GETJSAMPLE(colorindex[ci][GETJSAMPLE(*ptrin++)]);
|
pixcode += colorindex[ci][*ptrin++];
|
||||||
}
|
}
|
||||||
*ptrout++ = (JSAMPLE)pixcode;
|
*ptrout++ = (JSAMPLE)pixcode;
|
||||||
}
|
}
|
||||||
@@ -506,9 +506,9 @@ color_quantize3(j_decompress_ptr cinfo, JSAMPARRAY input_buf,
|
|||||||
ptrin = input_buf[row];
|
ptrin = input_buf[row];
|
||||||
ptrout = output_buf[row];
|
ptrout = output_buf[row];
|
||||||
for (col = width; col > 0; col--) {
|
for (col = width; col > 0; col--) {
|
||||||
pixcode = GETJSAMPLE(colorindex0[GETJSAMPLE(*ptrin++)]);
|
pixcode = colorindex0[*ptrin++];
|
||||||
pixcode += GETJSAMPLE(colorindex1[GETJSAMPLE(*ptrin++)]);
|
pixcode += colorindex1[*ptrin++];
|
||||||
pixcode += GETJSAMPLE(colorindex2[GETJSAMPLE(*ptrin++)]);
|
pixcode += colorindex2[*ptrin++];
|
||||||
*ptrout++ = (JSAMPLE)pixcode;
|
*ptrout++ = (JSAMPLE)pixcode;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -552,7 +552,7 @@ quantize_ord_dither(j_decompress_ptr cinfo, JSAMPARRAY input_buf,
|
|||||||
* required amount of padding.
|
* required amount of padding.
|
||||||
*/
|
*/
|
||||||
*output_ptr +=
|
*output_ptr +=
|
||||||
colorindex_ci[GETJSAMPLE(*input_ptr) + dither[col_index]];
|
colorindex_ci[*input_ptr + dither[col_index]];
|
||||||
input_ptr += nc;
|
input_ptr += nc;
|
||||||
output_ptr++;
|
output_ptr++;
|
||||||
col_index = (col_index + 1) & ODITHER_MASK;
|
col_index = (col_index + 1) & ODITHER_MASK;
|
||||||
@@ -595,12 +595,9 @@ quantize3_ord_dither(j_decompress_ptr cinfo, JSAMPARRAY input_buf,
|
|||||||
col_index = 0;
|
col_index = 0;
|
||||||
|
|
||||||
for (col = width; col > 0; col--) {
|
for (col = width; col > 0; col--) {
|
||||||
pixcode =
|
pixcode = colorindex0[(*input_ptr++) + dither0[col_index]];
|
||||||
GETJSAMPLE(colorindex0[GETJSAMPLE(*input_ptr++) + dither0[col_index]]);
|
pixcode += colorindex1[(*input_ptr++) + dither1[col_index]];
|
||||||
pixcode +=
|
pixcode += colorindex2[(*input_ptr++) + dither2[col_index]];
|
||||||
GETJSAMPLE(colorindex1[GETJSAMPLE(*input_ptr++) + dither1[col_index]]);
|
|
||||||
pixcode +=
|
|
||||||
GETJSAMPLE(colorindex2[GETJSAMPLE(*input_ptr++) + dither2[col_index]]);
|
|
||||||
*output_ptr++ = (JSAMPLE)pixcode;
|
*output_ptr++ = (JSAMPLE)pixcode;
|
||||||
col_index = (col_index + 1) & ODITHER_MASK;
|
col_index = (col_index + 1) & ODITHER_MASK;
|
||||||
}
|
}
|
||||||
@@ -677,15 +674,15 @@ quantize_fs_dither(j_decompress_ptr cinfo, JSAMPARRAY input_buf,
|
|||||||
* The maximum error is +- MAXJSAMPLE; this sets the required size
|
* The maximum error is +- MAXJSAMPLE; this sets the required size
|
||||||
* of the range_limit array.
|
* of the range_limit array.
|
||||||
*/
|
*/
|
||||||
cur += GETJSAMPLE(*input_ptr);
|
cur += *input_ptr;
|
||||||
cur = GETJSAMPLE(range_limit[cur]);
|
cur = range_limit[cur];
|
||||||
/* Select output value, accumulate into output code for this pixel */
|
/* Select output value, accumulate into output code for this pixel */
|
||||||
pixcode = GETJSAMPLE(colorindex_ci[cur]);
|
pixcode = colorindex_ci[cur];
|
||||||
*output_ptr += (JSAMPLE)pixcode;
|
*output_ptr += (JSAMPLE)pixcode;
|
||||||
/* Compute actual representation error at this pixel */
|
/* Compute actual representation error at this pixel */
|
||||||
/* Note: we can do this even though we don't have the final */
|
/* Note: we can do this even though we don't have the final */
|
||||||
/* pixel code, because the colormap is orthogonal. */
|
/* pixel code, because the colormap is orthogonal. */
|
||||||
cur -= GETJSAMPLE(colormap_ci[pixcode]);
|
cur -= colormap_ci[pixcode];
|
||||||
/* Compute error fractions to be propagated to adjacent pixels.
|
/* Compute error fractions to be propagated to adjacent pixels.
|
||||||
* Add these into the running sums, and simultaneously shift the
|
* Add these into the running sums, and simultaneously shift the
|
||||||
* next-line error sums left by 1 column.
|
* next-line error sums left by 1 column.
|
||||||
|
|||||||
Vendored
+23
-23
@@ -215,9 +215,9 @@ prescan_quantize(j_decompress_ptr cinfo, JSAMPARRAY input_buf,
|
|||||||
ptr = input_buf[row];
|
ptr = input_buf[row];
|
||||||
for (col = width; col > 0; col--) {
|
for (col = width; col > 0; col--) {
|
||||||
/* get pixel value and index into the histogram */
|
/* get pixel value and index into the histogram */
|
||||||
histp = &histogram[GETJSAMPLE(ptr[0]) >> C0_SHIFT]
|
histp = &histogram[ptr[0] >> C0_SHIFT]
|
||||||
[GETJSAMPLE(ptr[1]) >> C1_SHIFT]
|
[ptr[1] >> C1_SHIFT]
|
||||||
[GETJSAMPLE(ptr[2]) >> C2_SHIFT];
|
[ptr[2] >> C2_SHIFT];
|
||||||
/* increment, check for overflow and undo increment if so. */
|
/* increment, check for overflow and undo increment if so. */
|
||||||
if (++(*histp) <= 0)
|
if (++(*histp) <= 0)
|
||||||
(*histp)--;
|
(*histp)--;
|
||||||
@@ -665,7 +665,7 @@ find_nearby_colors(j_decompress_ptr cinfo, int minc0, int minc1, int minc2,
|
|||||||
|
|
||||||
for (i = 0; i < numcolors; i++) {
|
for (i = 0; i < numcolors; i++) {
|
||||||
/* We compute the squared-c0-distance term, then add in the other two. */
|
/* We compute the squared-c0-distance term, then add in the other two. */
|
||||||
x = GETJSAMPLE(cinfo->colormap[0][i]);
|
x = cinfo->colormap[0][i];
|
||||||
if (x < minc0) {
|
if (x < minc0) {
|
||||||
tdist = (x - minc0) * C0_SCALE;
|
tdist = (x - minc0) * C0_SCALE;
|
||||||
min_dist = tdist * tdist;
|
min_dist = tdist * tdist;
|
||||||
@@ -688,7 +688,7 @@ find_nearby_colors(j_decompress_ptr cinfo, int minc0, int minc1, int minc2,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
x = GETJSAMPLE(cinfo->colormap[1][i]);
|
x = cinfo->colormap[1][i];
|
||||||
if (x < minc1) {
|
if (x < minc1) {
|
||||||
tdist = (x - minc1) * C1_SCALE;
|
tdist = (x - minc1) * C1_SCALE;
|
||||||
min_dist += tdist * tdist;
|
min_dist += tdist * tdist;
|
||||||
@@ -710,7 +710,7 @@ find_nearby_colors(j_decompress_ptr cinfo, int minc0, int minc1, int minc2,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
x = GETJSAMPLE(cinfo->colormap[2][i]);
|
x = cinfo->colormap[2][i];
|
||||||
if (x < minc2) {
|
if (x < minc2) {
|
||||||
tdist = (x - minc2) * C2_SCALE;
|
tdist = (x - minc2) * C2_SCALE;
|
||||||
min_dist += tdist * tdist;
|
min_dist += tdist * tdist;
|
||||||
@@ -788,13 +788,13 @@ find_best_colors(j_decompress_ptr cinfo, int minc0, int minc1, int minc2,
|
|||||||
#define STEP_C2 ((1 << C2_SHIFT) * C2_SCALE)
|
#define STEP_C2 ((1 << C2_SHIFT) * C2_SCALE)
|
||||||
|
|
||||||
for (i = 0; i < numcolors; i++) {
|
for (i = 0; i < numcolors; i++) {
|
||||||
icolor = GETJSAMPLE(colorlist[i]);
|
icolor = colorlist[i];
|
||||||
/* Compute (square of) distance from minc0/c1/c2 to this color */
|
/* Compute (square of) distance from minc0/c1/c2 to this color */
|
||||||
inc0 = (minc0 - GETJSAMPLE(cinfo->colormap[0][icolor])) * C0_SCALE;
|
inc0 = (minc0 - cinfo->colormap[0][icolor]) * C0_SCALE;
|
||||||
dist0 = inc0 * inc0;
|
dist0 = inc0 * inc0;
|
||||||
inc1 = (minc1 - GETJSAMPLE(cinfo->colormap[1][icolor])) * C1_SCALE;
|
inc1 = (minc1 - cinfo->colormap[1][icolor]) * C1_SCALE;
|
||||||
dist0 += inc1 * inc1;
|
dist0 += inc1 * inc1;
|
||||||
inc2 = (minc2 - GETJSAMPLE(cinfo->colormap[2][icolor])) * C2_SCALE;
|
inc2 = (minc2 - cinfo->colormap[2][icolor]) * C2_SCALE;
|
||||||
dist0 += inc2 * inc2;
|
dist0 += inc2 * inc2;
|
||||||
/* Form the initial difference increments */
|
/* Form the initial difference increments */
|
||||||
inc0 = inc0 * (2 * STEP_C0) + STEP_C0 * STEP_C0;
|
inc0 = inc0 * (2 * STEP_C0) + STEP_C0 * STEP_C0;
|
||||||
@@ -879,7 +879,7 @@ fill_inverse_cmap(j_decompress_ptr cinfo, int c0, int c1, int c2)
|
|||||||
for (ic1 = 0; ic1 < BOX_C1_ELEMS; ic1++) {
|
for (ic1 = 0; ic1 < BOX_C1_ELEMS; ic1++) {
|
||||||
cachep = &histogram[c0 + ic0][c1 + ic1][c2];
|
cachep = &histogram[c0 + ic0][c1 + ic1][c2];
|
||||||
for (ic2 = 0; ic2 < BOX_C2_ELEMS; ic2++) {
|
for (ic2 = 0; ic2 < BOX_C2_ELEMS; ic2++) {
|
||||||
*cachep++ = (histcell)(GETJSAMPLE(*cptr++) + 1);
|
*cachep++ = (histcell)((*cptr++) + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -909,9 +909,9 @@ pass2_no_dither(j_decompress_ptr cinfo, JSAMPARRAY input_buf,
|
|||||||
outptr = output_buf[row];
|
outptr = output_buf[row];
|
||||||
for (col = width; col > 0; col--) {
|
for (col = width; col > 0; col--) {
|
||||||
/* get pixel value and index into the cache */
|
/* get pixel value and index into the cache */
|
||||||
c0 = GETJSAMPLE(*inptr++) >> C0_SHIFT;
|
c0 = (*inptr++) >> C0_SHIFT;
|
||||||
c1 = GETJSAMPLE(*inptr++) >> C1_SHIFT;
|
c1 = (*inptr++) >> C1_SHIFT;
|
||||||
c2 = GETJSAMPLE(*inptr++) >> C2_SHIFT;
|
c2 = (*inptr++) >> C2_SHIFT;
|
||||||
cachep = &histogram[c0][c1][c2];
|
cachep = &histogram[c0][c1][c2];
|
||||||
/* If we have not seen this color before, find nearest colormap entry */
|
/* If we have not seen this color before, find nearest colormap entry */
|
||||||
/* and update the cache */
|
/* and update the cache */
|
||||||
@@ -996,12 +996,12 @@ pass2_fs_dither(j_decompress_ptr cinfo, JSAMPARRAY input_buf,
|
|||||||
* The maximum error is +- MAXJSAMPLE (or less with error limiting);
|
* The maximum error is +- MAXJSAMPLE (or less with error limiting);
|
||||||
* this sets the required size of the range_limit array.
|
* this sets the required size of the range_limit array.
|
||||||
*/
|
*/
|
||||||
cur0 += GETJSAMPLE(inptr[0]);
|
cur0 += inptr[0];
|
||||||
cur1 += GETJSAMPLE(inptr[1]);
|
cur1 += inptr[1];
|
||||||
cur2 += GETJSAMPLE(inptr[2]);
|
cur2 += inptr[2];
|
||||||
cur0 = GETJSAMPLE(range_limit[cur0]);
|
cur0 = range_limit[cur0];
|
||||||
cur1 = GETJSAMPLE(range_limit[cur1]);
|
cur1 = range_limit[cur1];
|
||||||
cur2 = GETJSAMPLE(range_limit[cur2]);
|
cur2 = range_limit[cur2];
|
||||||
/* Index into the cache with adjusted pixel value */
|
/* Index into the cache with adjusted pixel value */
|
||||||
cachep =
|
cachep =
|
||||||
&histogram[cur0 >> C0_SHIFT][cur1 >> C1_SHIFT][cur2 >> C2_SHIFT];
|
&histogram[cur0 >> C0_SHIFT][cur1 >> C1_SHIFT][cur2 >> C2_SHIFT];
|
||||||
@@ -1015,9 +1015,9 @@ pass2_fs_dither(j_decompress_ptr cinfo, JSAMPARRAY input_buf,
|
|||||||
register int pixcode = *cachep - 1;
|
register int pixcode = *cachep - 1;
|
||||||
*outptr = (JSAMPLE)pixcode;
|
*outptr = (JSAMPLE)pixcode;
|
||||||
/* Compute representation error for this pixel */
|
/* Compute representation error for this pixel */
|
||||||
cur0 -= GETJSAMPLE(colormap0[pixcode]);
|
cur0 -= colormap0[pixcode];
|
||||||
cur1 -= GETJSAMPLE(colormap1[pixcode]);
|
cur1 -= colormap1[pixcode];
|
||||||
cur2 -= GETJSAMPLE(colormap2[pixcode]);
|
cur2 -= colormap2[pixcode];
|
||||||
}
|
}
|
||||||
/* Compute error fractions to be propagated to adjacent pixels.
|
/* Compute error fractions to be propagated to adjacent pixels.
|
||||||
* Add these into the running sums, and simultaneously shift the
|
* Add these into the running sums, and simultaneously shift the
|
||||||
|
|||||||
Vendored
+6
@@ -4,6 +4,7 @@
|
|||||||
* Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB
|
* Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB
|
||||||
* Copyright (C) 2011, 2014, D. R. Commander.
|
* Copyright (C) 2011, 2014, D. R. Commander.
|
||||||
* Copyright (C) 2015-2016, 2018, Matthieu Darbois.
|
* Copyright (C) 2015-2016, 2018, Matthieu Darbois.
|
||||||
|
* Copyright (C) 2020, Arm Limited.
|
||||||
*
|
*
|
||||||
* Based on the x86 SIMD extension for IJG JPEG library,
|
* Based on the x86 SIMD extension for IJG JPEG library,
|
||||||
* Copyright (C) 1999-2006, MIYASAKA Masaru.
|
* Copyright (C) 1999-2006, MIYASAKA Masaru.
|
||||||
@@ -75,6 +76,7 @@ EXTERN(void) jsimd_int_upsample(j_decompress_ptr cinfo,
|
|||||||
|
|
||||||
EXTERN(int) jsimd_can_h2v2_fancy_upsample(void);
|
EXTERN(int) jsimd_can_h2v2_fancy_upsample(void);
|
||||||
EXTERN(int) jsimd_can_h2v1_fancy_upsample(void);
|
EXTERN(int) jsimd_can_h2v1_fancy_upsample(void);
|
||||||
|
EXTERN(int) jsimd_can_h1v2_fancy_upsample(void);
|
||||||
|
|
||||||
EXTERN(void) jsimd_h2v2_fancy_upsample(j_decompress_ptr cinfo,
|
EXTERN(void) jsimd_h2v2_fancy_upsample(j_decompress_ptr cinfo,
|
||||||
jpeg_component_info *compptr,
|
jpeg_component_info *compptr,
|
||||||
@@ -84,6 +86,10 @@ EXTERN(void) jsimd_h2v1_fancy_upsample(j_decompress_ptr cinfo,
|
|||||||
jpeg_component_info *compptr,
|
jpeg_component_info *compptr,
|
||||||
JSAMPARRAY input_data,
|
JSAMPARRAY input_data,
|
||||||
JSAMPARRAY *output_data_ptr);
|
JSAMPARRAY *output_data_ptr);
|
||||||
|
EXTERN(void) jsimd_h1v2_fancy_upsample(j_decompress_ptr cinfo,
|
||||||
|
jpeg_component_info *compptr,
|
||||||
|
JSAMPARRAY input_data,
|
||||||
|
JSAMPARRAY *output_data_ptr);
|
||||||
|
|
||||||
EXTERN(int) jsimd_can_h2v2_merged_upsample(void);
|
EXTERN(int) jsimd_can_h2v2_merged_upsample(void);
|
||||||
EXTERN(int) jsimd_can_h2v1_merged_upsample(void);
|
EXTERN(int) jsimd_can_h2v1_merged_upsample(void);
|
||||||
|
|||||||
+13
@@ -4,6 +4,7 @@
|
|||||||
* Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB
|
* Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB
|
||||||
* Copyright (C) 2009-2011, 2014, D. R. Commander.
|
* Copyright (C) 2009-2011, 2014, D. R. Commander.
|
||||||
* Copyright (C) 2015-2016, 2018, Matthieu Darbois.
|
* Copyright (C) 2015-2016, 2018, Matthieu Darbois.
|
||||||
|
* Copyright (C) 2020, Arm Limited.
|
||||||
*
|
*
|
||||||
* Based on the x86 SIMD extension for IJG JPEG library,
|
* Based on the x86 SIMD extension for IJG JPEG library,
|
||||||
* Copyright (C) 1999-2006, MIYASAKA Masaru.
|
* Copyright (C) 1999-2006, MIYASAKA Masaru.
|
||||||
@@ -169,6 +170,12 @@ jsimd_can_h2v1_fancy_upsample(void)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GLOBAL(int)
|
||||||
|
jsimd_can_h1v2_fancy_upsample(void)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
GLOBAL(void)
|
GLOBAL(void)
|
||||||
jsimd_h2v2_fancy_upsample(j_decompress_ptr cinfo, jpeg_component_info *compptr,
|
jsimd_h2v2_fancy_upsample(j_decompress_ptr cinfo, jpeg_component_info *compptr,
|
||||||
JSAMPARRAY input_data, JSAMPARRAY *output_data_ptr)
|
JSAMPARRAY input_data, JSAMPARRAY *output_data_ptr)
|
||||||
@@ -181,6 +188,12 @@ jsimd_h2v1_fancy_upsample(j_decompress_ptr cinfo, jpeg_component_info *compptr,
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GLOBAL(void)
|
||||||
|
jsimd_h1v2_fancy_upsample(j_decompress_ptr cinfo, jpeg_component_info *compptr,
|
||||||
|
JSAMPARRAY input_data, JSAMPARRAY *output_data_ptr)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
GLOBAL(int)
|
GLOBAL(int)
|
||||||
jsimd_can_h2v2_merged_upsample(void)
|
jsimd_can_h2v2_merged_upsample(void)
|
||||||
{
|
{
|
||||||
|
|||||||
+5
-4
@@ -4,7 +4,7 @@
|
|||||||
* This file was part of the Independent JPEG Group's software:
|
* This file was part of the Independent JPEG Group's software:
|
||||||
* Copyright (C) 1991-1998, Thomas G. Lane.
|
* Copyright (C) 1991-1998, Thomas G. Lane.
|
||||||
* libjpeg-turbo Modifications:
|
* libjpeg-turbo Modifications:
|
||||||
* Copyright (C) 2013, D. R. Commander.
|
* Copyright (C) 2013, 2022, D. R. Commander.
|
||||||
* For conditions of distribution and use, see the accompanying README.ijg
|
* For conditions of distribution and use, see the accompanying README.ijg
|
||||||
* file.
|
* file.
|
||||||
*
|
*
|
||||||
@@ -29,7 +29,7 @@ add_huff_table(j_common_ptr cinfo, JHUFF_TBL **htblptr, const UINT8 *bits,
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
/* Copy the number-of-symbols-of-each-code-length counts */
|
/* Copy the number-of-symbols-of-each-code-length counts */
|
||||||
MEMCOPY((*htblptr)->bits, bits, sizeof((*htblptr)->bits));
|
memcpy((*htblptr)->bits, bits, sizeof((*htblptr)->bits));
|
||||||
|
|
||||||
/* Validate the counts. We do this here mainly so we can copy the right
|
/* Validate the counts. We do this here mainly so we can copy the right
|
||||||
* number of symbols from the val[] array, without risking marching off
|
* number of symbols from the val[] array, without risking marching off
|
||||||
@@ -41,8 +41,9 @@ add_huff_table(j_common_ptr cinfo, JHUFF_TBL **htblptr, const UINT8 *bits,
|
|||||||
if (nsymbols < 1 || nsymbols > 256)
|
if (nsymbols < 1 || nsymbols > 256)
|
||||||
ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
|
ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
|
||||||
|
|
||||||
MEMCOPY((*htblptr)->huffval, val, nsymbols * sizeof(UINT8));
|
memcpy((*htblptr)->huffval, val, nsymbols * sizeof(UINT8));
|
||||||
MEMZERO(&((*htblptr)->huffval[nsymbols]), (256 - nsymbols) * sizeof(UINT8));
|
memset(&((*htblptr)->huffval[nsymbols]), 0,
|
||||||
|
(256 - nsymbols) * sizeof(UINT8));
|
||||||
|
|
||||||
/* Initialize sent_table FALSE so table will be written to JPEG file. */
|
/* Initialize sent_table FALSE so table will be written to JPEG file. */
|
||||||
(*htblptr)->sent_table = FALSE;
|
(*htblptr)->sent_table = FALSE;
|
||||||
|
|||||||
Vendored
+5
-5
@@ -3,8 +3,8 @@
|
|||||||
*
|
*
|
||||||
* This file was part of the Independent JPEG Group's software:
|
* This file was part of the Independent JPEG Group's software:
|
||||||
* Copyright (C) 1991-1996, Thomas G. Lane.
|
* Copyright (C) 1991-1996, Thomas G. Lane.
|
||||||
* It was modified by The libjpeg-turbo Project to include only code
|
* libjpeg-turbo Modifications:
|
||||||
* relevant to libjpeg-turbo.
|
* Copyright (C) 2022, D. R. Commander.
|
||||||
* For conditions of distribution and use, see the accompanying README.ijg
|
* For conditions of distribution and use, see the accompanying README.ijg
|
||||||
* file.
|
* file.
|
||||||
*
|
*
|
||||||
@@ -110,7 +110,7 @@ jcopy_sample_rows(JSAMPARRAY input_array, int source_row,
|
|||||||
for (row = num_rows; row > 0; row--) {
|
for (row = num_rows; row > 0; row--) {
|
||||||
inptr = *input_array++;
|
inptr = *input_array++;
|
||||||
outptr = *output_array++;
|
outptr = *output_array++;
|
||||||
MEMCOPY(outptr, inptr, count);
|
memcpy(outptr, inptr, count);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -120,7 +120,7 @@ jcopy_block_row(JBLOCKROW input_row, JBLOCKROW output_row,
|
|||||||
JDIMENSION num_blocks)
|
JDIMENSION num_blocks)
|
||||||
/* Copy a row of coefficient blocks from one place to another. */
|
/* Copy a row of coefficient blocks from one place to another. */
|
||||||
{
|
{
|
||||||
MEMCOPY(output_row, input_row, num_blocks * (DCTSIZE2 * sizeof(JCOEF)));
|
memcpy(output_row, input_row, num_blocks * (DCTSIZE2 * sizeof(JCOEF)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -129,5 +129,5 @@ jzero_far(void *target, size_t bytestozero)
|
|||||||
/* Zero out a chunk of memory. */
|
/* Zero out a chunk of memory. */
|
||||||
/* This might be sample-array data, block-array data, or alloc_large data. */
|
/* This might be sample-array data, block-array data, or alloc_large data. */
|
||||||
{
|
{
|
||||||
MEMZERO(target, bytestozero);
|
memset(target, 0, bytestozero);
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-6
@@ -2,9 +2,9 @@
|
|||||||
* jversion.h
|
* jversion.h
|
||||||
*
|
*
|
||||||
* This file was part of the Independent JPEG Group's software:
|
* This file was part of the Independent JPEG Group's software:
|
||||||
* Copyright (C) 1991-2012, Thomas G. Lane, Guido Vollbeding.
|
* Copyright (C) 1991-2020, Thomas G. Lane, Guido Vollbeding.
|
||||||
* libjpeg-turbo Modifications:
|
* libjpeg-turbo Modifications:
|
||||||
* Copyright (C) 2010, 2012-2020, D. R. Commander.
|
* Copyright (C) 2010, 2012-2021, D. R. Commander.
|
||||||
* For conditions of distribution and use, see the accompanying README.ijg
|
* For conditions of distribution and use, see the accompanying README.ijg
|
||||||
* file.
|
* file.
|
||||||
*
|
*
|
||||||
@@ -37,9 +37,9 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#define JCOPYRIGHT \
|
#define JCOPYRIGHT \
|
||||||
"Copyright (C) 2009-2020 D. R. Commander\n" \
|
"Copyright (C) 2009-2021 D. R. Commander\n" \
|
||||||
"Copyright (C) 2015, 2020 Google, Inc.\n" \
|
"Copyright (C) 2015, 2020 Google, Inc.\n" \
|
||||||
"Copyright (C) 2019 Arm Limited\n" \
|
"Copyright (C) 2019-2020 Arm Limited\n" \
|
||||||
"Copyright (C) 2015-2016, 2018 Matthieu Darbois\n" \
|
"Copyright (C) 2015-2016, 2018 Matthieu Darbois\n" \
|
||||||
"Copyright (C) 2011-2016 Siarhei Siamashka\n" \
|
"Copyright (C) 2011-2016 Siarhei Siamashka\n" \
|
||||||
"Copyright (C) 2015 Intel Corporation\n" \
|
"Copyright (C) 2015 Intel Corporation\n" \
|
||||||
@@ -48,7 +48,7 @@
|
|||||||
"Copyright (C) 2009, 2012 Pierre Ossman for Cendio AB\n" \
|
"Copyright (C) 2009, 2012 Pierre Ossman for Cendio AB\n" \
|
||||||
"Copyright (C) 2009-2011 Nokia Corporation and/or its subsidiary(-ies)\n" \
|
"Copyright (C) 2009-2011 Nokia Corporation and/or its subsidiary(-ies)\n" \
|
||||||
"Copyright (C) 1999-2006 MIYASAKA Masaru\n" \
|
"Copyright (C) 1999-2006 MIYASAKA Masaru\n" \
|
||||||
"Copyright (C) 1991-2017 Thomas G. Lane, Guido Vollbeding"
|
"Copyright (C) 1991-2020 Thomas G. Lane, Guido Vollbeding"
|
||||||
|
|
||||||
#define JCOPYRIGHT_SHORT \
|
#define JCOPYRIGHT_SHORT \
|
||||||
"Copyright (C) 1991-2020 The libjpeg-turbo Project and many others"
|
"Copyright (C) 1991-2021 The libjpeg-turbo Project and many others"
|
||||||
|
|||||||
+54
@@ -0,0 +1,54 @@
|
|||||||
|
/*
|
||||||
|
* jversion.h
|
||||||
|
*
|
||||||
|
* This file was part of the Independent JPEG Group's software:
|
||||||
|
* Copyright (C) 1991-2020, Thomas G. Lane, Guido Vollbeding.
|
||||||
|
* libjpeg-turbo Modifications:
|
||||||
|
* Copyright (C) 2010, 2012-2022, D. R. Commander.
|
||||||
|
* For conditions of distribution and use, see the accompanying README.ijg
|
||||||
|
* file.
|
||||||
|
*
|
||||||
|
* This file contains software version identification.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#if JPEG_LIB_VERSION >= 80
|
||||||
|
|
||||||
|
#define JVERSION "8d 15-Jan-2012"
|
||||||
|
|
||||||
|
#elif JPEG_LIB_VERSION >= 70
|
||||||
|
|
||||||
|
#define JVERSION "7 27-Jun-2009"
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define JVERSION "6b 27-Mar-1998"
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NOTE: It is our convention to place the authors in the following order:
|
||||||
|
* - libjpeg-turbo authors (2009-) in descending order of the date of their
|
||||||
|
* most recent contribution to the project, then in ascending order of the
|
||||||
|
* date of their first contribution to the project, then in alphabetical
|
||||||
|
* order
|
||||||
|
* - Upstream authors in descending order of the date of the first inclusion of
|
||||||
|
* their code
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define JCOPYRIGHT \
|
||||||
|
"Copyright (C) 2009-2022 D. R. Commander\n" \
|
||||||
|
"Copyright (C) 2015, 2020 Google, Inc.\n" \
|
||||||
|
"Copyright (C) 2019-2020 Arm Limited\n" \
|
||||||
|
"Copyright (C) 2015-2016, 2018 Matthieu Darbois\n" \
|
||||||
|
"Copyright (C) 2011-2016 Siarhei Siamashka\n" \
|
||||||
|
"Copyright (C) 2015 Intel Corporation\n" \
|
||||||
|
"Copyright (C) 2013-2014 Linaro Limited\n" \
|
||||||
|
"Copyright (C) 2013-2014 MIPS Technologies, Inc.\n" \
|
||||||
|
"Copyright (C) 2009, 2012 Pierre Ossman for Cendio AB\n" \
|
||||||
|
"Copyright (C) 2009-2011 Nokia Corporation and/or its subsidiary(-ies)\n" \
|
||||||
|
"Copyright (C) 1999-2006 MIYASAKA Masaru\n" \
|
||||||
|
"Copyright (C) 1991-2020 Thomas G. Lane, Guido Vollbeding"
|
||||||
|
|
||||||
|
#define JCOPYRIGHT_SHORT \
|
||||||
|
"Copyright (C) @COPYRIGHT_YEAR@ The libjpeg-turbo Project and many others"
|
||||||
+545
@@ -0,0 +1,545 @@
|
|||||||
|
macro(simd_fail message)
|
||||||
|
message(STATUS "libjpeg-turbo(SIMD): ${message}. Performance will suffer.")
|
||||||
|
set(WITH_SIMD 0 PARENT_SCOPE)
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
macro(boolean_number var)
|
||||||
|
if(${var})
|
||||||
|
set(${var} 1 ${ARGN})
|
||||||
|
else()
|
||||||
|
set(${var} 0 ${ARGN})
|
||||||
|
endif()
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# x86[-64] (NASM)
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
if(CPU_TYPE STREQUAL "x86_64" OR CPU_TYPE STREQUAL "i386")
|
||||||
|
|
||||||
|
set(CMAKE_ASM_NASM_FLAGS_DEBUG_INIT "-g")
|
||||||
|
set(CMAKE_ASM_NASM_FLAGS_RELWITHDEBINFO_INIT "-g")
|
||||||
|
|
||||||
|
# Allow the location of the NASM executable to be specified using the ASM_NASM
|
||||||
|
# environment variable. This should happen automatically, but unfortunately
|
||||||
|
# enable_language(ASM_NASM) doesn't parse the ASM_NASM environment variable
|
||||||
|
# until after CMAKE_ASM_NASM_COMPILER has been populated with the results of
|
||||||
|
# searching for NASM or Yasm in the PATH.
|
||||||
|
if(NOT DEFINED CMAKE_ASM_NASM_COMPILER AND DEFINED ENV{ASM_NASM})
|
||||||
|
set(CMAKE_ASM_NASM_COMPILER $ENV{ASM_NASM})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(CPU_TYPE STREQUAL "x86_64")
|
||||||
|
if(CYGWIN)
|
||||||
|
set(CMAKE_ASM_NASM_OBJECT_FORMAT win64)
|
||||||
|
endif()
|
||||||
|
if(CMAKE_C_COMPILER_ABI MATCHES "ELF X32")
|
||||||
|
set(CMAKE_ASM_NASM_OBJECT_FORMAT elfx32)
|
||||||
|
endif()
|
||||||
|
elseif(CPU_TYPE STREQUAL "i386")
|
||||||
|
if(BORLAND)
|
||||||
|
set(CMAKE_ASM_NASM_OBJECT_FORMAT obj)
|
||||||
|
elseif(CYGWIN)
|
||||||
|
set(CMAKE_ASM_NASM_OBJECT_FORMAT win32)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
include(CheckLanguage)
|
||||||
|
check_language(ASM_NASM)
|
||||||
|
if(NOT CMAKE_ASM_NASM_COMPILER)
|
||||||
|
simd_fail("SIMD extensions disabled: could not find NASM compiler")
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
enable_language(ASM_NASM)
|
||||||
|
message(STATUS "CMAKE_ASM_NASM_COMPILER = ${CMAKE_ASM_NASM_COMPILER}")
|
||||||
|
|
||||||
|
if(CMAKE_ASM_NASM_OBJECT_FORMAT MATCHES "^macho")
|
||||||
|
set(CMAKE_ASM_NASM_FLAGS "${CMAKE_ASM_NASM_FLAGS} -DMACHO")
|
||||||
|
elseif(CMAKE_ASM_NASM_OBJECT_FORMAT MATCHES "^elf")
|
||||||
|
set(CMAKE_ASM_NASM_FLAGS "${CMAKE_ASM_NASM_FLAGS} -DELF")
|
||||||
|
set(CMAKE_ASM_NASM_DEBUG_FORMAT "dwarf2")
|
||||||
|
endif()
|
||||||
|
if(CPU_TYPE STREQUAL "x86_64")
|
||||||
|
if(WIN32 OR CYGWIN)
|
||||||
|
set(CMAKE_ASM_NASM_FLAGS "${CMAKE_ASM_NASM_FLAGS} -DWIN64")
|
||||||
|
endif()
|
||||||
|
set(CMAKE_ASM_NASM_FLAGS "${CMAKE_ASM_NASM_FLAGS} -D__x86_64__")
|
||||||
|
elseif(CPU_TYPE STREQUAL "i386")
|
||||||
|
if(BORLAND)
|
||||||
|
set(CMAKE_ASM_NASM_FLAGS "${CMAKE_ASM_NASM_FLAGS} -DOBJ32")
|
||||||
|
elseif(WIN32 OR CYGWIN)
|
||||||
|
set(CMAKE_ASM_NASM_FLAGS "${CMAKE_ASM_NASM_FLAGS} -DWIN32")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT CMAKE_ASM_NASM_OBJECT_FORMAT)
|
||||||
|
simd_fail("SIMD extensions disabled: could not determine NASM object format")
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
get_filename_component(CMAKE_ASM_NASM_COMPILER_TYPE
|
||||||
|
"${CMAKE_ASM_NASM_COMPILER}" NAME_WE)
|
||||||
|
if(CMAKE_ASM_NASM_COMPILER_TYPE MATCHES "yasm")
|
||||||
|
foreach(var CMAKE_ASM_NASM_FLAGS_DEBUG CMAKE_ASM_NASM_FLAGS_RELWITHDEBINFO)
|
||||||
|
if(${var} STREQUAL "-g")
|
||||||
|
if(CMAKE_ASM_NASM_DEBUG_FORMAT)
|
||||||
|
set_property(CACHE ${var} PROPERTY VALUE "-g ${CMAKE_ASM_NASM_DEBUG_FORMAT}")
|
||||||
|
else()
|
||||||
|
set_property(CACHE ${var} PROPERTY VALUE "")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT WIN32 AND (CMAKE_POSITION_INDEPENDENT_CODE OR ENABLE_SHARED))
|
||||||
|
set(CMAKE_ASM_NASM_FLAGS "${CMAKE_ASM_NASM_FLAGS} -DPIC")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_UC)
|
||||||
|
set(EFFECTIVE_ASM_NASM_FLAGS "${CMAKE_ASM_NASM_FLAGS} ${CMAKE_ASM_NASM_FLAGS_${CMAKE_BUILD_TYPE_UC}}")
|
||||||
|
|
||||||
|
set(CMAKE_ASM_NASM_FLAGS "${CMAKE_ASM_NASM_FLAGS} -I\"${CMAKE_CURRENT_SOURCE_DIR}/nasm/\" -I\"${CMAKE_CURRENT_SOURCE_DIR}/${CPU_TYPE}/\"")
|
||||||
|
|
||||||
|
set(GREP grep)
|
||||||
|
if(CMAKE_SYSTEM_NAME STREQUAL "SunOS")
|
||||||
|
set(GREP ggrep)
|
||||||
|
endif()
|
||||||
|
add_custom_target(jsimdcfg COMMAND
|
||||||
|
${CMAKE_C_COMPILER} -E -I${CMAKE_BINARY_DIR} -I${CMAKE_CURRENT_BINARY_DIR}
|
||||||
|
-I${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/nasm/jsimdcfg.inc.h |
|
||||||
|
${GREP} -E '^[\;%]|^\ %' | sed 's%_cpp_protection_%%' |
|
||||||
|
sed 's@% define@%define@g' >${CMAKE_CURRENT_SOURCE_DIR}/nasm/jsimdcfg.inc)
|
||||||
|
set_target_properties(jsimdcfg PROPERTIES FOLDER "3rdparty")
|
||||||
|
|
||||||
|
if(CPU_TYPE STREQUAL "x86_64")
|
||||||
|
set(SIMD_SOURCES x86_64/jsimdcpu.asm x86_64/jfdctflt-sse.asm
|
||||||
|
x86_64/jccolor-sse2.asm x86_64/jcgray-sse2.asm x86_64/jchuff-sse2.asm
|
||||||
|
x86_64/jcphuff-sse2.asm x86_64/jcsample-sse2.asm x86_64/jdcolor-sse2.asm
|
||||||
|
x86_64/jdmerge-sse2.asm x86_64/jdsample-sse2.asm x86_64/jfdctfst-sse2.asm
|
||||||
|
x86_64/jfdctint-sse2.asm x86_64/jidctflt-sse2.asm x86_64/jidctfst-sse2.asm
|
||||||
|
x86_64/jidctint-sse2.asm x86_64/jidctred-sse2.asm x86_64/jquantf-sse2.asm
|
||||||
|
x86_64/jquanti-sse2.asm
|
||||||
|
x86_64/jccolor-avx2.asm x86_64/jcgray-avx2.asm x86_64/jcsample-avx2.asm
|
||||||
|
x86_64/jdcolor-avx2.asm x86_64/jdmerge-avx2.asm x86_64/jdsample-avx2.asm
|
||||||
|
x86_64/jfdctint-avx2.asm x86_64/jidctint-avx2.asm x86_64/jquanti-avx2.asm)
|
||||||
|
else()
|
||||||
|
set(SIMD_SOURCES i386/jsimdcpu.asm i386/jfdctflt-3dn.asm
|
||||||
|
i386/jidctflt-3dn.asm i386/jquant-3dn.asm
|
||||||
|
i386/jccolor-mmx.asm i386/jcgray-mmx.asm i386/jcsample-mmx.asm
|
||||||
|
i386/jdcolor-mmx.asm i386/jdmerge-mmx.asm i386/jdsample-mmx.asm
|
||||||
|
i386/jfdctfst-mmx.asm i386/jfdctint-mmx.asm i386/jidctfst-mmx.asm
|
||||||
|
i386/jidctint-mmx.asm i386/jidctred-mmx.asm i386/jquant-mmx.asm
|
||||||
|
i386/jfdctflt-sse.asm i386/jidctflt-sse.asm i386/jquant-sse.asm
|
||||||
|
i386/jccolor-sse2.asm i386/jcgray-sse2.asm i386/jchuff-sse2.asm
|
||||||
|
i386/jcphuff-sse2.asm i386/jcsample-sse2.asm i386/jdcolor-sse2.asm
|
||||||
|
i386/jdmerge-sse2.asm i386/jdsample-sse2.asm i386/jfdctfst-sse2.asm
|
||||||
|
i386/jfdctint-sse2.asm i386/jidctflt-sse2.asm i386/jidctfst-sse2.asm
|
||||||
|
i386/jidctint-sse2.asm i386/jidctred-sse2.asm i386/jquantf-sse2.asm
|
||||||
|
i386/jquanti-sse2.asm
|
||||||
|
i386/jccolor-avx2.asm i386/jcgray-avx2.asm i386/jcsample-avx2.asm
|
||||||
|
i386/jdcolor-avx2.asm i386/jdmerge-avx2.asm i386/jdsample-avx2.asm
|
||||||
|
i386/jfdctint-avx2.asm i386/jidctint-avx2.asm i386/jquanti-avx2.asm)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(MSVC_IDE)
|
||||||
|
set(OBJDIR "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}")
|
||||||
|
string(REGEX REPLACE " " ";" CMAKE_ASM_NASM_FLAGS "${CMAKE_ASM_NASM_FLAGS}")
|
||||||
|
elseif(XCODE)
|
||||||
|
set(OBJDIR "${CMAKE_CURRENT_BINARY_DIR}")
|
||||||
|
string(REGEX REPLACE " " ";" CMAKE_ASM_NASM_FLAGS "${CMAKE_ASM_NASM_FLAGS}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
file(GLOB INC_FILES nasm/*.inc)
|
||||||
|
|
||||||
|
foreach(file ${SIMD_SOURCES})
|
||||||
|
set(OBJECT_DEPENDS "")
|
||||||
|
if(${file} MATCHES jccolor)
|
||||||
|
string(REGEX REPLACE "jccolor" "jccolext" DEPFILE ${file})
|
||||||
|
set(OBJECT_DEPENDS ${OBJECT_DEPENDS}
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/${DEPFILE})
|
||||||
|
endif()
|
||||||
|
if(${file} MATCHES jcgray)
|
||||||
|
string(REGEX REPLACE "jcgray" "jcgryext" DEPFILE ${file})
|
||||||
|
set(OBJECT_DEPENDS ${OBJECT_DEPENDS}
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/${DEPFILE})
|
||||||
|
endif()
|
||||||
|
if(${file} MATCHES jdcolor)
|
||||||
|
string(REGEX REPLACE "jdcolor" "jdcolext" DEPFILE ${file})
|
||||||
|
set(OBJECT_DEPENDS ${OBJECT_DEPENDS}
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/${DEPFILE})
|
||||||
|
endif()
|
||||||
|
if(${file} MATCHES jdmerge)
|
||||||
|
string(REGEX REPLACE "jdmerge" "jdmrgext" DEPFILE ${file})
|
||||||
|
set(OBJECT_DEPENDS ${OBJECT_DEPENDS}
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/${DEPFILE})
|
||||||
|
endif()
|
||||||
|
set(OBJECT_DEPENDS ${OBJECT_DEPENDS} ${INC_FILES})
|
||||||
|
if(MSVC_IDE OR XCODE)
|
||||||
|
# The CMake Visual Studio generators do not work properly with the ASM_NASM
|
||||||
|
# language, so we have to go rogue here and use a custom command like we
|
||||||
|
# did in prior versions of libjpeg-turbo. (This is why we can't have nice
|
||||||
|
# things.)
|
||||||
|
string(REGEX REPLACE "${CPU_TYPE}/" "" filename ${file})
|
||||||
|
set(SIMD_OBJ ${OBJDIR}/${filename}${CMAKE_C_OUTPUT_EXTENSION})
|
||||||
|
add_custom_command(OUTPUT ${SIMD_OBJ} DEPENDS ${file} ${OBJECT_DEPENDS}
|
||||||
|
COMMAND ${CMAKE_ASM_NASM_COMPILER} -f${CMAKE_ASM_NASM_OBJECT_FORMAT}
|
||||||
|
${CMAKE_ASM_NASM_FLAGS} ${CMAKE_CURRENT_SOURCE_DIR}/${file}
|
||||||
|
-o${SIMD_OBJ})
|
||||||
|
set(SIMD_OBJS ${SIMD_OBJS} ${SIMD_OBJ})
|
||||||
|
else()
|
||||||
|
set_source_files_properties(${file} PROPERTIES OBJECT_DEPENDS
|
||||||
|
"${OBJECT_DEPENDS}")
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
if(MSVC_IDE OR XCODE)
|
||||||
|
set(SIMD_OBJS ${SIMD_OBJS} PARENT_SCOPE)
|
||||||
|
add_library(jsimd OBJECT ${CPU_TYPE}/jsimd.c)
|
||||||
|
add_custom_target(jsimd-objs DEPENDS ${SIMD_OBJS})
|
||||||
|
add_dependencies(jsimd jsimd-objs)
|
||||||
|
set_target_properties(jsimd PROPERTIES FOLDER "3rdparty")
|
||||||
|
set_target_properties(jsimd-objs PROPERTIES FOLDER "3rdparty")
|
||||||
|
else()
|
||||||
|
add_library(jsimd OBJECT ${SIMD_SOURCES} ${CPU_TYPE}/jsimd.c)
|
||||||
|
endif()
|
||||||
|
if(NOT WIN32 AND (CMAKE_POSITION_INDEPENDENT_CODE OR ENABLE_SHARED))
|
||||||
|
set_target_properties(jsimd PROPERTIES POSITION_INDEPENDENT_CODE 1)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# Arm (Intrinsics or GAS)
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
elseif(CPU_TYPE STREQUAL "arm64" OR CPU_TYPE STREQUAL "arm")
|
||||||
|
|
||||||
|
# If Neon instructions are not explicitly enabled at compile time (e.g. using
|
||||||
|
# -mfpu=neon) with an AArch32 Linux or Android build, then the AArch32 SIMD
|
||||||
|
# dispatcher will parse /proc/cpuinfo to determine whether the Neon SIMD
|
||||||
|
# extensions can be enabled at run time. In order to support all AArch32 CPUs
|
||||||
|
# using the same code base, i.e. to support run-time FPU and Neon
|
||||||
|
# auto-detection, it is necessary to compile the scalar C source code using
|
||||||
|
# -mfloat-abi=soft (which is usually the default) but compile the intrinsics
|
||||||
|
# implementation of the Neon SIMD extensions using -mfloat-abi=softfp. The
|
||||||
|
# following test determines whether -mfloat-abi=softfp should be explicitly
|
||||||
|
# added to the compile flags for the intrinsics implementation of the Neon SIMD
|
||||||
|
# extensions.
|
||||||
|
|
||||||
|
if(BITS EQUAL 32)
|
||||||
|
check_c_source_compiles("
|
||||||
|
#if defined(__ARM_NEON__) || (!defined(__linux__) && !defined(ANDROID) && !defined(__ANDROID__))
|
||||||
|
#error \"Neon run-time auto-detection will not be used\"
|
||||||
|
#endif
|
||||||
|
#if __ARM_PCS_VFP == 1
|
||||||
|
#error \"float ABI = hard\"
|
||||||
|
#endif
|
||||||
|
#if __SOFTFP__ != 1
|
||||||
|
#error \"float ABI = softfp\"
|
||||||
|
#endif
|
||||||
|
int main(void) { return 0; }" NEED_SOFTFP_FOR_INTRINSICS)
|
||||||
|
if(NEED_SOFTFP_FOR_INTRINSICS)
|
||||||
|
set(SOFTFP_FLAG -mfloat-abi=softfp)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(BITS EQUAL 32)
|
||||||
|
set(CMAKE_REQUIRED_FLAGS "-mfpu=neon ${SOFTFP_FLAG}")
|
||||||
|
check_c_source_compiles("
|
||||||
|
#include <arm_neon.h>
|
||||||
|
int main(int argc, char **argv) {
|
||||||
|
uint16x8_t input = vdupq_n_u16((uint16_t)argc);
|
||||||
|
uint8x8_t output = vmovn_u16(input);
|
||||||
|
return (int)output[0];
|
||||||
|
}" HAVE_NEON)
|
||||||
|
if(NOT HAVE_NEON)
|
||||||
|
simd_fail("SIMD extensions not available for this architecture")
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
check_c_source_compiles("
|
||||||
|
#include <arm_neon.h>
|
||||||
|
int main(int argc, char **argv) {
|
||||||
|
int16_t input[] = {
|
||||||
|
(int16_t)argc, (int16_t)argc, (int16_t)argc, (int16_t)argc,
|
||||||
|
(int16_t)argc, (int16_t)argc, (int16_t)argc, (int16_t)argc,
|
||||||
|
(int16_t)argc, (int16_t)argc, (int16_t)argc, (int16_t)argc
|
||||||
|
};
|
||||||
|
int16x4x3_t output = vld1_s16_x3(input);
|
||||||
|
vst3_s16(input, output);
|
||||||
|
return (int)input[0];
|
||||||
|
}" HAVE_VLD1_S16_X3)
|
||||||
|
check_c_source_compiles("
|
||||||
|
#include <arm_neon.h>
|
||||||
|
int main(int argc, char **argv) {
|
||||||
|
uint16_t input[] = {
|
||||||
|
(uint16_t)argc, (uint16_t)argc, (uint16_t)argc, (uint16_t)argc,
|
||||||
|
(uint16_t)argc, (uint16_t)argc, (uint16_t)argc, (uint16_t)argc
|
||||||
|
};
|
||||||
|
uint16x4x2_t output = vld1_u16_x2(input);
|
||||||
|
vst2_u16(input, output);
|
||||||
|
return (int)input[0];
|
||||||
|
}" HAVE_VLD1_U16_X2)
|
||||||
|
check_c_source_compiles("
|
||||||
|
#include <arm_neon.h>
|
||||||
|
int main(int argc, char **argv) {
|
||||||
|
uint8_t input[] = {
|
||||||
|
(uint8_t)argc, (uint8_t)argc, (uint8_t)argc, (uint8_t)argc,
|
||||||
|
(uint8_t)argc, (uint8_t)argc, (uint8_t)argc, (uint8_t)argc,
|
||||||
|
(uint8_t)argc, (uint8_t)argc, (uint8_t)argc, (uint8_t)argc,
|
||||||
|
(uint8_t)argc, (uint8_t)argc, (uint8_t)argc, (uint8_t)argc,
|
||||||
|
(uint8_t)argc, (uint8_t)argc, (uint8_t)argc, (uint8_t)argc,
|
||||||
|
(uint8_t)argc, (uint8_t)argc, (uint8_t)argc, (uint8_t)argc,
|
||||||
|
(uint8_t)argc, (uint8_t)argc, (uint8_t)argc, (uint8_t)argc,
|
||||||
|
(uint8_t)argc, (uint8_t)argc, (uint8_t)argc, (uint8_t)argc,
|
||||||
|
(uint8_t)argc, (uint8_t)argc, (uint8_t)argc, (uint8_t)argc,
|
||||||
|
(uint8_t)argc, (uint8_t)argc, (uint8_t)argc, (uint8_t)argc,
|
||||||
|
(uint8_t)argc, (uint8_t)argc, (uint8_t)argc, (uint8_t)argc,
|
||||||
|
(uint8_t)argc, (uint8_t)argc, (uint8_t)argc, (uint8_t)argc,
|
||||||
|
(uint8_t)argc, (uint8_t)argc, (uint8_t)argc, (uint8_t)argc,
|
||||||
|
(uint8_t)argc, (uint8_t)argc, (uint8_t)argc, (uint8_t)argc,
|
||||||
|
(uint8_t)argc, (uint8_t)argc, (uint8_t)argc, (uint8_t)argc,
|
||||||
|
(uint8_t)argc, (uint8_t)argc, (uint8_t)argc, (uint8_t)argc
|
||||||
|
};
|
||||||
|
uint8x16x4_t output = vld1q_u8_x4(input);
|
||||||
|
vst4q_u8(input, output);
|
||||||
|
return (int)input[0];
|
||||||
|
}" HAVE_VLD1Q_U8_X4)
|
||||||
|
if(BITS EQUAL 32)
|
||||||
|
unset(CMAKE_REQUIRED_FLAGS)
|
||||||
|
endif()
|
||||||
|
configure_file(arm/neon-compat.h.in arm/neon-compat.h @ONLY)
|
||||||
|
include_directories(${CMAKE_CURRENT_BINARY_DIR}/arm)
|
||||||
|
|
||||||
|
# GCC 11 and earlier and some older versions of Clang do not have a full or
|
||||||
|
# optimal set of Neon intrinsics, so for performance reasons, when using those
|
||||||
|
# compilers, we default to using the older GAS implementation of the Neon SIMD
|
||||||
|
# extensions for certain algorithms. The presence or absence of the three
|
||||||
|
# intrinsics we tested above is a reasonable proxy for this, except with GCC 10
|
||||||
|
# and 11.
|
||||||
|
if((HAVE_VLD1_S16_X3 AND HAVE_VLD1_U16_X2 AND HAVE_VLD1Q_U8_X4 AND
|
||||||
|
(NOT CMAKE_COMPILER_IS_GNUCC OR
|
||||||
|
CMAKE_C_COMPILER_VERSION VERSION_EQUAL 12.0.0 OR
|
||||||
|
CMAKE_C_COMPILER_VERSION VERSION_GREATER 12.0.0)))
|
||||||
|
set(DEFAULT_NEON_INTRINSICS 1)
|
||||||
|
else()
|
||||||
|
set(DEFAULT_NEON_INTRINSICS 0)
|
||||||
|
endif()
|
||||||
|
option(NEON_INTRINSICS
|
||||||
|
"Because GCC (as of this writing) and some older versions of Clang do not have a full or optimal set of Neon intrinsics, for performance reasons, the default when building libjpeg-turbo with those compilers is to continue using the older GAS implementation of the Neon SIMD extensions for certain algorithms. Setting this option forces the full Neon intrinsics implementation to be used with all compilers. Unsetting this option forces the hybrid GAS/intrinsics implementation to be used with all compilers."
|
||||||
|
${DEFAULT_NEON_INTRINSICS})
|
||||||
|
if(NOT NEON_INTRINSICS)
|
||||||
|
enable_language(ASM)
|
||||||
|
|
||||||
|
set(CMAKE_ASM_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_ASM_FLAGS}")
|
||||||
|
|
||||||
|
# Test whether gas-preprocessor.pl would be needed to build the GAS
|
||||||
|
# implementation of the Neon SIMD extensions. If so, then automatically
|
||||||
|
# enable the full Neon intrinsics implementation.
|
||||||
|
if(CPU_TYPE STREQUAL "arm")
|
||||||
|
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/gastest.S "
|
||||||
|
.text
|
||||||
|
.fpu neon
|
||||||
|
.arch armv7a
|
||||||
|
.object_arch armv4
|
||||||
|
.arm
|
||||||
|
pld [r0]
|
||||||
|
vmovn.u16 d0, q0")
|
||||||
|
else()
|
||||||
|
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/gastest.S "
|
||||||
|
.text
|
||||||
|
MYVAR .req x0
|
||||||
|
movi v0.16b, #100
|
||||||
|
mov MYVAR, #100
|
||||||
|
.unreq MYVAR")
|
||||||
|
endif()
|
||||||
|
separate_arguments(CMAKE_ASM_FLAGS_SEP UNIX_COMMAND "${CMAKE_ASM_FLAGS}")
|
||||||
|
execute_process(COMMAND ${CMAKE_ASM_COMPILER} ${CMAKE_ASM_FLAGS_SEP}
|
||||||
|
-x assembler-with-cpp -c ${CMAKE_CURRENT_BINARY_DIR}/gastest.S
|
||||||
|
RESULT_VARIABLE RESULT OUTPUT_VARIABLE OUTPUT ERROR_VARIABLE ERROR)
|
||||||
|
if(NOT RESULT EQUAL 0)
|
||||||
|
message(STATUS "libjpeg-turbo(SIMD): GAS appears to be broken. Using the full Neon SIMD intrinsics implementation.")
|
||||||
|
set(NEON_INTRINSICS 1 CACHE INTERNAL "" FORCE)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
boolean_number(NEON_INTRINSICS PARENT_SCOPE)
|
||||||
|
if(NEON_INTRINSICS)
|
||||||
|
add_definitions(-DNEON_INTRINSICS)
|
||||||
|
message(STATUS "Use full Neon SIMD intrinsics implementation (NEON_INTRINSICS = ${NEON_INTRINSICS})")
|
||||||
|
else()
|
||||||
|
message(STATUS "Use partial Neon SIMD intrinsics implementation (NEON_INTRINSICS = ${NEON_INTRINSICS})")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(SIMD_SOURCES arm/jcgray-neon.c arm/jcphuff-neon.c arm/jcsample-neon.c
|
||||||
|
arm/jdmerge-neon.c arm/jdsample-neon.c arm/jfdctfst-neon.c
|
||||||
|
arm/jidctred-neon.c arm/jquanti-neon.c)
|
||||||
|
if(NEON_INTRINSICS)
|
||||||
|
set(SIMD_SOURCES ${SIMD_SOURCES} arm/jccolor-neon.c arm/jidctint-neon.c)
|
||||||
|
endif()
|
||||||
|
if(NEON_INTRINSICS OR BITS EQUAL 64)
|
||||||
|
set(SIMD_SOURCES ${SIMD_SOURCES} arm/jidctfst-neon.c)
|
||||||
|
endif()
|
||||||
|
if(NEON_INTRINSICS OR BITS EQUAL 32)
|
||||||
|
set(SIMD_SOURCES ${SIMD_SOURCES} arm/aarch${BITS}/jchuff-neon.c
|
||||||
|
arm/jdcolor-neon.c arm/jfdctint-neon.c)
|
||||||
|
endif()
|
||||||
|
if(BITS EQUAL 32)
|
||||||
|
set_source_files_properties(${SIMD_SOURCES} COMPILE_FLAGS "-mfpu=neon ${SOFTFP_FLAG}")
|
||||||
|
endif()
|
||||||
|
if(NOT NEON_INTRINSICS)
|
||||||
|
string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_UC)
|
||||||
|
set(EFFECTIVE_ASM_FLAGS "${CMAKE_ASM_FLAGS} ${CMAKE_ASM_FLAGS_${CMAKE_BUILD_TYPE_UC}}")
|
||||||
|
message(STATUS "CMAKE_ASM_FLAGS = ${EFFECTIVE_ASM_FLAGS}")
|
||||||
|
|
||||||
|
set(SIMD_SOURCES ${SIMD_SOURCES} arm/aarch${BITS}/jsimd_neon.S)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_library(jsimd OBJECT ${SIMD_SOURCES} arm/aarch${BITS}/jsimd.c)
|
||||||
|
|
||||||
|
if(CMAKE_POSITION_INDEPENDENT_CODE OR ENABLE_SHARED)
|
||||||
|
set_target_properties(jsimd PROPERTIES POSITION_INDEPENDENT_CODE 1)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# MIPS (GAS)
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
elseif(CPU_TYPE STREQUAL "mips" OR CPU_TYPE STREQUAL "mipsel")
|
||||||
|
|
||||||
|
enable_language(ASM)
|
||||||
|
|
||||||
|
string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_UC)
|
||||||
|
set(EFFECTIVE_ASM_FLAGS "${CMAKE_ASM_FLAGS} ${CMAKE_ASM_FLAGS_${CMAKE_BUILD_TYPE_UC}}")
|
||||||
|
message(STATUS "CMAKE_ASM_FLAGS = ${EFFECTIVE_ASM_FLAGS}")
|
||||||
|
|
||||||
|
set(CMAKE_REQUIRED_FLAGS -mdspr2)
|
||||||
|
|
||||||
|
check_c_source_compiles("
|
||||||
|
#if !(defined(__mips__) && __mips_isa_rev >= 2)
|
||||||
|
#error MIPS DSPr2 is currently only available on MIPS32r2 platforms.
|
||||||
|
#endif
|
||||||
|
int main(void) {
|
||||||
|
int c = 0, a = 0, b = 0;
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
\"precr.qb.ph %[c], %[a], %[b]\"
|
||||||
|
: [c] \"=r\" (c)
|
||||||
|
: [a] \"r\" (a), [b] \"r\" (b)
|
||||||
|
);
|
||||||
|
return c;
|
||||||
|
}" HAVE_DSPR2)
|
||||||
|
|
||||||
|
unset(CMAKE_REQUIRED_FLAGS)
|
||||||
|
|
||||||
|
if(NOT HAVE_DSPR2)
|
||||||
|
simd_fail("SIMD extensions not available for this CPU")
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_library(jsimd OBJECT mips/jsimd_dspr2.S mips/jsimd.c)
|
||||||
|
|
||||||
|
if(CMAKE_POSITION_INDEPENDENT_CODE OR ENABLE_SHARED)
|
||||||
|
set_target_properties(jsimd PROPERTIES POSITION_INDEPENDENT_CODE 1)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# MIPS64 (Intrinsics)
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
elseif(CPU_TYPE STREQUAL "loongson" OR CPU_TYPE MATCHES "^mips64")
|
||||||
|
|
||||||
|
set(CMAKE_REQUIRED_FLAGS -Wa,-mloongson-mmi,-mloongson-ext)
|
||||||
|
|
||||||
|
check_c_source_compiles("
|
||||||
|
int main(void) {
|
||||||
|
int c = 0, a = 0, b = 0;
|
||||||
|
asm (
|
||||||
|
\"paddb %0, %1, %2\"
|
||||||
|
: \"=f\" (c)
|
||||||
|
: \"f\" (a), \"f\" (b)
|
||||||
|
);
|
||||||
|
return c;
|
||||||
|
}" HAVE_MMI)
|
||||||
|
|
||||||
|
unset(CMAKE_REQUIRED_FLAGS)
|
||||||
|
|
||||||
|
if(NOT HAVE_MMI)
|
||||||
|
simd_fail("SIMD extensions not available for this CPU")
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(SIMD_SOURCES mips64/jccolor-mmi.c mips64/jcgray-mmi.c mips64/jcsample-mmi.c
|
||||||
|
mips64/jdcolor-mmi.c mips64/jdmerge-mmi.c mips64/jdsample-mmi.c
|
||||||
|
mips64/jfdctfst-mmi.c mips64/jfdctint-mmi.c mips64/jidctfst-mmi.c
|
||||||
|
mips64/jidctint-mmi.c mips64/jquanti-mmi.c)
|
||||||
|
|
||||||
|
if(CMAKE_COMPILER_IS_GNUCC)
|
||||||
|
foreach(file ${SIMD_SOURCES})
|
||||||
|
set_property(SOURCE ${file} APPEND_STRING PROPERTY COMPILE_FLAGS
|
||||||
|
" -fno-strict-aliasing")
|
||||||
|
endforeach()
|
||||||
|
endif()
|
||||||
|
foreach(file ${SIMD_SOURCES})
|
||||||
|
set_property(SOURCE ${file} APPEND_STRING PROPERTY COMPILE_FLAGS
|
||||||
|
" -Wa,-mloongson-mmi,-mloongson-ext")
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
add_library(jsimd OBJECT ${SIMD_SOURCES} mips64/jsimd.c)
|
||||||
|
|
||||||
|
if(CMAKE_POSITION_INDEPENDENT_CODE OR ENABLE_SHARED)
|
||||||
|
set_target_properties(jsimd PROPERTIES POSITION_INDEPENDENT_CODE 1)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# PowerPC (Intrinsics)
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
elseif(CPU_TYPE STREQUAL "powerpc")
|
||||||
|
|
||||||
|
set(CMAKE_REQUIRED_FLAGS -maltivec)
|
||||||
|
|
||||||
|
check_c_source_compiles("
|
||||||
|
#include <altivec.h>
|
||||||
|
int main(void) {
|
||||||
|
__vector int vi = { 0, 0, 0, 0 };
|
||||||
|
int i[4];
|
||||||
|
vec_st(vi, 0, i);
|
||||||
|
return i[0];
|
||||||
|
}" HAVE_ALTIVEC)
|
||||||
|
|
||||||
|
unset(CMAKE_REQUIRED_FLAGS)
|
||||||
|
|
||||||
|
if(NOT HAVE_ALTIVEC)
|
||||||
|
simd_fail("SIMD extensions not available for this CPU (PowerPC SPE)")
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(SIMD_SOURCES powerpc/jccolor-altivec.c powerpc/jcgray-altivec.c
|
||||||
|
powerpc/jcsample-altivec.c powerpc/jdcolor-altivec.c
|
||||||
|
powerpc/jdmerge-altivec.c powerpc/jdsample-altivec.c
|
||||||
|
powerpc/jfdctfst-altivec.c powerpc/jfdctint-altivec.c
|
||||||
|
powerpc/jidctfst-altivec.c powerpc/jidctint-altivec.c
|
||||||
|
powerpc/jquanti-altivec.c)
|
||||||
|
|
||||||
|
set_source_files_properties(${SIMD_SOURCES} PROPERTIES
|
||||||
|
COMPILE_FLAGS -maltivec)
|
||||||
|
|
||||||
|
add_library(jsimd OBJECT ${SIMD_SOURCES} powerpc/jsimd.c)
|
||||||
|
|
||||||
|
if(CMAKE_POSITION_INDEPENDENT_CODE OR ENABLE_SHARED)
|
||||||
|
set_target_properties(jsimd PROPERTIES POSITION_INDEPENDENT_CODE 1)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# None
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
else()
|
||||||
|
|
||||||
|
simd_fail("SIMD extensions not available for this CPU (${CMAKE_SYSTEM_PROCESSOR})")
|
||||||
|
|
||||||
|
endif() # CPU_TYPE
|
||||||
@@ -0,0 +1,148 @@
|
|||||||
|
/*
|
||||||
|
* jccolext-neon.c - colorspace conversion (32-bit Arm Neon)
|
||||||
|
*
|
||||||
|
* Copyright (C) 2020, Arm Limited. All Rights Reserved.
|
||||||
|
* Copyright (C) 2020, D. R. Commander. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* This software is provided 'as-is', without any express or implied
|
||||||
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
* arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose,
|
||||||
|
* including commercial applications, and to alter it and redistribute it
|
||||||
|
* freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
* claim that you wrote the original software. If you use this software
|
||||||
|
* in a product, an acknowledgment in the product documentation would be
|
||||||
|
* appreciated but is not required.
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
* misrepresented as being the original software.
|
||||||
|
* 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* This file is included by jccolor-neon.c */
|
||||||
|
|
||||||
|
|
||||||
|
/* RGB -> YCbCr conversion is defined by the following equations:
|
||||||
|
* Y = 0.29900 * R + 0.58700 * G + 0.11400 * B
|
||||||
|
* Cb = -0.16874 * R - 0.33126 * G + 0.50000 * B + 128
|
||||||
|
* Cr = 0.50000 * R - 0.41869 * G - 0.08131 * B + 128
|
||||||
|
*
|
||||||
|
* Avoid floating point arithmetic by using shifted integer constants:
|
||||||
|
* 0.29899597 = 19595 * 2^-16
|
||||||
|
* 0.58700561 = 38470 * 2^-16
|
||||||
|
* 0.11399841 = 7471 * 2^-16
|
||||||
|
* 0.16874695 = 11059 * 2^-16
|
||||||
|
* 0.33125305 = 21709 * 2^-16
|
||||||
|
* 0.50000000 = 32768 * 2^-16
|
||||||
|
* 0.41868592 = 27439 * 2^-16
|
||||||
|
* 0.08131409 = 5329 * 2^-16
|
||||||
|
* These constants are defined in jccolor-neon.c
|
||||||
|
*
|
||||||
|
* We add the fixed-point equivalent of 0.5 to Cb and Cr, which effectively
|
||||||
|
* rounds up or down the result via integer truncation.
|
||||||
|
*/
|
||||||
|
|
||||||
|
void jsimd_rgb_ycc_convert_neon(JDIMENSION image_width, JSAMPARRAY input_buf,
|
||||||
|
JSAMPIMAGE output_buf, JDIMENSION output_row,
|
||||||
|
int num_rows)
|
||||||
|
{
|
||||||
|
/* Pointer to RGB(X/A) input data */
|
||||||
|
JSAMPROW inptr;
|
||||||
|
/* Pointers to Y, Cb, and Cr output data */
|
||||||
|
JSAMPROW outptr0, outptr1, outptr2;
|
||||||
|
/* Allocate temporary buffer for final (image_width % 8) pixels in row. */
|
||||||
|
ALIGN(16) uint8_t tmp_buf[8 * RGB_PIXELSIZE];
|
||||||
|
|
||||||
|
/* Set up conversion constants. */
|
||||||
|
#ifdef HAVE_VLD1_U16_X2
|
||||||
|
const uint16x4x2_t consts = vld1_u16_x2(jsimd_rgb_ycc_neon_consts);
|
||||||
|
#else
|
||||||
|
/* GCC does not currently support the intrinsic vld1_<type>_x2(). */
|
||||||
|
const uint16x4_t consts1 = vld1_u16(jsimd_rgb_ycc_neon_consts);
|
||||||
|
const uint16x4_t consts2 = vld1_u16(jsimd_rgb_ycc_neon_consts + 4);
|
||||||
|
const uint16x4x2_t consts = { { consts1, consts2 } };
|
||||||
|
#endif
|
||||||
|
const uint32x4_t scaled_128_5 = vdupq_n_u32((128 << 16) + 32767);
|
||||||
|
|
||||||
|
while (--num_rows >= 0) {
|
||||||
|
inptr = *input_buf++;
|
||||||
|
outptr0 = output_buf[0][output_row];
|
||||||
|
outptr1 = output_buf[1][output_row];
|
||||||
|
outptr2 = output_buf[2][output_row];
|
||||||
|
output_row++;
|
||||||
|
|
||||||
|
int cols_remaining = image_width;
|
||||||
|
for (; cols_remaining > 0; cols_remaining -= 8) {
|
||||||
|
|
||||||
|
/* To prevent buffer overread by the vector load instructions, the last
|
||||||
|
* (image_width % 8) columns of data are first memcopied to a temporary
|
||||||
|
* buffer large enough to accommodate the vector load.
|
||||||
|
*/
|
||||||
|
if (cols_remaining < 8) {
|
||||||
|
memcpy(tmp_buf, inptr, cols_remaining * RGB_PIXELSIZE);
|
||||||
|
inptr = tmp_buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if RGB_PIXELSIZE == 4
|
||||||
|
uint8x8x4_t input_pixels = vld4_u8(inptr);
|
||||||
|
#else
|
||||||
|
uint8x8x3_t input_pixels = vld3_u8(inptr);
|
||||||
|
#endif
|
||||||
|
uint16x8_t r = vmovl_u8(input_pixels.val[RGB_RED]);
|
||||||
|
uint16x8_t g = vmovl_u8(input_pixels.val[RGB_GREEN]);
|
||||||
|
uint16x8_t b = vmovl_u8(input_pixels.val[RGB_BLUE]);
|
||||||
|
|
||||||
|
/* Compute Y = 0.29900 * R + 0.58700 * G + 0.11400 * B */
|
||||||
|
uint32x4_t y_low = vmull_lane_u16(vget_low_u16(r), consts.val[0], 0);
|
||||||
|
y_low = vmlal_lane_u16(y_low, vget_low_u16(g), consts.val[0], 1);
|
||||||
|
y_low = vmlal_lane_u16(y_low, vget_low_u16(b), consts.val[0], 2);
|
||||||
|
uint32x4_t y_high = vmull_lane_u16(vget_high_u16(r), consts.val[0], 0);
|
||||||
|
y_high = vmlal_lane_u16(y_high, vget_high_u16(g), consts.val[0], 1);
|
||||||
|
y_high = vmlal_lane_u16(y_high, vget_high_u16(b), consts.val[0], 2);
|
||||||
|
|
||||||
|
/* Compute Cb = -0.16874 * R - 0.33126 * G + 0.50000 * B + 128 */
|
||||||
|
uint32x4_t cb_low = scaled_128_5;
|
||||||
|
cb_low = vmlsl_lane_u16(cb_low, vget_low_u16(r), consts.val[0], 3);
|
||||||
|
cb_low = vmlsl_lane_u16(cb_low, vget_low_u16(g), consts.val[1], 0);
|
||||||
|
cb_low = vmlal_lane_u16(cb_low, vget_low_u16(b), consts.val[1], 1);
|
||||||
|
uint32x4_t cb_high = scaled_128_5;
|
||||||
|
cb_high = vmlsl_lane_u16(cb_high, vget_high_u16(r), consts.val[0], 3);
|
||||||
|
cb_high = vmlsl_lane_u16(cb_high, vget_high_u16(g), consts.val[1], 0);
|
||||||
|
cb_high = vmlal_lane_u16(cb_high, vget_high_u16(b), consts.val[1], 1);
|
||||||
|
|
||||||
|
/* Compute Cr = 0.50000 * R - 0.41869 * G - 0.08131 * B + 128 */
|
||||||
|
uint32x4_t cr_low = scaled_128_5;
|
||||||
|
cr_low = vmlal_lane_u16(cr_low, vget_low_u16(r), consts.val[1], 1);
|
||||||
|
cr_low = vmlsl_lane_u16(cr_low, vget_low_u16(g), consts.val[1], 2);
|
||||||
|
cr_low = vmlsl_lane_u16(cr_low, vget_low_u16(b), consts.val[1], 3);
|
||||||
|
uint32x4_t cr_high = scaled_128_5;
|
||||||
|
cr_high = vmlal_lane_u16(cr_high, vget_high_u16(r), consts.val[1], 1);
|
||||||
|
cr_high = vmlsl_lane_u16(cr_high, vget_high_u16(g), consts.val[1], 2);
|
||||||
|
cr_high = vmlsl_lane_u16(cr_high, vget_high_u16(b), consts.val[1], 3);
|
||||||
|
|
||||||
|
/* Descale Y values (rounding right shift) and narrow to 16-bit. */
|
||||||
|
uint16x8_t y_u16 = vcombine_u16(vrshrn_n_u32(y_low, 16),
|
||||||
|
vrshrn_n_u32(y_high, 16));
|
||||||
|
/* Descale Cb values (right shift) and narrow to 16-bit. */
|
||||||
|
uint16x8_t cb_u16 = vcombine_u16(vshrn_n_u32(cb_low, 16),
|
||||||
|
vshrn_n_u32(cb_high, 16));
|
||||||
|
/* Descale Cr values (right shift) and narrow to 16-bit. */
|
||||||
|
uint16x8_t cr_u16 = vcombine_u16(vshrn_n_u32(cr_low, 16),
|
||||||
|
vshrn_n_u32(cr_high, 16));
|
||||||
|
/* Narrow Y, Cb, and Cr values to 8-bit and store to memory. Buffer
|
||||||
|
* overwrite is permitted up to the next multiple of ALIGN_SIZE bytes.
|
||||||
|
*/
|
||||||
|
vst1_u8(outptr0, vmovn_u16(y_u16));
|
||||||
|
vst1_u8(outptr1, vmovn_u16(cb_u16));
|
||||||
|
vst1_u8(outptr2, vmovn_u16(cr_u16));
|
||||||
|
|
||||||
|
/* Increment pointers. */
|
||||||
|
inptr += (8 * RGB_PIXELSIZE);
|
||||||
|
outptr0 += 8;
|
||||||
|
outptr1 += 8;
|
||||||
|
outptr2 += 8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,334 @@
|
|||||||
|
/*
|
||||||
|
* jchuff-neon.c - Huffman entropy encoding (32-bit Arm Neon)
|
||||||
|
*
|
||||||
|
* Copyright (C) 2020, Arm Limited. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* This software is provided 'as-is', without any express or implied
|
||||||
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
* arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose,
|
||||||
|
* including commercial applications, and to alter it and redistribute it
|
||||||
|
* freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
* claim that you wrote the original software. If you use this software
|
||||||
|
* in a product, an acknowledgment in the product documentation would be
|
||||||
|
* appreciated but is not required.
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
* misrepresented as being the original software.
|
||||||
|
* 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*
|
||||||
|
* NOTE: All referenced figures are from
|
||||||
|
* Recommendation ITU-T T.81 (1992) | ISO/IEC 10918-1:1994.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define JPEG_INTERNALS
|
||||||
|
#include "../../../jinclude.h"
|
||||||
|
#include "../../../jpeglib.h"
|
||||||
|
#include "../../../jsimd.h"
|
||||||
|
#include "../../../jdct.h"
|
||||||
|
#include "../../../jsimddct.h"
|
||||||
|
#include "../../jsimd.h"
|
||||||
|
#include "../jchuff.h"
|
||||||
|
#include "neon-compat.h"
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
#include <arm_neon.h>
|
||||||
|
|
||||||
|
|
||||||
|
JOCTET *jsimd_huff_encode_one_block_neon(void *state, JOCTET *buffer,
|
||||||
|
JCOEFPTR block, int last_dc_val,
|
||||||
|
c_derived_tbl *dctbl,
|
||||||
|
c_derived_tbl *actbl)
|
||||||
|
{
|
||||||
|
uint8_t block_nbits[DCTSIZE2];
|
||||||
|
uint16_t block_diff[DCTSIZE2];
|
||||||
|
|
||||||
|
/* Load rows of coefficients from DCT block in zig-zag order. */
|
||||||
|
|
||||||
|
/* Compute DC coefficient difference value. (F.1.1.5.1) */
|
||||||
|
int16x8_t row0 = vdupq_n_s16(block[0] - last_dc_val);
|
||||||
|
row0 = vld1q_lane_s16(block + 1, row0, 1);
|
||||||
|
row0 = vld1q_lane_s16(block + 8, row0, 2);
|
||||||
|
row0 = vld1q_lane_s16(block + 16, row0, 3);
|
||||||
|
row0 = vld1q_lane_s16(block + 9, row0, 4);
|
||||||
|
row0 = vld1q_lane_s16(block + 2, row0, 5);
|
||||||
|
row0 = vld1q_lane_s16(block + 3, row0, 6);
|
||||||
|
row0 = vld1q_lane_s16(block + 10, row0, 7);
|
||||||
|
|
||||||
|
int16x8_t row1 = vld1q_dup_s16(block + 17);
|
||||||
|
row1 = vld1q_lane_s16(block + 24, row1, 1);
|
||||||
|
row1 = vld1q_lane_s16(block + 32, row1, 2);
|
||||||
|
row1 = vld1q_lane_s16(block + 25, row1, 3);
|
||||||
|
row1 = vld1q_lane_s16(block + 18, row1, 4);
|
||||||
|
row1 = vld1q_lane_s16(block + 11, row1, 5);
|
||||||
|
row1 = vld1q_lane_s16(block + 4, row1, 6);
|
||||||
|
row1 = vld1q_lane_s16(block + 5, row1, 7);
|
||||||
|
|
||||||
|
int16x8_t row2 = vld1q_dup_s16(block + 12);
|
||||||
|
row2 = vld1q_lane_s16(block + 19, row2, 1);
|
||||||
|
row2 = vld1q_lane_s16(block + 26, row2, 2);
|
||||||
|
row2 = vld1q_lane_s16(block + 33, row2, 3);
|
||||||
|
row2 = vld1q_lane_s16(block + 40, row2, 4);
|
||||||
|
row2 = vld1q_lane_s16(block + 48, row2, 5);
|
||||||
|
row2 = vld1q_lane_s16(block + 41, row2, 6);
|
||||||
|
row2 = vld1q_lane_s16(block + 34, row2, 7);
|
||||||
|
|
||||||
|
int16x8_t row3 = vld1q_dup_s16(block + 27);
|
||||||
|
row3 = vld1q_lane_s16(block + 20, row3, 1);
|
||||||
|
row3 = vld1q_lane_s16(block + 13, row3, 2);
|
||||||
|
row3 = vld1q_lane_s16(block + 6, row3, 3);
|
||||||
|
row3 = vld1q_lane_s16(block + 7, row3, 4);
|
||||||
|
row3 = vld1q_lane_s16(block + 14, row3, 5);
|
||||||
|
row3 = vld1q_lane_s16(block + 21, row3, 6);
|
||||||
|
row3 = vld1q_lane_s16(block + 28, row3, 7);
|
||||||
|
|
||||||
|
int16x8_t abs_row0 = vabsq_s16(row0);
|
||||||
|
int16x8_t abs_row1 = vabsq_s16(row1);
|
||||||
|
int16x8_t abs_row2 = vabsq_s16(row2);
|
||||||
|
int16x8_t abs_row3 = vabsq_s16(row3);
|
||||||
|
|
||||||
|
int16x8_t row0_lz = vclzq_s16(abs_row0);
|
||||||
|
int16x8_t row1_lz = vclzq_s16(abs_row1);
|
||||||
|
int16x8_t row2_lz = vclzq_s16(abs_row2);
|
||||||
|
int16x8_t row3_lz = vclzq_s16(abs_row3);
|
||||||
|
|
||||||
|
/* Compute number of bits required to represent each coefficient. */
|
||||||
|
uint8x8_t row0_nbits = vsub_u8(vdup_n_u8(16),
|
||||||
|
vmovn_u16(vreinterpretq_u16_s16(row0_lz)));
|
||||||
|
uint8x8_t row1_nbits = vsub_u8(vdup_n_u8(16),
|
||||||
|
vmovn_u16(vreinterpretq_u16_s16(row1_lz)));
|
||||||
|
uint8x8_t row2_nbits = vsub_u8(vdup_n_u8(16),
|
||||||
|
vmovn_u16(vreinterpretq_u16_s16(row2_lz)));
|
||||||
|
uint8x8_t row3_nbits = vsub_u8(vdup_n_u8(16),
|
||||||
|
vmovn_u16(vreinterpretq_u16_s16(row3_lz)));
|
||||||
|
|
||||||
|
vst1_u8(block_nbits + 0 * DCTSIZE, row0_nbits);
|
||||||
|
vst1_u8(block_nbits + 1 * DCTSIZE, row1_nbits);
|
||||||
|
vst1_u8(block_nbits + 2 * DCTSIZE, row2_nbits);
|
||||||
|
vst1_u8(block_nbits + 3 * DCTSIZE, row3_nbits);
|
||||||
|
|
||||||
|
uint16x8_t row0_mask =
|
||||||
|
vshlq_u16(vreinterpretq_u16_s16(vshrq_n_s16(row0, 15)),
|
||||||
|
vnegq_s16(row0_lz));
|
||||||
|
uint16x8_t row1_mask =
|
||||||
|
vshlq_u16(vreinterpretq_u16_s16(vshrq_n_s16(row1, 15)),
|
||||||
|
vnegq_s16(row1_lz));
|
||||||
|
uint16x8_t row2_mask =
|
||||||
|
vshlq_u16(vreinterpretq_u16_s16(vshrq_n_s16(row2, 15)),
|
||||||
|
vnegq_s16(row2_lz));
|
||||||
|
uint16x8_t row3_mask =
|
||||||
|
vshlq_u16(vreinterpretq_u16_s16(vshrq_n_s16(row3, 15)),
|
||||||
|
vnegq_s16(row3_lz));
|
||||||
|
|
||||||
|
uint16x8_t row0_diff = veorq_u16(vreinterpretq_u16_s16(abs_row0), row0_mask);
|
||||||
|
uint16x8_t row1_diff = veorq_u16(vreinterpretq_u16_s16(abs_row1), row1_mask);
|
||||||
|
uint16x8_t row2_diff = veorq_u16(vreinterpretq_u16_s16(abs_row2), row2_mask);
|
||||||
|
uint16x8_t row3_diff = veorq_u16(vreinterpretq_u16_s16(abs_row3), row3_mask);
|
||||||
|
|
||||||
|
/* Store diff values for rows 0, 1, 2, and 3. */
|
||||||
|
vst1q_u16(block_diff + 0 * DCTSIZE, row0_diff);
|
||||||
|
vst1q_u16(block_diff + 1 * DCTSIZE, row1_diff);
|
||||||
|
vst1q_u16(block_diff + 2 * DCTSIZE, row2_diff);
|
||||||
|
vst1q_u16(block_diff + 3 * DCTSIZE, row3_diff);
|
||||||
|
|
||||||
|
/* Load last four rows of coefficients from DCT block in zig-zag order. */
|
||||||
|
int16x8_t row4 = vld1q_dup_s16(block + 35);
|
||||||
|
row4 = vld1q_lane_s16(block + 42, row4, 1);
|
||||||
|
row4 = vld1q_lane_s16(block + 49, row4, 2);
|
||||||
|
row4 = vld1q_lane_s16(block + 56, row4, 3);
|
||||||
|
row4 = vld1q_lane_s16(block + 57, row4, 4);
|
||||||
|
row4 = vld1q_lane_s16(block + 50, row4, 5);
|
||||||
|
row4 = vld1q_lane_s16(block + 43, row4, 6);
|
||||||
|
row4 = vld1q_lane_s16(block + 36, row4, 7);
|
||||||
|
|
||||||
|
int16x8_t row5 = vld1q_dup_s16(block + 29);
|
||||||
|
row5 = vld1q_lane_s16(block + 22, row5, 1);
|
||||||
|
row5 = vld1q_lane_s16(block + 15, row5, 2);
|
||||||
|
row5 = vld1q_lane_s16(block + 23, row5, 3);
|
||||||
|
row5 = vld1q_lane_s16(block + 30, row5, 4);
|
||||||
|
row5 = vld1q_lane_s16(block + 37, row5, 5);
|
||||||
|
row5 = vld1q_lane_s16(block + 44, row5, 6);
|
||||||
|
row5 = vld1q_lane_s16(block + 51, row5, 7);
|
||||||
|
|
||||||
|
int16x8_t row6 = vld1q_dup_s16(block + 58);
|
||||||
|
row6 = vld1q_lane_s16(block + 59, row6, 1);
|
||||||
|
row6 = vld1q_lane_s16(block + 52, row6, 2);
|
||||||
|
row6 = vld1q_lane_s16(block + 45, row6, 3);
|
||||||
|
row6 = vld1q_lane_s16(block + 38, row6, 4);
|
||||||
|
row6 = vld1q_lane_s16(block + 31, row6, 5);
|
||||||
|
row6 = vld1q_lane_s16(block + 39, row6, 6);
|
||||||
|
row6 = vld1q_lane_s16(block + 46, row6, 7);
|
||||||
|
|
||||||
|
int16x8_t row7 = vld1q_dup_s16(block + 53);
|
||||||
|
row7 = vld1q_lane_s16(block + 60, row7, 1);
|
||||||
|
row7 = vld1q_lane_s16(block + 61, row7, 2);
|
||||||
|
row7 = vld1q_lane_s16(block + 54, row7, 3);
|
||||||
|
row7 = vld1q_lane_s16(block + 47, row7, 4);
|
||||||
|
row7 = vld1q_lane_s16(block + 55, row7, 5);
|
||||||
|
row7 = vld1q_lane_s16(block + 62, row7, 6);
|
||||||
|
row7 = vld1q_lane_s16(block + 63, row7, 7);
|
||||||
|
|
||||||
|
int16x8_t abs_row4 = vabsq_s16(row4);
|
||||||
|
int16x8_t abs_row5 = vabsq_s16(row5);
|
||||||
|
int16x8_t abs_row6 = vabsq_s16(row6);
|
||||||
|
int16x8_t abs_row7 = vabsq_s16(row7);
|
||||||
|
|
||||||
|
int16x8_t row4_lz = vclzq_s16(abs_row4);
|
||||||
|
int16x8_t row5_lz = vclzq_s16(abs_row5);
|
||||||
|
int16x8_t row6_lz = vclzq_s16(abs_row6);
|
||||||
|
int16x8_t row7_lz = vclzq_s16(abs_row7);
|
||||||
|
|
||||||
|
/* Compute number of bits required to represent each coefficient. */
|
||||||
|
uint8x8_t row4_nbits = vsub_u8(vdup_n_u8(16),
|
||||||
|
vmovn_u16(vreinterpretq_u16_s16(row4_lz)));
|
||||||
|
uint8x8_t row5_nbits = vsub_u8(vdup_n_u8(16),
|
||||||
|
vmovn_u16(vreinterpretq_u16_s16(row5_lz)));
|
||||||
|
uint8x8_t row6_nbits = vsub_u8(vdup_n_u8(16),
|
||||||
|
vmovn_u16(vreinterpretq_u16_s16(row6_lz)));
|
||||||
|
uint8x8_t row7_nbits = vsub_u8(vdup_n_u8(16),
|
||||||
|
vmovn_u16(vreinterpretq_u16_s16(row7_lz)));
|
||||||
|
|
||||||
|
vst1_u8(block_nbits + 4 * DCTSIZE, row4_nbits);
|
||||||
|
vst1_u8(block_nbits + 5 * DCTSIZE, row5_nbits);
|
||||||
|
vst1_u8(block_nbits + 6 * DCTSIZE, row6_nbits);
|
||||||
|
vst1_u8(block_nbits + 7 * DCTSIZE, row7_nbits);
|
||||||
|
|
||||||
|
uint16x8_t row4_mask =
|
||||||
|
vshlq_u16(vreinterpretq_u16_s16(vshrq_n_s16(row4, 15)),
|
||||||
|
vnegq_s16(row4_lz));
|
||||||
|
uint16x8_t row5_mask =
|
||||||
|
vshlq_u16(vreinterpretq_u16_s16(vshrq_n_s16(row5, 15)),
|
||||||
|
vnegq_s16(row5_lz));
|
||||||
|
uint16x8_t row6_mask =
|
||||||
|
vshlq_u16(vreinterpretq_u16_s16(vshrq_n_s16(row6, 15)),
|
||||||
|
vnegq_s16(row6_lz));
|
||||||
|
uint16x8_t row7_mask =
|
||||||
|
vshlq_u16(vreinterpretq_u16_s16(vshrq_n_s16(row7, 15)),
|
||||||
|
vnegq_s16(row7_lz));
|
||||||
|
|
||||||
|
uint16x8_t row4_diff = veorq_u16(vreinterpretq_u16_s16(abs_row4), row4_mask);
|
||||||
|
uint16x8_t row5_diff = veorq_u16(vreinterpretq_u16_s16(abs_row5), row5_mask);
|
||||||
|
uint16x8_t row6_diff = veorq_u16(vreinterpretq_u16_s16(abs_row6), row6_mask);
|
||||||
|
uint16x8_t row7_diff = veorq_u16(vreinterpretq_u16_s16(abs_row7), row7_mask);
|
||||||
|
|
||||||
|
/* Store diff values for rows 4, 5, 6, and 7. */
|
||||||
|
vst1q_u16(block_diff + 4 * DCTSIZE, row4_diff);
|
||||||
|
vst1q_u16(block_diff + 5 * DCTSIZE, row5_diff);
|
||||||
|
vst1q_u16(block_diff + 6 * DCTSIZE, row6_diff);
|
||||||
|
vst1q_u16(block_diff + 7 * DCTSIZE, row7_diff);
|
||||||
|
|
||||||
|
/* Construct bitmap to accelerate encoding of AC coefficients. A set bit
|
||||||
|
* means that the corresponding coefficient != 0.
|
||||||
|
*/
|
||||||
|
uint8x8_t row0_nbits_gt0 = vcgt_u8(row0_nbits, vdup_n_u8(0));
|
||||||
|
uint8x8_t row1_nbits_gt0 = vcgt_u8(row1_nbits, vdup_n_u8(0));
|
||||||
|
uint8x8_t row2_nbits_gt0 = vcgt_u8(row2_nbits, vdup_n_u8(0));
|
||||||
|
uint8x8_t row3_nbits_gt0 = vcgt_u8(row3_nbits, vdup_n_u8(0));
|
||||||
|
uint8x8_t row4_nbits_gt0 = vcgt_u8(row4_nbits, vdup_n_u8(0));
|
||||||
|
uint8x8_t row5_nbits_gt0 = vcgt_u8(row5_nbits, vdup_n_u8(0));
|
||||||
|
uint8x8_t row6_nbits_gt0 = vcgt_u8(row6_nbits, vdup_n_u8(0));
|
||||||
|
uint8x8_t row7_nbits_gt0 = vcgt_u8(row7_nbits, vdup_n_u8(0));
|
||||||
|
|
||||||
|
/* { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 } */
|
||||||
|
const uint8x8_t bitmap_mask =
|
||||||
|
vreinterpret_u8_u64(vmov_n_u64(0x0102040810204080));
|
||||||
|
|
||||||
|
row0_nbits_gt0 = vand_u8(row0_nbits_gt0, bitmap_mask);
|
||||||
|
row1_nbits_gt0 = vand_u8(row1_nbits_gt0, bitmap_mask);
|
||||||
|
row2_nbits_gt0 = vand_u8(row2_nbits_gt0, bitmap_mask);
|
||||||
|
row3_nbits_gt0 = vand_u8(row3_nbits_gt0, bitmap_mask);
|
||||||
|
row4_nbits_gt0 = vand_u8(row4_nbits_gt0, bitmap_mask);
|
||||||
|
row5_nbits_gt0 = vand_u8(row5_nbits_gt0, bitmap_mask);
|
||||||
|
row6_nbits_gt0 = vand_u8(row6_nbits_gt0, bitmap_mask);
|
||||||
|
row7_nbits_gt0 = vand_u8(row7_nbits_gt0, bitmap_mask);
|
||||||
|
|
||||||
|
uint8x8_t bitmap_rows_10 = vpadd_u8(row1_nbits_gt0, row0_nbits_gt0);
|
||||||
|
uint8x8_t bitmap_rows_32 = vpadd_u8(row3_nbits_gt0, row2_nbits_gt0);
|
||||||
|
uint8x8_t bitmap_rows_54 = vpadd_u8(row5_nbits_gt0, row4_nbits_gt0);
|
||||||
|
uint8x8_t bitmap_rows_76 = vpadd_u8(row7_nbits_gt0, row6_nbits_gt0);
|
||||||
|
uint8x8_t bitmap_rows_3210 = vpadd_u8(bitmap_rows_32, bitmap_rows_10);
|
||||||
|
uint8x8_t bitmap_rows_7654 = vpadd_u8(bitmap_rows_76, bitmap_rows_54);
|
||||||
|
uint8x8_t bitmap = vpadd_u8(bitmap_rows_7654, bitmap_rows_3210);
|
||||||
|
|
||||||
|
/* Shift left to remove DC bit. */
|
||||||
|
bitmap = vreinterpret_u8_u64(vshl_n_u64(vreinterpret_u64_u8(bitmap), 1));
|
||||||
|
/* Move bitmap to 32-bit scalar registers. */
|
||||||
|
uint32_t bitmap_1_32 = vget_lane_u32(vreinterpret_u32_u8(bitmap), 1);
|
||||||
|
uint32_t bitmap_33_63 = vget_lane_u32(vreinterpret_u32_u8(bitmap), 0);
|
||||||
|
|
||||||
|
/* Set up state and bit buffer for output bitstream. */
|
||||||
|
working_state *state_ptr = (working_state *)state;
|
||||||
|
int free_bits = state_ptr->cur.free_bits;
|
||||||
|
size_t put_buffer = state_ptr->cur.put_buffer;
|
||||||
|
|
||||||
|
/* Encode DC coefficient. */
|
||||||
|
|
||||||
|
unsigned int nbits = block_nbits[0];
|
||||||
|
/* Emit Huffman-coded symbol and additional diff bits. */
|
||||||
|
unsigned int diff = block_diff[0];
|
||||||
|
PUT_CODE(dctbl->ehufco[nbits], dctbl->ehufsi[nbits], diff)
|
||||||
|
|
||||||
|
/* Encode AC coefficients. */
|
||||||
|
|
||||||
|
unsigned int r = 0; /* r = run length of zeros */
|
||||||
|
unsigned int i = 1; /* i = number of coefficients encoded */
|
||||||
|
/* Code and size information for a run length of 16 zero coefficients */
|
||||||
|
const unsigned int code_0xf0 = actbl->ehufco[0xf0];
|
||||||
|
const unsigned int size_0xf0 = actbl->ehufsi[0xf0];
|
||||||
|
|
||||||
|
while (bitmap_1_32 != 0) {
|
||||||
|
r = BUILTIN_CLZ(bitmap_1_32);
|
||||||
|
i += r;
|
||||||
|
bitmap_1_32 <<= r;
|
||||||
|
nbits = block_nbits[i];
|
||||||
|
diff = block_diff[i];
|
||||||
|
while (r > 15) {
|
||||||
|
/* If run length > 15, emit special run-length-16 codes. */
|
||||||
|
PUT_BITS(code_0xf0, size_0xf0)
|
||||||
|
r -= 16;
|
||||||
|
}
|
||||||
|
/* Emit Huffman symbol for run length / number of bits. (F.1.2.2.1) */
|
||||||
|
unsigned int rs = (r << 4) + nbits;
|
||||||
|
PUT_CODE(actbl->ehufco[rs], actbl->ehufsi[rs], diff)
|
||||||
|
i++;
|
||||||
|
bitmap_1_32 <<= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
r = 33 - i;
|
||||||
|
i = 33;
|
||||||
|
|
||||||
|
while (bitmap_33_63 != 0) {
|
||||||
|
unsigned int leading_zeros = BUILTIN_CLZ(bitmap_33_63);
|
||||||
|
r += leading_zeros;
|
||||||
|
i += leading_zeros;
|
||||||
|
bitmap_33_63 <<= leading_zeros;
|
||||||
|
nbits = block_nbits[i];
|
||||||
|
diff = block_diff[i];
|
||||||
|
while (r > 15) {
|
||||||
|
/* If run length > 15, emit special run-length-16 codes. */
|
||||||
|
PUT_BITS(code_0xf0, size_0xf0)
|
||||||
|
r -= 16;
|
||||||
|
}
|
||||||
|
/* Emit Huffman symbol for run length / number of bits. (F.1.2.2.1) */
|
||||||
|
unsigned int rs = (r << 4) + nbits;
|
||||||
|
PUT_CODE(actbl->ehufco[rs], actbl->ehufsi[rs], diff)
|
||||||
|
r = 0;
|
||||||
|
i++;
|
||||||
|
bitmap_33_63 <<= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If the last coefficient(s) were zero, emit an end-of-block (EOB) code.
|
||||||
|
* The value of RS for the EOB code is 0.
|
||||||
|
*/
|
||||||
|
if (i != 64) {
|
||||||
|
PUT_BITS(actbl->ehufco[0], actbl->ehufsi[0])
|
||||||
|
}
|
||||||
|
|
||||||
|
state_ptr->cur.put_buffer = put_buffer;
|
||||||
|
state_ptr->cur.free_bits = free_bits;
|
||||||
|
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
+980
@@ -0,0 +1,980 @@
|
|||||||
|
/*
|
||||||
|
* jsimd_arm.c
|
||||||
|
*
|
||||||
|
* Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB
|
||||||
|
* Copyright (C) 2011, Nokia Corporation and/or its subsidiary(-ies).
|
||||||
|
* Copyright (C) 2009-2011, 2013-2014, 2016, 2018, 2022, D. R. Commander.
|
||||||
|
* Copyright (C) 2015-2016, 2018, Matthieu Darbois.
|
||||||
|
* Copyright (C) 2019, Google LLC.
|
||||||
|
* Copyright (C) 2020, Arm Limited.
|
||||||
|
*
|
||||||
|
* Based on the x86 SIMD extension for IJG JPEG library,
|
||||||
|
* Copyright (C) 1999-2006, MIYASAKA Masaru.
|
||||||
|
* For conditions of distribution and use, see copyright notice in jsimdext.inc
|
||||||
|
*
|
||||||
|
* This file contains the interface between the "normal" portions
|
||||||
|
* of the library and the SIMD implementations when running on a
|
||||||
|
* 32-bit Arm architecture.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define JPEG_INTERNALS
|
||||||
|
#include "../../../jinclude.h"
|
||||||
|
#include "../../../jpeglib.h"
|
||||||
|
#include "../../../jsimd.h"
|
||||||
|
#include "../../../jdct.h"
|
||||||
|
#include "../../../jsimddct.h"
|
||||||
|
#include "../../jsimd.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
|
static unsigned int simd_support = ~0;
|
||||||
|
static unsigned int simd_huffman = 1;
|
||||||
|
|
||||||
|
#if !defined(__ARM_NEON__) && (defined(__linux__) || defined(ANDROID) || defined(__ANDROID__))
|
||||||
|
|
||||||
|
#define SOMEWHAT_SANE_PROC_CPUINFO_SIZE_LIMIT (1024 * 1024)
|
||||||
|
|
||||||
|
LOCAL(int)
|
||||||
|
check_feature(char *buffer, char *feature)
|
||||||
|
{
|
||||||
|
char *p;
|
||||||
|
|
||||||
|
if (*feature == 0)
|
||||||
|
return 0;
|
||||||
|
if (strncmp(buffer, "Features", 8) != 0)
|
||||||
|
return 0;
|
||||||
|
buffer += 8;
|
||||||
|
while (isspace(*buffer))
|
||||||
|
buffer++;
|
||||||
|
|
||||||
|
/* Check if 'feature' is present in the buffer as a separate word */
|
||||||
|
while ((p = strstr(buffer, feature))) {
|
||||||
|
if (p > buffer && !isspace(*(p - 1))) {
|
||||||
|
buffer++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
p += strlen(feature);
|
||||||
|
if (*p != 0 && !isspace(*p)) {
|
||||||
|
buffer++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
LOCAL(int)
|
||||||
|
parse_proc_cpuinfo(int bufsize)
|
||||||
|
{
|
||||||
|
char *buffer = (char *)malloc(bufsize);
|
||||||
|
FILE *fd;
|
||||||
|
|
||||||
|
simd_support = 0;
|
||||||
|
|
||||||
|
if (!buffer)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
fd = fopen("/proc/cpuinfo", "r");
|
||||||
|
if (fd) {
|
||||||
|
while (fgets(buffer, bufsize, fd)) {
|
||||||
|
if (!strchr(buffer, '\n') && !feof(fd)) {
|
||||||
|
/* "impossible" happened - insufficient size of the buffer! */
|
||||||
|
fclose(fd);
|
||||||
|
free(buffer);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (check_feature(buffer, "neon"))
|
||||||
|
simd_support |= JSIMD_NEON;
|
||||||
|
}
|
||||||
|
fclose(fd);
|
||||||
|
}
|
||||||
|
free(buffer);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check what SIMD accelerations are supported.
|
||||||
|
*
|
||||||
|
* FIXME: This code is racy under a multi-threaded environment.
|
||||||
|
*/
|
||||||
|
LOCAL(void)
|
||||||
|
init_simd(void)
|
||||||
|
{
|
||||||
|
#ifndef NO_GETENV
|
||||||
|
char env[2] = { 0 };
|
||||||
|
#endif
|
||||||
|
#if !defined(__ARM_NEON__) && (defined(__linux__) || defined(ANDROID) || defined(__ANDROID__))
|
||||||
|
int bufsize = 1024; /* an initial guess for the line buffer size limit */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (simd_support != ~0U)
|
||||||
|
return;
|
||||||
|
|
||||||
|
simd_support = 0;
|
||||||
|
|
||||||
|
#if defined(__ARM_NEON__)
|
||||||
|
simd_support |= JSIMD_NEON;
|
||||||
|
#elif defined(__linux__) || defined(ANDROID) || defined(__ANDROID__)
|
||||||
|
/* We still have a chance to use Neon regardless of globally used
|
||||||
|
* -mcpu/-mfpu options passed to gcc by performing runtime detection via
|
||||||
|
* /proc/cpuinfo parsing on linux/android */
|
||||||
|
while (!parse_proc_cpuinfo(bufsize)) {
|
||||||
|
bufsize *= 2;
|
||||||
|
if (bufsize > SOMEWHAT_SANE_PROC_CPUINFO_SIZE_LIMIT)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef NO_GETENV
|
||||||
|
/* Force different settings through environment variables */
|
||||||
|
if (!GETENV_S(env, 2, "JSIMD_FORCENEON") && !strcmp(env, "1"))
|
||||||
|
simd_support = JSIMD_NEON;
|
||||||
|
if (!GETENV_S(env, 2, "JSIMD_FORCENONE") && !strcmp(env, "1"))
|
||||||
|
simd_support = 0;
|
||||||
|
if (!GETENV_S(env, 2, "JSIMD_NOHUFFENC") && !strcmp(env, "1"))
|
||||||
|
simd_huffman = 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(int)
|
||||||
|
jsimd_can_rgb_ycc(void)
|
||||||
|
{
|
||||||
|
init_simd();
|
||||||
|
|
||||||
|
/* The code is optimised for these values only */
|
||||||
|
if (BITS_IN_JSAMPLE != 8)
|
||||||
|
return 0;
|
||||||
|
if (sizeof(JDIMENSION) != 4)
|
||||||
|
return 0;
|
||||||
|
if ((RGB_PIXELSIZE != 3) && (RGB_PIXELSIZE != 4))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (simd_support & JSIMD_NEON)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(int)
|
||||||
|
jsimd_can_rgb_gray(void)
|
||||||
|
{
|
||||||
|
init_simd();
|
||||||
|
|
||||||
|
/* The code is optimised for these values only */
|
||||||
|
if (BITS_IN_JSAMPLE != 8)
|
||||||
|
return 0;
|
||||||
|
if (sizeof(JDIMENSION) != 4)
|
||||||
|
return 0;
|
||||||
|
if ((RGB_PIXELSIZE != 3) && (RGB_PIXELSIZE != 4))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (simd_support & JSIMD_NEON)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(int)
|
||||||
|
jsimd_can_ycc_rgb(void)
|
||||||
|
{
|
||||||
|
init_simd();
|
||||||
|
|
||||||
|
/* The code is optimised for these values only */
|
||||||
|
if (BITS_IN_JSAMPLE != 8)
|
||||||
|
return 0;
|
||||||
|
if (sizeof(JDIMENSION) != 4)
|
||||||
|
return 0;
|
||||||
|
if ((RGB_PIXELSIZE != 3) && (RGB_PIXELSIZE != 4))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (simd_support & JSIMD_NEON)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(int)
|
||||||
|
jsimd_can_ycc_rgb565(void)
|
||||||
|
{
|
||||||
|
init_simd();
|
||||||
|
|
||||||
|
/* The code is optimised for these values only */
|
||||||
|
if (BITS_IN_JSAMPLE != 8)
|
||||||
|
return 0;
|
||||||
|
if (sizeof(JDIMENSION) != 4)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (simd_support & JSIMD_NEON)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(void)
|
||||||
|
jsimd_rgb_ycc_convert(j_compress_ptr cinfo, JSAMPARRAY input_buf,
|
||||||
|
JSAMPIMAGE output_buf, JDIMENSION output_row,
|
||||||
|
int num_rows)
|
||||||
|
{
|
||||||
|
void (*neonfct) (JDIMENSION, JSAMPARRAY, JSAMPIMAGE, JDIMENSION, int);
|
||||||
|
|
||||||
|
switch (cinfo->in_color_space) {
|
||||||
|
case JCS_EXT_RGB:
|
||||||
|
neonfct = jsimd_extrgb_ycc_convert_neon;
|
||||||
|
break;
|
||||||
|
case JCS_EXT_RGBX:
|
||||||
|
case JCS_EXT_RGBA:
|
||||||
|
neonfct = jsimd_extrgbx_ycc_convert_neon;
|
||||||
|
break;
|
||||||
|
case JCS_EXT_BGR:
|
||||||
|
neonfct = jsimd_extbgr_ycc_convert_neon;
|
||||||
|
break;
|
||||||
|
case JCS_EXT_BGRX:
|
||||||
|
case JCS_EXT_BGRA:
|
||||||
|
neonfct = jsimd_extbgrx_ycc_convert_neon;
|
||||||
|
break;
|
||||||
|
case JCS_EXT_XBGR:
|
||||||
|
case JCS_EXT_ABGR:
|
||||||
|
neonfct = jsimd_extxbgr_ycc_convert_neon;
|
||||||
|
break;
|
||||||
|
case JCS_EXT_XRGB:
|
||||||
|
case JCS_EXT_ARGB:
|
||||||
|
neonfct = jsimd_extxrgb_ycc_convert_neon;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
neonfct = jsimd_extrgb_ycc_convert_neon;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
neonfct(cinfo->image_width, input_buf, output_buf, output_row, num_rows);
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(void)
|
||||||
|
jsimd_rgb_gray_convert(j_compress_ptr cinfo, JSAMPARRAY input_buf,
|
||||||
|
JSAMPIMAGE output_buf, JDIMENSION output_row,
|
||||||
|
int num_rows)
|
||||||
|
{
|
||||||
|
void (*neonfct) (JDIMENSION, JSAMPARRAY, JSAMPIMAGE, JDIMENSION, int);
|
||||||
|
|
||||||
|
switch (cinfo->in_color_space) {
|
||||||
|
case JCS_EXT_RGB:
|
||||||
|
neonfct = jsimd_extrgb_gray_convert_neon;
|
||||||
|
break;
|
||||||
|
case JCS_EXT_RGBX:
|
||||||
|
case JCS_EXT_RGBA:
|
||||||
|
neonfct = jsimd_extrgbx_gray_convert_neon;
|
||||||
|
break;
|
||||||
|
case JCS_EXT_BGR:
|
||||||
|
neonfct = jsimd_extbgr_gray_convert_neon;
|
||||||
|
break;
|
||||||
|
case JCS_EXT_BGRX:
|
||||||
|
case JCS_EXT_BGRA:
|
||||||
|
neonfct = jsimd_extbgrx_gray_convert_neon;
|
||||||
|
break;
|
||||||
|
case JCS_EXT_XBGR:
|
||||||
|
case JCS_EXT_ABGR:
|
||||||
|
neonfct = jsimd_extxbgr_gray_convert_neon;
|
||||||
|
break;
|
||||||
|
case JCS_EXT_XRGB:
|
||||||
|
case JCS_EXT_ARGB:
|
||||||
|
neonfct = jsimd_extxrgb_gray_convert_neon;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
neonfct = jsimd_extrgb_gray_convert_neon;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
neonfct(cinfo->image_width, input_buf, output_buf, output_row, num_rows);
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(void)
|
||||||
|
jsimd_ycc_rgb_convert(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
|
||||||
|
JDIMENSION input_row, JSAMPARRAY output_buf,
|
||||||
|
int num_rows)
|
||||||
|
{
|
||||||
|
void (*neonfct) (JDIMENSION, JSAMPIMAGE, JDIMENSION, JSAMPARRAY, int);
|
||||||
|
|
||||||
|
switch (cinfo->out_color_space) {
|
||||||
|
case JCS_EXT_RGB:
|
||||||
|
neonfct = jsimd_ycc_extrgb_convert_neon;
|
||||||
|
break;
|
||||||
|
case JCS_EXT_RGBX:
|
||||||
|
case JCS_EXT_RGBA:
|
||||||
|
neonfct = jsimd_ycc_extrgbx_convert_neon;
|
||||||
|
break;
|
||||||
|
case JCS_EXT_BGR:
|
||||||
|
neonfct = jsimd_ycc_extbgr_convert_neon;
|
||||||
|
break;
|
||||||
|
case JCS_EXT_BGRX:
|
||||||
|
case JCS_EXT_BGRA:
|
||||||
|
neonfct = jsimd_ycc_extbgrx_convert_neon;
|
||||||
|
break;
|
||||||
|
case JCS_EXT_XBGR:
|
||||||
|
case JCS_EXT_ABGR:
|
||||||
|
neonfct = jsimd_ycc_extxbgr_convert_neon;
|
||||||
|
break;
|
||||||
|
case JCS_EXT_XRGB:
|
||||||
|
case JCS_EXT_ARGB:
|
||||||
|
neonfct = jsimd_ycc_extxrgb_convert_neon;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
neonfct = jsimd_ycc_extrgb_convert_neon;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
neonfct(cinfo->output_width, input_buf, input_row, output_buf, num_rows);
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(void)
|
||||||
|
jsimd_ycc_rgb565_convert(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
|
||||||
|
JDIMENSION input_row, JSAMPARRAY output_buf,
|
||||||
|
int num_rows)
|
||||||
|
{
|
||||||
|
jsimd_ycc_rgb565_convert_neon(cinfo->output_width, input_buf, input_row,
|
||||||
|
output_buf, num_rows);
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(int)
|
||||||
|
jsimd_can_h2v2_downsample(void)
|
||||||
|
{
|
||||||
|
init_simd();
|
||||||
|
|
||||||
|
/* The code is optimised for these values only */
|
||||||
|
if (BITS_IN_JSAMPLE != 8)
|
||||||
|
return 0;
|
||||||
|
if (DCTSIZE != 8)
|
||||||
|
return 0;
|
||||||
|
if (sizeof(JDIMENSION) != 4)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (simd_support & JSIMD_NEON)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(int)
|
||||||
|
jsimd_can_h2v1_downsample(void)
|
||||||
|
{
|
||||||
|
init_simd();
|
||||||
|
|
||||||
|
/* The code is optimised for these values only */
|
||||||
|
if (BITS_IN_JSAMPLE != 8)
|
||||||
|
return 0;
|
||||||
|
if (DCTSIZE != 8)
|
||||||
|
return 0;
|
||||||
|
if (sizeof(JDIMENSION) != 4)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (simd_support & JSIMD_NEON)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(void)
|
||||||
|
jsimd_h2v2_downsample(j_compress_ptr cinfo, jpeg_component_info *compptr,
|
||||||
|
JSAMPARRAY input_data, JSAMPARRAY output_data)
|
||||||
|
{
|
||||||
|
jsimd_h2v2_downsample_neon(cinfo->image_width, cinfo->max_v_samp_factor,
|
||||||
|
compptr->v_samp_factor, compptr->width_in_blocks,
|
||||||
|
input_data, output_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(void)
|
||||||
|
jsimd_h2v1_downsample(j_compress_ptr cinfo, jpeg_component_info *compptr,
|
||||||
|
JSAMPARRAY input_data, JSAMPARRAY output_data)
|
||||||
|
{
|
||||||
|
jsimd_h2v1_downsample_neon(cinfo->image_width, cinfo->max_v_samp_factor,
|
||||||
|
compptr->v_samp_factor, compptr->width_in_blocks,
|
||||||
|
input_data, output_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(int)
|
||||||
|
jsimd_can_h2v2_upsample(void)
|
||||||
|
{
|
||||||
|
init_simd();
|
||||||
|
|
||||||
|
/* The code is optimised for these values only */
|
||||||
|
if (BITS_IN_JSAMPLE != 8)
|
||||||
|
return 0;
|
||||||
|
if (sizeof(JDIMENSION) != 4)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (simd_support & JSIMD_NEON)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(int)
|
||||||
|
jsimd_can_h2v1_upsample(void)
|
||||||
|
{
|
||||||
|
init_simd();
|
||||||
|
|
||||||
|
/* The code is optimised for these values only */
|
||||||
|
if (BITS_IN_JSAMPLE != 8)
|
||||||
|
return 0;
|
||||||
|
if (sizeof(JDIMENSION) != 4)
|
||||||
|
return 0;
|
||||||
|
if (simd_support & JSIMD_NEON)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(void)
|
||||||
|
jsimd_h2v2_upsample(j_decompress_ptr cinfo, jpeg_component_info *compptr,
|
||||||
|
JSAMPARRAY input_data, JSAMPARRAY *output_data_ptr)
|
||||||
|
{
|
||||||
|
jsimd_h2v2_upsample_neon(cinfo->max_v_samp_factor, cinfo->output_width,
|
||||||
|
input_data, output_data_ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(void)
|
||||||
|
jsimd_h2v1_upsample(j_decompress_ptr cinfo, jpeg_component_info *compptr,
|
||||||
|
JSAMPARRAY input_data, JSAMPARRAY *output_data_ptr)
|
||||||
|
{
|
||||||
|
jsimd_h2v1_upsample_neon(cinfo->max_v_samp_factor, cinfo->output_width,
|
||||||
|
input_data, output_data_ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(int)
|
||||||
|
jsimd_can_h2v2_fancy_upsample(void)
|
||||||
|
{
|
||||||
|
init_simd();
|
||||||
|
|
||||||
|
/* The code is optimised for these values only */
|
||||||
|
if (BITS_IN_JSAMPLE != 8)
|
||||||
|
return 0;
|
||||||
|
if (sizeof(JDIMENSION) != 4)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (simd_support & JSIMD_NEON)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(int)
|
||||||
|
jsimd_can_h2v1_fancy_upsample(void)
|
||||||
|
{
|
||||||
|
init_simd();
|
||||||
|
|
||||||
|
/* The code is optimised for these values only */
|
||||||
|
if (BITS_IN_JSAMPLE != 8)
|
||||||
|
return 0;
|
||||||
|
if (sizeof(JDIMENSION) != 4)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (simd_support & JSIMD_NEON)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(int)
|
||||||
|
jsimd_can_h1v2_fancy_upsample(void)
|
||||||
|
{
|
||||||
|
init_simd();
|
||||||
|
|
||||||
|
/* The code is optimised for these values only */
|
||||||
|
if (BITS_IN_JSAMPLE != 8)
|
||||||
|
return 0;
|
||||||
|
if (sizeof(JDIMENSION) != 4)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (simd_support & JSIMD_NEON)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(void)
|
||||||
|
jsimd_h2v2_fancy_upsample(j_decompress_ptr cinfo, jpeg_component_info *compptr,
|
||||||
|
JSAMPARRAY input_data, JSAMPARRAY *output_data_ptr)
|
||||||
|
{
|
||||||
|
jsimd_h2v2_fancy_upsample_neon(cinfo->max_v_samp_factor,
|
||||||
|
compptr->downsampled_width, input_data,
|
||||||
|
output_data_ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(void)
|
||||||
|
jsimd_h2v1_fancy_upsample(j_decompress_ptr cinfo, jpeg_component_info *compptr,
|
||||||
|
JSAMPARRAY input_data, JSAMPARRAY *output_data_ptr)
|
||||||
|
{
|
||||||
|
jsimd_h2v1_fancy_upsample_neon(cinfo->max_v_samp_factor,
|
||||||
|
compptr->downsampled_width, input_data,
|
||||||
|
output_data_ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(void)
|
||||||
|
jsimd_h1v2_fancy_upsample(j_decompress_ptr cinfo, jpeg_component_info *compptr,
|
||||||
|
JSAMPARRAY input_data, JSAMPARRAY *output_data_ptr)
|
||||||
|
{
|
||||||
|
jsimd_h1v2_fancy_upsample_neon(cinfo->max_v_samp_factor,
|
||||||
|
compptr->downsampled_width, input_data,
|
||||||
|
output_data_ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(int)
|
||||||
|
jsimd_can_h2v2_merged_upsample(void)
|
||||||
|
{
|
||||||
|
init_simd();
|
||||||
|
|
||||||
|
/* The code is optimised for these values only */
|
||||||
|
if (BITS_IN_JSAMPLE != 8)
|
||||||
|
return 0;
|
||||||
|
if (sizeof(JDIMENSION) != 4)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (simd_support & JSIMD_NEON)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(int)
|
||||||
|
jsimd_can_h2v1_merged_upsample(void)
|
||||||
|
{
|
||||||
|
init_simd();
|
||||||
|
|
||||||
|
/* The code is optimised for these values only */
|
||||||
|
if (BITS_IN_JSAMPLE != 8)
|
||||||
|
return 0;
|
||||||
|
if (sizeof(JDIMENSION) != 4)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (simd_support & JSIMD_NEON)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(void)
|
||||||
|
jsimd_h2v2_merged_upsample(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
|
||||||
|
JDIMENSION in_row_group_ctr, JSAMPARRAY output_buf)
|
||||||
|
{
|
||||||
|
void (*neonfct) (JDIMENSION, JSAMPIMAGE, JDIMENSION, JSAMPARRAY);
|
||||||
|
|
||||||
|
switch (cinfo->out_color_space) {
|
||||||
|
case JCS_EXT_RGB:
|
||||||
|
neonfct = jsimd_h2v2_extrgb_merged_upsample_neon;
|
||||||
|
break;
|
||||||
|
case JCS_EXT_RGBX:
|
||||||
|
case JCS_EXT_RGBA:
|
||||||
|
neonfct = jsimd_h2v2_extrgbx_merged_upsample_neon;
|
||||||
|
break;
|
||||||
|
case JCS_EXT_BGR:
|
||||||
|
neonfct = jsimd_h2v2_extbgr_merged_upsample_neon;
|
||||||
|
break;
|
||||||
|
case JCS_EXT_BGRX:
|
||||||
|
case JCS_EXT_BGRA:
|
||||||
|
neonfct = jsimd_h2v2_extbgrx_merged_upsample_neon;
|
||||||
|
break;
|
||||||
|
case JCS_EXT_XBGR:
|
||||||
|
case JCS_EXT_ABGR:
|
||||||
|
neonfct = jsimd_h2v2_extxbgr_merged_upsample_neon;
|
||||||
|
break;
|
||||||
|
case JCS_EXT_XRGB:
|
||||||
|
case JCS_EXT_ARGB:
|
||||||
|
neonfct = jsimd_h2v2_extxrgb_merged_upsample_neon;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
neonfct = jsimd_h2v2_extrgb_merged_upsample_neon;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
neonfct(cinfo->output_width, input_buf, in_row_group_ctr, output_buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(void)
|
||||||
|
jsimd_h2v1_merged_upsample(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
|
||||||
|
JDIMENSION in_row_group_ctr, JSAMPARRAY output_buf)
|
||||||
|
{
|
||||||
|
void (*neonfct) (JDIMENSION, JSAMPIMAGE, JDIMENSION, JSAMPARRAY);
|
||||||
|
|
||||||
|
switch (cinfo->out_color_space) {
|
||||||
|
case JCS_EXT_RGB:
|
||||||
|
neonfct = jsimd_h2v1_extrgb_merged_upsample_neon;
|
||||||
|
break;
|
||||||
|
case JCS_EXT_RGBX:
|
||||||
|
case JCS_EXT_RGBA:
|
||||||
|
neonfct = jsimd_h2v1_extrgbx_merged_upsample_neon;
|
||||||
|
break;
|
||||||
|
case JCS_EXT_BGR:
|
||||||
|
neonfct = jsimd_h2v1_extbgr_merged_upsample_neon;
|
||||||
|
break;
|
||||||
|
case JCS_EXT_BGRX:
|
||||||
|
case JCS_EXT_BGRA:
|
||||||
|
neonfct = jsimd_h2v1_extbgrx_merged_upsample_neon;
|
||||||
|
break;
|
||||||
|
case JCS_EXT_XBGR:
|
||||||
|
case JCS_EXT_ABGR:
|
||||||
|
neonfct = jsimd_h2v1_extxbgr_merged_upsample_neon;
|
||||||
|
break;
|
||||||
|
case JCS_EXT_XRGB:
|
||||||
|
case JCS_EXT_ARGB:
|
||||||
|
neonfct = jsimd_h2v1_extxrgb_merged_upsample_neon;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
neonfct = jsimd_h2v1_extrgb_merged_upsample_neon;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
neonfct(cinfo->output_width, input_buf, in_row_group_ctr, output_buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(int)
|
||||||
|
jsimd_can_convsamp(void)
|
||||||
|
{
|
||||||
|
init_simd();
|
||||||
|
|
||||||
|
/* The code is optimised for these values only */
|
||||||
|
if (DCTSIZE != 8)
|
||||||
|
return 0;
|
||||||
|
if (BITS_IN_JSAMPLE != 8)
|
||||||
|
return 0;
|
||||||
|
if (sizeof(JDIMENSION) != 4)
|
||||||
|
return 0;
|
||||||
|
if (sizeof(DCTELEM) != 2)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (simd_support & JSIMD_NEON)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(int)
|
||||||
|
jsimd_can_convsamp_float(void)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(void)
|
||||||
|
jsimd_convsamp(JSAMPARRAY sample_data, JDIMENSION start_col,
|
||||||
|
DCTELEM *workspace)
|
||||||
|
{
|
||||||
|
jsimd_convsamp_neon(sample_data, start_col, workspace);
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(void)
|
||||||
|
jsimd_convsamp_float(JSAMPARRAY sample_data, JDIMENSION start_col,
|
||||||
|
FAST_FLOAT *workspace)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(int)
|
||||||
|
jsimd_can_fdct_islow(void)
|
||||||
|
{
|
||||||
|
init_simd();
|
||||||
|
|
||||||
|
/* The code is optimised for these values only */
|
||||||
|
if (DCTSIZE != 8)
|
||||||
|
return 0;
|
||||||
|
if (sizeof(DCTELEM) != 2)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (simd_support & JSIMD_NEON)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(int)
|
||||||
|
jsimd_can_fdct_ifast(void)
|
||||||
|
{
|
||||||
|
init_simd();
|
||||||
|
|
||||||
|
/* The code is optimised for these values only */
|
||||||
|
if (DCTSIZE != 8)
|
||||||
|
return 0;
|
||||||
|
if (sizeof(DCTELEM) != 2)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (simd_support & JSIMD_NEON)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(int)
|
||||||
|
jsimd_can_fdct_float(void)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(void)
|
||||||
|
jsimd_fdct_islow(DCTELEM *data)
|
||||||
|
{
|
||||||
|
jsimd_fdct_islow_neon(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(void)
|
||||||
|
jsimd_fdct_ifast(DCTELEM *data)
|
||||||
|
{
|
||||||
|
jsimd_fdct_ifast_neon(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(void)
|
||||||
|
jsimd_fdct_float(FAST_FLOAT *data)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(int)
|
||||||
|
jsimd_can_quantize(void)
|
||||||
|
{
|
||||||
|
init_simd();
|
||||||
|
|
||||||
|
/* The code is optimised for these values only */
|
||||||
|
if (DCTSIZE != 8)
|
||||||
|
return 0;
|
||||||
|
if (sizeof(JCOEF) != 2)
|
||||||
|
return 0;
|
||||||
|
if (sizeof(DCTELEM) != 2)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (simd_support & JSIMD_NEON)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(int)
|
||||||
|
jsimd_can_quantize_float(void)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(void)
|
||||||
|
jsimd_quantize(JCOEFPTR coef_block, DCTELEM *divisors, DCTELEM *workspace)
|
||||||
|
{
|
||||||
|
jsimd_quantize_neon(coef_block, divisors, workspace);
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(void)
|
||||||
|
jsimd_quantize_float(JCOEFPTR coef_block, FAST_FLOAT *divisors,
|
||||||
|
FAST_FLOAT *workspace)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(int)
|
||||||
|
jsimd_can_idct_2x2(void)
|
||||||
|
{
|
||||||
|
init_simd();
|
||||||
|
|
||||||
|
/* The code is optimised for these values only */
|
||||||
|
if (DCTSIZE != 8)
|
||||||
|
return 0;
|
||||||
|
if (sizeof(JCOEF) != 2)
|
||||||
|
return 0;
|
||||||
|
if (BITS_IN_JSAMPLE != 8)
|
||||||
|
return 0;
|
||||||
|
if (sizeof(JDIMENSION) != 4)
|
||||||
|
return 0;
|
||||||
|
if (sizeof(ISLOW_MULT_TYPE) != 2)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (simd_support & JSIMD_NEON)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(int)
|
||||||
|
jsimd_can_idct_4x4(void)
|
||||||
|
{
|
||||||
|
init_simd();
|
||||||
|
|
||||||
|
/* The code is optimised for these values only */
|
||||||
|
if (DCTSIZE != 8)
|
||||||
|
return 0;
|
||||||
|
if (sizeof(JCOEF) != 2)
|
||||||
|
return 0;
|
||||||
|
if (BITS_IN_JSAMPLE != 8)
|
||||||
|
return 0;
|
||||||
|
if (sizeof(JDIMENSION) != 4)
|
||||||
|
return 0;
|
||||||
|
if (sizeof(ISLOW_MULT_TYPE) != 2)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (simd_support & JSIMD_NEON)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(void)
|
||||||
|
jsimd_idct_2x2(j_decompress_ptr cinfo, jpeg_component_info *compptr,
|
||||||
|
JCOEFPTR coef_block, JSAMPARRAY output_buf,
|
||||||
|
JDIMENSION output_col)
|
||||||
|
{
|
||||||
|
jsimd_idct_2x2_neon(compptr->dct_table, coef_block, output_buf, output_col);
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(void)
|
||||||
|
jsimd_idct_4x4(j_decompress_ptr cinfo, jpeg_component_info *compptr,
|
||||||
|
JCOEFPTR coef_block, JSAMPARRAY output_buf,
|
||||||
|
JDIMENSION output_col)
|
||||||
|
{
|
||||||
|
jsimd_idct_4x4_neon(compptr->dct_table, coef_block, output_buf, output_col);
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(int)
|
||||||
|
jsimd_can_idct_islow(void)
|
||||||
|
{
|
||||||
|
init_simd();
|
||||||
|
|
||||||
|
/* The code is optimised for these values only */
|
||||||
|
if (DCTSIZE != 8)
|
||||||
|
return 0;
|
||||||
|
if (sizeof(JCOEF) != 2)
|
||||||
|
return 0;
|
||||||
|
if (BITS_IN_JSAMPLE != 8)
|
||||||
|
return 0;
|
||||||
|
if (sizeof(JDIMENSION) != 4)
|
||||||
|
return 0;
|
||||||
|
if (sizeof(ISLOW_MULT_TYPE) != 2)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (simd_support & JSIMD_NEON)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(int)
|
||||||
|
jsimd_can_idct_ifast(void)
|
||||||
|
{
|
||||||
|
init_simd();
|
||||||
|
|
||||||
|
/* The code is optimised for these values only */
|
||||||
|
if (DCTSIZE != 8)
|
||||||
|
return 0;
|
||||||
|
if (sizeof(JCOEF) != 2)
|
||||||
|
return 0;
|
||||||
|
if (BITS_IN_JSAMPLE != 8)
|
||||||
|
return 0;
|
||||||
|
if (sizeof(JDIMENSION) != 4)
|
||||||
|
return 0;
|
||||||
|
if (sizeof(IFAST_MULT_TYPE) != 2)
|
||||||
|
return 0;
|
||||||
|
if (IFAST_SCALE_BITS != 2)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (simd_support & JSIMD_NEON)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(int)
|
||||||
|
jsimd_can_idct_float(void)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(void)
|
||||||
|
jsimd_idct_islow(j_decompress_ptr cinfo, jpeg_component_info *compptr,
|
||||||
|
JCOEFPTR coef_block, JSAMPARRAY output_buf,
|
||||||
|
JDIMENSION output_col)
|
||||||
|
{
|
||||||
|
jsimd_idct_islow_neon(compptr->dct_table, coef_block, output_buf,
|
||||||
|
output_col);
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(void)
|
||||||
|
jsimd_idct_ifast(j_decompress_ptr cinfo, jpeg_component_info *compptr,
|
||||||
|
JCOEFPTR coef_block, JSAMPARRAY output_buf,
|
||||||
|
JDIMENSION output_col)
|
||||||
|
{
|
||||||
|
jsimd_idct_ifast_neon(compptr->dct_table, coef_block, output_buf,
|
||||||
|
output_col);
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(void)
|
||||||
|
jsimd_idct_float(j_decompress_ptr cinfo, jpeg_component_info *compptr,
|
||||||
|
JCOEFPTR coef_block, JSAMPARRAY output_buf,
|
||||||
|
JDIMENSION output_col)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(int)
|
||||||
|
jsimd_can_huff_encode_one_block(void)
|
||||||
|
{
|
||||||
|
init_simd();
|
||||||
|
|
||||||
|
if (DCTSIZE != 8)
|
||||||
|
return 0;
|
||||||
|
if (sizeof(JCOEF) != 2)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (simd_support & JSIMD_NEON && simd_huffman)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(JOCTET *)
|
||||||
|
jsimd_huff_encode_one_block(void *state, JOCTET *buffer, JCOEFPTR block,
|
||||||
|
int last_dc_val, c_derived_tbl *dctbl,
|
||||||
|
c_derived_tbl *actbl)
|
||||||
|
{
|
||||||
|
return jsimd_huff_encode_one_block_neon(state, buffer, block, last_dc_val,
|
||||||
|
dctbl, actbl);
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(int)
|
||||||
|
jsimd_can_encode_mcu_AC_first_prepare(void)
|
||||||
|
{
|
||||||
|
init_simd();
|
||||||
|
|
||||||
|
if (DCTSIZE != 8)
|
||||||
|
return 0;
|
||||||
|
if (sizeof(JCOEF) != 2)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (simd_support & JSIMD_NEON)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(void)
|
||||||
|
jsimd_encode_mcu_AC_first_prepare(const JCOEF *block,
|
||||||
|
const int *jpeg_natural_order_start, int Sl,
|
||||||
|
int Al, JCOEF *values, size_t *zerobits)
|
||||||
|
{
|
||||||
|
jsimd_encode_mcu_AC_first_prepare_neon(block, jpeg_natural_order_start,
|
||||||
|
Sl, Al, values, zerobits);
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(int)
|
||||||
|
jsimd_can_encode_mcu_AC_refine_prepare(void)
|
||||||
|
{
|
||||||
|
init_simd();
|
||||||
|
|
||||||
|
if (DCTSIZE != 8)
|
||||||
|
return 0;
|
||||||
|
if (sizeof(JCOEF) != 2)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (simd_support & JSIMD_NEON)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL(int)
|
||||||
|
jsimd_encode_mcu_AC_refine_prepare(const JCOEF *block,
|
||||||
|
const int *jpeg_natural_order_start, int Sl,
|
||||||
|
int Al, JCOEF *absvalues, size_t *bits)
|
||||||
|
{
|
||||||
|
return jsimd_encode_mcu_AC_refine_prepare_neon(block,
|
||||||
|
jpeg_natural_order_start, Sl,
|
||||||
|
Al, absvalues, bits);
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,316 @@
|
|||||||
|
/*
|
||||||
|
* jccolext-neon.c - colorspace conversion (64-bit Arm Neon)
|
||||||
|
*
|
||||||
|
* Copyright (C) 2020, Arm Limited. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* This software is provided 'as-is', without any express or implied
|
||||||
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
* arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose,
|
||||||
|
* including commercial applications, and to alter it and redistribute it
|
||||||
|
* freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
* claim that you wrote the original software. If you use this software
|
||||||
|
* in a product, an acknowledgment in the product documentation would be
|
||||||
|
* appreciated but is not required.
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
* misrepresented as being the original software.
|
||||||
|
* 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* This file is included by jccolor-neon.c */
|
||||||
|
|
||||||
|
|
||||||
|
/* RGB -> YCbCr conversion is defined by the following equations:
|
||||||
|
* Y = 0.29900 * R + 0.58700 * G + 0.11400 * B
|
||||||
|
* Cb = -0.16874 * R - 0.33126 * G + 0.50000 * B + 128
|
||||||
|
* Cr = 0.50000 * R - 0.41869 * G - 0.08131 * B + 128
|
||||||
|
*
|
||||||
|
* Avoid floating point arithmetic by using shifted integer constants:
|
||||||
|
* 0.29899597 = 19595 * 2^-16
|
||||||
|
* 0.58700561 = 38470 * 2^-16
|
||||||
|
* 0.11399841 = 7471 * 2^-16
|
||||||
|
* 0.16874695 = 11059 * 2^-16
|
||||||
|
* 0.33125305 = 21709 * 2^-16
|
||||||
|
* 0.50000000 = 32768 * 2^-16
|
||||||
|
* 0.41868592 = 27439 * 2^-16
|
||||||
|
* 0.08131409 = 5329 * 2^-16
|
||||||
|
* These constants are defined in jccolor-neon.c
|
||||||
|
*
|
||||||
|
* We add the fixed-point equivalent of 0.5 to Cb and Cr, which effectively
|
||||||
|
* rounds up or down the result via integer truncation.
|
||||||
|
*/
|
||||||
|
|
||||||
|
void jsimd_rgb_ycc_convert_neon(JDIMENSION image_width, JSAMPARRAY input_buf,
|
||||||
|
JSAMPIMAGE output_buf, JDIMENSION output_row,
|
||||||
|
int num_rows)
|
||||||
|
{
|
||||||
|
/* Pointer to RGB(X/A) input data */
|
||||||
|
JSAMPROW inptr;
|
||||||
|
/* Pointers to Y, Cb, and Cr output data */
|
||||||
|
JSAMPROW outptr0, outptr1, outptr2;
|
||||||
|
/* Allocate temporary buffer for final (image_width % 16) pixels in row. */
|
||||||
|
ALIGN(16) uint8_t tmp_buf[16 * RGB_PIXELSIZE];
|
||||||
|
|
||||||
|
/* Set up conversion constants. */
|
||||||
|
const uint16x8_t consts = vld1q_u16(jsimd_rgb_ycc_neon_consts);
|
||||||
|
const uint32x4_t scaled_128_5 = vdupq_n_u32((128 << 16) + 32767);
|
||||||
|
|
||||||
|
while (--num_rows >= 0) {
|
||||||
|
inptr = *input_buf++;
|
||||||
|
outptr0 = output_buf[0][output_row];
|
||||||
|
outptr1 = output_buf[1][output_row];
|
||||||
|
outptr2 = output_buf[2][output_row];
|
||||||
|
output_row++;
|
||||||
|
|
||||||
|
int cols_remaining = image_width;
|
||||||
|
for (; cols_remaining >= 16; cols_remaining -= 16) {
|
||||||
|
|
||||||
|
#if RGB_PIXELSIZE == 4
|
||||||
|
uint8x16x4_t input_pixels = vld4q_u8(inptr);
|
||||||
|
#else
|
||||||
|
uint8x16x3_t input_pixels = vld3q_u8(inptr);
|
||||||
|
#endif
|
||||||
|
uint16x8_t r_l = vmovl_u8(vget_low_u8(input_pixels.val[RGB_RED]));
|
||||||
|
uint16x8_t g_l = vmovl_u8(vget_low_u8(input_pixels.val[RGB_GREEN]));
|
||||||
|
uint16x8_t b_l = vmovl_u8(vget_low_u8(input_pixels.val[RGB_BLUE]));
|
||||||
|
uint16x8_t r_h = vmovl_u8(vget_high_u8(input_pixels.val[RGB_RED]));
|
||||||
|
uint16x8_t g_h = vmovl_u8(vget_high_u8(input_pixels.val[RGB_GREEN]));
|
||||||
|
uint16x8_t b_h = vmovl_u8(vget_high_u8(input_pixels.val[RGB_BLUE]));
|
||||||
|
|
||||||
|
/* Compute Y = 0.29900 * R + 0.58700 * G + 0.11400 * B */
|
||||||
|
uint32x4_t y_ll = vmull_laneq_u16(vget_low_u16(r_l), consts, 0);
|
||||||
|
y_ll = vmlal_laneq_u16(y_ll, vget_low_u16(g_l), consts, 1);
|
||||||
|
y_ll = vmlal_laneq_u16(y_ll, vget_low_u16(b_l), consts, 2);
|
||||||
|
uint32x4_t y_lh = vmull_laneq_u16(vget_high_u16(r_l), consts, 0);
|
||||||
|
y_lh = vmlal_laneq_u16(y_lh, vget_high_u16(g_l), consts, 1);
|
||||||
|
y_lh = vmlal_laneq_u16(y_lh, vget_high_u16(b_l), consts, 2);
|
||||||
|
uint32x4_t y_hl = vmull_laneq_u16(vget_low_u16(r_h), consts, 0);
|
||||||
|
y_hl = vmlal_laneq_u16(y_hl, vget_low_u16(g_h), consts, 1);
|
||||||
|
y_hl = vmlal_laneq_u16(y_hl, vget_low_u16(b_h), consts, 2);
|
||||||
|
uint32x4_t y_hh = vmull_laneq_u16(vget_high_u16(r_h), consts, 0);
|
||||||
|
y_hh = vmlal_laneq_u16(y_hh, vget_high_u16(g_h), consts, 1);
|
||||||
|
y_hh = vmlal_laneq_u16(y_hh, vget_high_u16(b_h), consts, 2);
|
||||||
|
|
||||||
|
/* Compute Cb = -0.16874 * R - 0.33126 * G + 0.50000 * B + 128 */
|
||||||
|
uint32x4_t cb_ll = scaled_128_5;
|
||||||
|
cb_ll = vmlsl_laneq_u16(cb_ll, vget_low_u16(r_l), consts, 3);
|
||||||
|
cb_ll = vmlsl_laneq_u16(cb_ll, vget_low_u16(g_l), consts, 4);
|
||||||
|
cb_ll = vmlal_laneq_u16(cb_ll, vget_low_u16(b_l), consts, 5);
|
||||||
|
uint32x4_t cb_lh = scaled_128_5;
|
||||||
|
cb_lh = vmlsl_laneq_u16(cb_lh, vget_high_u16(r_l), consts, 3);
|
||||||
|
cb_lh = vmlsl_laneq_u16(cb_lh, vget_high_u16(g_l), consts, 4);
|
||||||
|
cb_lh = vmlal_laneq_u16(cb_lh, vget_high_u16(b_l), consts, 5);
|
||||||
|
uint32x4_t cb_hl = scaled_128_5;
|
||||||
|
cb_hl = vmlsl_laneq_u16(cb_hl, vget_low_u16(r_h), consts, 3);
|
||||||
|
cb_hl = vmlsl_laneq_u16(cb_hl, vget_low_u16(g_h), consts, 4);
|
||||||
|
cb_hl = vmlal_laneq_u16(cb_hl, vget_low_u16(b_h), consts, 5);
|
||||||
|
uint32x4_t cb_hh = scaled_128_5;
|
||||||
|
cb_hh = vmlsl_laneq_u16(cb_hh, vget_high_u16(r_h), consts, 3);
|
||||||
|
cb_hh = vmlsl_laneq_u16(cb_hh, vget_high_u16(g_h), consts, 4);
|
||||||
|
cb_hh = vmlal_laneq_u16(cb_hh, vget_high_u16(b_h), consts, 5);
|
||||||
|
|
||||||
|
/* Compute Cr = 0.50000 * R - 0.41869 * G - 0.08131 * B + 128 */
|
||||||
|
uint32x4_t cr_ll = scaled_128_5;
|
||||||
|
cr_ll = vmlal_laneq_u16(cr_ll, vget_low_u16(r_l), consts, 5);
|
||||||
|
cr_ll = vmlsl_laneq_u16(cr_ll, vget_low_u16(g_l), consts, 6);
|
||||||
|
cr_ll = vmlsl_laneq_u16(cr_ll, vget_low_u16(b_l), consts, 7);
|
||||||
|
uint32x4_t cr_lh = scaled_128_5;
|
||||||
|
cr_lh = vmlal_laneq_u16(cr_lh, vget_high_u16(r_l), consts, 5);
|
||||||
|
cr_lh = vmlsl_laneq_u16(cr_lh, vget_high_u16(g_l), consts, 6);
|
||||||
|
cr_lh = vmlsl_laneq_u16(cr_lh, vget_high_u16(b_l), consts, 7);
|
||||||
|
uint32x4_t cr_hl = scaled_128_5;
|
||||||
|
cr_hl = vmlal_laneq_u16(cr_hl, vget_low_u16(r_h), consts, 5);
|
||||||
|
cr_hl = vmlsl_laneq_u16(cr_hl, vget_low_u16(g_h), consts, 6);
|
||||||
|
cr_hl = vmlsl_laneq_u16(cr_hl, vget_low_u16(b_h), consts, 7);
|
||||||
|
uint32x4_t cr_hh = scaled_128_5;
|
||||||
|
cr_hh = vmlal_laneq_u16(cr_hh, vget_high_u16(r_h), consts, 5);
|
||||||
|
cr_hh = vmlsl_laneq_u16(cr_hh, vget_high_u16(g_h), consts, 6);
|
||||||
|
cr_hh = vmlsl_laneq_u16(cr_hh, vget_high_u16(b_h), consts, 7);
|
||||||
|
|
||||||
|
/* Descale Y values (rounding right shift) and narrow to 16-bit. */
|
||||||
|
uint16x8_t y_l = vcombine_u16(vrshrn_n_u32(y_ll, 16),
|
||||||
|
vrshrn_n_u32(y_lh, 16));
|
||||||
|
uint16x8_t y_h = vcombine_u16(vrshrn_n_u32(y_hl, 16),
|
||||||
|
vrshrn_n_u32(y_hh, 16));
|
||||||
|
/* Descale Cb values (right shift) and narrow to 16-bit. */
|
||||||
|
uint16x8_t cb_l = vcombine_u16(vshrn_n_u32(cb_ll, 16),
|
||||||
|
vshrn_n_u32(cb_lh, 16));
|
||||||
|
uint16x8_t cb_h = vcombine_u16(vshrn_n_u32(cb_hl, 16),
|
||||||
|
vshrn_n_u32(cb_hh, 16));
|
||||||
|
/* Descale Cr values (right shift) and narrow to 16-bit. */
|
||||||
|
uint16x8_t cr_l = vcombine_u16(vshrn_n_u32(cr_ll, 16),
|
||||||
|
vshrn_n_u32(cr_lh, 16));
|
||||||
|
uint16x8_t cr_h = vcombine_u16(vshrn_n_u32(cr_hl, 16),
|
||||||
|
vshrn_n_u32(cr_hh, 16));
|
||||||
|
/* Narrow Y, Cb, and Cr values to 8-bit and store to memory. Buffer
|
||||||
|
* overwrite is permitted up to the next multiple of ALIGN_SIZE bytes.
|
||||||
|
*/
|
||||||
|
vst1q_u8(outptr0, vcombine_u8(vmovn_u16(y_l), vmovn_u16(y_h)));
|
||||||
|
vst1q_u8(outptr1, vcombine_u8(vmovn_u16(cb_l), vmovn_u16(cb_h)));
|
||||||
|
vst1q_u8(outptr2, vcombine_u8(vmovn_u16(cr_l), vmovn_u16(cr_h)));
|
||||||
|
|
||||||
|
/* Increment pointers. */
|
||||||
|
inptr += (16 * RGB_PIXELSIZE);
|
||||||
|
outptr0 += 16;
|
||||||
|
outptr1 += 16;
|
||||||
|
outptr2 += 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cols_remaining > 8) {
|
||||||
|
/* To prevent buffer overread by the vector load instructions, the last
|
||||||
|
* (image_width % 16) columns of data are first memcopied to a temporary
|
||||||
|
* buffer large enough to accommodate the vector load.
|
||||||
|
*/
|
||||||
|
memcpy(tmp_buf, inptr, cols_remaining * RGB_PIXELSIZE);
|
||||||
|
inptr = tmp_buf;
|
||||||
|
|
||||||
|
#if RGB_PIXELSIZE == 4
|
||||||
|
uint8x16x4_t input_pixels = vld4q_u8(inptr);
|
||||||
|
#else
|
||||||
|
uint8x16x3_t input_pixels = vld3q_u8(inptr);
|
||||||
|
#endif
|
||||||
|
uint16x8_t r_l = vmovl_u8(vget_low_u8(input_pixels.val[RGB_RED]));
|
||||||
|
uint16x8_t g_l = vmovl_u8(vget_low_u8(input_pixels.val[RGB_GREEN]));
|
||||||
|
uint16x8_t b_l = vmovl_u8(vget_low_u8(input_pixels.val[RGB_BLUE]));
|
||||||
|
uint16x8_t r_h = vmovl_u8(vget_high_u8(input_pixels.val[RGB_RED]));
|
||||||
|
uint16x8_t g_h = vmovl_u8(vget_high_u8(input_pixels.val[RGB_GREEN]));
|
||||||
|
uint16x8_t b_h = vmovl_u8(vget_high_u8(input_pixels.val[RGB_BLUE]));
|
||||||
|
|
||||||
|
/* Compute Y = 0.29900 * R + 0.58700 * G + 0.11400 * B */
|
||||||
|
uint32x4_t y_ll = vmull_laneq_u16(vget_low_u16(r_l), consts, 0);
|
||||||
|
y_ll = vmlal_laneq_u16(y_ll, vget_low_u16(g_l), consts, 1);
|
||||||
|
y_ll = vmlal_laneq_u16(y_ll, vget_low_u16(b_l), consts, 2);
|
||||||
|
uint32x4_t y_lh = vmull_laneq_u16(vget_high_u16(r_l), consts, 0);
|
||||||
|
y_lh = vmlal_laneq_u16(y_lh, vget_high_u16(g_l), consts, 1);
|
||||||
|
y_lh = vmlal_laneq_u16(y_lh, vget_high_u16(b_l), consts, 2);
|
||||||
|
uint32x4_t y_hl = vmull_laneq_u16(vget_low_u16(r_h), consts, 0);
|
||||||
|
y_hl = vmlal_laneq_u16(y_hl, vget_low_u16(g_h), consts, 1);
|
||||||
|
y_hl = vmlal_laneq_u16(y_hl, vget_low_u16(b_h), consts, 2);
|
||||||
|
uint32x4_t y_hh = vmull_laneq_u16(vget_high_u16(r_h), consts, 0);
|
||||||
|
y_hh = vmlal_laneq_u16(y_hh, vget_high_u16(g_h), consts, 1);
|
||||||
|
y_hh = vmlal_laneq_u16(y_hh, vget_high_u16(b_h), consts, 2);
|
||||||
|
|
||||||
|
/* Compute Cb = -0.16874 * R - 0.33126 * G + 0.50000 * B + 128 */
|
||||||
|
uint32x4_t cb_ll = scaled_128_5;
|
||||||
|
cb_ll = vmlsl_laneq_u16(cb_ll, vget_low_u16(r_l), consts, 3);
|
||||||
|
cb_ll = vmlsl_laneq_u16(cb_ll, vget_low_u16(g_l), consts, 4);
|
||||||
|
cb_ll = vmlal_laneq_u16(cb_ll, vget_low_u16(b_l), consts, 5);
|
||||||
|
uint32x4_t cb_lh = scaled_128_5;
|
||||||
|
cb_lh = vmlsl_laneq_u16(cb_lh, vget_high_u16(r_l), consts, 3);
|
||||||
|
cb_lh = vmlsl_laneq_u16(cb_lh, vget_high_u16(g_l), consts, 4);
|
||||||
|
cb_lh = vmlal_laneq_u16(cb_lh, vget_high_u16(b_l), consts, 5);
|
||||||
|
uint32x4_t cb_hl = scaled_128_5;
|
||||||
|
cb_hl = vmlsl_laneq_u16(cb_hl, vget_low_u16(r_h), consts, 3);
|
||||||
|
cb_hl = vmlsl_laneq_u16(cb_hl, vget_low_u16(g_h), consts, 4);
|
||||||
|
cb_hl = vmlal_laneq_u16(cb_hl, vget_low_u16(b_h), consts, 5);
|
||||||
|
uint32x4_t cb_hh = scaled_128_5;
|
||||||
|
cb_hh = vmlsl_laneq_u16(cb_hh, vget_high_u16(r_h), consts, 3);
|
||||||
|
cb_hh = vmlsl_laneq_u16(cb_hh, vget_high_u16(g_h), consts, 4);
|
||||||
|
cb_hh = vmlal_laneq_u16(cb_hh, vget_high_u16(b_h), consts, 5);
|
||||||
|
|
||||||
|
/* Compute Cr = 0.50000 * R - 0.41869 * G - 0.08131 * B + 128 */
|
||||||
|
uint32x4_t cr_ll = scaled_128_5;
|
||||||
|
cr_ll = vmlal_laneq_u16(cr_ll, vget_low_u16(r_l), consts, 5);
|
||||||
|
cr_ll = vmlsl_laneq_u16(cr_ll, vget_low_u16(g_l), consts, 6);
|
||||||
|
cr_ll = vmlsl_laneq_u16(cr_ll, vget_low_u16(b_l), consts, 7);
|
||||||
|
uint32x4_t cr_lh = scaled_128_5;
|
||||||
|
cr_lh = vmlal_laneq_u16(cr_lh, vget_high_u16(r_l), consts, 5);
|
||||||
|
cr_lh = vmlsl_laneq_u16(cr_lh, vget_high_u16(g_l), consts, 6);
|
||||||
|
cr_lh = vmlsl_laneq_u16(cr_lh, vget_high_u16(b_l), consts, 7);
|
||||||
|
uint32x4_t cr_hl = scaled_128_5;
|
||||||
|
cr_hl = vmlal_laneq_u16(cr_hl, vget_low_u16(r_h), consts, 5);
|
||||||
|
cr_hl = vmlsl_laneq_u16(cr_hl, vget_low_u16(g_h), consts, 6);
|
||||||
|
cr_hl = vmlsl_laneq_u16(cr_hl, vget_low_u16(b_h), consts, 7);
|
||||||
|
uint32x4_t cr_hh = scaled_128_5;
|
||||||
|
cr_hh = vmlal_laneq_u16(cr_hh, vget_high_u16(r_h), consts, 5);
|
||||||
|
cr_hh = vmlsl_laneq_u16(cr_hh, vget_high_u16(g_h), consts, 6);
|
||||||
|
cr_hh = vmlsl_laneq_u16(cr_hh, vget_high_u16(b_h), consts, 7);
|
||||||
|
|
||||||
|
/* Descale Y values (rounding right shift) and narrow to 16-bit. */
|
||||||
|
uint16x8_t y_l = vcombine_u16(vrshrn_n_u32(y_ll, 16),
|
||||||
|
vrshrn_n_u32(y_lh, 16));
|
||||||
|
uint16x8_t y_h = vcombine_u16(vrshrn_n_u32(y_hl, 16),
|
||||||
|
vrshrn_n_u32(y_hh, 16));
|
||||||
|
/* Descale Cb values (right shift) and narrow to 16-bit. */
|
||||||
|
uint16x8_t cb_l = vcombine_u16(vshrn_n_u32(cb_ll, 16),
|
||||||
|
vshrn_n_u32(cb_lh, 16));
|
||||||
|
uint16x8_t cb_h = vcombine_u16(vshrn_n_u32(cb_hl, 16),
|
||||||
|
vshrn_n_u32(cb_hh, 16));
|
||||||
|
/* Descale Cr values (right shift) and narrow to 16-bit. */
|
||||||
|
uint16x8_t cr_l = vcombine_u16(vshrn_n_u32(cr_ll, 16),
|
||||||
|
vshrn_n_u32(cr_lh, 16));
|
||||||
|
uint16x8_t cr_h = vcombine_u16(vshrn_n_u32(cr_hl, 16),
|
||||||
|
vshrn_n_u32(cr_hh, 16));
|
||||||
|
/* Narrow Y, Cb, and Cr values to 8-bit and store to memory. Buffer
|
||||||
|
* overwrite is permitted up to the next multiple of ALIGN_SIZE bytes.
|
||||||
|
*/
|
||||||
|
vst1q_u8(outptr0, vcombine_u8(vmovn_u16(y_l), vmovn_u16(y_h)));
|
||||||
|
vst1q_u8(outptr1, vcombine_u8(vmovn_u16(cb_l), vmovn_u16(cb_h)));
|
||||||
|
vst1q_u8(outptr2, vcombine_u8(vmovn_u16(cr_l), vmovn_u16(cr_h)));
|
||||||
|
|
||||||
|
} else if (cols_remaining > 0) {
|
||||||
|
/* To prevent buffer overread by the vector load instructions, the last
|
||||||
|
* (image_width % 8) columns of data are first memcopied to a temporary
|
||||||
|
* buffer large enough to accommodate the vector load.
|
||||||
|
*/
|
||||||
|
memcpy(tmp_buf, inptr, cols_remaining * RGB_PIXELSIZE);
|
||||||
|
inptr = tmp_buf;
|
||||||
|
|
||||||
|
#if RGB_PIXELSIZE == 4
|
||||||
|
uint8x8x4_t input_pixels = vld4_u8(inptr);
|
||||||
|
#else
|
||||||
|
uint8x8x3_t input_pixels = vld3_u8(inptr);
|
||||||
|
#endif
|
||||||
|
uint16x8_t r = vmovl_u8(input_pixels.val[RGB_RED]);
|
||||||
|
uint16x8_t g = vmovl_u8(input_pixels.val[RGB_GREEN]);
|
||||||
|
uint16x8_t b = vmovl_u8(input_pixels.val[RGB_BLUE]);
|
||||||
|
|
||||||
|
/* Compute Y = 0.29900 * R + 0.58700 * G + 0.11400 * B */
|
||||||
|
uint32x4_t y_l = vmull_laneq_u16(vget_low_u16(r), consts, 0);
|
||||||
|
y_l = vmlal_laneq_u16(y_l, vget_low_u16(g), consts, 1);
|
||||||
|
y_l = vmlal_laneq_u16(y_l, vget_low_u16(b), consts, 2);
|
||||||
|
uint32x4_t y_h = vmull_laneq_u16(vget_high_u16(r), consts, 0);
|
||||||
|
y_h = vmlal_laneq_u16(y_h, vget_high_u16(g), consts, 1);
|
||||||
|
y_h = vmlal_laneq_u16(y_h, vget_high_u16(b), consts, 2);
|
||||||
|
|
||||||
|
/* Compute Cb = -0.16874 * R - 0.33126 * G + 0.50000 * B + 128 */
|
||||||
|
uint32x4_t cb_l = scaled_128_5;
|
||||||
|
cb_l = vmlsl_laneq_u16(cb_l, vget_low_u16(r), consts, 3);
|
||||||
|
cb_l = vmlsl_laneq_u16(cb_l, vget_low_u16(g), consts, 4);
|
||||||
|
cb_l = vmlal_laneq_u16(cb_l, vget_low_u16(b), consts, 5);
|
||||||
|
uint32x4_t cb_h = scaled_128_5;
|
||||||
|
cb_h = vmlsl_laneq_u16(cb_h, vget_high_u16(r), consts, 3);
|
||||||
|
cb_h = vmlsl_laneq_u16(cb_h, vget_high_u16(g), consts, 4);
|
||||||
|
cb_h = vmlal_laneq_u16(cb_h, vget_high_u16(b), consts, 5);
|
||||||
|
|
||||||
|
/* Compute Cr = 0.50000 * R - 0.41869 * G - 0.08131 * B + 128 */
|
||||||
|
uint32x4_t cr_l = scaled_128_5;
|
||||||
|
cr_l = vmlal_laneq_u16(cr_l, vget_low_u16(r), consts, 5);
|
||||||
|
cr_l = vmlsl_laneq_u16(cr_l, vget_low_u16(g), consts, 6);
|
||||||
|
cr_l = vmlsl_laneq_u16(cr_l, vget_low_u16(b), consts, 7);
|
||||||
|
uint32x4_t cr_h = scaled_128_5;
|
||||||
|
cr_h = vmlal_laneq_u16(cr_h, vget_high_u16(r), consts, 5);
|
||||||
|
cr_h = vmlsl_laneq_u16(cr_h, vget_high_u16(g), consts, 6);
|
||||||
|
cr_h = vmlsl_laneq_u16(cr_h, vget_high_u16(b), consts, 7);
|
||||||
|
|
||||||
|
/* Descale Y values (rounding right shift) and narrow to 16-bit. */
|
||||||
|
uint16x8_t y_u16 = vcombine_u16(vrshrn_n_u32(y_l, 16),
|
||||||
|
vrshrn_n_u32(y_h, 16));
|
||||||
|
/* Descale Cb values (right shift) and narrow to 16-bit. */
|
||||||
|
uint16x8_t cb_u16 = vcombine_u16(vshrn_n_u32(cb_l, 16),
|
||||||
|
vshrn_n_u32(cb_h, 16));
|
||||||
|
/* Descale Cr values (right shift) and narrow to 16-bit. */
|
||||||
|
uint16x8_t cr_u16 = vcombine_u16(vshrn_n_u32(cr_l, 16),
|
||||||
|
vshrn_n_u32(cr_h, 16));
|
||||||
|
/* Narrow Y, Cb, and Cr values to 8-bit and store to memory. Buffer
|
||||||
|
* overwrite is permitted up to the next multiple of ALIGN_SIZE bytes.
|
||||||
|
*/
|
||||||
|
vst1_u8(outptr0, vmovn_u16(y_u16));
|
||||||
|
vst1_u8(outptr1, vmovn_u16(cb_u16));
|
||||||
|
vst1_u8(outptr2, vmovn_u16(cr_u16));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,411 @@
|
|||||||
|
/*
|
||||||
|
* jchuff-neon.c - Huffman entropy encoding (64-bit Arm Neon)
|
||||||
|
*
|
||||||
|
* Copyright (C) 2020-2021, Arm Limited. All Rights Reserved.
|
||||||
|
* Copyright (C) 2020, 2022, D. R. Commander. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* This software is provided 'as-is', without any express or implied
|
||||||
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
* arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose,
|
||||||
|
* including commercial applications, and to alter it and redistribute it
|
||||||
|
* freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
* claim that you wrote the original software. If you use this software
|
||||||
|
* in a product, an acknowledgment in the product documentation would be
|
||||||
|
* appreciated but is not required.
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
* misrepresented as being the original software.
|
||||||
|
* 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*
|
||||||
|
* NOTE: All referenced figures are from
|
||||||
|
* Recommendation ITU-T T.81 (1992) | ISO/IEC 10918-1:1994.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define JPEG_INTERNALS
|
||||||
|
#include "../../../jinclude.h"
|
||||||
|
#include "../../../jpeglib.h"
|
||||||
|
#include "../../../jsimd.h"
|
||||||
|
#include "../../../jdct.h"
|
||||||
|
#include "../../../jsimddct.h"
|
||||||
|
#include "../../jsimd.h"
|
||||||
|
#include "../align.h"
|
||||||
|
#include "../jchuff.h"
|
||||||
|
#include "neon-compat.h"
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
#include <arm_neon.h>
|
||||||
|
|
||||||
|
|
||||||
|
ALIGN(16) static const uint8_t jsimd_huff_encode_one_block_consts[] = {
|
||||||
|
0, 1, 2, 3, 16, 17, 32, 33,
|
||||||
|
18, 19, 4, 5, 6, 7, 20, 21,
|
||||||
|
34, 35, 48, 49, 255, 255, 50, 51,
|
||||||
|
36, 37, 22, 23, 8, 9, 10, 11,
|
||||||
|
255, 255, 6, 7, 20, 21, 34, 35,
|
||||||
|
48, 49, 255, 255, 50, 51, 36, 37,
|
||||||
|
54, 55, 40, 41, 26, 27, 12, 13,
|
||||||
|
14, 15, 28, 29, 42, 43, 56, 57,
|
||||||
|
6, 7, 20, 21, 34, 35, 48, 49,
|
||||||
|
50, 51, 36, 37, 22, 23, 8, 9,
|
||||||
|
26, 27, 12, 13, 255, 255, 14, 15,
|
||||||
|
28, 29, 42, 43, 56, 57, 255, 255,
|
||||||
|
52, 53, 54, 55, 40, 41, 26, 27,
|
||||||
|
12, 13, 255, 255, 14, 15, 28, 29,
|
||||||
|
26, 27, 40, 41, 42, 43, 28, 29,
|
||||||
|
14, 15, 30, 31, 44, 45, 46, 47
|
||||||
|
};
|
||||||
|
|
||||||
|
/* The AArch64 implementation of the FLUSH() macro triggers a UBSan misaligned
|
||||||
|
* address warning because the macro sometimes writes a 64-bit value to a
|
||||||
|
* non-64-bit-aligned address. That behavior is technically undefined per
|
||||||
|
* the C specification, but it is supported by the AArch64 architecture and
|
||||||
|
* compilers.
|
||||||
|
*/
|
||||||
|
#if defined(__has_feature)
|
||||||
|
#if __has_feature(undefined_behavior_sanitizer)
|
||||||
|
__attribute__((no_sanitize("alignment")))
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
JOCTET *jsimd_huff_encode_one_block_neon(void *state, JOCTET *buffer,
|
||||||
|
JCOEFPTR block, int last_dc_val,
|
||||||
|
c_derived_tbl *dctbl,
|
||||||
|
c_derived_tbl *actbl)
|
||||||
|
{
|
||||||
|
uint16_t block_diff[DCTSIZE2];
|
||||||
|
|
||||||
|
/* Load lookup table indices for rows of zig-zag ordering. */
|
||||||
|
#ifdef HAVE_VLD1Q_U8_X4
|
||||||
|
const uint8x16x4_t idx_rows_0123 =
|
||||||
|
vld1q_u8_x4(jsimd_huff_encode_one_block_consts + 0 * DCTSIZE);
|
||||||
|
const uint8x16x4_t idx_rows_4567 =
|
||||||
|
vld1q_u8_x4(jsimd_huff_encode_one_block_consts + 8 * DCTSIZE);
|
||||||
|
#else
|
||||||
|
/* GCC does not currently support intrinsics vl1dq_<type>_x4(). */
|
||||||
|
const uint8x16x4_t idx_rows_0123 = { {
|
||||||
|
vld1q_u8(jsimd_huff_encode_one_block_consts + 0 * DCTSIZE),
|
||||||
|
vld1q_u8(jsimd_huff_encode_one_block_consts + 2 * DCTSIZE),
|
||||||
|
vld1q_u8(jsimd_huff_encode_one_block_consts + 4 * DCTSIZE),
|
||||||
|
vld1q_u8(jsimd_huff_encode_one_block_consts + 6 * DCTSIZE)
|
||||||
|
} };
|
||||||
|
const uint8x16x4_t idx_rows_4567 = { {
|
||||||
|
vld1q_u8(jsimd_huff_encode_one_block_consts + 8 * DCTSIZE),
|
||||||
|
vld1q_u8(jsimd_huff_encode_one_block_consts + 10 * DCTSIZE),
|
||||||
|
vld1q_u8(jsimd_huff_encode_one_block_consts + 12 * DCTSIZE),
|
||||||
|
vld1q_u8(jsimd_huff_encode_one_block_consts + 14 * DCTSIZE)
|
||||||
|
} };
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Load 8x8 block of DCT coefficients. */
|
||||||
|
#ifdef HAVE_VLD1Q_U8_X4
|
||||||
|
const int8x16x4_t tbl_rows_0123 =
|
||||||
|
vld1q_s8_x4((int8_t *)(block + 0 * DCTSIZE));
|
||||||
|
const int8x16x4_t tbl_rows_4567 =
|
||||||
|
vld1q_s8_x4((int8_t *)(block + 4 * DCTSIZE));
|
||||||
|
#else
|
||||||
|
const int8x16x4_t tbl_rows_0123 = { {
|
||||||
|
vld1q_s8((int8_t *)(block + 0 * DCTSIZE)),
|
||||||
|
vld1q_s8((int8_t *)(block + 1 * DCTSIZE)),
|
||||||
|
vld1q_s8((int8_t *)(block + 2 * DCTSIZE)),
|
||||||
|
vld1q_s8((int8_t *)(block + 3 * DCTSIZE))
|
||||||
|
} };
|
||||||
|
const int8x16x4_t tbl_rows_4567 = { {
|
||||||
|
vld1q_s8((int8_t *)(block + 4 * DCTSIZE)),
|
||||||
|
vld1q_s8((int8_t *)(block + 5 * DCTSIZE)),
|
||||||
|
vld1q_s8((int8_t *)(block + 6 * DCTSIZE)),
|
||||||
|
vld1q_s8((int8_t *)(block + 7 * DCTSIZE))
|
||||||
|
} };
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Initialise extra lookup tables. */
|
||||||
|
const int8x16x4_t tbl_rows_2345 = { {
|
||||||
|
tbl_rows_0123.val[2], tbl_rows_0123.val[3],
|
||||||
|
tbl_rows_4567.val[0], tbl_rows_4567.val[1]
|
||||||
|
} };
|
||||||
|
const int8x16x3_t tbl_rows_567 =
|
||||||
|
{ { tbl_rows_4567.val[1], tbl_rows_4567.val[2], tbl_rows_4567.val[3] } };
|
||||||
|
|
||||||
|
/* Shuffle coefficients into zig-zag order. */
|
||||||
|
int16x8_t row0 =
|
||||||
|
vreinterpretq_s16_s8(vqtbl4q_s8(tbl_rows_0123, idx_rows_0123.val[0]));
|
||||||
|
int16x8_t row1 =
|
||||||
|
vreinterpretq_s16_s8(vqtbl4q_s8(tbl_rows_0123, idx_rows_0123.val[1]));
|
||||||
|
int16x8_t row2 =
|
||||||
|
vreinterpretq_s16_s8(vqtbl4q_s8(tbl_rows_2345, idx_rows_0123.val[2]));
|
||||||
|
int16x8_t row3 =
|
||||||
|
vreinterpretq_s16_s8(vqtbl4q_s8(tbl_rows_0123, idx_rows_0123.val[3]));
|
||||||
|
int16x8_t row4 =
|
||||||
|
vreinterpretq_s16_s8(vqtbl4q_s8(tbl_rows_4567, idx_rows_4567.val[0]));
|
||||||
|
int16x8_t row5 =
|
||||||
|
vreinterpretq_s16_s8(vqtbl4q_s8(tbl_rows_2345, idx_rows_4567.val[1]));
|
||||||
|
int16x8_t row6 =
|
||||||
|
vreinterpretq_s16_s8(vqtbl4q_s8(tbl_rows_4567, idx_rows_4567.val[2]));
|
||||||
|
int16x8_t row7 =
|
||||||
|
vreinterpretq_s16_s8(vqtbl3q_s8(tbl_rows_567, idx_rows_4567.val[3]));
|
||||||
|
|
||||||
|
/* Compute DC coefficient difference value (F.1.1.5.1). */
|
||||||
|
row0 = vsetq_lane_s16(block[0] - last_dc_val, row0, 0);
|
||||||
|
/* Initialize AC coefficient lanes not reachable by lookup tables. */
|
||||||
|
row1 =
|
||||||
|
vsetq_lane_s16(vgetq_lane_s16(vreinterpretq_s16_s8(tbl_rows_4567.val[0]),
|
||||||
|
0), row1, 2);
|
||||||
|
row2 =
|
||||||
|
vsetq_lane_s16(vgetq_lane_s16(vreinterpretq_s16_s8(tbl_rows_0123.val[1]),
|
||||||
|
4), row2, 0);
|
||||||
|
row2 =
|
||||||
|
vsetq_lane_s16(vgetq_lane_s16(vreinterpretq_s16_s8(tbl_rows_4567.val[2]),
|
||||||
|
0), row2, 5);
|
||||||
|
row5 =
|
||||||
|
vsetq_lane_s16(vgetq_lane_s16(vreinterpretq_s16_s8(tbl_rows_0123.val[1]),
|
||||||
|
7), row5, 2);
|
||||||
|
row5 =
|
||||||
|
vsetq_lane_s16(vgetq_lane_s16(vreinterpretq_s16_s8(tbl_rows_4567.val[2]),
|
||||||
|
3), row5, 7);
|
||||||
|
row6 =
|
||||||
|
vsetq_lane_s16(vgetq_lane_s16(vreinterpretq_s16_s8(tbl_rows_0123.val[3]),
|
||||||
|
7), row6, 5);
|
||||||
|
|
||||||
|
/* DCT block is now in zig-zag order; start Huffman encoding process. */
|
||||||
|
|
||||||
|
/* Construct bitmap to accelerate encoding of AC coefficients. A set bit
|
||||||
|
* means that the corresponding coefficient != 0.
|
||||||
|
*/
|
||||||
|
uint16x8_t row0_ne_0 = vtstq_s16(row0, row0);
|
||||||
|
uint16x8_t row1_ne_0 = vtstq_s16(row1, row1);
|
||||||
|
uint16x8_t row2_ne_0 = vtstq_s16(row2, row2);
|
||||||
|
uint16x8_t row3_ne_0 = vtstq_s16(row3, row3);
|
||||||
|
uint16x8_t row4_ne_0 = vtstq_s16(row4, row4);
|
||||||
|
uint16x8_t row5_ne_0 = vtstq_s16(row5, row5);
|
||||||
|
uint16x8_t row6_ne_0 = vtstq_s16(row6, row6);
|
||||||
|
uint16x8_t row7_ne_0 = vtstq_s16(row7, row7);
|
||||||
|
|
||||||
|
uint8x16_t row10_ne_0 = vuzp1q_u8(vreinterpretq_u8_u16(row1_ne_0),
|
||||||
|
vreinterpretq_u8_u16(row0_ne_0));
|
||||||
|
uint8x16_t row32_ne_0 = vuzp1q_u8(vreinterpretq_u8_u16(row3_ne_0),
|
||||||
|
vreinterpretq_u8_u16(row2_ne_0));
|
||||||
|
uint8x16_t row54_ne_0 = vuzp1q_u8(vreinterpretq_u8_u16(row5_ne_0),
|
||||||
|
vreinterpretq_u8_u16(row4_ne_0));
|
||||||
|
uint8x16_t row76_ne_0 = vuzp1q_u8(vreinterpretq_u8_u16(row7_ne_0),
|
||||||
|
vreinterpretq_u8_u16(row6_ne_0));
|
||||||
|
|
||||||
|
/* { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 } */
|
||||||
|
const uint8x16_t bitmap_mask =
|
||||||
|
vreinterpretq_u8_u64(vdupq_n_u64(0x0102040810204080));
|
||||||
|
|
||||||
|
uint8x16_t bitmap_rows_10 = vandq_u8(row10_ne_0, bitmap_mask);
|
||||||
|
uint8x16_t bitmap_rows_32 = vandq_u8(row32_ne_0, bitmap_mask);
|
||||||
|
uint8x16_t bitmap_rows_54 = vandq_u8(row54_ne_0, bitmap_mask);
|
||||||
|
uint8x16_t bitmap_rows_76 = vandq_u8(row76_ne_0, bitmap_mask);
|
||||||
|
|
||||||
|
uint8x16_t bitmap_rows_3210 = vpaddq_u8(bitmap_rows_32, bitmap_rows_10);
|
||||||
|
uint8x16_t bitmap_rows_7654 = vpaddq_u8(bitmap_rows_76, bitmap_rows_54);
|
||||||
|
uint8x16_t bitmap_rows_76543210 = vpaddq_u8(bitmap_rows_7654,
|
||||||
|
bitmap_rows_3210);
|
||||||
|
uint8x8_t bitmap_all = vpadd_u8(vget_low_u8(bitmap_rows_76543210),
|
||||||
|
vget_high_u8(bitmap_rows_76543210));
|
||||||
|
|
||||||
|
/* Shift left to remove DC bit. */
|
||||||
|
bitmap_all =
|
||||||
|
vreinterpret_u8_u64(vshl_n_u64(vreinterpret_u64_u8(bitmap_all), 1));
|
||||||
|
/* Count bits set (number of non-zero coefficients) in bitmap. */
|
||||||
|
unsigned int non_zero_coefficients = vaddv_u8(vcnt_u8(bitmap_all));
|
||||||
|
/* Move bitmap to 64-bit scalar register. */
|
||||||
|
uint64_t bitmap = vget_lane_u64(vreinterpret_u64_u8(bitmap_all), 0);
|
||||||
|
|
||||||
|
/* Set up state and bit buffer for output bitstream. */
|
||||||
|
working_state *state_ptr = (working_state *)state;
|
||||||
|
int free_bits = state_ptr->cur.free_bits;
|
||||||
|
size_t put_buffer = state_ptr->cur.put_buffer;
|
||||||
|
|
||||||
|
/* Encode DC coefficient. */
|
||||||
|
|
||||||
|
/* For negative coeffs: diff = abs(coeff) -1 = ~abs(coeff) */
|
||||||
|
int16x8_t abs_row0 = vabsq_s16(row0);
|
||||||
|
int16x8_t row0_lz = vclzq_s16(abs_row0);
|
||||||
|
uint16x8_t row0_mask = vshlq_u16(vcltzq_s16(row0), vnegq_s16(row0_lz));
|
||||||
|
uint16x8_t row0_diff = veorq_u16(vreinterpretq_u16_s16(abs_row0), row0_mask);
|
||||||
|
/* Find nbits required to specify sign and amplitude of coefficient. */
|
||||||
|
unsigned int lz = vgetq_lane_u16(vreinterpretq_u16_s16(row0_lz), 0);
|
||||||
|
unsigned int nbits = 16 - lz;
|
||||||
|
/* Emit Huffman-coded symbol and additional diff bits. */
|
||||||
|
unsigned int diff = vgetq_lane_u16(row0_diff, 0);
|
||||||
|
PUT_CODE(dctbl->ehufco[nbits], dctbl->ehufsi[nbits], diff)
|
||||||
|
|
||||||
|
/* Encode AC coefficients. */
|
||||||
|
|
||||||
|
unsigned int r = 0; /* r = run length of zeros */
|
||||||
|
unsigned int i = 1; /* i = number of coefficients encoded */
|
||||||
|
/* Code and size information for a run length of 16 zero coefficients */
|
||||||
|
const unsigned int code_0xf0 = actbl->ehufco[0xf0];
|
||||||
|
const unsigned int size_0xf0 = actbl->ehufsi[0xf0];
|
||||||
|
|
||||||
|
/* The most efficient method of computing nbits and diff depends on the
|
||||||
|
* number of non-zero coefficients. If the bitmap is not too sparse (> 8
|
||||||
|
* non-zero AC coefficients), it is beneficial to do all of the work using
|
||||||
|
* Neon; else we do some of the work using Neon and the rest on demand using
|
||||||
|
* scalar code.
|
||||||
|
*/
|
||||||
|
if (non_zero_coefficients > 8) {
|
||||||
|
uint8_t block_nbits[DCTSIZE2];
|
||||||
|
|
||||||
|
int16x8_t abs_row1 = vabsq_s16(row1);
|
||||||
|
int16x8_t abs_row2 = vabsq_s16(row2);
|
||||||
|
int16x8_t abs_row3 = vabsq_s16(row3);
|
||||||
|
int16x8_t abs_row4 = vabsq_s16(row4);
|
||||||
|
int16x8_t abs_row5 = vabsq_s16(row5);
|
||||||
|
int16x8_t abs_row6 = vabsq_s16(row6);
|
||||||
|
int16x8_t abs_row7 = vabsq_s16(row7);
|
||||||
|
int16x8_t row1_lz = vclzq_s16(abs_row1);
|
||||||
|
int16x8_t row2_lz = vclzq_s16(abs_row2);
|
||||||
|
int16x8_t row3_lz = vclzq_s16(abs_row3);
|
||||||
|
int16x8_t row4_lz = vclzq_s16(abs_row4);
|
||||||
|
int16x8_t row5_lz = vclzq_s16(abs_row5);
|
||||||
|
int16x8_t row6_lz = vclzq_s16(abs_row6);
|
||||||
|
int16x8_t row7_lz = vclzq_s16(abs_row7);
|
||||||
|
/* Narrow leading zero count to 8 bits. */
|
||||||
|
uint8x16_t row01_lz = vuzp1q_u8(vreinterpretq_u8_s16(row0_lz),
|
||||||
|
vreinterpretq_u8_s16(row1_lz));
|
||||||
|
uint8x16_t row23_lz = vuzp1q_u8(vreinterpretq_u8_s16(row2_lz),
|
||||||
|
vreinterpretq_u8_s16(row3_lz));
|
||||||
|
uint8x16_t row45_lz = vuzp1q_u8(vreinterpretq_u8_s16(row4_lz),
|
||||||
|
vreinterpretq_u8_s16(row5_lz));
|
||||||
|
uint8x16_t row67_lz = vuzp1q_u8(vreinterpretq_u8_s16(row6_lz),
|
||||||
|
vreinterpretq_u8_s16(row7_lz));
|
||||||
|
/* Compute nbits needed to specify magnitude of each coefficient. */
|
||||||
|
uint8x16_t row01_nbits = vsubq_u8(vdupq_n_u8(16), row01_lz);
|
||||||
|
uint8x16_t row23_nbits = vsubq_u8(vdupq_n_u8(16), row23_lz);
|
||||||
|
uint8x16_t row45_nbits = vsubq_u8(vdupq_n_u8(16), row45_lz);
|
||||||
|
uint8x16_t row67_nbits = vsubq_u8(vdupq_n_u8(16), row67_lz);
|
||||||
|
/* Store nbits. */
|
||||||
|
vst1q_u8(block_nbits + 0 * DCTSIZE, row01_nbits);
|
||||||
|
vst1q_u8(block_nbits + 2 * DCTSIZE, row23_nbits);
|
||||||
|
vst1q_u8(block_nbits + 4 * DCTSIZE, row45_nbits);
|
||||||
|
vst1q_u8(block_nbits + 6 * DCTSIZE, row67_nbits);
|
||||||
|
/* Mask bits not required to specify sign and amplitude of diff. */
|
||||||
|
uint16x8_t row1_mask = vshlq_u16(vcltzq_s16(row1), vnegq_s16(row1_lz));
|
||||||
|
uint16x8_t row2_mask = vshlq_u16(vcltzq_s16(row2), vnegq_s16(row2_lz));
|
||||||
|
uint16x8_t row3_mask = vshlq_u16(vcltzq_s16(row3), vnegq_s16(row3_lz));
|
||||||
|
uint16x8_t row4_mask = vshlq_u16(vcltzq_s16(row4), vnegq_s16(row4_lz));
|
||||||
|
uint16x8_t row5_mask = vshlq_u16(vcltzq_s16(row5), vnegq_s16(row5_lz));
|
||||||
|
uint16x8_t row6_mask = vshlq_u16(vcltzq_s16(row6), vnegq_s16(row6_lz));
|
||||||
|
uint16x8_t row7_mask = vshlq_u16(vcltzq_s16(row7), vnegq_s16(row7_lz));
|
||||||
|
/* diff = abs(coeff) ^ sign(coeff) [no-op for positive coefficients] */
|
||||||
|
uint16x8_t row1_diff = veorq_u16(vreinterpretq_u16_s16(abs_row1),
|
||||||
|
row1_mask);
|
||||||
|
uint16x8_t row2_diff = veorq_u16(vreinterpretq_u16_s16(abs_row2),
|
||||||
|
row2_mask);
|
||||||
|
uint16x8_t row3_diff = veorq_u16(vreinterpretq_u16_s16(abs_row3),
|
||||||
|
row3_mask);
|
||||||
|
uint16x8_t row4_diff = veorq_u16(vreinterpretq_u16_s16(abs_row4),
|
||||||
|
row4_mask);
|
||||||
|
uint16x8_t row5_diff = veorq_u16(vreinterpretq_u16_s16(abs_row5),
|
||||||
|
row5_mask);
|
||||||
|
uint16x8_t row6_diff = veorq_u16(vreinterpretq_u16_s16(abs_row6),
|
||||||
|
row6_mask);
|
||||||
|
uint16x8_t row7_diff = veorq_u16(vreinterpretq_u16_s16(abs_row7),
|
||||||
|
row7_mask);
|
||||||
|
/* Store diff bits. */
|
||||||
|
vst1q_u16(block_diff + 0 * DCTSIZE, row0_diff);
|
||||||
|
vst1q_u16(block_diff + 1 * DCTSIZE, row1_diff);
|
||||||
|
vst1q_u16(block_diff + 2 * DCTSIZE, row2_diff);
|
||||||
|
vst1q_u16(block_diff + 3 * DCTSIZE, row3_diff);
|
||||||
|
vst1q_u16(block_diff + 4 * DCTSIZE, row4_diff);
|
||||||
|
vst1q_u16(block_diff + 5 * DCTSIZE, row5_diff);
|
||||||
|
vst1q_u16(block_diff + 6 * DCTSIZE, row6_diff);
|
||||||
|
vst1q_u16(block_diff + 7 * DCTSIZE, row7_diff);
|
||||||
|
|
||||||
|
while (bitmap != 0) {
|
||||||
|
r = BUILTIN_CLZLL(bitmap);
|
||||||
|
i += r;
|
||||||
|
bitmap <<= r;
|
||||||
|
nbits = block_nbits[i];
|
||||||
|
diff = block_diff[i];
|
||||||
|
while (r > 15) {
|
||||||
|
/* If run length > 15, emit special run-length-16 codes. */
|
||||||
|
PUT_BITS(code_0xf0, size_0xf0)
|
||||||
|
r -= 16;
|
||||||
|
}
|
||||||
|
/* Emit Huffman symbol for run length / number of bits. (F.1.2.2.1) */
|
||||||
|
unsigned int rs = (r << 4) + nbits;
|
||||||
|
PUT_CODE(actbl->ehufco[rs], actbl->ehufsi[rs], diff)
|
||||||
|
i++;
|
||||||
|
bitmap <<= 1;
|
||||||
|
}
|
||||||
|
} else if (bitmap != 0) {
|
||||||
|
uint16_t block_abs[DCTSIZE2];
|
||||||
|
/* Compute and store absolute value of coefficients. */
|
||||||
|
int16x8_t abs_row1 = vabsq_s16(row1);
|
||||||
|
int16x8_t abs_row2 = vabsq_s16(row2);
|
||||||
|
int16x8_t abs_row3 = vabsq_s16(row3);
|
||||||
|
int16x8_t abs_row4 = vabsq_s16(row4);
|
||||||
|
int16x8_t abs_row5 = vabsq_s16(row5);
|
||||||
|
int16x8_t abs_row6 = vabsq_s16(row6);
|
||||||
|
int16x8_t abs_row7 = vabsq_s16(row7);
|
||||||
|
vst1q_u16(block_abs + 0 * DCTSIZE, vreinterpretq_u16_s16(abs_row0));
|
||||||
|
vst1q_u16(block_abs + 1 * DCTSIZE, vreinterpretq_u16_s16(abs_row1));
|
||||||
|
vst1q_u16(block_abs + 2 * DCTSIZE, vreinterpretq_u16_s16(abs_row2));
|
||||||
|
vst1q_u16(block_abs + 3 * DCTSIZE, vreinterpretq_u16_s16(abs_row3));
|
||||||
|
vst1q_u16(block_abs + 4 * DCTSIZE, vreinterpretq_u16_s16(abs_row4));
|
||||||
|
vst1q_u16(block_abs + 5 * DCTSIZE, vreinterpretq_u16_s16(abs_row5));
|
||||||
|
vst1q_u16(block_abs + 6 * DCTSIZE, vreinterpretq_u16_s16(abs_row6));
|
||||||
|
vst1q_u16(block_abs + 7 * DCTSIZE, vreinterpretq_u16_s16(abs_row7));
|
||||||
|
/* Compute diff bits (without nbits mask) and store. */
|
||||||
|
uint16x8_t row1_diff = veorq_u16(vreinterpretq_u16_s16(abs_row1),
|
||||||
|
vcltzq_s16(row1));
|
||||||
|
uint16x8_t row2_diff = veorq_u16(vreinterpretq_u16_s16(abs_row2),
|
||||||
|
vcltzq_s16(row2));
|
||||||
|
uint16x8_t row3_diff = veorq_u16(vreinterpretq_u16_s16(abs_row3),
|
||||||
|
vcltzq_s16(row3));
|
||||||
|
uint16x8_t row4_diff = veorq_u16(vreinterpretq_u16_s16(abs_row4),
|
||||||
|
vcltzq_s16(row4));
|
||||||
|
uint16x8_t row5_diff = veorq_u16(vreinterpretq_u16_s16(abs_row5),
|
||||||
|
vcltzq_s16(row5));
|
||||||
|
uint16x8_t row6_diff = veorq_u16(vreinterpretq_u16_s16(abs_row6),
|
||||||
|
vcltzq_s16(row6));
|
||||||
|
uint16x8_t row7_diff = veorq_u16(vreinterpretq_u16_s16(abs_row7),
|
||||||
|
vcltzq_s16(row7));
|
||||||
|
vst1q_u16(block_diff + 0 * DCTSIZE, row0_diff);
|
||||||
|
vst1q_u16(block_diff + 1 * DCTSIZE, row1_diff);
|
||||||
|
vst1q_u16(block_diff + 2 * DCTSIZE, row2_diff);
|
||||||
|
vst1q_u16(block_diff + 3 * DCTSIZE, row3_diff);
|
||||||
|
vst1q_u16(block_diff + 4 * DCTSIZE, row4_diff);
|
||||||
|
vst1q_u16(block_diff + 5 * DCTSIZE, row5_diff);
|
||||||
|
vst1q_u16(block_diff + 6 * DCTSIZE, row6_diff);
|
||||||
|
vst1q_u16(block_diff + 7 * DCTSIZE, row7_diff);
|
||||||
|
|
||||||
|
/* Same as above but must mask diff bits and compute nbits on demand. */
|
||||||
|
while (bitmap != 0) {
|
||||||
|
r = BUILTIN_CLZLL(bitmap);
|
||||||
|
i += r;
|
||||||
|
bitmap <<= r;
|
||||||
|
lz = BUILTIN_CLZ(block_abs[i]);
|
||||||
|
nbits = 32 - lz;
|
||||||
|
diff = ((unsigned int)block_diff[i] << lz) >> lz;
|
||||||
|
while (r > 15) {
|
||||||
|
/* If run length > 15, emit special run-length-16 codes. */
|
||||||
|
PUT_BITS(code_0xf0, size_0xf0)
|
||||||
|
r -= 16;
|
||||||
|
}
|
||||||
|
/* Emit Huffman symbol for run length / number of bits. (F.1.2.2.1) */
|
||||||
|
unsigned int rs = (r << 4) + nbits;
|
||||||
|
PUT_CODE(actbl->ehufco[rs], actbl->ehufsi[rs], diff)
|
||||||
|
i++;
|
||||||
|
bitmap <<= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If the last coefficient(s) were zero, emit an end-of-block (EOB) code.
|
||||||
|
* The value of RS for the EOB code is 0.
|
||||||
|
*/
|
||||||
|
if (i != 64) {
|
||||||
|
PUT_BITS(actbl->ehufco[0], actbl->ehufsi[0])
|
||||||
|
}
|
||||||
|
|
||||||
|
state_ptr->cur.put_buffer = put_buffer;
|
||||||
|
state_ptr->cur.free_bits = free_bits;
|
||||||
|
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user