mirror of
https://github.com/opencv/opencv.git
synced 2026-07-29 15:23:05 +04:00
Compare commits
1466 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| b1cf550123 | |||
| 17bd9a1fa1 | |||
| 0321644bbd | |||
| 81e7988eb9 | |||
| 4985311d46 | |||
| 05348f3250 | |||
| 003609e565 | |||
| 9537a909f7 | |||
| 8c2dd5fb9a | |||
| 27545dcc86 | |||
| 724e04e979 | |||
| dfc94c58f0 | |||
| fac895d7ba | |||
| 04b40ff221 | |||
| a3d7811f24 | |||
| 755e0143fb | |||
| dfa48094dc | |||
| e585192eeb | |||
| 646924fce8 | |||
| c63aa7f085 | |||
| c54abde1bd | |||
| 95c1d2a887 | |||
| ebef84e9ea | |||
| b1a772d194 | |||
| f11f2bfb56 | |||
| 24f43e7ae9 | |||
| d94d469c86 | |||
| d20c9bde7e | |||
| 62414e3073 | |||
| 48c985e775 | |||
| 7358fffb0f | |||
| de5b6386e0 | |||
| 1de2d5c2b6 | |||
| ef53a9229f | |||
| 259c39a63a | |||
| 327b98eb13 | |||
| f977d10a19 | |||
| a0cf8c322d | |||
| 1e74f5850b | |||
| 9b76872708 | |||
| 4d587c341b | |||
| 846317ef37 | |||
| 7e62789edf | |||
| 852663f6d2 | |||
| a9b30984a3 | |||
| 2f83c3b689 | |||
| b25ad12f1a | |||
| d95e43a6a1 | |||
| 2cc14bd0fb | |||
| fdc8ed8d05 | |||
| 236c64a17d | |||
| f96569da1e | |||
| 91ff45fbde | |||
| 45aabc5d0d | |||
| f9bd83c854 | |||
| 86a51015b1 | |||
| 998406d20e | |||
| f7b4b750d8 | |||
| a4e2c56317 | |||
| 9c5d7716e2 | |||
| 46fd26e366 | |||
| c410d7a97d | |||
| 6fa63dcc0c | |||
| 96f25332ea | |||
| 3385d38648 | |||
| 1618c963e4 | |||
| 1e3be09b3b | |||
| 6e66a9222a | |||
| 9d1e8b1e1d | |||
| f605373a2b | |||
| 56b7622612 | |||
| 696a6ccd57 | |||
| 51b03b87e6 | |||
| aa7ba0bc1a | |||
| 07e4076585 | |||
| de1a459879 | |||
| 1aacb9bb15 | |||
| 9b4ecc96f6 | |||
| e3f4f874c5 | |||
| 6ace801418 | |||
| d31b93b513 | |||
| ac0fd6aa9a | |||
| 068f33cfdf | |||
| 4807cd8a6e | |||
| 35e824c287 | |||
| 1e0d290f2e | |||
| 0097a8d097 | |||
| 36cc43170d | |||
| 5578ad5e14 | |||
| d11f0a709d | |||
| 0a43b23275 | |||
| 7967683296 | |||
| 5b2c016834 | |||
| aaff125608 | |||
| 407adc7061 | |||
| d0e612dc36 | |||
| 7c23ec90a9 | |||
| 390957fec4 | |||
| 060a76dc3e | |||
| 6625810d2a | |||
| edc442afdb | |||
| 16b9514543 | |||
| 95c7f4a7f0 | |||
| ae6fabc6fe | |||
| 7eaadf616c | |||
| 8fed5fc5ae | |||
| f25951c412 | |||
| 1259a474ba | |||
| 3995deaf76 | |||
| 076587425e | |||
| da6aeaca46 | |||
| 8ee33ca551 | |||
| ea7f13922b | |||
| 38d0063c36 | |||
| df83459721 | |||
| 54a9e00970 | |||
| 9bda96d39e | |||
| 77a5c43d50 | |||
| f28e4b86fb | |||
| b675e6ab77 | |||
| d6306f8ccb | |||
| a9817e9127 | |||
| c08897cd10 | |||
| 384875f4fc | |||
| 9cfa84313c | |||
| fe625a558e | |||
| 9ef41f68fb | |||
| cfb36443fb | |||
| 9d3826c676 | |||
| 4300bb2e1f | |||
| 6edc438789 | |||
| 25cd7c7c50 | |||
| 732cb6c45c | |||
| 266a868ba9 | |||
| 8199967b31 | |||
| 9d61c18143 | |||
| 221bfa4c67 | |||
| 1a8b7f7513 | |||
| 992b47b991 | |||
| 739ff84732 | |||
| 2a177052de | |||
| f7c82baee9 | |||
| 2b34e0abdc | |||
| 633fedaa96 | |||
| 65134c793b | |||
| d5f34cf34c | |||
| cefa602601 | |||
| d773691848 | |||
| f40707dc68 | |||
| 2d8ce500fa | |||
| ddf1b04cce | |||
| ad5b3a4753 | |||
| 531ea5b3a2 | |||
| b468468e7e | |||
| cff0168f3a | |||
| d83901e665 | |||
| 1e1984a586 | |||
| 06dcc5a2c6 | |||
| 000f762fb9 | |||
| 3bc3eeb5da | |||
| 4e5699fa71 | |||
| a76274b549 | |||
| 803ff8ebb9 | |||
| b42152ffeb | |||
| 024b43ca06 | |||
| 9448fe3db4 | |||
| 3817f3a89b | |||
| 2062a7ca8f | |||
| 8334ee18e6 | |||
| cc2592f582 | |||
| 96d35f7c54 | |||
| 98c5fc6ae2 | |||
| fbde0c6c96 | |||
| 602e7c83e2 | |||
| eb9218a86b | |||
| 9f2dcc3f13 | |||
| bc210b292b | |||
| 2113af9c52 | |||
| 6f417b57c1 | |||
| 0acd06d13c | |||
| fd22e98298 | |||
| 167a12028d | |||
| 6af2faebd2 | |||
| fd16222613 | |||
| 1ba6cd8423 | |||
| 4788de784b | |||
| 926535469d | |||
| 5627a0cbdf | |||
| 9a9954a036 | |||
| 591708903b | |||
| f9d62fba7a | |||
| 9d039c206b | |||
| 4c3f9b2ef4 | |||
| 0e523618a1 | |||
| 3b26105f68 | |||
| 0f2f966a91 | |||
| d7d491d445 | |||
| 9b0d6862c4 | |||
| 890fcdf842 | |||
| 18dbac203f | |||
| 8d1f254dcc | |||
| 90df3af6cf | |||
| b699fe7a9d | |||
| b2ed5c3070 | |||
| 5b8c10f2f8 | |||
| 24983f62e2 | |||
| f2057ce1ab | |||
| 6797fd65a5 | |||
| 947e06a860 | |||
| 04d5ba266f | |||
| 90be83ae99 | |||
| 5e80bd3cc9 | |||
| db4b1e613c | |||
| 7d842f5bcf | |||
| 828304d587 | |||
| 9d584475f6 | |||
| bb60cb0bf9 | |||
| 55e1dfb778 | |||
| c2263db7bc | |||
| 7bbbda71df | |||
| 8e0baf257c | |||
| c8268e65fd | |||
| 3cf4375387 | |||
| c1adbe3189 | |||
| 7ee1816612 | |||
| 8f4f834ce6 | |||
| 2b84c97a78 | |||
| 3ddf84534b | |||
| bd26104088 | |||
| 5f80f43ff5 | |||
| b221143c0f | |||
| 995841624c | |||
| bbcd06f42f | |||
| 43940f7ffc | |||
| f4a79b0554 | |||
| 411fd2b761 | |||
| 61e30c15a9 | |||
| d332f33346 | |||
| 636db09d73 | |||
| 64c018507b | |||
| c34445a496 | |||
| ff60abb575 | |||
| 7d91dfe339 | |||
| 15af65d4cf | |||
| 81afeda537 | |||
| e10de25e86 | |||
| 746bd47ce5 | |||
| dcb4cabb26 | |||
| 59b4baee0c | |||
| bb3bbd192b | |||
| 1212aef03b | |||
| 814550d2a6 | |||
| fb68fe8930 | |||
| d3be58b6d7 | |||
| 8ecfbdb4ff | |||
| 63256a00ff | |||
| 450dc92452 | |||
| 3d2f4fa164 | |||
| 3d394943e6 | |||
| 3e25f32c9b | |||
| 81567a9d3e | |||
| 4a2adba8f4 | |||
| 84f78059d3 | |||
| 7499a15c92 | |||
| 5f4e55bc68 | |||
| c621384707 | |||
| c0162a64d1 | |||
| 1ae16beb06 | |||
| e53a4ce64d | |||
| 72655a9eea | |||
| 125f890dc3 | |||
| 101d50703c | |||
| 901ed5545f | |||
| 699b4b9fc5 | |||
| 1d7d18afba | |||
| b335fe67b0 | |||
| dde029f105 | |||
| 302c2354a3 | |||
| 158b13e0ba | |||
| b1dc7ed873 | |||
| 1bced43e96 | |||
| 8550f7e04d | |||
| 9f3e83baf6 | |||
| 17ab61a40d | |||
| 1b844f8413 | |||
| baa22fa808 | |||
| f78cebfc98 | |||
| d2a9ca13f1 | |||
| 71bae7c23f | |||
| d4f104f17f | |||
| fd44ba296d | |||
| b04d6a2d9b | |||
| a08eac452e | |||
| 7021ea6748 | |||
| 55aa1d4852 | |||
| 159534313e | |||
| 2f68c43e39 | |||
| e2483aa072 | |||
| c69f37343c | |||
| aec62a7fc5 | |||
| bf26050f7e | |||
| 402bce1a31 | |||
| 8868350888 | |||
| 1b64851fa8 | |||
| 2e143b8799 | |||
| 3930c9a492 | |||
| f0839d2703 | |||
| 405e820fe1 | |||
| 6598e9d506 | |||
| 8c2cf89845 | |||
| aeb8dfc52d | |||
| 0649a2fbdb | |||
| ec32061f5f | |||
| f2da1a0a7a | |||
| fda1e6f148 | |||
| 2a48730166 | |||
| 0bdbc745c4 | |||
| 6f70b0524a | |||
| b9b19185bc | |||
| 63ba9970bd | |||
| a9a6801c6d | |||
| 222af8e7e4 | |||
| ec8b7c933a | |||
| 76860933f0 | |||
| 19a936fc03 | |||
| be17fce657 | |||
| 9a1d7736f8 | |||
| 9f295b2c91 | |||
| 3a8154051f | |||
| f3f46096d6 | |||
| ace37df941 | |||
| ac9182f20d | |||
| 2cf1a13755 | |||
| 6465e393b6 | |||
| 6e6c0f31f7 | |||
| d0e3e638c3 | |||
| 6a72bf5085 | |||
| 0ff57e3292 | |||
| 5db484b6c2 | |||
| 6865787a75 | |||
| 7f664850f5 | |||
| 2907fb88f5 | |||
| d7cb2ea210 | |||
| 4ae2c11520 | |||
| 1b3e0b27af | |||
| e4b0251e9d | |||
| b26f5b9468 | |||
| 5340dc6686 | |||
| 2b86de217a | |||
| 1615afd7f4 | |||
| 908957317f | |||
| 6fa2bdd7f2 | |||
| f82303d614 | |||
| 6773fa03e2 | |||
| d651ff8d6b | |||
| 8069a6b4f8 | |||
| b697b3162f | |||
| 53a16b1186 | |||
| a2a92999be | |||
| 40c0830b63 | |||
| 6f1eefec69 | |||
| bb6e15f2c0 | |||
| 0dcb99cf23 | |||
| cc6d48959e | |||
| aab62aa6dd | |||
| ac9f3a1242 | |||
| 53652a6194 | |||
| 8d232a63ad | |||
| bf03f5fa3a | |||
| 6e8022a3af | |||
| d27eb79fa6 | |||
| 3e48a91d97 | |||
| 144443d011 | |||
| 86d0a86141 | |||
| bf9f67e93f | |||
| 26ea4760ad | |||
| f59917bea1 | |||
| a394c8b10b | |||
| e56e4876e7 | |||
| 56bdd7db5c | |||
| 3df6bc58e9 | |||
| e75f1b071b | |||
| 7a2b3ed471 | |||
| 551d4a8ec1 | |||
| 29a289dfa1 | |||
| bdd2b57e5d | |||
| a97f6f8058 | |||
| c0dd82fb53 | |||
| 1211a8b9cd | |||
| f680505086 | |||
| ae60bbc7e4 | |||
| 7664e6d090 | |||
| 960f501cc1 | |||
| 7a8e171691 | |||
| 7ca9740da5 | |||
| 68fae94cbb | |||
| 6da5c7c1d0 | |||
| 87e607a19b | |||
| cbe236652b | |||
| d4d805cb3e | |||
| 8d29a902e4 | |||
| f136adcad5 | |||
| 95ab9468c1 | |||
| f8181fbef8 | |||
| b995de4ff3 | |||
| 825dadfbdd | |||
| 63048812c7 | |||
| e4692ac079 | |||
| 47337e2196 | |||
| 1d6a1e5f9c | |||
| 84fcc4ab9b | |||
| 65b51e1538 | |||
| 6c9be1bc1d | |||
| 4c48f1eed2 | |||
| 31f66766b7 | |||
| 601690695e | |||
| 85009800b3 | |||
| 04a9ff88d8 | |||
| dc24663e8d | |||
| d2cc63e779 | |||
| 358878caf7 | |||
| 640f188ca2 | |||
| a1e2c4f338 | |||
| 625d4fc884 | |||
| f821530eb0 | |||
| 7894cd3c73 | |||
| 125cc79c17 | |||
| 2a808aeec0 | |||
| 94533e12eb | |||
| a0008de281 | |||
| a42d4da003 | |||
| 0689c70dba | |||
| 75ad74c893 | |||
| cbfd38bd41 | |||
| 2ab1f3f166 | |||
| a123c48d4d | |||
| 1c88e1fd19 | |||
| cc22a73d0f | |||
| ba7d0c5b23 | |||
| 5d499a185b | |||
| eab8ac9a71 | |||
| 19865a26e5 | |||
| 96947c30c0 | |||
| 19f1bac18c | |||
| b3b80f85fe | |||
| 9695165877 | |||
| 84080c12fd | |||
| 1a855fed8f | |||
| 773262bc09 | |||
| fadb25baf8 | |||
| 20a46b31cd | |||
| b2321576bc | |||
| 67b6ef4c2a | |||
| 7ffc4b57aa | |||
| d4d12164aa | |||
| 34d5746553 | |||
| 86cb435adf | |||
| 513f5a8869 | |||
| 1de02b9c57 | |||
| f6bc4fd4c6 | |||
| 9b399f3960 | |||
| 98c2ccfaa3 | |||
| 309e1e2b1d | |||
| af13f61a43 | |||
| d093ac6a0f | |||
| 4badf640bf | |||
| 8f6ba5a089 | |||
| 5cf08b0722 | |||
| 0421c3991d | |||
| 50a1a33d07 | |||
| 96570820ef | |||
| eb90186614 | |||
| 8d21c84e7d | |||
| 601851cc7e | |||
| 29f55810cf | |||
| f76ba285c9 | |||
| 0a7a54f312 | |||
| 5b16b190c1 | |||
| 0885a79c28 | |||
| 6d3502833f | |||
| bc8727786b | |||
| f0445295bd | |||
| 5a06d679cf | |||
| 76cc034df2 | |||
| cbb230fdfc | |||
| 5d1540f4fc | |||
| a5a421a9f1 | |||
| 743099f9f9 | |||
| d2d6eba16a | |||
| cceec84139 | |||
| c909693d45 | |||
| fba70f7991 | |||
| 84a290097b | |||
| 6ee23c9b85 | |||
| cac5b0fe5a | |||
| 93783df42a | |||
| a3fb64d1cd | |||
| 7079e7ea5e | |||
| 4f39f8a8d0 | |||
| 27bada6737 | |||
| 650836d700 | |||
| 3b9aebee11 | |||
| 847b16fb76 | |||
| 2387813428 | |||
| 0be18f5cb0 | |||
| 4f08bb5046 | |||
| 09d2ca17cf | |||
| 83aa711346 | |||
| 863ecded30 | |||
| 0a86ddc36c | |||
| 6c1a433c4c | |||
| 23734aff74 | |||
| 0016c25b58 | |||
| 68eb54dc13 | |||
| b08d67c4e1 | |||
| 5ab4623c2a | |||
| cdf73f2e05 | |||
| 30bef20e22 | |||
| 4be077163f | |||
| b9dfffc237 | |||
| c5bf15e009 | |||
| e2949c7d0a | |||
| e448f4f6ef | |||
| ebd91459f2 | |||
| ff8a624189 | |||
| 449ebc1b70 | |||
| 3f14341629 | |||
| ca9cbab532 | |||
| 5c70a2015f | |||
| 573812d0ff | |||
| c12930cdde | |||
| 857f339914 | |||
| b1ffe7a153 | |||
| 62b60b11bb | |||
| 96e0902f39 | |||
| 1d3207d7c7 | |||
| fb0abdeb4f | |||
| 331f1b9961 | |||
| 3cfe7b9af9 | |||
| 37e656082b | |||
| 0c0cf8b19f | |||
| bbad38b2c5 | |||
| 413febf657 | |||
| d5447d859f | |||
| 38a49f92ab | |||
| 0f968e3b6d | |||
| f65d75f5c8 | |||
| 291dbdfbe6 | |||
| 6ce9bb6f7a | |||
| a0bdb78a99 | |||
| 321f26f450 | |||
| 212815a10d | |||
| 104e64dd0f | |||
| 5967acc9ca | |||
| eea4397b12 | |||
| a122a53e72 | |||
| 8215380336 | |||
| af9597f454 | |||
| 235e648bf5 | |||
| fbcc532de5 | |||
| 72894a1a90 | |||
| e3856dfe5d | |||
| 62420b900e | |||
| 89ef676613 | |||
| 83e14f602f | |||
| 5389309d40 | |||
| 058460ddf4 | |||
| 380009ac58 | |||
| 2775099a32 | |||
| f98e567f49 | |||
| 9fb48d5f44 | |||
| 8f653ba8de | |||
| 87b3b48fe0 | |||
| 0043d9bf13 | |||
| 2d2d72afbb | |||
| 4f9cb3871a | |||
| 5b598c1812 | |||
| 8f66dad65b | |||
| 55f06b76f9 | |||
| 6e1da2ef91 | |||
| 1ec2ade65b | |||
| 13148df9f2 | |||
| 5a10261111 | |||
| 064d48771d | |||
| 7eeba4d485 | |||
| 0681deb3c9 | |||
| 0ffa78b66a | |||
| b51ae87828 | |||
| 68fb8dd873 | |||
| 8869dc7762 | |||
| e6c9291e32 | |||
| a6f14ca97c | |||
| c555a6747d | |||
| dd276dbb59 | |||
| 70d82017fe | |||
| 663bd73518 | |||
| c526705f4f | |||
| c84d2cb32a | |||
| ff211371bc | |||
| e9a4734a57 | |||
| 3359bdc464 | |||
| 17faee5d81 | |||
| 5cd852f9bd | |||
| 4c75b1c102 | |||
| ef27c11d50 | |||
| cd3939a153 | |||
| 9f5463ce42 | |||
| 3bc1b53962 | |||
| de1b919641 | |||
| 03e224ee83 | |||
| c2bc171ef6 | |||
| f8740e124c | |||
| 57da381ae3 | |||
| 935cb4076b | |||
| b2ea15da35 | |||
| 9733177083 | |||
| fa665141bb | |||
| 64720f15a2 | |||
| 8df0f13230 | |||
| 94e7be3714 | |||
| 9b4adc9acb | |||
| e27162397a | |||
| 99d750d597 | |||
| 8391a23600 | |||
| ec3ef520e6 | |||
| 28aab134db | |||
| 752cc26ad6 | |||
| d159417474 | |||
| 7b0d7d0c9a | |||
| 7631056b8a | |||
| 4107dc7355 | |||
| 085a131801 | |||
| 50fed1d774 | |||
| c240355cc6 | |||
| a9edcc1705 | |||
| 4b3d2c8834 | |||
| 48d9031efb | |||
| a8adb99e94 | |||
| b01ae2de05 | |||
| af71b03000 | |||
| 392991fa0b | |||
| 1bfc75ac23 | |||
| def679554f | |||
| 08b6abd711 | |||
| 33761ee06b | |||
| d2b8fd6401 | |||
| 4f236d1c50 | |||
| f9f9e2ad4a | |||
| 23c246882e | |||
| f290ff215e | |||
| 1f3255d76b | |||
| fdeac73a59 | |||
| 175cd03ff2 | |||
| d6a7f5e1e0 | |||
| 8ce08dedfe | |||
| 32377ce57d | |||
| d84a9484b7 | |||
| 55a2bcbe15 | |||
| f2422ace7d | |||
| 3e5d7e1718 | |||
| 8286d84fb1 | |||
| c42d0c8374 | |||
| 37bfb3c48d | |||
| b3937288e5 | |||
| 7eaa548b6d | |||
| d7e936de5c | |||
| d2bc0e5fe0 | |||
| d8107a5125 | |||
| a82c50eac2 | |||
| 7fa9efbfd8 | |||
| fe3893ff01 | |||
| e8348e5f64 | |||
| fb85974d01 | |||
| 3377ddaf09 | |||
| 962f5c9b82 | |||
| 2c634eeef2 | |||
| c6e60f06eb | |||
| e5d2642780 | |||
| a9f4f8ded4 | |||
| 26e8048a0a | |||
| 6bfb0dda85 | |||
| 8ae1552a5b | |||
| 00f36a3149 | |||
| 12a36b5a94 | |||
| e371592f75 | |||
| 84a3654371 | |||
| 7e5c4fe1cd | |||
| 773ccc4bf8 | |||
| b31ce408ae | |||
| 7983c484b2 | |||
| 6502737bd5 | |||
| b98dd728ca | |||
| 7f3ba5963d | |||
| 43e58de918 | |||
| e309ad8465 | |||
| 2fa624aef0 | |||
| e958600f32 | |||
| 484251c52b | |||
| 512be4ab65 | |||
| 6f8120cb3a | |||
| c42d47d94a | |||
| d35e2f5339 | |||
| 91ce6ef190 | |||
| aac30e772f | |||
| acc142d4ba | |||
| 24fac5f56d | |||
| 4e4458416d | |||
| da2978f607 | |||
| 7c78c59e64 | |||
| 0cc92bd67c | |||
| 2cf2456f4c | |||
| 8c5b3c4150 | |||
| 36d771affc | |||
| 387a76ba59 | |||
| f601e817fe | |||
| 3fd0d0dafb | |||
| f28895cd6b | |||
| 0800f6f91b | |||
| f4f462c50b | |||
| 359ecda4fc | |||
| bf0846f0ea | |||
| 0401d5920c | |||
| ac418e999d | |||
| ae42815b7d | |||
| 5a3a915a9b | |||
| 632a08ff40 | |||
| 1b3dd8f38b | |||
| ce31c9c448 | |||
| bc434e8f67 | |||
| e05c2e0f1d | |||
| 2255973b0f | |||
| ac24a72e66 | |||
| bb067c7ebf | |||
| 599bb9c457 | |||
| 12b8d542b7 | |||
| fef23768fe | |||
| 328883b6ea | |||
| 87ed750510 | |||
| cc7f17f011 | |||
| 3c25fd1ba5 | |||
| 301c078d19 | |||
| 9485113923 | |||
| 4f3130f562 | |||
| a783bf4a93 | |||
| f7e8dc770a | |||
| 34909d97b4 | |||
| 474a67231c | |||
| b645fc10a3 | |||
| 8e1e08ee38 | |||
| d266fee8bb | |||
| 8357e865bc | |||
| fe9a8ebea2 | |||
| 2b558a3787 | |||
| 72d06080c6 | |||
| 3cdf926454 | |||
| 025a9647af | |||
| 32e7ef8a3d | |||
| 2b82f8f12c | |||
| 3a184ae677 | |||
| 564d1a0f79 | |||
| 05c011e842 | |||
| 61144f935e | |||
| d23435baac | |||
| 41c2669476 | |||
| ed3591ed1f | |||
| 5dae278652 | |||
| 30d91e8ed6 | |||
| c69417149d | |||
| 08271e5591 | |||
| a104e7c593 | |||
| c3e7a23da5 | |||
| 083edb201c | |||
| df7bf9a048 | |||
| bed5debca6 | |||
| caa1658a4c | |||
| bb5b628cce | |||
| 127a44f2b9 | |||
| ad71a1633c | |||
| fb69620a27 | |||
| a6e15b2f57 | |||
| 39ecd96b09 | |||
| 21a8d9569d | |||
| 24d60da553 | |||
| 039795b405 | |||
| 716450ceb5 | |||
| 97eaddd93b | |||
| e3ce0fbee3 | |||
| 364702b1c9 | |||
| 0f7b2eb79f | |||
| 4a0760719e | |||
| d011383a3d | |||
| 0ec94630d4 | |||
| c71f2714c6 | |||
| 71462d9f99 | |||
| 61a8cf8ba7 | |||
| 8869d3212f | |||
| aac7c5465b | |||
| 22ee5c0c4d | |||
| 7f3d8de26f | |||
| 331b73c8e4 | |||
| 9138c98b25 | |||
| 456af21d8b | |||
| c82417697a | |||
| bd19f991a5 | |||
| e87ba1d317 | |||
| f9d1f5196a | |||
| b5717f82a0 | |||
| bc6a70c689 | |||
| 1fb6c6e6e5 | |||
| d2dbc9d7a0 | |||
| 8c4d415412 | |||
| 25163eb008 | |||
| 96e8b83d41 | |||
| de93782fab | |||
| 7ed82aea38 | |||
| dc15187f1b | |||
| ae1a249a0a | |||
| 171fbf879f | |||
| 8a1caa0d16 | |||
| cdcf7e62f3 | |||
| 083727b0a6 | |||
| 718dd9f170 | |||
| 6c218c7b0f | |||
| e87a0baa4b | |||
| 8ee5f2ad89 | |||
| ee76cef1ff | |||
| 6da05f7086 | |||
| e24b1629a0 | |||
| d9ea9bedb2 | |||
| 1546b9bf99 | |||
| 62b5d37b6b | |||
| d78d9bf151 | |||
| a5f0fb6008 | |||
| f2bb3d0d80 | |||
| 037a72debd | |||
| 1ef4b7ae5a | |||
| b314cc4c23 | |||
| 644de8f22a | |||
| 36f61f3879 | |||
| aa11f7d8a3 | |||
| f30aafc3cc | |||
| 2f065b8b4c | |||
| aece3e732e | |||
| ebe9327a92 | |||
| 102d8f67cd | |||
| a00fe15abd | |||
| 3acf8cfd63 | |||
| d34717d8c9 | |||
| a5b8f163d7 | |||
| 6add3b9161 | |||
| 1ddd61f98a | |||
| 3503a36e5e | |||
| 2ea7269450 | |||
| a968eadbf1 | |||
| c6b63e0e28 | |||
| 7bd8ddc8fa | |||
| 14e264f646 | |||
| 969b55036f | |||
| cbf978d1f7 | |||
| 94e0ac7d9f | |||
| 08b36e4f48 | |||
| d62d880316 | |||
| 361b5e0ebf | |||
| c16e2e6234 | |||
| c08f29c803 | |||
| ecb6d03ccd | |||
| e59793cc75 | |||
| 236ad4aeda | |||
| 97bb91d5fa | |||
| 233030e417 | |||
| 6256e425f3 | |||
| 48368dc9a1 | |||
| 691c655630 | |||
| b88ad7f2d9 | |||
| b300b6b3bd | |||
| 234117800f | |||
| ac58b2f857 | |||
| 220b37144b | |||
| 74c8ccb45b | |||
| 9cfe981e1f | |||
| 2f9072efdc | |||
| 5e90802b1a | |||
| 45fee13f3d | |||
| 261ad78122 | |||
| 4fa82809df | |||
| 3e3787ecb6 | |||
| a723aaedd8 | |||
| ebb528976f | |||
| f77c2d700f | |||
| 8c44b8306b | |||
| e668cff573 | |||
| fa953e4205 | |||
| 540982cc9d | |||
| a61546680b | |||
| 8cb7eae5c9 | |||
| 18440c1faf | |||
| 9f69ca503a | |||
| 49ba744130 | |||
| 4b24ddd70d | |||
| 1612db5f91 | |||
| 7dfe68cac6 | |||
| 83807811cd | |||
| 23e71d1aa2 | |||
| b542a1804c | |||
| 2dff2f36bf | |||
| 6b674709b8 | |||
| f56445d7ca | |||
| 03bee14372 | |||
| 50ff40d684 | |||
| c31164bf1e | |||
| 3835ab394e | |||
| 20b23da8e2 | |||
| f6795d75a6 | |||
| fa11b98800 | |||
| 64c67a93d3 | |||
| 154380ccf5 | |||
| 1f2c83845d | |||
| 2349a09736 | |||
| 1df533c914 | |||
| 44bf748479 | |||
| f9fbd29c14 | |||
| 31dc3e9256 | |||
| 698b2bf729 | |||
| 1d42560018 | |||
| efcf307b4c | |||
| 6876f3b91d | |||
| 7495a4722f | |||
| 7ce56b3a47 | |||
| 5376863c0c | |||
| a86e036594 | |||
| 01324b02e7 | |||
| 792722865f | |||
| 9aa401a7d0 | |||
| a160e4fb6b | |||
| c7422e4d90 | |||
| 485d2b593c | |||
| 1bea537731 | |||
| 75e88d613f | |||
| 379b83e946 | |||
| dda1bf1887 | |||
| f7e524cbe6 | |||
| e503ac508e | |||
| f5ba3f51ce | |||
| d392b11dfb | |||
| cd01ee9a54 | |||
| 8c1af09989 | |||
| f53ff0d01c | |||
| 4f48dab023 | |||
| a7ffcaab28 | |||
| f617f18e46 | |||
| 4372d75b26 | |||
| da555a2c9b | |||
| 885fb703cf | |||
| cd00d8f3f0 | |||
| b3755e617c | |||
| fc0f9da7a7 | |||
| 277961fa25 | |||
| 14a9103fc0 | |||
| 6d1f7c2b1b | |||
| 2c1f3487a4 | |||
| acc6189da0 | |||
| ac177b849c | |||
| 29aeebf5bc | |||
| cc769ff19d | |||
| 1834eed809 | |||
| b34234ac14 | |||
| 7ec9f52509 | |||
| 68f527267b | |||
| 7f22b34c78 | |||
| ad63d24dba | |||
| 3b5813c035 | |||
| 339b963e6b | |||
| 00890aecdf | |||
| 2171cae8ff | |||
| 3f55152ca0 | |||
| f3cebb3e1b | |||
| 2b227f00f2 | |||
| 98de57c6c4 | |||
| e231be86b7 | |||
| 7ec221e734 | |||
| fe9ff64d64 | |||
| 3f65c12d0c | |||
| 336627a776 | |||
| 6226ea0085 | |||
| 1067cd0649 | |||
| 1537ecd931 | |||
| 5b5c42d2c7 | |||
| 161890dad4 | |||
| 35846fe735 | |||
| 96ce65f021 | |||
| 8457e471fd | |||
| 246de2b7f5 | |||
| e8c26963e9 | |||
| 793e7c0d9f | |||
| 3b337a12c9 | |||
| 2c32cb743c | |||
| 883b995fd6 | |||
| a28533933f | |||
| d695208727 | |||
| 613ff61de7 | |||
| 65b02cc8f2 | |||
| 1c8ee3f957 | |||
| 922108060d | |||
| ce74285c5e | |||
| c262eea84a | |||
| f2ca7e664a | |||
| cf8f65d806 | |||
| bc221bdb90 | |||
| 6bed5c181b | |||
| f162c08cda | |||
| 0d1d452b79 | |||
| 3c3e131c38 | |||
| a218cf3c61 | |||
| 866468cc3e | |||
| f66fc199a2 | |||
| 11ac26bfb4 | |||
| 2241bfb0df | |||
| d92af2aa85 | |||
| e4d573a080 | |||
| f86c8656a3 | |||
| 6697f0ea86 | |||
| e935f06f16 | |||
| 1e18004bdd | |||
| 19646ad049 | |||
| 7e943808b6 | |||
| 88dbee3589 | |||
| 5bfa43f7d5 | |||
| 7ed37b3fa5 | |||
| f0271e54d9 | |||
| 0ac2f0e04c | |||
| ef1690ef45 | |||
| 0fa06b1db0 | |||
| abceef74e0 | |||
| 5444a6b11c | |||
| 9411cd6c07 | |||
| a35d4f9029 | |||
| 284d26da05 | |||
| e8d4259f9a | |||
| 8086afc60a | |||
| b2ebd37ee2 | |||
| 83e6813345 | |||
| 09f24a851e | |||
| 81e027eef7 | |||
| 1c371d07b5 | |||
| 55e8549839 | |||
| f8d6c5b330 | |||
| 435b6df989 | |||
| bf8136eaa6 | |||
| cc584760d3 | |||
| d41b20b268 | |||
| 36da867caf | |||
| c5f540e3d7 | |||
| c90e824342 | |||
| 749bd80091 | |||
| 1c0b70bbd2 | |||
| b75f6c05c0 | |||
| 269b810601 | |||
| e54040d540 | |||
| b96e9a4a4a | |||
| e18df87a15 | |||
| 5cb8619eca | |||
| 476094ad5a | |||
| d2469edd10 | |||
| 0df8fb70b4 | |||
| 4dd9a36a3c | |||
| 41678fe3d3 | |||
| 5bc6b6fc26 | |||
| 8931c68b20 | |||
| f78f908c09 | |||
| 5487bca4f3 | |||
| 762a5c8334 | |||
| 2fed41dfa5 | |||
| e0f9eac521 | |||
| b90a2a8497 | |||
| 950a916952 | |||
| 3f13339071 | |||
| eb6678ebef | |||
| d62e0a3695 | |||
| dcb7fd8520 | |||
| d5713c657b | |||
| 99c4b76a6d | |||
| e4887aaa5b | |||
| d69a7a3bbf | |||
| ccf6dd07b3 | |||
| e8129429e9 | |||
| 2566d13100 | |||
| 5a15369d4d | |||
| deaf1dd458 | |||
| 65f87b114b | |||
| 8f5b453a96 | |||
| b7eec216e9 | |||
| 17c430da88 | |||
| 96a501c08b | |||
| dc57707e60 | |||
| 56b5a7d977 | |||
| 65dbbf712d | |||
| 49497d8e7c | |||
| 728684840c | |||
| 73f7d091f8 | |||
| 00e1bc49c8 | |||
| cb3a098b25 | |||
| 5a7045181a | |||
| 6a045fd678 | |||
| 327f92cc46 | |||
| 482cacd420 | |||
| 93a6be836c | |||
| ef7185ce43 | |||
| 920c180052 | |||
| a84afb6334 | |||
| cdac7c7bec | |||
| fe09c79f4b | |||
| cabad90d6c | |||
| 6dba1733f0 | |||
| daa88c6b9e | |||
| 9b727fa1f3 | |||
| e45d74c8f9 | |||
| 923009b5ff | |||
| 4064d4c7eb | |||
| e58ce89b10 | |||
| 6259ba1bfd | |||
| cd8262eb79 | |||
| d2b854674e | |||
| ad930f6216 | |||
| f061a0ab36 | |||
| 2e165053ef | |||
| 8cc8b0d2b4 | |||
| 06b4292534 | |||
| 29f883feee | |||
| 0e69cddda2 | |||
| ad5e70f94e | |||
| 7fae2e834c | |||
| 8e3f5fb209 | |||
| 05fbd1e5bc | |||
| 1491934d17 | |||
| fce486c4f9 | |||
| 1b4955342f | |||
| 95ac650af6 | |||
| 2b98aa403e | |||
| 425c653a14 | |||
| 52844614c4 | |||
| 85c0c8c7ed | |||
| a8f04359e8 | |||
| cb54f4c2ec | |||
| 77fa1a20bf | |||
| a7cdc42140 | |||
| a8aa9d5ecb | |||
| 52fbfb3ec0 | |||
| d25293b721 | |||
| c07af090f5 | |||
| 456e88a8a4 | |||
| a7cc1159cd | |||
| 6bd87e8146 | |||
| 42a4c3fba6 | |||
| 1cba763189 | |||
| d01cbe9320 | |||
| b10ab79743 | |||
| 619462b029 | |||
| d93b6be3cc | |||
| 9755ab160d | |||
| 2043e06102 | |||
| c7dcdc0e88 | |||
| eb67dc9f50 | |||
| 676b818d6a | |||
| 411ce04f54 | |||
| d321a34f7c | |||
| fb1a58ac76 | |||
| 1644af841b | |||
| b0def9617f | |||
| c2664d912a | |||
| 9697e3ac24 | |||
| d2a9efd039 | |||
| 442999dcdb | |||
| d753ae1489 | |||
| db3e3be8ee | |||
| 0c8da03869 | |||
| 0417c8c9c7 | |||
| d4af89781b | |||
| a8c1cdf88e | |||
| 7a187e9b5e | |||
| 9096b1c768 | |||
| 781fbde449 | |||
| 1b336bb602 | |||
| 0fb3b8db72 | |||
| b44302382d | |||
| 458f1d5ebe | |||
| a43e3bebe6 | |||
| f62fe956d1 | |||
| 852b0226e0 | |||
| ef3844a177 | |||
| 476aa443c6 | |||
| cb0f74ab9f | |||
| 08d1c54364 | |||
| dbbfa003d3 | |||
| 5ffc5bca7c | |||
| 11ac2e1475 | |||
| 59608907b8 | |||
| e454c4891e | |||
| 3ed243abde | |||
| d60524ecfa | |||
| 345e071b24 | |||
| be1a121d0d | |||
| 156406b56c | |||
| f68654a204 | |||
| 8abb312c20 | |||
| adcb943f61 | |||
| 5489735258 | |||
| 8de176988d | |||
| 79c5d07abe | |||
| 74020a084b | |||
| 09acd478f1 | |||
| e6c9e2fa50 | |||
| ab2c59b80e | |||
| a5209c4882 | |||
| f1dd5e49c5 | |||
| c6b60e219d | |||
| 740f6628ec | |||
| 821fac187c | |||
| 73fdf75328 | |||
| f7daa9e4f5 | |||
| e58e545584 | |||
| 319db07b6b | |||
| 407cc5f1b6 | |||
| 80037dc6de | |||
| d9bada9867 | |||
| 6b89154afd | |||
| 1f2d4e4839 | |||
| 4a9904fe62 | |||
| 4b5fdc6bb2 | |||
| 2d11edd103 | |||
| fef6192bca | |||
| 7d9e1be588 | |||
| ba3cf47600 | |||
| 9e09828cc3 | |||
| b236f10792 | |||
| f0bef94a03 | |||
| 1bec7ca540 | |||
| 29bbbaa0a7 | |||
| 73aa5f567b | |||
| d5e8792f55 | |||
| 5393185add | |||
| 9fef09fe89 | |||
| a9b030591b | |||
| d4a9c731ff | |||
| 17d15df6cd | |||
| 98611adeb9 | |||
| 01a8c9ca8d | |||
| 0940c56a3f | |||
| d650b5cc5a | |||
| b624da27bd | |||
| 5b443199ca | |||
| cb82388a84 | |||
| 735c31bb4a | |||
| b7253e3280 | |||
| 94d187e269 | |||
| d991c22090 | |||
| 322960f795 | |||
| b5035ce991 | |||
| 07c56f149f | |||
| 0e1c7eda39 | |||
| 2b2bcc9b38 | |||
| a3b109eca0 | |||
| a1b09a3734 | |||
| d81ac52ce2 | |||
| 220df8252d | |||
| de720ac34a | |||
| 68d59a2913 | |||
| 753e417dec | |||
| 7d1094b7e1 | |||
| 58426c80a3 | |||
| cddd7f10d5 | |||
| ea3c2307dc | |||
| 65b3209441 | |||
| 400a781ebf | |||
| c8689d9d0a | |||
| ea0d1424d8 | |||
| 365f44b094 | |||
| bcf96d637e | |||
| 6ced54a892 | |||
| c5a2d28367 | |||
| b4a6aa335d | |||
| 35245cb76e | |||
| fa349b7a4e | |||
| df305e83fa | |||
| b2464e3379 | |||
| 6856cc7253 | |||
| 508bd3f55d | |||
| 8b51e2df8b | |||
| bd1b252de9 | |||
| f30931848e | |||
| b27ae9c63b | |||
| 79f8b7fd73 | |||
| 48e9e651a4 | |||
| 1bf353b876 | |||
| 23e336ee53 | |||
| ac54bb193c | |||
| e9058ea8f5 | |||
| fd06139c20 | |||
| b43da8aa5d | |||
| 066259b656 | |||
| 64f5471b2a | |||
| 4e789635c9 | |||
| 7c17695be4 | |||
| 73bbabcd04 | |||
| 93d79d2e5d | |||
| 1889d72889 | |||
| 5813d2439c | |||
| 4f1ba5e69e | |||
| c934d9c3cc | |||
| 00b19d6fba | |||
| 8b13b85c5e | |||
| 64b0757758 | |||
| 1622e7cc90 | |||
| 1f9713195b | |||
| ea04f9d12e | |||
| 74e4cfd1da | |||
| 27ee6501eb | |||
| a5696da9ec | |||
| 0b439bcd08 | |||
| b805115c1a | |||
| c41fb45da3 | |||
| cdfa58dde0 | |||
| 6630eac813 | |||
| 63f5f93063 | |||
| 5da4bb7e88 | |||
| dc1b1f2cd7 | |||
| 25ec4ce6f1 | |||
| d30bc0a4c0 | |||
| c05ac8729e | |||
| 9926a93a78 | |||
| 7093752cb5 | |||
| 0daf055fe6 | |||
| 3f38edfd61 | |||
| ee201f4df5 | |||
| 9181ecfc7b | |||
| 4bf94cb5d1 | |||
| 599a3026d1 | |||
| 288fa70ed9 | |||
| 8d05dab32c | |||
| 3c14a8c507 | |||
| ab3b1e9922 | |||
| cd7db168e0 | |||
| cbcdbde29d | |||
| 2df978b8e7 | |||
| 10808ccbb4 | |||
| f756923271 | |||
| a327418767 | |||
| 83c4378d5d | |||
| e74075c689 | |||
| 1c1762d3f6 | |||
| e0ac0cfbe2 | |||
| 775d031366 | |||
| 1a17f402a4 | |||
| 40973bea31 | |||
| 0be2c7018b | |||
| aa08900ac8 | |||
| d37180a2c4 | |||
| 8badf7f354 | |||
| 150bd3aee6 | |||
| a748eba42e | |||
| 935420217c | |||
| 81d4d4948e | |||
| 041da57e87 | |||
| acf1be547d | |||
| 908bf935f7 | |||
| e59e978fcd | |||
| fbaae7ac37 | |||
| dcf7eb972e | |||
| 2840362868 | |||
| d4fc302c7e | |||
| 1cce9db710 | |||
| e92f1eaa3d | |||
| f84cae833a | |||
| ed58b5489f | |||
| ef5fa498d4 | |||
| 78e4fbd2d7 | |||
| 96075ce0c9 | |||
| c007228d0f | |||
| dca9b4283b | |||
| dcec3150f0 | |||
| d015db3de8 | |||
| ef7fb905aa | |||
| 5e5385a814 | |||
| 7aaa918367 | |||
| c2e484a465 | |||
| f64d807863 | |||
| 81c2f3d194 | |||
| 8c77f35fce | |||
| ff4ce9f7b1 | |||
| f39784c584 | |||
| 98e38b2a41 | |||
| 1d8c73cf6c | |||
| ef68cc3d5f | |||
| 18550b4601 | |||
| c8f1948d58 | |||
| f6de25b6cb | |||
| b3514a5708 | |||
| 91b0100287 | |||
| 870a775d7d | |||
| 575a609b80 | |||
| 675342ecd9 | |||
| 245b2fec34 | |||
| 49a75079f2 | |||
| d3f9ad1145 | |||
| 46615ffc4a | |||
| f0ffc52435 | |||
| f7d029cfce | |||
| 1eb63cfc42 | |||
| 43ff8f8e8d | |||
| b11a3a0820 | |||
| bef6b6282c | |||
| 9c58a7cb1e | |||
| 69ac19d82d | |||
| b77fe9d624 | |||
| 5c7c80dd27 | |||
| d7abb641ca | |||
| 4e75f31c55 | |||
| e1f14fcac7 | |||
| 39d3bbb601 | |||
| 4d35a46c48 | |||
| 2c9d149ac2 | |||
| 06bf845783 | |||
| f496a37340 | |||
| b745e1c43a | |||
| 21ed892489 | |||
| 5504d94e36 | |||
| adf54d41d5 | |||
| 75bd9f86b2 | |||
| 734771418e | |||
| 51a8885566 | |||
| 60c382d8f1 | |||
| 3371e679ce | |||
| ce5626db45 | |||
| 1377b9b736 | |||
| 936428cb3b | |||
| c305455cb2 | |||
| 8334932a26 | |||
| 99d29c9d39 | |||
| a448d3a6aa | |||
| 1a6b4d6ce6 | |||
| a15417fe74 | |||
| 3dcb775d16 | |||
| 2d387356de | |||
| 07c3aae315 | |||
| b36eba7fab | |||
| 8574a757f9 | |||
| 0812207db7 | |||
| 7e4b2057f2 | |||
| 2947877871 | |||
| fadb90c579 | |||
| dfb9832a25 | |||
| fd46684bf8 | |||
| 9badb0d903 | |||
| c5f06814bc | |||
| 69d43e2997 | |||
| 0f0dea79fc | |||
| b6d636214e | |||
| 4b64955a12 | |||
| 546239a3a8 | |||
| 8be0a3452d | |||
| 99d914ea3b | |||
| 24284d3d17 | |||
| 9fc872b70b | |||
| e3654d5416 | |||
| d92bee821d | |||
| df10411e05 | |||
| 44e9fb306d |
@@ -1,5 +1,5 @@
|
|||||||
<!--
|
<!--
|
||||||
If you have a question rather than reporting a bug please go to http://answers.opencv.org where you get much faster responses.
|
If you have a question rather than reporting a bug please go to https://forum.opencv.org where you get much faster responses.
|
||||||
If you need further assistance please read [How To Contribute](https://github.com/opencv/opencv/wiki/How_to_contribute).
|
If you need further assistance please read [How To Contribute](https://github.com/opencv/opencv/wiki/How_to_contribute).
|
||||||
|
|
||||||
This is a template helping you to create an issue which can be processed as quickly as possible. This is the bug reporting section for the OpenCV library.
|
This is a template helping you to create an issue which can be processed as quickly as possible. This is the bug reporting section for the OpenCV library.
|
||||||
@@ -27,4 +27,4 @@ This is a template helping you to create an issue which can be processed as quic
|
|||||||
// C++ code example
|
// C++ code example
|
||||||
```
|
```
|
||||||
or attach as .txt or .zip file
|
or attach as .txt or .zip file
|
||||||
-->
|
-->
|
||||||
|
|||||||
Vendored
+3
-2
@@ -27,7 +27,7 @@ if(CMAKE_COMPILER_IS_GNUCC)
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_library(carotene_objs OBJECT
|
add_library(carotene_objs OBJECT EXCLUDE_FROM_ALL
|
||||||
${carotene_headers}
|
${carotene_headers}
|
||||||
${carotene_sources}
|
${carotene_sources}
|
||||||
)
|
)
|
||||||
@@ -40,4 +40,5 @@ if(WITH_NEON)
|
|||||||
target_compile_definitions(carotene_objs PRIVATE "-DWITH_NEON")
|
target_compile_definitions(carotene_objs PRIVATE "-DWITH_NEON")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_library(carotene STATIC EXCLUDE_FROM_ALL "$<TARGET_OBJECTS:carotene_objs>")
|
# we add dummy file to fix XCode build
|
||||||
|
add_library(carotene STATIC ${OPENCV_3RDPARTY_EXCLUDE_FROM_ALL} "$<TARGET_OBJECTS:carotene_objs>" "${CAROTENE_SOURCE_DIR}/dummy.cpp")
|
||||||
|
|||||||
Vendored
+2
-1
@@ -80,7 +80,8 @@ set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS ${carotene_defs})
|
|||||||
# set_source_files_properties(impl.cpp $<TARGET_OBJECTS:carotene_objs> COMPILE_FLAGS "--param ipcp-unit-growth=100000 --param inline-unit-growth=100000 --param large-stack-frame-growth=5000")
|
# set_source_files_properties(impl.cpp $<TARGET_OBJECTS:carotene_objs> COMPILE_FLAGS "--param ipcp-unit-growth=100000 --param inline-unit-growth=100000 --param large-stack-frame-growth=5000")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_library(tegra_hal STATIC $<TARGET_OBJECTS:carotene_objs>)
|
# we add dummy file to fix XCode build
|
||||||
|
add_library(tegra_hal STATIC $<TARGET_OBJECTS:carotene_objs> "dummy.cpp")
|
||||||
set_target_properties(tegra_hal PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${3P_LIBRARY_OUTPUT_PATH})
|
set_target_properties(tegra_hal PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${3P_LIBRARY_OUTPUT_PATH})
|
||||||
set(OPENCV_SRC_DIR "${CMAKE_SOURCE_DIR}")
|
set(OPENCV_SRC_DIR "${CMAKE_SOURCE_DIR}")
|
||||||
if(NOT BUILD_SHARED_LIBS)
|
if(NOT BUILD_SHARED_LIBS)
|
||||||
|
|||||||
Vendored
+2
@@ -0,0 +1,2 @@
|
|||||||
|
// This file is needed for compilation on some platforms e.g. with XCode generator
|
||||||
|
// Related issue: https://gitlab.kitware.com/cmake/cmake/-/issues/17457
|
||||||
Vendored
+22
-17
@@ -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
|
||||||
@@ -1847,6 +1850,8 @@ TegraCvtColor_Invoker(bgrx2hsvf, bgrx2hsv, src_data + static_cast<size_t>(range.
|
|||||||
#define cv_hal_cvtBGRtoHSV TEGRA_CVTBGRTOHSV
|
#define cv_hal_cvtBGRtoHSV TEGRA_CVTBGRTOHSV
|
||||||
#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 // OPENCV_IMGPROC_HAL_INTERFACE_H
|
#endif // OPENCV_IMGPROC_HAL_INTERFACE_H
|
||||||
|
|
||||||
|
|||||||
Vendored
+2
@@ -0,0 +1,2 @@
|
|||||||
|
// This file is needed for compilation on some platforms e.g. with XCode generator
|
||||||
|
// Related issue: https://gitlab.kitware.com/cmake/cmake/-/issues/17457
|
||||||
Vendored
+1
-1
@@ -758,7 +758,7 @@ inline void resizeAreaRounding(const Size2D &ssize, const Size2D &dsize,
|
|||||||
}
|
}
|
||||||
else if (channels == 3)
|
else if (channels == 3)
|
||||||
{
|
{
|
||||||
if ((wr == 2.0f) && (wr == 2.0f))
|
if ((wr == 2.0f) && (hr == 2.0f))
|
||||||
{
|
{
|
||||||
#ifndef __ANDROID__
|
#ifndef __ANDROID__
|
||||||
size_t roiw16 = dsize.width >= 15 ? (dsize.width - 15) * 3 : 0;
|
size_t roiw16 = dsize.width >= 15 ? (dsize.width - 15) * 3 : 0;
|
||||||
|
|||||||
Vendored
+2
-2
@@ -14,7 +14,7 @@ if(NOT DEFINED CPUFEATURES_SOURCES)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
include_directories(${CPUFEATURES_INCLUDE_DIRS})
|
include_directories(${CPUFEATURES_INCLUDE_DIRS})
|
||||||
add_library(${OPENCV_CPUFEATURES_TARGET_NAME} STATIC ${CPUFEATURES_SOURCES})
|
add_library(${OPENCV_CPUFEATURES_TARGET_NAME} STATIC ${OPENCV_3RDPARTY_EXCLUDE_FROM_ALL} ${CPUFEATURES_SOURCES})
|
||||||
|
|
||||||
set_target_properties(${OPENCV_CPUFEATURES_TARGET_NAME}
|
set_target_properties(${OPENCV_CPUFEATURES_TARGET_NAME}
|
||||||
PROPERTIES OUTPUT_NAME cpufeatures
|
PROPERTIES OUTPUT_NAME cpufeatures
|
||||||
@@ -29,7 +29,7 @@ if(ENABLE_SOLUTION_FOLDERS)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(NOT BUILD_SHARED_LIBS)
|
if(NOT BUILD_SHARED_LIBS)
|
||||||
ocv_install_target(${OPENCV_CPUFEATURES_TARGET_NAME} EXPORT OpenCVModules ARCHIVE DESTINATION ${OPENCV_3P_LIB_INSTALL_PATH} COMPONENT dev)
|
ocv_install_target(${OPENCV_CPUFEATURES_TARGET_NAME} EXPORT OpenCVModules ARCHIVE DESTINATION ${OPENCV_3P_LIB_INSTALL_PATH} COMPONENT dev OPTIONAL)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
ocv_install_3rdparty_licenses(cpufeatures LICENSE README.md)
|
ocv_install_3rdparty_licenses(cpufeatures LICENSE README.md)
|
||||||
|
|||||||
Vendored
+5
-5
@@ -1,8 +1,8 @@
|
|||||||
# Binaries branch name: ffmpeg/3.4_20200310
|
# Binaries branch name: ffmpeg/3.4_20211005
|
||||||
# Binaries were created for OpenCV: 4966186e10e2a940514d8c20447ca4a828af5f46
|
# Binaries were created for OpenCV: 95c1d2a8872b222f32bd88db9f1efcbd9f70a9cf
|
||||||
ocv_update(FFMPEG_BINARIES_COMMIT "e81ccda615672833b578c6cefdb859ad69c560ba")
|
ocv_update(FFMPEG_BINARIES_COMMIT "0bf6c0753d435d2c82c03c48db0c6e18ac79976c")
|
||||||
ocv_update(FFMPEG_FILE_HASH_BIN32 "301ae2000e25f800ab8e0065f277ad28")
|
ocv_update(FFMPEG_FILE_HASH_BIN32 "55c25bbc13e4a12d4339b70d3b76987f")
|
||||||
ocv_update(FFMPEG_FILE_HASH_BIN64 "d87ce032289c3f811d02f0c3d8dbe366")
|
ocv_update(FFMPEG_FILE_HASH_BIN64 "67caee9231c6843483b4de9815d6526e")
|
||||||
ocv_update(FFMPEG_FILE_HASH_CMAKE "3b90f67f4b429e77d3da36698cef700c")
|
ocv_update(FFMPEG_FILE_HASH_CMAKE "3b90f67f4b429e77d3da36698cef700c")
|
||||||
|
|
||||||
function(download_win_ffmpeg script_var)
|
function(download_win_ffmpeg script_var)
|
||||||
|
|||||||
Vendored
+2
-2
@@ -17,7 +17,7 @@ file(GLOB lib_hdrs ${IPP_IW_PATH}/include/*.h ${IPP_IW_PATH}/include/iw/*.h ${IP
|
|||||||
# Define the library target:
|
# Define the library target:
|
||||||
# ----------------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
add_library(${IPP_IW_LIBRARY} STATIC ${lib_srcs} ${lib_hdrs})
|
add_library(${IPP_IW_LIBRARY} STATIC ${OPENCV_3RDPARTY_EXCLUDE_FROM_ALL} ${lib_srcs} ${lib_hdrs})
|
||||||
|
|
||||||
if(UNIX)
|
if(UNIX)
|
||||||
if(CV_GCC OR CV_CLANG OR CV_ICC)
|
if(CV_GCC OR CV_CLANG OR CV_ICC)
|
||||||
@@ -41,5 +41,5 @@ if(ENABLE_SOLUTION_FOLDERS)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(NOT BUILD_SHARED_LIBS)
|
if(NOT BUILD_SHARED_LIBS)
|
||||||
ocv_install_target(${IPP_IW_LIBRARY} EXPORT OpenCVModules ARCHIVE DESTINATION ${OPENCV_3P_LIB_INSTALL_PATH} COMPONENT dev)
|
ocv_install_target(${IPP_IW_LIBRARY} EXPORT OpenCVModules ARCHIVE DESTINATION ${OPENCV_3P_LIB_INSTALL_PATH} COMPONENT dev OPTIONAL)
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
Vendored
+2
-2
@@ -37,7 +37,7 @@ set(ITT_SRCS
|
|||||||
src/ittnotify/jitprofiling.c
|
src/ittnotify/jitprofiling.c
|
||||||
)
|
)
|
||||||
|
|
||||||
add_library(${ITT_LIBRARY} STATIC ${ITT_SRCS} ${ITT_PUBLIC_HDRS} ${ITT_PRIVATE_HDRS})
|
add_library(${ITT_LIBRARY} STATIC ${OPENCV_3RDPARTY_EXCLUDE_FROM_ALL} ${ITT_SRCS} ${ITT_PUBLIC_HDRS} ${ITT_PRIVATE_HDRS})
|
||||||
|
|
||||||
if(NOT WIN32)
|
if(NOT WIN32)
|
||||||
if(HAVE_DL_LIBRARY)
|
if(HAVE_DL_LIBRARY)
|
||||||
@@ -60,7 +60,7 @@ if(ENABLE_SOLUTION_FOLDERS)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(NOT BUILD_SHARED_LIBS)
|
if(NOT BUILD_SHARED_LIBS)
|
||||||
ocv_install_target(${ITT_LIBRARY} EXPORT OpenCVModules ARCHIVE DESTINATION ${OPENCV_3P_LIB_INSTALL_PATH} COMPONENT dev)
|
ocv_install_target(${ITT_LIBRARY} EXPORT OpenCVModules ARCHIVE DESTINATION ${OPENCV_3P_LIB_INSTALL_PATH} COMPONENT dev OPTIONAL)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
ocv_install_3rdparty_licenses(ittnotify src/ittnotify/LICENSE.BSD src/ittnotify/LICENSE.GPL)
|
ocv_install_3rdparty_licenses(ittnotify src/ittnotify/LICENSE.BSD src/ittnotify/LICENSE.GPL)
|
||||||
|
|||||||
Vendored
+2
-2
@@ -17,7 +17,7 @@ file(GLOB lib_ext_hdrs jasper/*.h)
|
|||||||
# Define the library target:
|
# Define the library target:
|
||||||
# ----------------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
add_library(${JASPER_LIBRARY} STATIC ${lib_srcs} ${lib_hdrs} ${lib_ext_hdrs})
|
add_library(${JASPER_LIBRARY} STATIC ${OPENCV_3RDPARTY_EXCLUDE_FROM_ALL} ${lib_srcs} ${lib_hdrs} ${lib_ext_hdrs})
|
||||||
|
|
||||||
if(WIN32 AND NOT MINGW)
|
if(WIN32 AND NOT MINGW)
|
||||||
add_definitions(-DJAS_WIN_MSVC_BUILD)
|
add_definitions(-DJAS_WIN_MSVC_BUILD)
|
||||||
@@ -46,7 +46,7 @@ if(ENABLE_SOLUTION_FOLDERS)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(NOT BUILD_SHARED_LIBS)
|
if(NOT BUILD_SHARED_LIBS)
|
||||||
ocv_install_target(${JASPER_LIBRARY} EXPORT OpenCVModules ARCHIVE DESTINATION ${OPENCV_3P_LIB_INSTALL_PATH} COMPONENT dev)
|
ocv_install_target(${JASPER_LIBRARY} EXPORT OpenCVModules ARCHIVE DESTINATION ${OPENCV_3P_LIB_INSTALL_PATH} COMPONENT dev OPTIONAL)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
ocv_install_3rdparty_licenses(jasper LICENSE README copyright)
|
ocv_install_3rdparty_licenses(jasper LICENSE README copyright)
|
||||||
|
|||||||
+7
-6
@@ -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 4)
|
set(VERSION_REVISION 0)
|
||||||
set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION})
|
set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION})
|
||||||
set(LIBJPEG_TURBO_VERSION_NUMBER 2000004)
|
set(LIBJPEG_TURBO_VERSION_NUMBER 2001000)
|
||||||
|
|
||||||
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")
|
||||||
@@ -46,7 +46,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()
|
||||||
|
|
||||||
|
|
||||||
@@ -65,6 +64,8 @@ set(JPEG_LIB_VERSION 62)
|
|||||||
# OpenCV
|
# OpenCV
|
||||||
set(JPEG_LIB_VERSION "${VERSION}-${JPEG_LIB_VERSION}" PARENT_SCOPE)
|
set(JPEG_LIB_VERSION "${VERSION}-${JPEG_LIB_VERSION}" PARENT_SCOPE)
|
||||||
|
|
||||||
|
set(THREAD_LOCAL "") # WITH_TURBOJPEG is not used
|
||||||
|
|
||||||
if(MSVC)
|
if(MSVC)
|
||||||
add_definitions(-W3 -wd4996 -wd4018)
|
add_definitions(-W3 -wd4996 -wd4018)
|
||||||
endif()
|
endif()
|
||||||
@@ -104,7 +105,7 @@ set(JPEG_SOURCES ${JPEG_SOURCES} jsimd_none.c)
|
|||||||
|
|
||||||
ocv_list_add_prefix(JPEG_SOURCES src/)
|
ocv_list_add_prefix(JPEG_SOURCES src/)
|
||||||
|
|
||||||
add_library(${JPEG_LIBRARY} STATIC ${JPEG_SOURCES} ${SIMD_OBJS})
|
add_library(${JPEG_LIBRARY} STATIC ${OPENCV_3RDPARTY_EXCLUDE_FROM_ALL} ${JPEG_SOURCES} ${SIMD_OBJS})
|
||||||
|
|
||||||
set_target_properties(${JPEG_LIBRARY}
|
set_target_properties(${JPEG_LIBRARY}
|
||||||
PROPERTIES OUTPUT_NAME ${JPEG_LIBRARY}
|
PROPERTIES OUTPUT_NAME ${JPEG_LIBRARY}
|
||||||
@@ -119,7 +120,7 @@ if(ENABLE_SOLUTION_FOLDERS)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(NOT BUILD_SHARED_LIBS)
|
if(NOT BUILD_SHARED_LIBS)
|
||||||
ocv_install_target(${JPEG_LIBRARY} EXPORT OpenCVModules ARCHIVE DESTINATION ${OPENCV_3P_LIB_INSTALL_PATH} COMPONENT dev)
|
ocv_install_target(${JPEG_LIBRARY} EXPORT OpenCVModules ARCHIVE DESTINATION ${OPENCV_3P_LIB_INSTALL_PATH} COMPONENT dev OPTIONAL)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
ocv_install_3rdparty_licenses(libjpeg-turbo README.md LICENSE.md README.ijg)
|
ocv_install_3rdparty_licenses(libjpeg-turbo README.md LICENSE.md README.ijg)
|
||||||
|
|||||||
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-2019 D. R. Commander. All Rights Reserved.
|
Copyright (C)2009-2021 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
+9
-28
@@ -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
|
||||||
==========
|
==========
|
||||||
|
|
||||||
@@ -223,12 +210,12 @@ https://www.iso.org/standard/54989.html and http://www.itu.int/rec/T-REC-T.871.
|
|||||||
A PDF file of the older JFIF 1.02 specification is available at
|
A PDF file of the older JFIF 1.02 specification is available at
|
||||||
http://www.w3.org/Graphics/JPEG/jfif3.pdf.
|
http://www.w3.org/Graphics/JPEG/jfif3.pdf.
|
||||||
|
|
||||||
The TIFF 6.0 file format specification can be obtained by FTP from
|
The TIFF 6.0 file format specification can be obtained from
|
||||||
ftp://ftp.sgi.com/graphics/tiff/TIFF6.ps.gz. The JPEG incorporation scheme
|
http://mirrors.ctan.org/graphics/tiff/TIFF6.ps.gz. The JPEG incorporation
|
||||||
found in the TIFF 6.0 spec of 3-June-92 has a number of serious problems.
|
scheme found in the TIFF 6.0 spec of 3-June-92 has a number of serious
|
||||||
IJG does not recommend use of the TIFF 6.0 design (TIFF Compression tag 6).
|
problems. IJG does not recommend use of the TIFF 6.0 design (TIFF Compression
|
||||||
Instead, we recommend the JPEG design proposed by TIFF Technical Note #2
|
tag 6). Instead, we recommend the JPEG design proposed by TIFF Technical Note
|
||||||
(Compression tag 7). Copies of this Note can be obtained from
|
#2 (Compression tag 7). Copies of this Note can be obtained from
|
||||||
http://www.ijg.org/files/. It is expected that the next revision
|
http://www.ijg.org/files/. It is expected that the next revision
|
||||||
of the TIFF spec will replace the 6.0 JPEG design with the Note's design.
|
of the TIFF spec will replace the 6.0 JPEG design with the Note's design.
|
||||||
Although IJG's own code does not support TIFF/JPEG, the free libtiff library
|
Although IJG's own code does not support TIFF/JPEG, the free libtiff library
|
||||||
@@ -243,14 +230,8 @@ The most recent released version can always be found there in
|
|||||||
directory "files".
|
directory "files".
|
||||||
|
|
||||||
The JPEG FAQ (Frequently Asked Questions) article is a source of some
|
The JPEG FAQ (Frequently Asked Questions) article is a source of some
|
||||||
general information about JPEG.
|
general information about JPEG. It is available at
|
||||||
It is available on the World Wide Web at http://www.faqs.org/faqs/jpeg-faq/
|
http://www.faqs.org/faqs/jpeg-faq.
|
||||||
and other news.answers archive sites, including the official news.answers
|
|
||||||
archive at rtfm.mit.edu: ftp://rtfm.mit.edu/pub/usenet/news.answers/jpeg-faq/.
|
|
||||||
If you don't have Web or FTP access, send e-mail to mail-server@rtfm.mit.edu
|
|
||||||
with body
|
|
||||||
send usenet/news.answers/jpeg-faq/part1
|
|
||||||
send usenet/news.answers/jpeg-faq/part2
|
|
||||||
|
|
||||||
|
|
||||||
FILE FORMAT COMPATIBILITY
|
FILE FORMAT COMPATIBILITY
|
||||||
|
|||||||
Vendored
+12
-11
@@ -2,8 +2,8 @@ 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
|
||||||
@@ -179,8 +179,8 @@ supported and which aren't.
|
|||||||
|
|
||||||
NOTE: As of this writing, extensive research has been conducted into the
|
NOTE: As of this writing, extensive research has been conducted into the
|
||||||
usefulness of DCT scaling as a means of data reduction and SmartScale as a
|
usefulness of DCT scaling as a means of data reduction and SmartScale as a
|
||||||
means of quality improvement. The reader is invited to peruse the research at
|
means of quality improvement. Readers are invited to peruse the research at
|
||||||
<http://www.libjpeg-turbo.org/About/SmartScale> and draw his/her own conclusions,
|
<http://www.libjpeg-turbo.org/About/SmartScale> and draw their own conclusions,
|
||||||
but it is the general belief of our project that these features have not
|
but it is the general belief of our project that these features have not
|
||||||
demonstrated sufficient usefulness to justify inclusion in libjpeg-turbo.
|
demonstrated sufficient usefulness to justify inclusion in libjpeg-turbo.
|
||||||
|
|
||||||
@@ -287,12 +287,13 @@ following reasons:
|
|||||||
(and slightly faster) floating point IDCT algorithm introduced in libjpeg
|
(and slightly faster) floating point IDCT algorithm introduced in libjpeg
|
||||||
v8a as opposed to the algorithm used in libjpeg v6b. It should be noted,
|
v8a as opposed to the algorithm used in libjpeg v6b. It should be noted,
|
||||||
however, that this algorithm basically brings the accuracy of the floating
|
however, that this algorithm basically brings the accuracy of the floating
|
||||||
point IDCT in line with the accuracy of the slow integer IDCT. The floating
|
point IDCT in line with the accuracy of the accurate integer IDCT. The
|
||||||
point DCT/IDCT algorithms are mainly a legacy feature, and they do not
|
floating point DCT/IDCT algorithms are mainly a legacy feature, and they do
|
||||||
produce significantly more accuracy than the slow integer algorithms (to put
|
not produce significantly more accuracy than the accurate integer algorithms
|
||||||
numbers on this, the typical difference in PNSR between the two algorithms
|
(to put numbers on this, the typical difference in PNSR between the two
|
||||||
is less than 0.10 dB, whereas changing the quality level by 1 in the upper
|
algorithms is less than 0.10 dB, whereas changing the quality level by 1 in
|
||||||
range of the quality scale is typically more like a 1.0 dB difference.)
|
the upper range of the quality scale is typically more like a 1.0 dB
|
||||||
|
difference.)
|
||||||
|
|
||||||
- If the floating point algorithms in libjpeg-turbo are not implemented using
|
- If the floating point algorithms in libjpeg-turbo are not implemented using
|
||||||
SIMD instructions on a particular platform, then the accuracy of the
|
SIMD instructions on a particular platform, then the accuracy of the
|
||||||
@@ -340,7 +341,7 @@ The algorithm used by the SIMD-accelerated quantization function cannot produce
|
|||||||
correct results whenever the fast integer forward DCT is used along with a JPEG
|
correct results whenever the fast integer forward DCT is used along with a JPEG
|
||||||
quality of 98-100. Thus, libjpeg-turbo must use the non-SIMD quantization
|
quality of 98-100. Thus, libjpeg-turbo must use the non-SIMD quantization
|
||||||
function in those cases. This causes performance to drop by as much as 40%.
|
function in those cases. This causes performance to drop by as much as 40%.
|
||||||
It is therefore strongly advised that you use the slow integer forward DCT
|
It is therefore strongly advised that you use the accurate integer forward DCT
|
||||||
whenever encoding images with a JPEG quality of 98 or higher.
|
whenever encoding images with a JPEG quality of 98 or higher.
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
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 */
|
||||||
|
|||||||
+3
@@ -15,6 +15,9 @@
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* How to obtain thread-local storage */
|
||||||
|
#define THREAD_LOCAL @THREAD_LOCAL@
|
||||||
|
|
||||||
/* Define to the full name of this package. */
|
/* Define to the full name of this package. */
|
||||||
#define PACKAGE_NAME "@CMAKE_PROJECT_NAME@"
|
#define PACKAGE_NAME "@CMAKE_PROJECT_NAME@"
|
||||||
|
|
||||||
|
|||||||
+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
+222
-182
@@ -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-2021, 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.
|
||||||
*
|
*
|
||||||
@@ -34,23 +36,27 @@
|
|||||||
* memory footprint by 64k, which is important for some mobile applications
|
* memory footprint by 64k, which is important for some mobile applications
|
||||||
* that create many isolated instances of libjpeg-turbo (web browsers, for
|
* that create many isolated instances of libjpeg-turbo (web browsers, for
|
||||||
* instance.) This may improve performance on some mobile platforms as well.
|
* instance.) This may improve performance on some mobile platforms as well.
|
||||||
* This feature is enabled by default only on ARM processors, because some x86
|
* This feature is enabled by default only on Arm processors, because some x86
|
||||||
* chips have a slow implementation of bsr, and the use of clz/bsr cannot be
|
* chips have a slow implementation of bsr, and the use of clz/bsr cannot be
|
||||||
* shown to have a significant performance impact even on the x86 chips that
|
* shown to have a significant performance impact even on the x86 chips that
|
||||||
* have a fast implementation of it. When building for ARMv6, you can
|
* have a fast implementation of it. When building for Armv6, you can
|
||||||
* explicitly disable the use of clz/bsr by adding -mthumb to the compiler
|
* explicitly disable the use of clz/bsr by adding -mthumb to the compiler
|
||||||
* flags (this defines __thumb__).
|
* flags (this defines __thumb__).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* NOTE: Both GCC and Clang define __GNUC__ */
|
#if defined(__arm__) || defined(__aarch64__) || defined(_M_ARM) || \
|
||||||
#if defined(__GNUC__) && (defined(__arm__) || defined(__aarch64__))
|
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 +71,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 +140,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;
|
||||||
|
|
||||||
|
|
||||||
@@ -201,8 +219,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,6 +314,7 @@ 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->ehufco, sizeof(dtbl->ehufco));
|
||||||
MEMZERO(dtbl->ehufsi, sizeof(dtbl->ehufsi));
|
MEMZERO(dtbl->ehufsi, 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
|
||||||
@@ -334,94 +362,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,6 +472,7 @@ 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) { \
|
||||||
@@ -466,20 +495,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 +548,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 +564,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 +606,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 +692,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 +733,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 +762,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 +773,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Vendored
+4
-1
@@ -1,8 +1,10 @@
|
|||||||
/*
|
/*
|
||||||
* jcinit.c
|
* jcinit.c
|
||||||
*
|
*
|
||||||
|
* 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.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* libjpeg-turbo Modifications:
|
||||||
|
* Copyright (C) 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
|
||||||
* file.
|
* file.
|
||||||
*
|
*
|
||||||
@@ -19,6 +21,7 @@
|
|||||||
#define JPEG_INTERNALS
|
#define JPEG_INTERNALS
|
||||||
#include "jinclude.h"
|
#include "jinclude.h"
|
||||||
#include "jpeglib.h"
|
#include "jpeglib.h"
|
||||||
|
#include "jpegcomp.h"
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
Vendored
+18
-11
@@ -4,8 +4,9 @@
|
|||||||
* 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, D. R. Commander.
|
||||||
* Copyright (C) 2016, 2018, Matthieu Darbois.
|
* Copyright (C) 2016, 2018, Matthieu Darbois.
|
||||||
|
* 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,23 +44,27 @@
|
|||||||
* memory footprint by 64k, which is important for some mobile applications
|
* memory footprint by 64k, which is important for some mobile applications
|
||||||
* that create many isolated instances of libjpeg-turbo (web browsers, for
|
* that create many isolated instances of libjpeg-turbo (web browsers, for
|
||||||
* instance.) This may improve performance on some mobile platforms as well.
|
* instance.) This may improve performance on some mobile platforms as well.
|
||||||
* This feature is enabled by default only on ARM processors, because some x86
|
* This feature is enabled by default only on Arm processors, because some x86
|
||||||
* chips have a slow implementation of bsr, and the use of clz/bsr cannot be
|
* chips have a slow implementation of bsr, and the use of clz/bsr cannot be
|
||||||
* shown to have a significant performance impact even on the x86 chips that
|
* shown to have a significant performance impact even on the x86 chips that
|
||||||
* have a fast implementation of it. When building for ARMv6, you can
|
* have a fast implementation of it. When building for Armv6, you can
|
||||||
* explicitly disable the use of clz/bsr by adding -mthumb to the compiler
|
* explicitly disable the use of clz/bsr by adding -mthumb to the compiler
|
||||||
* flags (this defines __thumb__).
|
* flags (this defines __thumb__).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* NOTE: Both GCC and Clang define __GNUC__ */
|
#if defined(__arm__) || defined(__aarch64__) || defined(_M_ARM) || \
|
||||||
#if defined(__GNUC__) && (defined(__arm__) || defined(__aarch64__))
|
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 +174,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -860,7 +867,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 +924,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;
|
||||||
@@ -968,7 +975,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;
|
||||||
|
|||||||
+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
-2
@@ -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) 1995-1998, Thomas G. Lane.
|
* Copyright (C) 1995-1998, Thomas G. Lane.
|
||||||
* Modified 2000-2009 by Guido Vollbeding.
|
* Modified 2000-2009 by Guido Vollbeding.
|
||||||
* It was modified by The libjpeg-turbo Project to include only code relevant
|
* libjpeg-turbo Modifications:
|
||||||
* to libjpeg-turbo.
|
* Copyright (C) 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
|
||||||
* file.
|
* file.
|
||||||
*
|
*
|
||||||
@@ -17,6 +17,7 @@
|
|||||||
#define JPEG_INTERNALS
|
#define JPEG_INTERNALS
|
||||||
#include "jinclude.h"
|
#include "jinclude.h"
|
||||||
#include "jpeglib.h"
|
#include "jpeglib.h"
|
||||||
|
#include "jpegcomp.h"
|
||||||
|
|
||||||
|
|
||||||
/* Forward declarations */
|
/* Forward declarations */
|
||||||
|
|||||||
+44
-9
@@ -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, D. R. Commander.
|
* Copyright (C) 2010, 2015-2020, 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.
|
||||||
@@ -21,6 +21,8 @@
|
|||||||
#include "jinclude.h"
|
#include "jinclude.h"
|
||||||
#include "jdmainct.h"
|
#include "jdmainct.h"
|
||||||
#include "jdcoefct.h"
|
#include "jdcoefct.h"
|
||||||
|
#include "jdmaster.h"
|
||||||
|
#include "jdmerge.h"
|
||||||
#include "jdsample.h"
|
#include "jdsample.h"
|
||||||
#include "jmemsys.h"
|
#include "jmemsys.h"
|
||||||
|
|
||||||
@@ -316,6 +318,10 @@ LOCAL(void)
|
|||||||
read_and_discard_scanlines(j_decompress_ptr cinfo, JDIMENSION num_lines)
|
read_and_discard_scanlines(j_decompress_ptr cinfo, JDIMENSION num_lines)
|
||||||
{
|
{
|
||||||
JDIMENSION n;
|
JDIMENSION n;
|
||||||
|
my_master_ptr master = (my_master_ptr)cinfo->master;
|
||||||
|
JSAMPLE dummy_sample[1] = { 0 };
|
||||||
|
JSAMPROW dummy_row = dummy_sample;
|
||||||
|
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,
|
||||||
int num_rows) = NULL;
|
int num_rows) = NULL;
|
||||||
@@ -325,6 +331,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) {
|
||||||
@@ -332,8 +342,13 @@ read_and_discard_scanlines(j_decompress_ptr cinfo, JDIMENSION num_lines)
|
|||||||
cinfo->cquantize->color_quantize = noop_quantize;
|
cinfo->cquantize->color_quantize = noop_quantize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (master->using_merged_upsample && cinfo->max_v_samp_factor == 2) {
|
||||||
|
my_merged_upsample_ptr upsample = (my_merged_upsample_ptr)cinfo->upsample;
|
||||||
|
scanlines = &upsample->spare_row;
|
||||||
|
}
|
||||||
|
|
||||||
for (n = 0; n < num_lines; n++)
|
for (n = 0; n < num_lines; n++)
|
||||||
jpeg_read_scanlines(cinfo, NULL, 1);
|
jpeg_read_scanlines(cinfo, scanlines, 1);
|
||||||
|
|
||||||
if (color_convert)
|
if (color_convert)
|
||||||
cinfo->cconvert->color_convert = color_convert;
|
cinfo->cconvert->color_convert = color_convert;
|
||||||
@@ -353,6 +368,12 @@ increment_simple_rowgroup_ctr(j_decompress_ptr cinfo, JDIMENSION rows)
|
|||||||
{
|
{
|
||||||
JDIMENSION rows_left;
|
JDIMENSION rows_left;
|
||||||
my_main_ptr main_ptr = (my_main_ptr)cinfo->main;
|
my_main_ptr main_ptr = (my_main_ptr)cinfo->main;
|
||||||
|
my_master_ptr master = (my_master_ptr)cinfo->master;
|
||||||
|
|
||||||
|
if (master->using_merged_upsample && cinfo->max_v_samp_factor == 2) {
|
||||||
|
read_and_discard_scanlines(cinfo, rows);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* Increment the counter to the next row group after the skipped rows. */
|
/* Increment the counter to the next row group after the skipped rows. */
|
||||||
main_ptr->rowgroup_ctr += rows / cinfo->max_v_samp_factor;
|
main_ptr->rowgroup_ctr += rows / cinfo->max_v_samp_factor;
|
||||||
@@ -382,21 +403,27 @@ jpeg_skip_scanlines(j_decompress_ptr cinfo, JDIMENSION num_lines)
|
|||||||
{
|
{
|
||||||
my_main_ptr main_ptr = (my_main_ptr)cinfo->main;
|
my_main_ptr main_ptr = (my_main_ptr)cinfo->main;
|
||||||
my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
|
my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
|
||||||
|
my_master_ptr master = (my_master_ptr)cinfo->master;
|
||||||
my_upsample_ptr upsample = (my_upsample_ptr)cinfo->upsample;
|
my_upsample_ptr upsample = (my_upsample_ptr)cinfo->upsample;
|
||||||
JDIMENSION i, x;
|
JDIMENSION i, x;
|
||||||
int y;
|
int y;
|
||||||
JDIMENSION lines_per_iMCU_row, lines_left_in_iMCU_row, lines_after_iMCU_row;
|
JDIMENSION lines_per_iMCU_row, lines_left_in_iMCU_row, lines_after_iMCU_row;
|
||||||
JDIMENSION lines_to_skip, lines_to_read;
|
JDIMENSION lines_to_skip, lines_to_read;
|
||||||
|
|
||||||
|
/* Two-pass color quantization is not supported. */
|
||||||
|
if (cinfo->quantize_colors && cinfo->two_pass_quantize)
|
||||||
|
ERREXIT(cinfo, JERR_NOTIMPL);
|
||||||
|
|
||||||
if (cinfo->global_state != DSTATE_SCANNING)
|
if (cinfo->global_state != DSTATE_SCANNING)
|
||||||
ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
|
ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
|
||||||
|
|
||||||
/* Do not skip past the bottom of the image. */
|
/* Do not skip past the bottom of the image. */
|
||||||
if (cinfo->output_scanline + num_lines >= cinfo->output_height) {
|
if (cinfo->output_scanline + num_lines >= cinfo->output_height) {
|
||||||
|
num_lines = cinfo->output_height - cinfo->output_scanline;
|
||||||
cinfo->output_scanline = cinfo->output_height;
|
cinfo->output_scanline = cinfo->output_height;
|
||||||
(*cinfo->inputctl->finish_input_pass) (cinfo);
|
(*cinfo->inputctl->finish_input_pass) (cinfo);
|
||||||
cinfo->inputctl->eoi_reached = TRUE;
|
cinfo->inputctl->eoi_reached = TRUE;
|
||||||
return cinfo->output_height - cinfo->output_scanline;
|
return num_lines;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (num_lines == 0)
|
if (num_lines == 0)
|
||||||
@@ -445,8 +472,10 @@ jpeg_skip_scanlines(j_decompress_ptr cinfo, JDIMENSION num_lines)
|
|||||||
main_ptr->buffer_full = FALSE;
|
main_ptr->buffer_full = FALSE;
|
||||||
main_ptr->rowgroup_ctr = 0;
|
main_ptr->rowgroup_ctr = 0;
|
||||||
main_ptr->context_state = CTX_PREPARE_FOR_IMCU;
|
main_ptr->context_state = CTX_PREPARE_FOR_IMCU;
|
||||||
upsample->next_row_out = cinfo->max_v_samp_factor;
|
if (!master->using_merged_upsample) {
|
||||||
upsample->rows_to_go = cinfo->output_height - cinfo->output_scanline;
|
upsample->next_row_out = cinfo->max_v_samp_factor;
|
||||||
|
upsample->rows_to_go = cinfo->output_height - cinfo->output_scanline;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Skipping is much simpler when context rows are not required. */
|
/* Skipping is much simpler when context rows are not required. */
|
||||||
@@ -458,8 +487,10 @@ jpeg_skip_scanlines(j_decompress_ptr cinfo, JDIMENSION num_lines)
|
|||||||
cinfo->output_scanline += lines_left_in_iMCU_row;
|
cinfo->output_scanline += lines_left_in_iMCU_row;
|
||||||
main_ptr->buffer_full = FALSE;
|
main_ptr->buffer_full = FALSE;
|
||||||
main_ptr->rowgroup_ctr = 0;
|
main_ptr->rowgroup_ctr = 0;
|
||||||
upsample->next_row_out = cinfo->max_v_samp_factor;
|
if (!master->using_merged_upsample) {
|
||||||
upsample->rows_to_go = cinfo->output_height - cinfo->output_scanline;
|
upsample->next_row_out = cinfo->max_v_samp_factor;
|
||||||
|
upsample->rows_to_go = cinfo->output_height - cinfo->output_scanline;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -494,7 +525,8 @@ jpeg_skip_scanlines(j_decompress_ptr cinfo, JDIMENSION num_lines)
|
|||||||
cinfo->output_iMCU_row += lines_to_skip / lines_per_iMCU_row;
|
cinfo->output_iMCU_row += lines_to_skip / lines_per_iMCU_row;
|
||||||
increment_simple_rowgroup_ctr(cinfo, lines_to_read);
|
increment_simple_rowgroup_ctr(cinfo, lines_to_read);
|
||||||
}
|
}
|
||||||
upsample->rows_to_go = cinfo->output_height - cinfo->output_scanline;
|
if (!master->using_merged_upsample)
|
||||||
|
upsample->rows_to_go = cinfo->output_height - cinfo->output_scanline;
|
||||||
return num_lines;
|
return num_lines;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -506,6 +538,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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -535,7 +569,8 @@ jpeg_skip_scanlines(j_decompress_ptr cinfo, JDIMENSION num_lines)
|
|||||||
* bit odd, since "rows_to_go" seems to be redundantly keeping track of
|
* bit odd, since "rows_to_go" seems to be redundantly keeping track of
|
||||||
* output_scanline.
|
* output_scanline.
|
||||||
*/
|
*/
|
||||||
upsample->rows_to_go = cinfo->output_height - cinfo->output_scanline;
|
if (!master->using_merged_upsample)
|
||||||
|
upsample->rows_to_go = cinfo->output_height - cinfo->output_scanline;
|
||||||
|
|
||||||
/* Always skip the requested number of lines. */
|
/* Always skip the requested number of lines. */
|
||||||
return num_lines;
|
return num_lines;
|
||||||
|
|||||||
Vendored
+12
-3
@@ -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, 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++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -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)
|
||||||
@@ -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++)
|
||||||
|
|||||||
+1
-2
@@ -143,8 +143,7 @@ empty_mem_output_buffer(j_compress_ptr cinfo)
|
|||||||
|
|
||||||
MEMCOPY(nextbuffer, dest->buffer, dest->bufsize);
|
MEMCOPY(nextbuffer, dest->buffer, dest->bufsize);
|
||||||
|
|
||||||
if (dest->newbuffer != NULL)
|
free(dest->newbuffer);
|
||||||
free(dest->newbuffer);
|
|
||||||
|
|
||||||
dest->newbuffer = nextbuffer;
|
dest->newbuffer = nextbuffer;
|
||||||
|
|
||||||
|
|||||||
+238
-52
@@ -5,8 +5,8 @@
|
|||||||
* 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, 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,25 +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];
|
|
||||||
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;
|
||||||
|
|
||||||
/* 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];
|
||||||
@@ -513,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))
|
||||||
@@ -539,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))
|
||||||
@@ -554,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))
|
||||||
@@ -569,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))
|
||||||
@@ -584,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))
|
||||||
@@ -597,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;
|
||||||
@@ -653,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
+11
-12
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -571,11 +571,10 @@ ycck_cmyk_convert(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
|
|||||||
* RGB565 conversion
|
* RGB565 conversion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define PACK_SHORT_565_LE(r, g, b) ((((r) << 8) & 0xF800) | \
|
#define PACK_SHORT_565_LE(r, g, b) \
|
||||||
(((g) << 3) & 0x7E0) | ((b) >> 3))
|
((((r) << 8) & 0xF800) | (((g) << 3) & 0x7E0) | ((b) >> 3))
|
||||||
#define PACK_SHORT_565_BE(r, g, b) (((r) & 0xF8) | ((g) >> 5) | \
|
#define PACK_SHORT_565_BE(r, g, b) \
|
||||||
(((g) << 11) & 0xE000) | \
|
(((r) & 0xF8) | ((g) >> 5) | (((g) << 11) & 0xE000) | (((b) << 5) & 0x1F00))
|
||||||
(((b) << 5) & 0x1F00))
|
|
||||||
|
|
||||||
#define PACK_TWO_PIXELS_LE(l, r) ((r << 16) | l)
|
#define PACK_TWO_PIXELS_LE(l, r) ((r << 16) | l)
|
||||||
#define PACK_TWO_PIXELS_BE(l, r) ((l << 16) | r)
|
#define PACK_TWO_PIXELS_BE(l, r) ((l << 16) | r)
|
||||||
|
|||||||
Vendored
+27
-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.
|
||||||
*/
|
*/
|
||||||
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,7 +646,7 @@ 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -671,7 +664,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 +681,7 @@ 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]);
|
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 +733,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 +788,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
-16
@@ -38,18 +38,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 +102,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 +154,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];
|
||||||
|
|||||||
+32
-35
@@ -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++; )
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -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;
|
||||||
|
|||||||
+2
-13
@@ -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, 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
|
||||||
@@ -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
|
||||||
|
|||||||
Vendored
+13
-42
@@ -5,7 +5,7 @@
|
|||||||
* Copyright (C) 1994-1996, Thomas G. Lane.
|
* Copyright (C) 1994-1996, 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) 2009, 2011, 2014-2015, D. R. Commander.
|
* Copyright (C) 2009, 2011, 2014-2015, 2020, D. R. Commander.
|
||||||
* Copyright (C) 2013, Linaro Limited.
|
* Copyright (C) 2013, Linaro 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.
|
||||||
@@ -40,41 +40,13 @@
|
|||||||
#define JPEG_INTERNALS
|
#define JPEG_INTERNALS
|
||||||
#include "jinclude.h"
|
#include "jinclude.h"
|
||||||
#include "jpeglib.h"
|
#include "jpeglib.h"
|
||||||
|
#include "jdmerge.h"
|
||||||
#include "jsimd.h"
|
#include "jsimd.h"
|
||||||
#include "jconfigint.h"
|
#include "jconfigint.h"
|
||||||
|
|
||||||
#ifdef UPSAMPLE_MERGING_SUPPORTED
|
#ifdef UPSAMPLE_MERGING_SUPPORTED
|
||||||
|
|
||||||
|
|
||||||
/* Private subobject */
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
struct jpeg_upsampler pub; /* public fields */
|
|
||||||
|
|
||||||
/* Pointer to routine to do actual upsampling/conversion of one row group */
|
|
||||||
void (*upmethod) (j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
|
|
||||||
JDIMENSION in_row_group_ctr, JSAMPARRAY output_buf);
|
|
||||||
|
|
||||||
/* Private state for YCC->RGB conversion */
|
|
||||||
int *Cr_r_tab; /* => table for Cr to R conversion */
|
|
||||||
int *Cb_b_tab; /* => table for Cb to B conversion */
|
|
||||||
JLONG *Cr_g_tab; /* => table for Cr to G conversion */
|
|
||||||
JLONG *Cb_g_tab; /* => table for Cb to G conversion */
|
|
||||||
|
|
||||||
/* For 2:1 vertical sampling, we produce two output rows at a time.
|
|
||||||
* We need a "spare" row buffer to hold the second output row if the
|
|
||||||
* application provides just a one-row buffer; we also use the spare
|
|
||||||
* to discard the dummy last row if the image height is odd.
|
|
||||||
*/
|
|
||||||
JSAMPROW spare_row;
|
|
||||||
boolean spare_full; /* T if spare buffer is occupied */
|
|
||||||
|
|
||||||
JDIMENSION out_row_width; /* samples per output row */
|
|
||||||
JDIMENSION rows_to_go; /* counts rows remaining in image */
|
|
||||||
} my_upsampler;
|
|
||||||
|
|
||||||
typedef my_upsampler *my_upsample_ptr;
|
|
||||||
|
|
||||||
#define SCALEBITS 16 /* speediest right-shift on some machines */
|
#define SCALEBITS 16 /* speediest right-shift on some machines */
|
||||||
#define ONE_HALF ((JLONG)1 << (SCALEBITS - 1))
|
#define ONE_HALF ((JLONG)1 << (SCALEBITS - 1))
|
||||||
#define FIX(x) ((JLONG)((x) * (1L << SCALEBITS) + 0.5))
|
#define FIX(x) ((JLONG)((x) * (1L << SCALEBITS) + 0.5))
|
||||||
@@ -189,7 +161,7 @@ typedef my_upsampler *my_upsample_ptr;
|
|||||||
LOCAL(void)
|
LOCAL(void)
|
||||||
build_ycc_rgb_table(j_decompress_ptr cinfo)
|
build_ycc_rgb_table(j_decompress_ptr cinfo)
|
||||||
{
|
{
|
||||||
my_upsample_ptr upsample = (my_upsample_ptr)cinfo->upsample;
|
my_merged_upsample_ptr upsample = (my_merged_upsample_ptr)cinfo->upsample;
|
||||||
int i;
|
int i;
|
||||||
JLONG x;
|
JLONG x;
|
||||||
SHIFT_TEMPS
|
SHIFT_TEMPS
|
||||||
@@ -232,7 +204,7 @@ build_ycc_rgb_table(j_decompress_ptr cinfo)
|
|||||||
METHODDEF(void)
|
METHODDEF(void)
|
||||||
start_pass_merged_upsample(j_decompress_ptr cinfo)
|
start_pass_merged_upsample(j_decompress_ptr cinfo)
|
||||||
{
|
{
|
||||||
my_upsample_ptr upsample = (my_upsample_ptr)cinfo->upsample;
|
my_merged_upsample_ptr upsample = (my_merged_upsample_ptr)cinfo->upsample;
|
||||||
|
|
||||||
/* Mark the spare buffer empty */
|
/* Mark the spare buffer empty */
|
||||||
upsample->spare_full = FALSE;
|
upsample->spare_full = FALSE;
|
||||||
@@ -254,7 +226,7 @@ merged_2v_upsample(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
|
|||||||
JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail)
|
JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail)
|
||||||
/* 2:1 vertical sampling case: may need a spare row. */
|
/* 2:1 vertical sampling case: may need a spare row. */
|
||||||
{
|
{
|
||||||
my_upsample_ptr upsample = (my_upsample_ptr)cinfo->upsample;
|
my_merged_upsample_ptr upsample = (my_merged_upsample_ptr)cinfo->upsample;
|
||||||
JSAMPROW work_ptrs[2];
|
JSAMPROW work_ptrs[2];
|
||||||
JDIMENSION num_rows; /* number of rows returned to caller */
|
JDIMENSION num_rows; /* number of rows returned to caller */
|
||||||
|
|
||||||
@@ -305,7 +277,7 @@ merged_1v_upsample(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
|
|||||||
JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail)
|
JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail)
|
||||||
/* 1:1 vertical sampling case: much easier, never need a spare row. */
|
/* 1:1 vertical sampling case: much easier, never need a spare row. */
|
||||||
{
|
{
|
||||||
my_upsample_ptr upsample = (my_upsample_ptr)cinfo->upsample;
|
my_merged_upsample_ptr upsample = (my_merged_upsample_ptr)cinfo->upsample;
|
||||||
|
|
||||||
/* Just do the upsampling. */
|
/* Just do the upsampling. */
|
||||||
(*upsample->upmethod) (cinfo, input_buf, *in_row_group_ctr,
|
(*upsample->upmethod) (cinfo, input_buf, *in_row_group_ctr,
|
||||||
@@ -420,11 +392,10 @@ h2v2_merged_upsample(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
|
|||||||
* RGB565 conversion
|
* RGB565 conversion
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define PACK_SHORT_565_LE(r, g, b) ((((r) << 8) & 0xF800) | \
|
#define PACK_SHORT_565_LE(r, g, b) \
|
||||||
(((g) << 3) & 0x7E0) | ((b) >> 3))
|
((((r) << 8) & 0xF800) | (((g) << 3) & 0x7E0) | ((b) >> 3))
|
||||||
#define PACK_SHORT_565_BE(r, g, b) (((r) & 0xF8) | ((g) >> 5) | \
|
#define PACK_SHORT_565_BE(r, g, b) \
|
||||||
(((g) << 11) & 0xE000) | \
|
(((r) & 0xF8) | ((g) >> 5) | (((g) << 11) & 0xE000) | (((b) << 5) & 0x1F00))
|
||||||
(((b) << 5) & 0x1F00))
|
|
||||||
|
|
||||||
#define PACK_TWO_PIXELS_LE(l, r) ((r << 16) | l)
|
#define PACK_TWO_PIXELS_LE(l, r) ((r << 16) | l)
|
||||||
#define PACK_TWO_PIXELS_BE(l, r) ((l << 16) | r)
|
#define PACK_TWO_PIXELS_BE(l, r) ((l << 16) | r)
|
||||||
@@ -566,11 +537,11 @@ h2v2_merged_upsample_565D(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
|
|||||||
GLOBAL(void)
|
GLOBAL(void)
|
||||||
jinit_merged_upsampler(j_decompress_ptr cinfo)
|
jinit_merged_upsampler(j_decompress_ptr cinfo)
|
||||||
{
|
{
|
||||||
my_upsample_ptr upsample;
|
my_merged_upsample_ptr upsample;
|
||||||
|
|
||||||
upsample = (my_upsample_ptr)
|
upsample = (my_merged_upsample_ptr)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
|
(*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
|
||||||
sizeof(my_upsampler));
|
sizeof(my_merged_upsampler));
|
||||||
cinfo->upsample = (struct jpeg_upsampler *)upsample;
|
cinfo->upsample = (struct jpeg_upsampler *)upsample;
|
||||||
upsample->pub.start_pass = start_pass_merged_upsample;
|
upsample->pub.start_pass = start_pass_merged_upsample;
|
||||||
upsample->pub.need_context_rows = FALSE;
|
upsample->pub.need_context_rows = FALSE;
|
||||||
|
|||||||
Vendored
+47
@@ -0,0 +1,47 @@
|
|||||||
|
/*
|
||||||
|
* jdmerge.h
|
||||||
|
*
|
||||||
|
* This file was part of the Independent JPEG Group's software:
|
||||||
|
* Copyright (C) 1994-1996, Thomas G. Lane.
|
||||||
|
* libjpeg-turbo Modifications:
|
||||||
|
* Copyright (C) 2020, D. R. Commander.
|
||||||
|
* For conditions of distribution and use, see the accompanying README.ijg
|
||||||
|
* file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define JPEG_INTERNALS
|
||||||
|
#include "jpeglib.h"
|
||||||
|
|
||||||
|
#ifdef UPSAMPLE_MERGING_SUPPORTED
|
||||||
|
|
||||||
|
|
||||||
|
/* Private subobject */
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
struct jpeg_upsampler pub; /* public fields */
|
||||||
|
|
||||||
|
/* Pointer to routine to do actual upsampling/conversion of one row group */
|
||||||
|
void (*upmethod) (j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
|
||||||
|
JDIMENSION in_row_group_ctr, JSAMPARRAY output_buf);
|
||||||
|
|
||||||
|
/* Private state for YCC->RGB conversion */
|
||||||
|
int *Cr_r_tab; /* => table for Cr to R conversion */
|
||||||
|
int *Cb_b_tab; /* => table for Cb to B conversion */
|
||||||
|
JLONG *Cr_g_tab; /* => table for Cr to G conversion */
|
||||||
|
JLONG *Cb_g_tab; /* => table for Cb to G conversion */
|
||||||
|
|
||||||
|
/* For 2:1 vertical sampling, we produce two output rows at a time.
|
||||||
|
* We need a "spare" row buffer to hold the second output row if the
|
||||||
|
* application provides just a one-row buffer; we also use the spare
|
||||||
|
* to discard the dummy last row if the image height is odd.
|
||||||
|
*/
|
||||||
|
JSAMPROW spare_row;
|
||||||
|
boolean spare_full; /* T if spare buffer is occupied */
|
||||||
|
|
||||||
|
JDIMENSION out_row_width; /* samples per output row */
|
||||||
|
JDIMENSION rows_to_go; /* counts rows remaining in image */
|
||||||
|
} my_merged_upsampler;
|
||||||
|
|
||||||
|
typedef my_merged_upsampler *my_merged_upsample_ptr;
|
||||||
|
|
||||||
|
#endif /* UPSAMPLE_MERGING_SUPPORTED */
|
||||||
+39
-39
@@ -5,7 +5,7 @@
|
|||||||
* Copyright (C) 1994-1996, Thomas G. Lane.
|
* Copyright (C) 1994-1996, Thomas G. Lane.
|
||||||
* libjpeg-turbo Modifications:
|
* libjpeg-turbo Modifications:
|
||||||
* Copyright (C) 2013, Linaro Limited.
|
* Copyright (C) 2013, Linaro Limited.
|
||||||
* Copyright (C) 2014-2015, 2018, D. R. Commander.
|
* Copyright (C) 2014-2015, 2018, 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
|
||||||
* file.
|
* file.
|
||||||
*
|
*
|
||||||
@@ -19,7 +19,7 @@ h2v1_merged_upsample_565_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
|
|||||||
JDIMENSION in_row_group_ctr,
|
JDIMENSION in_row_group_ctr,
|
||||||
JSAMPARRAY output_buf)
|
JSAMPARRAY output_buf)
|
||||||
{
|
{
|
||||||
my_upsample_ptr upsample = (my_upsample_ptr)cinfo->upsample;
|
my_merged_upsample_ptr upsample = (my_merged_upsample_ptr)cinfo->upsample;
|
||||||
register int y, cred, cgreen, cblue;
|
register int y, cred, cgreen, cblue;
|
||||||
int cb, cr;
|
int cb, cr;
|
||||||
register JSAMPROW outptr;
|
register JSAMPROW outptr;
|
||||||
@@ -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];
|
||||||
@@ -90,7 +90,7 @@ h2v1_merged_upsample_565D_internal(j_decompress_ptr cinfo,
|
|||||||
JDIMENSION in_row_group_ctr,
|
JDIMENSION in_row_group_ctr,
|
||||||
JSAMPARRAY output_buf)
|
JSAMPARRAY output_buf)
|
||||||
{
|
{
|
||||||
my_upsample_ptr upsample = (my_upsample_ptr)cinfo->upsample;
|
my_merged_upsample_ptr upsample = (my_merged_upsample_ptr)cinfo->upsample;
|
||||||
register int y, cred, cgreen, cblue;
|
register int y, cred, cgreen, cblue;
|
||||||
int cb, cr;
|
int cb, cr;
|
||||||
register JSAMPROW outptr;
|
register JSAMPROW outptr;
|
||||||
@@ -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)];
|
||||||
@@ -163,7 +163,7 @@ h2v2_merged_upsample_565_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
|
|||||||
JDIMENSION in_row_group_ctr,
|
JDIMENSION in_row_group_ctr,
|
||||||
JSAMPARRAY output_buf)
|
JSAMPARRAY output_buf)
|
||||||
{
|
{
|
||||||
my_upsample_ptr upsample = (my_upsample_ptr)cinfo->upsample;
|
my_merged_upsample_ptr upsample = (my_merged_upsample_ptr)cinfo->upsample;
|
||||||
register int y, cred, cgreen, cblue;
|
register int y, cred, cgreen, cblue;
|
||||||
int cb, cr;
|
int cb, cr;
|
||||||
register JSAMPROW outptr0, outptr1;
|
register JSAMPROW outptr0, outptr1;
|
||||||
@@ -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];
|
||||||
@@ -259,7 +259,7 @@ h2v2_merged_upsample_565D_internal(j_decompress_ptr cinfo,
|
|||||||
JDIMENSION in_row_group_ctr,
|
JDIMENSION in_row_group_ctr,
|
||||||
JSAMPARRAY output_buf)
|
JSAMPARRAY output_buf)
|
||||||
{
|
{
|
||||||
my_upsample_ptr upsample = (my_upsample_ptr)cinfo->upsample;
|
my_merged_upsample_ptr upsample = (my_merged_upsample_ptr)cinfo->upsample;
|
||||||
register int y, cred, cgreen, cblue;
|
register int y, cred, cgreen, cblue;
|
||||||
int cb, cr;
|
int cb, cr;
|
||||||
register JSAMPROW outptr0, outptr1;
|
register JSAMPROW outptr0, outptr1;
|
||||||
@@ -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)];
|
||||||
|
|||||||
+20
-20
@@ -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) 2011, 2015, D. R. Commander.
|
* Copyright (C) 2011, 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
|
||||||
* file.
|
* file.
|
||||||
*
|
*
|
||||||
@@ -25,7 +25,7 @@ h2v1_merged_upsample_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
|
|||||||
JDIMENSION in_row_group_ctr,
|
JDIMENSION in_row_group_ctr,
|
||||||
JSAMPARRAY output_buf)
|
JSAMPARRAY output_buf)
|
||||||
{
|
{
|
||||||
my_upsample_ptr upsample = (my_upsample_ptr)cinfo->upsample;
|
my_merged_upsample_ptr upsample = (my_merged_upsample_ptr)cinfo->upsample;
|
||||||
register int y, cred, cgreen, cblue;
|
register int y, cred, cgreen, cblue;
|
||||||
int cb, cr;
|
int cb, cr;
|
||||||
register JSAMPROW outptr;
|
register JSAMPROW outptr;
|
||||||
@@ -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];
|
||||||
@@ -97,7 +97,7 @@ h2v2_merged_upsample_internal(j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
|
|||||||
JDIMENSION in_row_group_ctr,
|
JDIMENSION in_row_group_ctr,
|
||||||
JSAMPARRAY output_buf)
|
JSAMPARRAY output_buf)
|
||||||
{
|
{
|
||||||
my_upsample_ptr upsample = (my_upsample_ptr)cinfo->upsample;
|
my_merged_upsample_ptr upsample = (my_merged_upsample_ptr)cinfo->upsample;
|
||||||
register int y, cred, cgreen, cblue;
|
register int y, cred, cgreen, cblue;
|
||||||
int cb, cr;
|
int cb, cr;
|
||||||
register JSAMPROW outptr0, outptr1;
|
register JSAMPROW outptr0, outptr1;
|
||||||
@@ -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
+20
-28
@@ -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-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.
|
||||||
*
|
*
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
@@ -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
+3
-2
@@ -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) 1995-1997, Thomas G. Lane.
|
* Copyright (C) 1995-1997, Thomas G. Lane.
|
||||||
* It was modified by The libjpeg-turbo Project to include only code relevant
|
* libjpeg-turbo Modifications:
|
||||||
* to libjpeg-turbo.
|
* Copyright (C) 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
|
||||||
* file.
|
* file.
|
||||||
*
|
*
|
||||||
@@ -16,6 +16,7 @@
|
|||||||
#define JPEG_INTERNALS
|
#define JPEG_INTERNALS
|
||||||
#include "jinclude.h"
|
#include "jinclude.h"
|
||||||
#include "jpeglib.h"
|
#include "jpeglib.h"
|
||||||
|
#include "jpegcomp.h"
|
||||||
|
|
||||||
|
|
||||||
/* Forward declarations */
|
/* Forward declarations */
|
||||||
|
|||||||
Vendored
+13
@@ -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,6 +256,15 @@ 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), \
|
||||||
|
|||||||
+2
-2
@@ -4,11 +4,11 @@
|
|||||||
* 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.
|
||||||
* libjpeg-turbo Modifications:
|
* libjpeg-turbo Modifications:
|
||||||
* Copyright (C) 2015, 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
|
||||||
* file.
|
* file.
|
||||||
*
|
*
|
||||||
* This file contains a slow-but-accurate integer implementation of the
|
* This file contains a slower but more accurate integer implementation of the
|
||||||
* forward DCT (Discrete Cosine Transform).
|
* forward DCT (Discrete Cosine Transform).
|
||||||
*
|
*
|
||||||
* A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT
|
* A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT
|
||||||
|
|||||||
+6
-6
@@ -3,13 +3,13 @@
|
|||||||
*
|
*
|
||||||
* 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, 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
|
||||||
* file.
|
* file.
|
||||||
*
|
*
|
||||||
* This file contains a slow-but-accurate integer implementation of the
|
* This file contains a slower but more accurate integer implementation of the
|
||||||
* inverse DCT (Discrete Cosine Transform). In the IJG code, this routine
|
* inverse DCT (Discrete Cosine Transform). In the IJG code, this routine
|
||||||
* must also perform dequantization of the input coefficients.
|
* must also perform dequantization of the input coefficients.
|
||||||
*
|
*
|
||||||
@@ -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] */
|
||||||
|
|||||||
+4
-39
@@ -5,7 +5,7 @@
|
|||||||
* 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) 2009, 2011, 2014-2015, 2018, D. R. Commander.
|
* Copyright (C) 2009, 2011, 2014-2015, 2018, 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
|
||||||
* file.
|
* file.
|
||||||
*
|
*
|
||||||
@@ -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,15 +96,7 @@ 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. */
|
||||||
|
|
||||||
@@ -273,9 +238,9 @@ typedef int boolean;
|
|||||||
|
|
||||||
/* Capability options common to encoder and decoder: */
|
/* Capability options common to encoder and decoder: */
|
||||||
|
|
||||||
#define DCT_ISLOW_SUPPORTED /* slow but accurate integer algorithm */
|
#define DCT_ISLOW_SUPPORTED /* accurate integer method */
|
||||||
#define DCT_IFAST_SUPPORTED /* faster, less accurate integer method */
|
#define DCT_IFAST_SUPPORTED /* less accurate int method [legacy feature] */
|
||||||
#define DCT_FLOAT_SUPPORTED /* floating-point: accurate, fast on fast HW */
|
#define DCT_FLOAT_SUPPORTED /* floating-point method [legacy feature] */
|
||||||
|
|
||||||
/* Encoder capability options: */
|
/* Encoder capability options: */
|
||||||
|
|
||||||
|
|||||||
+2
-1
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* jpegcomp.h
|
* jpegcomp.h
|
||||||
*
|
*
|
||||||
* Copyright (C) 2010, D. R. Commander.
|
* Copyright (C) 2010, 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
|
||||||
* file.
|
* file.
|
||||||
*
|
*
|
||||||
@@ -19,6 +19,7 @@
|
|||||||
#define _min_DCT_v_scaled_size min_DCT_v_scaled_size
|
#define _min_DCT_v_scaled_size min_DCT_v_scaled_size
|
||||||
#define _jpeg_width jpeg_width
|
#define _jpeg_width jpeg_width
|
||||||
#define _jpeg_height jpeg_height
|
#define _jpeg_height jpeg_height
|
||||||
|
#define JERR_ARITH_NOTIMPL JERR_NOT_COMPILED
|
||||||
#else
|
#else
|
||||||
#define _DCT_scaled_size DCT_scaled_size
|
#define _DCT_scaled_size DCT_scaled_size
|
||||||
#define _DCT_h_scaled_size DCT_scaled_size
|
#define _DCT_h_scaled_size DCT_scaled_size
|
||||||
|
|||||||
Vendored
+4
-1
@@ -5,7 +5,7 @@
|
|||||||
* 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, 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.
|
||||||
@@ -158,6 +158,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 */
|
||||||
|
|||||||
Vendored
+4
-4
@@ -5,7 +5,7 @@
|
|||||||
* Copyright (C) 1991-1998, Thomas G. Lane.
|
* Copyright (C) 1991-1998, 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, 2013-2014, 2016-2017, D. R. Commander.
|
* Copyright (C) 2009-2011, 2013-2014, 2016-2017, 2020, 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.
|
||||||
@@ -244,9 +244,9 @@ typedef enum {
|
|||||||
/* DCT/IDCT algorithm options. */
|
/* DCT/IDCT algorithm options. */
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
JDCT_ISLOW, /* slow but accurate integer algorithm */
|
JDCT_ISLOW, /* accurate integer method */
|
||||||
JDCT_IFAST, /* faster, less accurate integer method */
|
JDCT_IFAST, /* less accurate integer method [legacy feature] */
|
||||||
JDCT_FLOAT /* floating-point: accurate, fast on fast HW */
|
JDCT_FLOAT /* floating-point method [legacy feature] */
|
||||||
} J_DCT_METHOD;
|
} J_DCT_METHOD;
|
||||||
|
|
||||||
#ifndef JDCT_DEFAULT /* may be overridden in jconfig.h */
|
#ifndef JDCT_DEFAULT /* may be overridden in jconfig.h */
|
||||||
|
|||||||
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
+26
-26
@@ -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-1996, Thomas G. Lane.
|
* Copyright (C) 1991-1996, Thomas G. Lane.
|
||||||
* libjpeg-turbo Modifications:
|
* libjpeg-turbo Modifications:
|
||||||
* Copyright (C) 2009, 2014-2015, D. R. Commander.
|
* Copyright (C) 2009, 2014-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
|
||||||
* file.
|
* file.
|
||||||
*
|
*
|
||||||
@@ -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
|
||||||
@@ -1145,7 +1145,7 @@ start_pass_2_quant(j_decompress_ptr cinfo, boolean is_pre_scan)
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* Only F-S dithering or no dithering is supported. */
|
/* Only F-S dithering or no dithering is supported. */
|
||||||
/* If user asks for ordered dither, give him F-S. */
|
/* If user asks for ordered dither, give them F-S. */
|
||||||
if (cinfo->dither_mode != JDITHER_NONE)
|
if (cinfo->dither_mode != JDITHER_NONE)
|
||||||
cinfo->dither_mode = JDITHER_FS;
|
cinfo->dither_mode = JDITHER_FS;
|
||||||
|
|
||||||
@@ -1263,7 +1263,7 @@ jinit_2pass_quantizer(j_decompress_ptr cinfo)
|
|||||||
cquantize->sv_colormap = NULL;
|
cquantize->sv_colormap = NULL;
|
||||||
|
|
||||||
/* Only F-S dithering or no dithering is supported. */
|
/* Only F-S dithering or no dithering is supported. */
|
||||||
/* If user asks for ordered dither, give him F-S. */
|
/* If user asks for ordered dither, give them F-S. */
|
||||||
if (cinfo->dither_mode != JDITHER_NONE)
|
if (cinfo->dither_mode != JDITHER_NONE)
|
||||||
cinfo->dither_mode = JDITHER_FS;
|
cinfo->dither_mode = JDITHER_FS;
|
||||||
|
|
||||||
|
|||||||
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)
|
||||||
{
|
{
|
||||||
|
|||||||
+12
-10
@@ -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-2019, 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.
|
||||||
*
|
*
|
||||||
@@ -30,23 +30,25 @@
|
|||||||
* NOTE: It is our convention to place the authors in the following order:
|
* 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
|
* - libjpeg-turbo authors (2009-) in descending order of the date of their
|
||||||
* most recent contribution to the project, then in ascending order of the
|
* most recent contribution to the project, then in ascending order of the
|
||||||
* date of their first contribution to the project
|
* 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
|
* - Upstream authors in descending order of the date of the first inclusion of
|
||||||
* their code
|
* their code
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define JCOPYRIGHT \
|
#define JCOPYRIGHT \
|
||||||
"Copyright (C) 2009-2019 D. R. Commander\n" \
|
"Copyright (C) 2009-2021 D. R. Commander\n" \
|
||||||
"Copyright (C) 2011-2016 Siarhei Siamashka\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) 2015-2016, 2018 Matthieu Darbois\n" \
|
||||||
|
"Copyright (C) 2011-2016 Siarhei Siamashka\n" \
|
||||||
"Copyright (C) 2015 Intel Corporation\n" \
|
"Copyright (C) 2015 Intel Corporation\n" \
|
||||||
"Copyright (C) 2015 Google, Inc.\n" \
|
"Copyright (C) 2013-2014 Linaro Limited\n" \
|
||||||
"Copyright (C) 2013-2014 MIPS Technologies, Inc.\n" \
|
"Copyright (C) 2013-2014 MIPS Technologies, Inc.\n" \
|
||||||
"Copyright (C) 2013 Linaro Limited\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) 2009 Pierre Ossman for Cendio AB\n" \
|
|
||||||
"Copyright (C) 1999-2006 MIYASAKA Masaru\n" \
|
"Copyright (C) 1999-2006 MIYASAKA Masaru\n" \
|
||||||
"Copyright (C) 1991-2016 Thomas G. Lane, Guido Vollbeding"
|
"Copyright (C) 1991-2020 Thomas G. Lane, Guido Vollbeding"
|
||||||
|
|
||||||
#define JCOPYRIGHT_SHORT \
|
#define JCOPYRIGHT_SHORT \
|
||||||
"Copyright (C) 1991-2019 The libjpeg-turbo Project and many others"
|
"Copyright (C) 1991-2021 The libjpeg-turbo Project and many others"
|
||||||
|
|||||||
Vendored
+2
-2
@@ -19,7 +19,7 @@ endif()
|
|||||||
# Define the library target:
|
# Define the library target:
|
||||||
# ----------------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
add_library(${JPEG_LIBRARY} STATIC ${lib_srcs} ${lib_hdrs})
|
add_library(${JPEG_LIBRARY} STATIC ${OPENCV_3RDPARTY_EXCLUDE_FROM_ALL} ${lib_srcs} ${lib_hdrs})
|
||||||
|
|
||||||
if(CV_GCC OR CV_CLANG)
|
if(CV_GCC OR CV_CLANG)
|
||||||
set_source_files_properties(jcdctmgr.c PROPERTIES COMPILE_FLAGS "-O1")
|
set_source_files_properties(jcdctmgr.c PROPERTIES COMPILE_FLAGS "-O1")
|
||||||
@@ -42,7 +42,7 @@ if(ENABLE_SOLUTION_FOLDERS)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(NOT BUILD_SHARED_LIBS)
|
if(NOT BUILD_SHARED_LIBS)
|
||||||
ocv_install_target(${JPEG_LIBRARY} EXPORT OpenCVModules ARCHIVE DESTINATION ${OPENCV_3P_LIB_INSTALL_PATH} COMPONENT dev)
|
ocv_install_target(${JPEG_LIBRARY} EXPORT OpenCVModules ARCHIVE DESTINATION ${OPENCV_3P_LIB_INSTALL_PATH} COMPONENT dev OPTIONAL)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
ocv_install_3rdparty_licenses(libjpeg README)
|
ocv_install_3rdparty_licenses(libjpeg README)
|
||||||
|
|||||||
Vendored
+6
-13
@@ -1,7 +1,7 @@
|
|||||||
The Independent JPEG Group's JPEG software
|
The Independent JPEG Group's JPEG software
|
||||||
==========================================
|
==========================================
|
||||||
|
|
||||||
README for release 9c of 14-Jan-2018
|
README for release 9d of 12-Jan-2020
|
||||||
====================================
|
====================================
|
||||||
|
|
||||||
This distribution contains the ninth public release of the Independent JPEG
|
This distribution contains the ninth public release of the Independent JPEG
|
||||||
@@ -10,8 +10,8 @@ to use it for any purpose, subject to the conditions under LEGAL ISSUES, below.
|
|||||||
|
|
||||||
This software is the work of Tom Lane, Guido Vollbeding, Philip Gladstone,
|
This software is the work of Tom Lane, Guido Vollbeding, Philip Gladstone,
|
||||||
Bill Allombert, Jim Boucher, Lee Crocker, Bob Friesenhahn, Ben Jackson,
|
Bill Allombert, Jim Boucher, Lee Crocker, Bob Friesenhahn, Ben Jackson,
|
||||||
Julian Minguillon, Luis Ortiz, George Phillips, Davide Rossi, Ge' Weijers,
|
John Korejwa, Julian Minguillon, Luis Ortiz, George Phillips, Davide Rossi,
|
||||||
and other members of the Independent JPEG Group.
|
Ge' Weijers, and other members of the Independent JPEG Group.
|
||||||
|
|
||||||
IJG is not affiliated with the ISO/IEC JTC1/SC29/WG1 standards committee
|
IJG is not affiliated with the ISO/IEC JTC1/SC29/WG1 standards committee
|
||||||
(previously known as JPEG, together with ITU-T SG16).
|
(previously known as JPEG, together with ITU-T SG16).
|
||||||
@@ -115,7 +115,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-2018, 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
|
||||||
@@ -152,13 +152,6 @@ The same holds for its supporting scripts (config.guess, config.sub,
|
|||||||
ltmain.sh). Another support script, install-sh, is copyright by X Consortium
|
ltmain.sh). Another support script, install-sh, is copyright by X Consortium
|
||||||
but is also freely distributable.
|
but is also freely distributable.
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
|
|
||||||
REFERENCES
|
REFERENCES
|
||||||
==========
|
==========
|
||||||
@@ -246,8 +239,8 @@ ARCHIVE LOCATIONS
|
|||||||
The "official" archive site for this software is www.ijg.org.
|
The "official" archive site for this software is www.ijg.org.
|
||||||
The most recent released version can always be found there in
|
The most recent released version can always be found there in
|
||||||
directory "files". This particular version will be archived as
|
directory "files". This particular version will be archived as
|
||||||
http://www.ijg.org/files/jpegsrc.v9c.tar.gz, and in Windows-compatible
|
http://www.ijg.org/files/jpegsrc.v9d.tar.gz, and in Windows-compatible
|
||||||
"zip" archive format as http://www.ijg.org/files/jpegsr9c.zip.
|
"zip" archive format as http://www.ijg.org/files/jpegsr9d.zip.
|
||||||
|
|
||||||
The JPEG FAQ (Frequently Asked Questions) article is a source of some
|
The JPEG FAQ (Frequently Asked Questions) article is a source of some
|
||||||
general information about JPEG.
|
general information about JPEG.
|
||||||
|
|||||||
Vendored
+49
@@ -1,6 +1,55 @@
|
|||||||
CHANGE LOG for Independent JPEG Group's JPEG software
|
CHANGE LOG for Independent JPEG Group's JPEG software
|
||||||
|
|
||||||
|
|
||||||
|
Version 9d 12-Jan-2020
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
Optimize the optimal Huffman code table generation to produce
|
||||||
|
slightly smaller files. Thank to John Korejwa for suggestion.
|
||||||
|
Note: Requires rebuild of testimgp.jpg.
|
||||||
|
|
||||||
|
Decoding Huffman: Use default tables if tables are not defined.
|
||||||
|
Thank to Simone Azzalin for report (Motion JPEG),
|
||||||
|
and to Martin Strunz for hint.
|
||||||
|
|
||||||
|
Add sanity check in optimal Huffman code table generation.
|
||||||
|
Thank to Adam Farley for suggestion.
|
||||||
|
|
||||||
|
rdtarga.c: use read_byte(), with EOF check, instead of getc()
|
||||||
|
in read_*_pixel().
|
||||||
|
Thank to Chijin Zhou for cjpeg potential vulnerability report.
|
||||||
|
|
||||||
|
jmemnobs.c: respect the max_memory_to_use setting in
|
||||||
|
jpeg_mem_available() computation. Thank to Sheng Shu and
|
||||||
|
Dongdong She for djpeg potential vulnerability report.
|
||||||
|
|
||||||
|
jdarith.c, jdhuff.c: avoid left shift of negative value
|
||||||
|
compiler warning in decode_mcu_AC_refine().
|
||||||
|
Thank to Indu Bhagat for suggestion.
|
||||||
|
|
||||||
|
Add x64 (64-bit) platform support, avoid compiler warnings.
|
||||||
|
Thank to Jonathan Potter, Feiyun Wang, and Sheng Shu for suggestion.
|
||||||
|
|
||||||
|
Adjust libjpeg version specification for pkg-config file.
|
||||||
|
Thank to Chen Chen for suggestion.
|
||||||
|
|
||||||
|
Restore GIF read and write support from libjpeg version 6a.
|
||||||
|
Thank to Wolfgang Werner (W.W.) Heinz for suggestion.
|
||||||
|
|
||||||
|
Improve consistency in raw (downsampled) image data processing mode.
|
||||||
|
Thank to Zhongyuan Zhou for hint.
|
||||||
|
|
||||||
|
Avoid out of bounds array read (AC derived table pointers)
|
||||||
|
in start pass in jdhuff.c. Thank to Peng Li for report.
|
||||||
|
|
||||||
|
Improve code sanity (jdhuff.c).
|
||||||
|
Thank to Reza Mirzazade farkhani for reports.
|
||||||
|
|
||||||
|
Add jpegtran -drop option; add options to the crop extension and wipe
|
||||||
|
to fill the extra area with content from the source image region,
|
||||||
|
instead of gray out.
|
||||||
|
|
||||||
|
|
||||||
Version 9c 14-Jan-2018
|
Version 9c 14-Jan-2018
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
||||||
|
|||||||
Vendored
+9
-8
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* jcarith.c
|
* jcarith.c
|
||||||
*
|
*
|
||||||
* Developed 1997-2013 by Guido Vollbeding.
|
* Developed 1997-2019 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@@ -181,11 +181,11 @@ finish_pass (j_compress_ptr cinfo)
|
|||||||
if (e->zc) /* output final pending zero bytes */
|
if (e->zc) /* output final pending zero bytes */
|
||||||
do emit_byte(0x00, cinfo);
|
do emit_byte(0x00, cinfo);
|
||||||
while (--e->zc);
|
while (--e->zc);
|
||||||
emit_byte((e->c >> 19) & 0xFF, cinfo);
|
emit_byte((int) ((e->c >> 19) & 0xFF), cinfo);
|
||||||
if (((e->c >> 19) & 0xFF) == 0xFF)
|
if (((e->c >> 19) & 0xFF) == 0xFF)
|
||||||
emit_byte(0x00, cinfo);
|
emit_byte(0x00, cinfo);
|
||||||
if (e->c & 0x7F800L) {
|
if (e->c & 0x7F800L) {
|
||||||
emit_byte((e->c >> 11) & 0xFF, cinfo);
|
emit_byte((int) ((e->c >> 11) & 0xFF), cinfo);
|
||||||
if (((e->c >> 11) & 0xFF) == 0xFF)
|
if (((e->c >> 11) & 0xFF) == 0xFF)
|
||||||
emit_byte(0x00, cinfo);
|
emit_byte(0x00, cinfo);
|
||||||
}
|
}
|
||||||
@@ -280,7 +280,8 @@ arith_encode (j_compress_ptr cinfo, unsigned char *st, int val)
|
|||||||
/* Note: The 3 spacer bits in the C register guarantee
|
/* Note: The 3 spacer bits in the C register guarantee
|
||||||
* that the new buffer byte can't be 0xFF here
|
* that the new buffer byte can't be 0xFF here
|
||||||
* (see page 160 in the P&M JPEG book). */
|
* (see page 160 in the P&M JPEG book). */
|
||||||
e->buffer = temp & 0xFF; /* new output byte, might overflow later */
|
/* New output byte, might overflow later */
|
||||||
|
e->buffer = (int) (temp & 0xFF);
|
||||||
} else if (temp == 0xFF) {
|
} else if (temp == 0xFF) {
|
||||||
++e->sc; /* stack 0xFF byte (which might overflow later) */
|
++e->sc; /* stack 0xFF byte (which might overflow later) */
|
||||||
} else {
|
} else {
|
||||||
@@ -302,7 +303,8 @@ arith_encode (j_compress_ptr cinfo, unsigned char *st, int val)
|
|||||||
emit_byte(0x00, cinfo);
|
emit_byte(0x00, cinfo);
|
||||||
} while (--e->sc);
|
} while (--e->sc);
|
||||||
}
|
}
|
||||||
e->buffer = temp & 0xFF; /* new output byte (can still overflow) */
|
/* New output byte (can still overflow) */
|
||||||
|
e->buffer = (int) (temp & 0xFF);
|
||||||
}
|
}
|
||||||
e->c &= 0x7FFFFL;
|
e->c &= 0x7FFFFL;
|
||||||
e->ct += 8;
|
e->ct += 8;
|
||||||
@@ -926,9 +928,8 @@ jinit_arith_encoder (j_compress_ptr cinfo)
|
|||||||
arith_entropy_ptr entropy;
|
arith_entropy_ptr entropy;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
entropy = (arith_entropy_ptr)
|
entropy = (arith_entropy_ptr) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(arith_entropy_encoder));
|
||||||
SIZEOF(arith_entropy_encoder));
|
|
||||||
cinfo->entropy = &entropy->pub;
|
cinfo->entropy = &entropy->pub;
|
||||||
entropy->pub.start_pass = start_pass;
|
entropy->pub.start_pass = start_pass;
|
||||||
entropy->pub.finish_pass = finish_pass;
|
entropy->pub.finish_pass = finish_pass;
|
||||||
|
|||||||
Vendored
+47
-50
@@ -2,7 +2,7 @@
|
|||||||
* jccolor.c
|
* jccolor.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1996, Thomas G. Lane.
|
* Copyright (C) 1991-1996, Thomas G. Lane.
|
||||||
* Modified 2011-2013 by Guido Vollbeding.
|
* Modified 2011-2019 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@@ -105,14 +105,14 @@ rgb_ycc_start (j_compress_ptr cinfo)
|
|||||||
/* Allocate and fill in the conversion tables. */
|
/* Allocate and fill in the conversion tables. */
|
||||||
cconvert->rgb_ycc_tab = rgb_ycc_tab = (INT32 *)
|
cconvert->rgb_ycc_tab = rgb_ycc_tab = (INT32 *)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
||||||
(TABLE_SIZE * SIZEOF(INT32)));
|
TABLE_SIZE * SIZEOF(INT32));
|
||||||
|
|
||||||
for (i = 0; i <= MAXJSAMPLE; i++) {
|
for (i = 0; i <= MAXJSAMPLE; i++) {
|
||||||
rgb_ycc_tab[i+R_Y_OFF] = FIX(0.299) * i;
|
rgb_ycc_tab[i+R_Y_OFF] = FIX(0.299) * i;
|
||||||
rgb_ycc_tab[i+G_Y_OFF] = FIX(0.587) * i;
|
rgb_ycc_tab[i+G_Y_OFF] = FIX(0.587) * i;
|
||||||
rgb_ycc_tab[i+B_Y_OFF] = FIX(0.114) * i + ONE_HALF;
|
rgb_ycc_tab[i+B_Y_OFF] = FIX(0.114) * i + ONE_HALF;
|
||||||
rgb_ycc_tab[i+R_CB_OFF] = (-FIX(0.168735892)) * i;
|
rgb_ycc_tab[i+R_CB_OFF] = (- FIX(0.168735892)) * i;
|
||||||
rgb_ycc_tab[i+G_CB_OFF] = (-FIX(0.331264108)) * i;
|
rgb_ycc_tab[i+G_CB_OFF] = (- FIX(0.331264108)) * i;
|
||||||
/* We use a rounding fudge-factor of 0.5-epsilon for Cb and Cr.
|
/* We use a rounding fudge-factor of 0.5-epsilon for Cb and Cr.
|
||||||
* This ensures that the maximum output will round to MAXJSAMPLE
|
* This ensures that the maximum output will round to MAXJSAMPLE
|
||||||
* not MAXJSAMPLE+1, and thus that we don't have to range-limit.
|
* not MAXJSAMPLE+1, and thus that we don't have to range-limit.
|
||||||
@@ -121,8 +121,8 @@ rgb_ycc_start (j_compress_ptr cinfo)
|
|||||||
/* B=>Cb and R=>Cr tables are the same
|
/* B=>Cb and R=>Cr tables are the same
|
||||||
rgb_ycc_tab[i+R_CR_OFF] = FIX(0.5) * i + CBCR_OFFSET + ONE_HALF-1;
|
rgb_ycc_tab[i+R_CR_OFF] = FIX(0.5) * i + CBCR_OFFSET + ONE_HALF-1;
|
||||||
*/
|
*/
|
||||||
rgb_ycc_tab[i+G_CR_OFF] = (-FIX(0.418687589)) * i;
|
rgb_ycc_tab[i+G_CR_OFF] = (- FIX(0.418687589)) * i;
|
||||||
rgb_ycc_tab[i+B_CR_OFF] = (-FIX(0.081312411)) * i;
|
rgb_ycc_tab[i+B_CR_OFF] = (- FIX(0.081312411)) * i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -131,12 +131,12 @@ rgb_ycc_start (j_compress_ptr cinfo)
|
|||||||
* Convert some rows of samples to the JPEG colorspace.
|
* Convert some rows of samples to the JPEG colorspace.
|
||||||
*
|
*
|
||||||
* Note that we change from the application's interleaved-pixel format
|
* Note that we change from the application's interleaved-pixel format
|
||||||
* to our internal noninterleaved, one-plane-per-component format.
|
* to our internal noninterleaved, one-plane-per-component format. The
|
||||||
* The input buffer is therefore three times as wide as the output buffer.
|
* input buffer is therefore three times as wide as the output buffer.
|
||||||
*
|
*
|
||||||
* A starting row offset is provided only for the output buffer. The caller
|
* A starting row offset is provided only for the output buffer. The
|
||||||
* can easily adjust the passed input_buf value to accommodate any row
|
* caller can easily adjust the passed input_buf value to accommodate
|
||||||
* offset required on that side.
|
* any row offset required on that side.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
METHODDEF(void)
|
METHODDEF(void)
|
||||||
@@ -145,8 +145,8 @@ rgb_ycc_convert (j_compress_ptr cinfo,
|
|||||||
JDIMENSION output_row, int num_rows)
|
JDIMENSION output_row, int num_rows)
|
||||||
{
|
{
|
||||||
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
|
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
|
||||||
register INT32 * ctab = cconvert->rgb_ycc_tab;
|
|
||||||
register int r, g, b;
|
register int r, g, b;
|
||||||
|
register INT32 * ctab = cconvert->rgb_ycc_tab;
|
||||||
register JSAMPROW inptr;
|
register JSAMPROW inptr;
|
||||||
register JSAMPROW outptr0, outptr1, outptr2;
|
register JSAMPROW outptr0, outptr1, outptr2;
|
||||||
register JDIMENSION col;
|
register JDIMENSION col;
|
||||||
@@ -162,6 +162,7 @@ rgb_ycc_convert (j_compress_ptr cinfo,
|
|||||||
r = GETJSAMPLE(inptr[RGB_RED]);
|
r = GETJSAMPLE(inptr[RGB_RED]);
|
||||||
g = GETJSAMPLE(inptr[RGB_GREEN]);
|
g = GETJSAMPLE(inptr[RGB_GREEN]);
|
||||||
b = GETJSAMPLE(inptr[RGB_BLUE]);
|
b = GETJSAMPLE(inptr[RGB_BLUE]);
|
||||||
|
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.
|
||||||
* Hence the value being shifted is never negative, and we don't
|
* Hence the value being shifted is never negative, and we don't
|
||||||
@@ -179,7 +180,6 @@ rgb_ycc_convert (j_compress_ptr cinfo,
|
|||||||
outptr2[col] = (JSAMPLE)
|
outptr2[col] = (JSAMPLE)
|
||||||
((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF])
|
((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF])
|
||||||
>> SCALEBITS);
|
>> SCALEBITS);
|
||||||
inptr += RGB_PIXELSIZE;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -201,8 +201,8 @@ rgb_gray_convert (j_compress_ptr cinfo,
|
|||||||
JDIMENSION output_row, int num_rows)
|
JDIMENSION output_row, int num_rows)
|
||||||
{
|
{
|
||||||
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
|
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
|
||||||
register INT32 * ctab = cconvert->rgb_ycc_tab;
|
|
||||||
register int r, g, b;
|
register int r, g, b;
|
||||||
|
register INT32 * ctab = cconvert->rgb_ycc_tab;
|
||||||
register JSAMPROW inptr;
|
register JSAMPROW inptr;
|
||||||
register JSAMPROW outptr;
|
register JSAMPROW outptr;
|
||||||
register JDIMENSION col;
|
register JDIMENSION col;
|
||||||
@@ -215,11 +215,11 @@ rgb_gray_convert (j_compress_ptr cinfo,
|
|||||||
r = GETJSAMPLE(inptr[RGB_RED]);
|
r = GETJSAMPLE(inptr[RGB_RED]);
|
||||||
g = GETJSAMPLE(inptr[RGB_GREEN]);
|
g = GETJSAMPLE(inptr[RGB_GREEN]);
|
||||||
b = GETJSAMPLE(inptr[RGB_BLUE]);
|
b = GETJSAMPLE(inptr[RGB_BLUE]);
|
||||||
|
inptr += RGB_PIXELSIZE;
|
||||||
/* Y */
|
/* Y */
|
||||||
outptr[col] = (JSAMPLE)
|
outptr[col] = (JSAMPLE)
|
||||||
((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])
|
((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])
|
||||||
>> SCALEBITS);
|
>> SCALEBITS);
|
||||||
inptr += RGB_PIXELSIZE;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -228,8 +228,8 @@ rgb_gray_convert (j_compress_ptr cinfo,
|
|||||||
/*
|
/*
|
||||||
* Convert some rows of samples to the JPEG colorspace.
|
* Convert some rows of samples to the JPEG colorspace.
|
||||||
* This version handles Adobe-style CMYK->YCCK conversion,
|
* This version handles Adobe-style CMYK->YCCK conversion,
|
||||||
* where we convert R=1-C, G=1-M, and B=1-Y to YCbCr using the same
|
* where we convert R=1-C, G=1-M, and B=1-Y to YCbCr using the
|
||||||
* conversion as above, while passing K (black) unchanged.
|
* same conversion as above, while passing K (black) unchanged.
|
||||||
* We assume rgb_ycc_start has been called.
|
* We assume rgb_ycc_start has been called.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -239,8 +239,8 @@ cmyk_ycck_convert (j_compress_ptr cinfo,
|
|||||||
JDIMENSION output_row, int num_rows)
|
JDIMENSION output_row, int num_rows)
|
||||||
{
|
{
|
||||||
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
|
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
|
||||||
register INT32 * ctab = cconvert->rgb_ycc_tab;
|
|
||||||
register int r, g, b;
|
register int r, g, b;
|
||||||
|
register INT32 * ctab = cconvert->rgb_ycc_tab;
|
||||||
register JSAMPROW inptr;
|
register JSAMPROW inptr;
|
||||||
register JSAMPROW outptr0, outptr1, outptr2, outptr3;
|
register JSAMPROW outptr0, outptr1, outptr2, outptr3;
|
||||||
register JDIMENSION col;
|
register JDIMENSION col;
|
||||||
@@ -259,6 +259,7 @@ cmyk_ycck_convert (j_compress_ptr cinfo,
|
|||||||
b = MAXJSAMPLE - GETJSAMPLE(inptr[2]);
|
b = MAXJSAMPLE - GETJSAMPLE(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]; /* don't need GETJSAMPLE here */
|
||||||
|
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.
|
||||||
* Hence the value being shifted is never negative, and we don't
|
* Hence the value being shifted is never negative, and we don't
|
||||||
@@ -276,7 +277,6 @@ cmyk_ycck_convert (j_compress_ptr cinfo,
|
|||||||
outptr2[col] = (JSAMPLE)
|
outptr2[col] = (JSAMPLE)
|
||||||
((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF])
|
((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF])
|
||||||
>> SCALEBITS);
|
>> SCALEBITS);
|
||||||
inptr += 4;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -312,13 +312,13 @@ rgb_rgb1_convert (j_compress_ptr cinfo,
|
|||||||
r = GETJSAMPLE(inptr[RGB_RED]);
|
r = GETJSAMPLE(inptr[RGB_RED]);
|
||||||
g = GETJSAMPLE(inptr[RGB_GREEN]);
|
g = GETJSAMPLE(inptr[RGB_GREEN]);
|
||||||
b = GETJSAMPLE(inptr[RGB_BLUE]);
|
b = GETJSAMPLE(inptr[RGB_BLUE]);
|
||||||
|
inptr += RGB_PIXELSIZE;
|
||||||
/* Assume that MAXJSAMPLE+1 is a power of 2, so that the MOD
|
/* Assume that MAXJSAMPLE+1 is a power of 2, so that the MOD
|
||||||
* (modulo) operator is equivalent to the bitmask operator AND.
|
* (modulo) operator is equivalent to the bitmask operator AND.
|
||||||
*/
|
*/
|
||||||
outptr0[col] = (JSAMPLE) ((r - g + CENTERJSAMPLE) & MAXJSAMPLE);
|
outptr0[col] = (JSAMPLE) ((r - g + CENTERJSAMPLE) & MAXJSAMPLE);
|
||||||
outptr1[col] = (JSAMPLE) g;
|
outptr1[col] = (JSAMPLE) g;
|
||||||
outptr2[col] = (JSAMPLE) ((b - g + CENTERJSAMPLE) & MAXJSAMPLE);
|
outptr2[col] = (JSAMPLE) ((b - g + CENTERJSAMPLE) & MAXJSAMPLE);
|
||||||
inptr += RGB_PIXELSIZE;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -335,17 +335,17 @@ grayscale_convert (j_compress_ptr cinfo,
|
|||||||
JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
|
JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
|
||||||
JDIMENSION output_row, int num_rows)
|
JDIMENSION output_row, int num_rows)
|
||||||
{
|
{
|
||||||
int instride = cinfo->input_components;
|
|
||||||
register JSAMPROW inptr;
|
register JSAMPROW inptr;
|
||||||
register JSAMPROW outptr;
|
register JSAMPROW outptr;
|
||||||
register JDIMENSION col;
|
register JDIMENSION count;
|
||||||
|
register int instride = cinfo->input_components;
|
||||||
JDIMENSION num_cols = cinfo->image_width;
|
JDIMENSION num_cols = cinfo->image_width;
|
||||||
|
|
||||||
while (--num_rows >= 0) {
|
while (--num_rows >= 0) {
|
||||||
inptr = *input_buf++;
|
inptr = *input_buf++;
|
||||||
outptr = output_buf[0][output_row++];
|
outptr = output_buf[0][output_row++];
|
||||||
for (col = 0; col < num_cols; col++) {
|
for (count = num_cols; count > 0; count--) {
|
||||||
outptr[col] = inptr[0]; /* don't need GETJSAMPLE() here */
|
*outptr++ = *inptr; /* don't need GETJSAMPLE() here */
|
||||||
inptr += instride;
|
inptr += instride;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -396,21 +396,21 @@ null_convert (j_compress_ptr cinfo,
|
|||||||
JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
|
JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
|
||||||
JDIMENSION output_row, int num_rows)
|
JDIMENSION output_row, int num_rows)
|
||||||
{
|
{
|
||||||
int ci;
|
|
||||||
register int nc = cinfo->num_components;
|
|
||||||
register JSAMPROW inptr;
|
register JSAMPROW inptr;
|
||||||
register JSAMPROW outptr;
|
register JSAMPROW outptr;
|
||||||
register JDIMENSION col;
|
register JDIMENSION count;
|
||||||
|
register int num_comps = cinfo->num_components;
|
||||||
JDIMENSION num_cols = cinfo->image_width;
|
JDIMENSION num_cols = cinfo->image_width;
|
||||||
|
int ci;
|
||||||
|
|
||||||
while (--num_rows >= 0) {
|
while (--num_rows >= 0) {
|
||||||
/* It seems fastest to make a separate pass for each component. */
|
/* It seems fastest to make a separate pass for each component. */
|
||||||
for (ci = 0; ci < nc; ci++) {
|
for (ci = 0; ci < num_comps; ci++) {
|
||||||
inptr = input_buf[0] + ci;
|
inptr = input_buf[0] + ci;
|
||||||
outptr = output_buf[ci][output_row];
|
outptr = output_buf[ci][output_row];
|
||||||
for (col = 0; col < num_cols; col++) {
|
for (count = num_cols; count > 0; count--) {
|
||||||
*outptr++ = *inptr; /* don't need GETJSAMPLE() here */
|
*outptr++ = *inptr; /* don't need GETJSAMPLE() here */
|
||||||
inptr += nc;
|
inptr += num_comps;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
input_buf++;
|
input_buf++;
|
||||||
@@ -439,9 +439,8 @@ jinit_color_converter (j_compress_ptr cinfo)
|
|||||||
{
|
{
|
||||||
my_cconvert_ptr cconvert;
|
my_cconvert_ptr cconvert;
|
||||||
|
|
||||||
cconvert = (my_cconvert_ptr)
|
cconvert = (my_cconvert_ptr) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(my_color_converter));
|
||||||
SIZEOF(my_color_converter));
|
|
||||||
cinfo->cconvert = &cconvert->pub;
|
cinfo->cconvert = &cconvert->pub;
|
||||||
/* set start_pass to null method until we find out differently */
|
/* set start_pass to null method until we find out differently */
|
||||||
cconvert->pub.start_pass = null_method;
|
cconvert->pub.start_pass = null_method;
|
||||||
@@ -455,9 +454,11 @@ jinit_color_converter (j_compress_ptr cinfo)
|
|||||||
|
|
||||||
case JCS_RGB:
|
case JCS_RGB:
|
||||||
case JCS_BG_RGB:
|
case JCS_BG_RGB:
|
||||||
|
#if RGB_PIXELSIZE != 3
|
||||||
if (cinfo->input_components != RGB_PIXELSIZE)
|
if (cinfo->input_components != RGB_PIXELSIZE)
|
||||||
ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
|
ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
|
||||||
break;
|
break;
|
||||||
|
#endif /* else share code with YCbCr */
|
||||||
|
|
||||||
case JCS_YCbCr:
|
case JCS_YCbCr:
|
||||||
case JCS_BG_YCC:
|
case JCS_BG_YCC:
|
||||||
@@ -474,7 +475,6 @@ jinit_color_converter (j_compress_ptr cinfo)
|
|||||||
default: /* JCS_UNKNOWN can be anything */
|
default: /* JCS_UNKNOWN can be anything */
|
||||||
if (cinfo->input_components < 1)
|
if (cinfo->input_components < 1)
|
||||||
ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
|
ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Support color transform only for RGB colorspaces */
|
/* Support color transform only for RGB colorspaces */
|
||||||
@@ -507,19 +507,18 @@ jinit_color_converter (j_compress_ptr cinfo)
|
|||||||
case JCS_BG_RGB:
|
case JCS_BG_RGB:
|
||||||
if (cinfo->num_components != 3)
|
if (cinfo->num_components != 3)
|
||||||
ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
|
ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
|
||||||
if (cinfo->in_color_space == cinfo->jpeg_color_space) {
|
if (cinfo->in_color_space != cinfo->jpeg_color_space)
|
||||||
switch (cinfo->color_transform) {
|
|
||||||
case JCT_NONE:
|
|
||||||
cconvert->pub.color_convert = rgb_convert;
|
|
||||||
break;
|
|
||||||
case JCT_SUBTRACT_GREEN:
|
|
||||||
cconvert->pub.color_convert = rgb_rgb1_convert;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
||||||
|
switch (cinfo->color_transform) {
|
||||||
|
case JCT_NONE:
|
||||||
|
cconvert->pub.color_convert = rgb_convert;
|
||||||
|
break;
|
||||||
|
case JCT_SUBTRACT_GREEN:
|
||||||
|
cconvert->pub.color_convert = rgb_rgb1_convert;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case JCS_YCbCr:
|
case JCS_YCbCr:
|
||||||
@@ -572,10 +571,9 @@ jinit_color_converter (j_compress_ptr cinfo)
|
|||||||
case JCS_CMYK:
|
case JCS_CMYK:
|
||||||
if (cinfo->num_components != 4)
|
if (cinfo->num_components != 4)
|
||||||
ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
|
ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
|
||||||
if (cinfo->in_color_space == JCS_CMYK)
|
if (cinfo->in_color_space != JCS_CMYK)
|
||||||
cconvert->pub.color_convert = null_convert;
|
|
||||||
else
|
|
||||||
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
||||||
|
cconvert->pub.color_convert = null_convert;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case JCS_YCCK:
|
case JCS_YCCK:
|
||||||
@@ -599,6 +597,5 @@ jinit_color_converter (j_compress_ptr cinfo)
|
|||||||
cinfo->num_components != cinfo->input_components)
|
cinfo->num_components != cinfo->input_components)
|
||||||
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
||||||
cconvert->pub.color_convert = null_convert;
|
cconvert->pub.color_convert = null_convert;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+109
-42
@@ -2,7 +2,7 @@
|
|||||||
* jchuff.c
|
* jchuff.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1997, Thomas G. Lane.
|
* Copyright (C) 1991-1997, Thomas G. Lane.
|
||||||
* Modified 2006-2013 by Guido Vollbeding.
|
* Modified 2006-2019 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@@ -178,13 +178,12 @@ jpeg_make_c_derived_tbl (j_compress_ptr cinfo, boolean isDC, int tblno,
|
|||||||
htbl =
|
htbl =
|
||||||
isDC ? cinfo->dc_huff_tbl_ptrs[tblno] : cinfo->ac_huff_tbl_ptrs[tblno];
|
isDC ? cinfo->dc_huff_tbl_ptrs[tblno] : cinfo->ac_huff_tbl_ptrs[tblno];
|
||||||
if (htbl == NULL)
|
if (htbl == NULL)
|
||||||
ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);
|
htbl = jpeg_std_huff_table((j_common_ptr) cinfo, isDC, tblno);
|
||||||
|
|
||||||
/* Allocate a workspace if we haven't already done so. */
|
/* Allocate a workspace if we haven't already done so. */
|
||||||
if (*pdtbl == NULL)
|
if (*pdtbl == NULL)
|
||||||
*pdtbl = (c_derived_tbl *)
|
*pdtbl = (c_derived_tbl *) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(c_derived_tbl));
|
||||||
SIZEOF(c_derived_tbl));
|
|
||||||
dtbl = *pdtbl;
|
dtbl = *pdtbl;
|
||||||
|
|
||||||
/* Figure C.1: make table of Huffman code length for each symbol */
|
/* Figure C.1: make table of Huffman code length for each symbol */
|
||||||
@@ -1256,22 +1255,88 @@ jpeg_gen_optimal_table (j_compress_ptr cinfo, JHUFF_TBL * htbl, long freq[])
|
|||||||
UINT8 bits[MAX_CLEN+1]; /* bits[k] = # of symbols with code length k */
|
UINT8 bits[MAX_CLEN+1]; /* bits[k] = # of symbols with code length k */
|
||||||
int codesize[257]; /* codesize[k] = code length of symbol k */
|
int codesize[257]; /* codesize[k] = code length of symbol k */
|
||||||
int others[257]; /* next symbol in current branch of tree */
|
int others[257]; /* next symbol in current branch of tree */
|
||||||
int c1, c2;
|
int c1, c2, i, j;
|
||||||
int p, i, j;
|
UINT8 *p;
|
||||||
long v;
|
long v;
|
||||||
|
|
||||||
|
freq[256] = 1; /* make sure 256 has a nonzero count */
|
||||||
|
/* Including the pseudo-symbol 256 in the Huffman procedure guarantees
|
||||||
|
* that no real symbol is given code-value of all ones, because 256
|
||||||
|
* will be placed last in the largest codeword category.
|
||||||
|
* In the symbol list build procedure this element serves as sentinel
|
||||||
|
* for the zero run loop.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef DONT_USE_FANCY_HUFF_OPT
|
||||||
|
|
||||||
|
/* Build list of symbols sorted in order of descending frequency */
|
||||||
|
/* This approach has several benefits (thank to John Korejwa for the idea):
|
||||||
|
* 1.
|
||||||
|
* If a codelength category is split during the length limiting procedure
|
||||||
|
* below, the feature that more frequent symbols are assigned shorter
|
||||||
|
* codewords remains valid for the adjusted code.
|
||||||
|
* 2.
|
||||||
|
* To reduce consecutive ones in a Huffman data stream (thus reducing the
|
||||||
|
* number of stuff bytes in JPEG) it is preferable to follow 0 branches
|
||||||
|
* (and avoid 1 branches) as much as possible. This is easily done by
|
||||||
|
* assigning symbols to leaves of the Huffman tree in order of decreasing
|
||||||
|
* frequency, with no secondary sort based on codelengths.
|
||||||
|
* 3.
|
||||||
|
* The symbol list can be built independently from the assignment of code
|
||||||
|
* lengths by the Huffman procedure below.
|
||||||
|
* Note: The symbol list build procedure must be performed first, because
|
||||||
|
* the Huffman procedure assigning the codelengths clobbers the frequency
|
||||||
|
* counts!
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Here we use the others array as a linked list of nonzero frequencies
|
||||||
|
* to be sorted. Already sorted elements are removed from the list.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Building list */
|
||||||
|
|
||||||
|
/* This item does not correspond to a valid symbol frequency and is used
|
||||||
|
* as starting index.
|
||||||
|
*/
|
||||||
|
j = 256;
|
||||||
|
|
||||||
|
for (i = 0;; i++) {
|
||||||
|
if (freq[i] == 0) /* skip zero frequencies */
|
||||||
|
continue;
|
||||||
|
if (i > 255)
|
||||||
|
break;
|
||||||
|
others[j] = i; /* this symbol value */
|
||||||
|
j = i; /* previous symbol value */
|
||||||
|
}
|
||||||
|
others[j] = -1; /* mark end of list */
|
||||||
|
|
||||||
|
/* Sorting list */
|
||||||
|
|
||||||
|
p = htbl->huffval;
|
||||||
|
while ((c1 = others[256]) >= 0) {
|
||||||
|
v = freq[c1];
|
||||||
|
i = c1; /* first symbol value */
|
||||||
|
j = 256; /* pseudo symbol value for starting index */
|
||||||
|
while ((c2 = others[c1]) >= 0) {
|
||||||
|
if (freq[c2] > v) {
|
||||||
|
v = freq[c2];
|
||||||
|
i = c2; /* this symbol value */
|
||||||
|
j = c1; /* previous symbol value */
|
||||||
|
}
|
||||||
|
c1 = c2;
|
||||||
|
}
|
||||||
|
others[j] = others[i]; /* remove this symbol i from list */
|
||||||
|
*p++ = (UINT8) i;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* DONT_USE_FANCY_HUFF_OPT */
|
||||||
|
|
||||||
/* 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));
|
MEMZERO(bits, SIZEOF(bits));
|
||||||
MEMZERO(codesize, SIZEOF(codesize));
|
MEMZERO(codesize, 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 */
|
||||||
|
|
||||||
freq[256] = 1; /* make sure 256 has a nonzero count */
|
|
||||||
/* Including the pseudo-symbol 256 in the Huffman procedure guarantees
|
|
||||||
* that no real symbol is given code-value of all ones, because 256
|
|
||||||
* will be placed last in the largest codeword category.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Huffman's basic algorithm to assign optimal code lengths to symbols */
|
/* Huffman's basic algorithm to assign optimal code lengths to symbols */
|
||||||
|
|
||||||
@@ -1301,7 +1366,7 @@ jpeg_gen_optimal_table (j_compress_ptr cinfo, JHUFF_TBL * htbl, long freq[])
|
|||||||
/* Done if we've merged everything into one frequency */
|
/* Done if we've merged everything into one frequency */
|
||||||
if (c2 < 0)
|
if (c2 < 0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Else merge the two counts/trees */
|
/* Else merge the two counts/trees */
|
||||||
freq[c1] += freq[c2];
|
freq[c1] += freq[c2];
|
||||||
freq[c2] = 0;
|
freq[c2] = 0;
|
||||||
@@ -1312,9 +1377,9 @@ jpeg_gen_optimal_table (j_compress_ptr cinfo, JHUFF_TBL * htbl, long freq[])
|
|||||||
c1 = others[c1];
|
c1 = others[c1];
|
||||||
codesize[c1]++;
|
codesize[c1]++;
|
||||||
}
|
}
|
||||||
|
|
||||||
others[c1] = c2; /* chain c2 onto c1's tree branch */
|
others[c1] = c2; /* chain c2 onto c1's tree branch */
|
||||||
|
|
||||||
/* Increment the codesize of everything in c2's tree branch */
|
/* Increment the codesize of everything in c2's tree branch */
|
||||||
codesize[c2]++;
|
codesize[c2]++;
|
||||||
while (others[c2] >= 0) {
|
while (others[c2] >= 0) {
|
||||||
@@ -1329,7 +1394,7 @@ jpeg_gen_optimal_table (j_compress_ptr cinfo, JHUFF_TBL * htbl, long freq[])
|
|||||||
/* The JPEG standard seems to think that this can't happen, */
|
/* The JPEG standard seems to think that this can't happen, */
|
||||||
/* but I'm paranoid... */
|
/* but I'm paranoid... */
|
||||||
if (codesize[i] > MAX_CLEN)
|
if (codesize[i] > MAX_CLEN)
|
||||||
ERREXIT(cinfo, JERR_HUFF_CLEN_OVERFLOW);
|
ERREXIT(cinfo, JERR_HUFF_CLEN_OUTOFBOUNDS);
|
||||||
|
|
||||||
bits[codesize[i]]++;
|
bits[codesize[i]]++;
|
||||||
}
|
}
|
||||||
@@ -1345,13 +1410,16 @@ jpeg_gen_optimal_table (j_compress_ptr cinfo, JHUFF_TBL * htbl, long freq[])
|
|||||||
* shortest nonzero BITS entry is converted into a prefix for two code words
|
* shortest nonzero BITS entry is converted into a prefix for two code words
|
||||||
* one bit longer.
|
* one bit longer.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
for (i = MAX_CLEN; i > 16; i--) {
|
for (i = MAX_CLEN; i > 16; i--) {
|
||||||
while (bits[i] > 0) {
|
while (bits[i] > 0) {
|
||||||
j = i - 2; /* find length of new prefix to be used */
|
j = i - 2; /* find length of new prefix to be used */
|
||||||
while (bits[j] == 0)
|
while (bits[j] == 0) {
|
||||||
|
if (j == 0)
|
||||||
|
ERREXIT(cinfo, JERR_HUFF_CLEN_OUTOFBOUNDS);
|
||||||
j--;
|
j--;
|
||||||
|
}
|
||||||
|
|
||||||
bits[i] -= 2; /* remove two symbols */
|
bits[i] -= 2; /* remove two symbols */
|
||||||
bits[i-1]++; /* one goes in this length */
|
bits[i-1]++; /* one goes in this length */
|
||||||
bits[j+1] += 2; /* two new symbols in this length */
|
bits[j+1] += 2; /* two new symbols in this length */
|
||||||
@@ -1363,24 +1431,27 @@ jpeg_gen_optimal_table (j_compress_ptr cinfo, JHUFF_TBL * htbl, long freq[])
|
|||||||
while (bits[i] == 0) /* find largest codelength still in use */
|
while (bits[i] == 0) /* find largest codelength still in use */
|
||||||
i--;
|
i--;
|
||||||
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));
|
MEMCOPY(htbl->bits, bits, SIZEOF(htbl->bits));
|
||||||
|
|
||||||
|
#ifdef DONT_USE_FANCY_HUFF_OPT
|
||||||
|
|
||||||
/* 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
|
/* Note: Due to the codelength changes made above, it can happen
|
||||||
* changes made above, but the JPEG spec seems to think this works.
|
* that more frequent symbols are assigned longer codewords.
|
||||||
*/
|
*/
|
||||||
p = 0;
|
p = htbl->huffval;
|
||||||
for (i = 1; i <= MAX_CLEN; i++) {
|
for (i = 1; i <= MAX_CLEN; i++) {
|
||||||
for (j = 0; j <= 255; j++) {
|
for (j = 0; j <= 255; j++) {
|
||||||
if (codesize[j] == i) {
|
if (codesize[j] == i) {
|
||||||
htbl->huffval[p] = (UINT8) j;
|
*p++ = (UINT8) j;
|
||||||
p++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif /* DONT_USE_FANCY_HUFF_OPT */
|
||||||
|
|
||||||
/* Set sent_table FALSE so updated table will be written to JPEG file. */
|
/* Set sent_table FALSE so updated table will be written to JPEG file. */
|
||||||
htbl->sent_table = FALSE;
|
htbl->sent_table = FALSE;
|
||||||
}
|
}
|
||||||
@@ -1400,13 +1471,13 @@ finish_pass_gather (j_compress_ptr cinfo)
|
|||||||
boolean did_dc[NUM_HUFF_TBLS];
|
boolean did_dc[NUM_HUFF_TBLS];
|
||||||
boolean did_ac[NUM_HUFF_TBLS];
|
boolean did_ac[NUM_HUFF_TBLS];
|
||||||
|
|
||||||
/* It's important not to apply jpeg_gen_optimal_table more than once
|
|
||||||
* per table, because it clobbers the input frequency counts!
|
|
||||||
*/
|
|
||||||
if (cinfo->progressive_mode)
|
if (cinfo->progressive_mode)
|
||||||
/* Flush out buffered data (all we care about is counting the EOB symbol) */
|
/* Flush out buffered data (all we care about is counting the EOB symbol) */
|
||||||
emit_eobrun(entropy);
|
emit_eobrun(entropy);
|
||||||
|
|
||||||
|
/* It's important not to apply jpeg_gen_optimal_table more than once
|
||||||
|
* per table, because it clobbers the input frequency counts!
|
||||||
|
*/
|
||||||
MEMZERO(did_dc, SIZEOF(did_dc));
|
MEMZERO(did_dc, SIZEOF(did_dc));
|
||||||
MEMZERO(did_ac, SIZEOF(did_ac));
|
MEMZERO(did_ac, SIZEOF(did_ac));
|
||||||
|
|
||||||
@@ -1475,9 +1546,8 @@ start_pass_huff (j_compress_ptr cinfo, boolean gather_statistics)
|
|||||||
entropy->pub.encode_mcu = encode_mcu_AC_refine;
|
entropy->pub.encode_mcu = encode_mcu_AC_refine;
|
||||||
/* AC refinement needs a correction bit buffer */
|
/* AC refinement needs a correction bit buffer */
|
||||||
if (entropy->bit_buffer == NULL)
|
if (entropy->bit_buffer == NULL)
|
||||||
entropy->bit_buffer = (char *)
|
entropy->bit_buffer = (char *) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, MAX_CORR_BITS * SIZEOF(char));
|
||||||
MAX_CORR_BITS * SIZEOF(char));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1505,9 +1575,8 @@ start_pass_huff (j_compress_ptr cinfo, boolean gather_statistics)
|
|||||||
/* Allocate and zero the statistics tables */
|
/* Allocate and zero the statistics tables */
|
||||||
/* Note that jpeg_gen_optimal_table expects 257 entries in each table! */
|
/* Note that jpeg_gen_optimal_table expects 257 entries in each table! */
|
||||||
if (entropy->dc_count_ptrs[tbl] == NULL)
|
if (entropy->dc_count_ptrs[tbl] == NULL)
|
||||||
entropy->dc_count_ptrs[tbl] = (long *)
|
entropy->dc_count_ptrs[tbl] = (long *) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, 257 * SIZEOF(long));
|
||||||
257 * SIZEOF(long));
|
|
||||||
MEMZERO(entropy->dc_count_ptrs[tbl], 257 * SIZEOF(long));
|
MEMZERO(entropy->dc_count_ptrs[tbl], 257 * SIZEOF(long));
|
||||||
} else {
|
} else {
|
||||||
/* Compute derived values for Huffman tables */
|
/* Compute derived values for Huffman tables */
|
||||||
@@ -1525,9 +1594,8 @@ start_pass_huff (j_compress_ptr cinfo, boolean gather_statistics)
|
|||||||
if (tbl < 0 || tbl >= NUM_HUFF_TBLS)
|
if (tbl < 0 || tbl >= NUM_HUFF_TBLS)
|
||||||
ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tbl);
|
ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tbl);
|
||||||
if (entropy->ac_count_ptrs[tbl] == NULL)
|
if (entropy->ac_count_ptrs[tbl] == NULL)
|
||||||
entropy->ac_count_ptrs[tbl] = (long *)
|
entropy->ac_count_ptrs[tbl] = (long *) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, 257 * SIZEOF(long));
|
||||||
257 * SIZEOF(long));
|
|
||||||
MEMZERO(entropy->ac_count_ptrs[tbl], 257 * SIZEOF(long));
|
MEMZERO(entropy->ac_count_ptrs[tbl], 257 * SIZEOF(long));
|
||||||
} else {
|
} else {
|
||||||
jpeg_make_c_derived_tbl(cinfo, FALSE, tbl,
|
jpeg_make_c_derived_tbl(cinfo, FALSE, tbl,
|
||||||
@@ -1556,9 +1624,8 @@ jinit_huff_encoder (j_compress_ptr cinfo)
|
|||||||
huff_entropy_ptr entropy;
|
huff_entropy_ptr entropy;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
entropy = (huff_entropy_ptr)
|
entropy = (huff_entropy_ptr) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(huff_entropy_encoder));
|
||||||
SIZEOF(huff_entropy_encoder));
|
|
||||||
cinfo->entropy = &entropy->pub;
|
cinfo->entropy = &entropy->pub;
|
||||||
entropy->pub.start_pass = start_pass_huff;
|
entropy->pub.start_pass = start_pass_huff;
|
||||||
|
|
||||||
|
|||||||
Vendored
+3
-5
@@ -2,7 +2,7 @@
|
|||||||
* jcmarker.c
|
* jcmarker.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1998, Thomas G. Lane.
|
* Copyright (C) 1991-1998, Thomas G. Lane.
|
||||||
* Modified 2003-2013 by Guido Vollbeding.
|
* Modified 2003-2019 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@@ -471,7 +471,6 @@ emit_adobe_app14 (j_compress_ptr cinfo)
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
emit_byte(cinfo, 0); /* Color transform = 0 */
|
emit_byte(cinfo, 0); /* Color transform = 0 */
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -702,9 +701,8 @@ jinit_marker_writer (j_compress_ptr cinfo)
|
|||||||
my_marker_ptr marker;
|
my_marker_ptr marker;
|
||||||
|
|
||||||
/* Create the subobject */
|
/* Create the subobject */
|
||||||
marker = (my_marker_ptr)
|
marker = (my_marker_ptr) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(my_marker_writer));
|
||||||
SIZEOF(my_marker_writer));
|
|
||||||
cinfo->marker = &marker->pub;
|
cinfo->marker = &marker->pub;
|
||||||
/* Initialize method pointers */
|
/* Initialize method pointers */
|
||||||
marker->pub.write_file_header = write_file_header;
|
marker->pub.write_file_header = write_file_header;
|
||||||
|
|||||||
Vendored
+18
-15
@@ -2,7 +2,7 @@
|
|||||||
* jcmaster.c
|
* jcmaster.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1997, Thomas G. Lane.
|
* Copyright (C) 1991-1997, Thomas G. Lane.
|
||||||
* Modified 2003-2017 by Guido Vollbeding.
|
* Modified 2003-2019 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@@ -62,7 +62,7 @@ initial_setup (j_compress_ptr cinfo)
|
|||||||
case 5: cinfo->natural_order = jpeg_natural_order5; break;
|
case 5: cinfo->natural_order = jpeg_natural_order5; break;
|
||||||
case 6: cinfo->natural_order = jpeg_natural_order6; break;
|
case 6: cinfo->natural_order = jpeg_natural_order6; break;
|
||||||
case 7: cinfo->natural_order = jpeg_natural_order7; break;
|
case 7: cinfo->natural_order = jpeg_natural_order7; break;
|
||||||
default: cinfo->natural_order = jpeg_natural_order; break;
|
default: cinfo->natural_order = jpeg_natural_order;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Derive lim_Se from block_size */
|
/* Derive lim_Se from block_size */
|
||||||
@@ -114,20 +114,24 @@ initial_setup (j_compress_ptr cinfo)
|
|||||||
*/
|
*/
|
||||||
ssize = 1;
|
ssize = 1;
|
||||||
#ifdef DCT_SCALING_SUPPORTED
|
#ifdef DCT_SCALING_SUPPORTED
|
||||||
while (cinfo->min_DCT_h_scaled_size * ssize <=
|
if (! cinfo->raw_data_in)
|
||||||
(cinfo->do_fancy_downsampling ? DCTSIZE : DCTSIZE / 2) &&
|
while (cinfo->min_DCT_h_scaled_size * ssize <=
|
||||||
(cinfo->max_h_samp_factor % (compptr->h_samp_factor * ssize * 2)) == 0) {
|
(cinfo->do_fancy_downsampling ? DCTSIZE : DCTSIZE / 2) &&
|
||||||
ssize = ssize * 2;
|
(cinfo->max_h_samp_factor % (compptr->h_samp_factor * ssize * 2)) ==
|
||||||
}
|
0) {
|
||||||
|
ssize = ssize * 2;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
compptr->DCT_h_scaled_size = cinfo->min_DCT_h_scaled_size * ssize;
|
compptr->DCT_h_scaled_size = cinfo->min_DCT_h_scaled_size * ssize;
|
||||||
ssize = 1;
|
ssize = 1;
|
||||||
#ifdef DCT_SCALING_SUPPORTED
|
#ifdef DCT_SCALING_SUPPORTED
|
||||||
while (cinfo->min_DCT_v_scaled_size * ssize <=
|
if (! cinfo->raw_data_in)
|
||||||
(cinfo->do_fancy_downsampling ? DCTSIZE : DCTSIZE / 2) &&
|
while (cinfo->min_DCT_v_scaled_size * ssize <=
|
||||||
(cinfo->max_v_samp_factor % (compptr->v_samp_factor * ssize * 2)) == 0) {
|
(cinfo->do_fancy_downsampling ? DCTSIZE : DCTSIZE / 2) &&
|
||||||
ssize = ssize * 2;
|
(cinfo->max_v_samp_factor % (compptr->v_samp_factor * ssize * 2)) ==
|
||||||
}
|
0) {
|
||||||
|
ssize = ssize * 2;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
compptr->DCT_v_scaled_size = cinfo->min_DCT_v_scaled_size * ssize;
|
compptr->DCT_v_scaled_size = cinfo->min_DCT_v_scaled_size * ssize;
|
||||||
|
|
||||||
@@ -620,9 +624,8 @@ jinit_c_master_control (j_compress_ptr cinfo, boolean transcode_only)
|
|||||||
{
|
{
|
||||||
my_master_ptr master;
|
my_master_ptr master;
|
||||||
|
|
||||||
master = (my_master_ptr)
|
master = (my_master_ptr) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(my_comp_master));
|
||||||
SIZEOF(my_comp_master));
|
|
||||||
cinfo->master = &master->pub;
|
cinfo->master = &master->pub;
|
||||||
master->pub.prepare_for_pass = prepare_for_pass;
|
master->pub.prepare_for_pass = prepare_for_pass;
|
||||||
master->pub.pass_startup = pass_startup;
|
master->pub.pass_startup = pass_startup;
|
||||||
|
|||||||
Vendored
+138
@@ -2,6 +2,7 @@
|
|||||||
* jcomapi.c
|
* jcomapi.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1994-1997, Thomas G. Lane.
|
* Copyright (C) 1994-1997, Thomas G. Lane.
|
||||||
|
* Modified 2019 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@@ -104,3 +105,140 @@ jpeg_alloc_huff_table (j_common_ptr cinfo)
|
|||||||
tbl->sent_table = FALSE; /* make sure this is false in any new table */
|
tbl->sent_table = FALSE; /* make sure this is false in any new table */
|
||||||
return tbl;
|
return tbl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set up the standard Huffman tables (cf. JPEG standard section K.3).
|
||||||
|
* IMPORTANT: these are only valid for 8-bit data precision!
|
||||||
|
* (Would jutils.c be a more reasonable place to put this?)
|
||||||
|
*/
|
||||||
|
|
||||||
|
GLOBAL(JHUFF_TBL *)
|
||||||
|
jpeg_std_huff_table (j_common_ptr cinfo, boolean isDC, int tblno)
|
||||||
|
{
|
||||||
|
JHUFF_TBL **htblptr, *htbl;
|
||||||
|
const UINT8 *bits, *val;
|
||||||
|
int nsymbols, len;
|
||||||
|
|
||||||
|
static const UINT8 bits_dc_luminance[17] =
|
||||||
|
{ /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 };
|
||||||
|
static const UINT8 val_dc_luminance[] =
|
||||||
|
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
|
||||||
|
|
||||||
|
static const UINT8 bits_dc_chrominance[17] =
|
||||||
|
{ /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 };
|
||||||
|
static const UINT8 val_dc_chrominance[] =
|
||||||
|
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
|
||||||
|
|
||||||
|
static const UINT8 bits_ac_luminance[17] =
|
||||||
|
{ /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d };
|
||||||
|
static const UINT8 val_ac_luminance[] =
|
||||||
|
{ 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
|
||||||
|
0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
|
||||||
|
0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
|
||||||
|
0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
|
||||||
|
0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
|
||||||
|
0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
|
||||||
|
0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
|
||||||
|
0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
|
||||||
|
0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
|
||||||
|
0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
|
||||||
|
0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
|
||||||
|
0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
|
||||||
|
0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
|
||||||
|
0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
|
||||||
|
0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
|
||||||
|
0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
|
||||||
|
0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
|
||||||
|
0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
|
||||||
|
0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
|
||||||
|
0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
|
||||||
|
0xf9, 0xfa };
|
||||||
|
|
||||||
|
static const UINT8 bits_ac_chrominance[17] =
|
||||||
|
{ /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 };
|
||||||
|
static const UINT8 val_ac_chrominance[] =
|
||||||
|
{ 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
|
||||||
|
0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
|
||||||
|
0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
|
||||||
|
0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
|
||||||
|
0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
|
||||||
|
0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
|
||||||
|
0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
|
||||||
|
0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
|
||||||
|
0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
|
||||||
|
0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
|
||||||
|
0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
|
||||||
|
0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
|
||||||
|
0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
|
||||||
|
0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
|
||||||
|
0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
|
||||||
|
0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
|
||||||
|
0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
|
||||||
|
0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
|
||||||
|
0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
|
||||||
|
0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
|
||||||
|
0xf9, 0xfa };
|
||||||
|
|
||||||
|
if (cinfo->is_decompressor) {
|
||||||
|
if (isDC)
|
||||||
|
htblptr = ((j_decompress_ptr) cinfo)->dc_huff_tbl_ptrs;
|
||||||
|
else
|
||||||
|
htblptr = ((j_decompress_ptr) cinfo)->ac_huff_tbl_ptrs;
|
||||||
|
} else {
|
||||||
|
if (isDC)
|
||||||
|
htblptr = ((j_compress_ptr) cinfo)->dc_huff_tbl_ptrs;
|
||||||
|
else
|
||||||
|
htblptr = ((j_compress_ptr) cinfo)->ac_huff_tbl_ptrs;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (tblno) {
|
||||||
|
case 0:
|
||||||
|
if (isDC) {
|
||||||
|
bits = bits_dc_luminance;
|
||||||
|
val = val_dc_luminance;
|
||||||
|
} else {
|
||||||
|
bits = bits_ac_luminance;
|
||||||
|
val = val_ac_luminance;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
if (isDC) {
|
||||||
|
bits = bits_dc_chrominance;
|
||||||
|
val = val_dc_chrominance;
|
||||||
|
} else {
|
||||||
|
bits = bits_ac_chrominance;
|
||||||
|
val = val_ac_chrominance;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);
|
||||||
|
return NULL; /* avoid compiler warnings for uninitialized variables */
|
||||||
|
}
|
||||||
|
|
||||||
|
if (htblptr[tblno] == NULL)
|
||||||
|
htblptr[tblno] = jpeg_alloc_huff_table(cinfo);
|
||||||
|
|
||||||
|
htbl = htblptr[tblno];
|
||||||
|
|
||||||
|
/* Copy the number-of-symbols-of-each-code-length counts */
|
||||||
|
MEMCOPY(htbl->bits, bits, SIZEOF(htbl->bits));
|
||||||
|
|
||||||
|
/* 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
|
||||||
|
* the end of memory. jxhuff.c will do a more thorough test later.
|
||||||
|
*/
|
||||||
|
nsymbols = 0;
|
||||||
|
for (len = 1; len <= 16; len++)
|
||||||
|
nsymbols += bits[len];
|
||||||
|
if (nsymbols > 256)
|
||||||
|
ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
|
||||||
|
|
||||||
|
if (nsymbols > 0)
|
||||||
|
MEMCOPY(htbl->huffval, val, nsymbols * SIZEOF(UINT8));
|
||||||
|
|
||||||
|
/* Initialize sent_table FALSE so table will be written to JPEG file. */
|
||||||
|
htbl->sent_table = FALSE;
|
||||||
|
|
||||||
|
return htbl;
|
||||||
|
}
|
||||||
|
|||||||
Vendored
+14
-103
@@ -2,7 +2,7 @@
|
|||||||
* jcparam.c
|
* jcparam.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1998, Thomas G. Lane.
|
* Copyright (C) 1991-1998, Thomas G. Lane.
|
||||||
* Modified 2003-2013 by Guido Vollbeding.
|
* Modified 2003-2019 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@@ -162,112 +162,23 @@ jpeg_set_quality (j_compress_ptr cinfo, int quality, boolean force_baseline)
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Huffman table setup routines
|
* Reset standard Huffman tables
|
||||||
*/
|
*/
|
||||||
|
|
||||||
LOCAL(void)
|
|
||||||
add_huff_table (j_compress_ptr cinfo,
|
|
||||||
JHUFF_TBL **htblptr, const UINT8 *bits, const UINT8 *val)
|
|
||||||
/* Define a Huffman table */
|
|
||||||
{
|
|
||||||
int nsymbols, len;
|
|
||||||
|
|
||||||
if (*htblptr == NULL)
|
|
||||||
*htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);
|
|
||||||
|
|
||||||
/* Copy the number-of-symbols-of-each-code-length counts */
|
|
||||||
MEMCOPY((*htblptr)->bits, bits, SIZEOF((*htblptr)->bits));
|
|
||||||
|
|
||||||
/* 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
|
|
||||||
* the end of memory. jchuff.c will do a more thorough test later.
|
|
||||||
*/
|
|
||||||
nsymbols = 0;
|
|
||||||
for (len = 1; len <= 16; len++)
|
|
||||||
nsymbols += bits[len];
|
|
||||||
if (nsymbols < 1 || nsymbols > 256)
|
|
||||||
ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
|
|
||||||
|
|
||||||
MEMCOPY((*htblptr)->huffval, val, nsymbols * SIZEOF(UINT8));
|
|
||||||
|
|
||||||
/* Initialize sent_table FALSE so table will be written to JPEG file. */
|
|
||||||
(*htblptr)->sent_table = FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
LOCAL(void)
|
LOCAL(void)
|
||||||
std_huff_tables (j_compress_ptr cinfo)
|
std_huff_tables (j_compress_ptr cinfo)
|
||||||
/* Set up the standard Huffman tables (cf. JPEG standard section K.3) */
|
|
||||||
/* IMPORTANT: these are only valid for 8-bit data precision! */
|
|
||||||
{
|
{
|
||||||
static const UINT8 bits_dc_luminance[17] =
|
if (cinfo->dc_huff_tbl_ptrs[0] != NULL)
|
||||||
{ /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 };
|
(void) jpeg_std_huff_table((j_common_ptr) cinfo, TRUE, 0);
|
||||||
static const UINT8 val_dc_luminance[] =
|
|
||||||
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
|
if (cinfo->ac_huff_tbl_ptrs[0] != NULL)
|
||||||
|
(void) jpeg_std_huff_table((j_common_ptr) cinfo, FALSE, 0);
|
||||||
static const UINT8 bits_dc_chrominance[17] =
|
|
||||||
{ /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 };
|
if (cinfo->dc_huff_tbl_ptrs[1] != NULL)
|
||||||
static const UINT8 val_dc_chrominance[] =
|
(void) jpeg_std_huff_table((j_common_ptr) cinfo, TRUE, 1);
|
||||||
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
|
|
||||||
|
if (cinfo->ac_huff_tbl_ptrs[1] != NULL)
|
||||||
static const UINT8 bits_ac_luminance[17] =
|
(void) jpeg_std_huff_table((j_common_ptr) cinfo, FALSE, 1);
|
||||||
{ /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d };
|
|
||||||
static const UINT8 val_ac_luminance[] =
|
|
||||||
{ 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
|
|
||||||
0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
|
|
||||||
0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
|
|
||||||
0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
|
|
||||||
0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
|
|
||||||
0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
|
|
||||||
0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
|
|
||||||
0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
|
|
||||||
0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
|
|
||||||
0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
|
|
||||||
0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
|
|
||||||
0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
|
|
||||||
0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
|
|
||||||
0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
|
|
||||||
0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
|
|
||||||
0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
|
|
||||||
0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
|
|
||||||
0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
|
|
||||||
0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
|
|
||||||
0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
|
|
||||||
0xf9, 0xfa };
|
|
||||||
|
|
||||||
static const UINT8 bits_ac_chrominance[17] =
|
|
||||||
{ /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 };
|
|
||||||
static const UINT8 val_ac_chrominance[] =
|
|
||||||
{ 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
|
|
||||||
0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
|
|
||||||
0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
|
|
||||||
0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
|
|
||||||
0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
|
|
||||||
0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
|
|
||||||
0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
|
|
||||||
0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
|
|
||||||
0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
|
|
||||||
0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
|
|
||||||
0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
|
|
||||||
0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
|
|
||||||
0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
|
|
||||||
0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
|
|
||||||
0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
|
|
||||||
0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
|
|
||||||
0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
|
|
||||||
0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
|
|
||||||
0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
|
|
||||||
0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
|
|
||||||
0xf9, 0xfa };
|
|
||||||
|
|
||||||
add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[0],
|
|
||||||
bits_dc_luminance, val_dc_luminance);
|
|
||||||
add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[0],
|
|
||||||
bits_ac_luminance, val_ac_luminance);
|
|
||||||
add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[1],
|
|
||||||
bits_dc_chrominance, val_dc_chrominance);
|
|
||||||
add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[1],
|
|
||||||
bits_ac_chrominance, val_ac_chrominance);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -306,7 +217,7 @@ jpeg_set_defaults (j_compress_ptr cinfo)
|
|||||||
cinfo->data_precision = BITS_IN_JSAMPLE;
|
cinfo->data_precision = BITS_IN_JSAMPLE;
|
||||||
/* Set up two quantization tables using default quality of 75 */
|
/* Set up two quantization tables using default quality of 75 */
|
||||||
jpeg_set_quality(cinfo, 75, TRUE);
|
jpeg_set_quality(cinfo, 75, TRUE);
|
||||||
/* Set up two Huffman tables */
|
/* Reset standard Huffman tables */
|
||||||
std_huff_tables(cinfo);
|
std_huff_tables(cinfo);
|
||||||
|
|
||||||
/* Initialize default arithmetic coding conditioning */
|
/* Initialize default arithmetic coding conditioning */
|
||||||
|
|||||||
Vendored
+14
-14
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* jdarith.c
|
* jdarith.c
|
||||||
*
|
*
|
||||||
* Developed 1997-2015 by Guido Vollbeding.
|
* Developed 1997-2019 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@@ -280,7 +280,7 @@ decode_mcu_DC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
if ((m = arith_decode(cinfo, st)) != 0) {
|
if ((m = arith_decode(cinfo, st)) != 0) {
|
||||||
st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */
|
st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */
|
||||||
while (arith_decode(cinfo, st)) {
|
while (arith_decode(cinfo, st)) {
|
||||||
if ((m <<= 1) == 0x8000) {
|
if ((m <<= 1) == (int) 0x8000U) {
|
||||||
WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
|
WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
|
||||||
entropy->ct = -1; /* magnitude overflow */
|
entropy->ct = -1; /* magnitude overflow */
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@@ -370,7 +370,7 @@ decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
st = entropy->ac_stats[tbl] +
|
st = entropy->ac_stats[tbl] +
|
||||||
(k <= cinfo->arith_ac_K[tbl] ? 189 : 217);
|
(k <= cinfo->arith_ac_K[tbl] ? 189 : 217);
|
||||||
while (arith_decode(cinfo, st)) {
|
while (arith_decode(cinfo, st)) {
|
||||||
if ((m <<= 1) == 0x8000) {
|
if ((m <<= 1) == (int) 0x8000U) {
|
||||||
WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
|
WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
|
||||||
entropy->ct = -1; /* magnitude overflow */
|
entropy->ct = -1; /* magnitude overflow */
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@@ -404,7 +404,8 @@ decode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
{
|
{
|
||||||
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
||||||
unsigned char *st;
|
unsigned char *st;
|
||||||
int p1, blkn;
|
JCOEF p1;
|
||||||
|
int blkn;
|
||||||
|
|
||||||
/* Process restart marker if needed */
|
/* Process restart marker if needed */
|
||||||
if (cinfo->restart_interval) {
|
if (cinfo->restart_interval) {
|
||||||
@@ -440,7 +441,7 @@ decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
JCOEFPTR thiscoef;
|
JCOEFPTR thiscoef;
|
||||||
unsigned char *st;
|
unsigned char *st;
|
||||||
int tbl, k, kex;
|
int tbl, k, kex;
|
||||||
int p1, m1;
|
JCOEF p1, m1;
|
||||||
const int * natural_order;
|
const int * natural_order;
|
||||||
|
|
||||||
/* Process restart marker if needed */
|
/* Process restart marker if needed */
|
||||||
@@ -459,7 +460,7 @@ decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
tbl = cinfo->cur_comp_info[0]->ac_tbl_no;
|
tbl = cinfo->cur_comp_info[0]->ac_tbl_no;
|
||||||
|
|
||||||
p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */
|
p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */
|
||||||
m1 = (-1) << cinfo->Al; /* -1 in the bit position being coded */
|
m1 = -p1; /* -1 in the bit position being coded */
|
||||||
|
|
||||||
/* Establish EOBx (previous stage end-of-block) index */
|
/* Establish EOBx (previous stage end-of-block) index */
|
||||||
kex = cinfo->Se;
|
kex = cinfo->Se;
|
||||||
@@ -555,7 +556,7 @@ decode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
if ((m = arith_decode(cinfo, st)) != 0) {
|
if ((m = arith_decode(cinfo, st)) != 0) {
|
||||||
st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */
|
st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */
|
||||||
while (arith_decode(cinfo, st)) {
|
while (arith_decode(cinfo, st)) {
|
||||||
if ((m <<= 1) == 0x8000) {
|
if ((m <<= 1) == (int) 0x8000U) {
|
||||||
WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
|
WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
|
||||||
entropy->ct = -1; /* magnitude overflow */
|
entropy->ct = -1; /* magnitude overflow */
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@@ -612,7 +613,7 @@ decode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
st = entropy->ac_stats[tbl] +
|
st = entropy->ac_stats[tbl] +
|
||||||
(k <= cinfo->arith_ac_K[tbl] ? 189 : 217);
|
(k <= cinfo->arith_ac_K[tbl] ? 189 : 217);
|
||||||
while (arith_decode(cinfo, st)) {
|
while (arith_decode(cinfo, st)) {
|
||||||
if ((m <<= 1) == 0x8000) {
|
if ((m <<= 1) == (int) 0x8000U) {
|
||||||
WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
|
WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
|
||||||
entropy->ct = -1; /* magnitude overflow */
|
entropy->ct = -1; /* magnitude overflow */
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@@ -766,9 +767,8 @@ jinit_arith_decoder (j_decompress_ptr cinfo)
|
|||||||
arith_entropy_ptr entropy;
|
arith_entropy_ptr entropy;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
entropy = (arith_entropy_ptr)
|
entropy = (arith_entropy_ptr) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(arith_entropy_decoder));
|
||||||
SIZEOF(arith_entropy_decoder));
|
|
||||||
cinfo->entropy = &entropy->pub;
|
cinfo->entropy = &entropy->pub;
|
||||||
entropy->pub.start_pass = start_pass;
|
entropy->pub.start_pass = start_pass;
|
||||||
entropy->pub.finish_pass = finish_pass;
|
entropy->pub.finish_pass = finish_pass;
|
||||||
@@ -785,9 +785,9 @@ jinit_arith_decoder (j_decompress_ptr cinfo)
|
|||||||
if (cinfo->progressive_mode) {
|
if (cinfo->progressive_mode) {
|
||||||
/* Create progression status table */
|
/* Create progression status table */
|
||||||
int *coef_bit_ptr, ci;
|
int *coef_bit_ptr, ci;
|
||||||
cinfo->coef_bits = (int (*)[DCTSIZE2])
|
cinfo->coef_bits = (int (*)[DCTSIZE2]) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE,
|
||||||
cinfo->num_components*DCTSIZE2*SIZEOF(int));
|
cinfo->num_components * DCTSIZE2 * 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++)
|
||||||
for (i = 0; i < DCTSIZE2; i++)
|
for (i = 0; i < DCTSIZE2; i++)
|
||||||
|
|||||||
Vendored
+10
-13
@@ -2,7 +2,7 @@
|
|||||||
* jdatadst.c
|
* jdatadst.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1994-1996, Thomas G. Lane.
|
* Copyright (C) 1994-1996, Thomas G. Lane.
|
||||||
* Modified 2009-2017 by Guido Vollbeding.
|
* Modified 2009-2019 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@@ -46,7 +46,7 @@ typedef struct {
|
|||||||
struct jpeg_destination_mgr pub; /* public fields */
|
struct jpeg_destination_mgr pub; /* public fields */
|
||||||
|
|
||||||
unsigned char ** outbuffer; /* target buffer */
|
unsigned char ** outbuffer; /* target buffer */
|
||||||
unsigned long * outsize;
|
size_t * outsize;
|
||||||
unsigned char * newbuffer; /* newly allocated buffer */
|
unsigned char * newbuffer; /* newly allocated buffer */
|
||||||
JOCTET * buffer; /* start of buffer */
|
JOCTET * buffer; /* start of buffer */
|
||||||
size_t bufsize;
|
size_t bufsize;
|
||||||
@@ -66,9 +66,8 @@ init_destination (j_compress_ptr cinfo)
|
|||||||
my_dest_ptr dest = (my_dest_ptr) cinfo->dest;
|
my_dest_ptr dest = (my_dest_ptr) cinfo->dest;
|
||||||
|
|
||||||
/* Allocate the output buffer --- it will be released when done with image */
|
/* Allocate the output buffer --- it will be released when done with image */
|
||||||
dest->buffer = (JOCTET *)
|
dest->buffer = (JOCTET *) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, OUTPUT_BUF_SIZE * SIZEOF(JOCTET));
|
||||||
OUTPUT_BUF_SIZE * SIZEOF(JOCTET));
|
|
||||||
|
|
||||||
dest->pub.next_output_byte = dest->buffer;
|
dest->pub.next_output_byte = dest->buffer;
|
||||||
dest->pub.free_in_buffer = OUTPUT_BUF_SIZE;
|
dest->pub.free_in_buffer = OUTPUT_BUF_SIZE;
|
||||||
@@ -131,7 +130,7 @@ empty_mem_output_buffer (j_compress_ptr cinfo)
|
|||||||
nextbuffer = (JOCTET *) malloc(nextsize);
|
nextbuffer = (JOCTET *) malloc(nextsize);
|
||||||
|
|
||||||
if (nextbuffer == NULL)
|
if (nextbuffer == NULL)
|
||||||
ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 10);
|
ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 11);
|
||||||
|
|
||||||
MEMCOPY(nextbuffer, dest->buffer, dest->bufsize);
|
MEMCOPY(nextbuffer, dest->buffer, dest->bufsize);
|
||||||
|
|
||||||
@@ -204,9 +203,8 @@ jpeg_stdio_dest (j_compress_ptr cinfo, FILE * outfile)
|
|||||||
* sizes may be different. Caveat programmer.
|
* sizes may be different. Caveat programmer.
|
||||||
*/
|
*/
|
||||||
if (cinfo->dest == NULL) { /* first time for this JPEG object? */
|
if (cinfo->dest == NULL) { /* first time for this JPEG object? */
|
||||||
cinfo->dest = (struct jpeg_destination_mgr *)
|
cinfo->dest = (struct jpeg_destination_mgr *) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
|
((j_common_ptr) cinfo, JPOOL_PERMANENT, SIZEOF(my_destination_mgr));
|
||||||
SIZEOF(my_destination_mgr));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dest = (my_dest_ptr) cinfo->dest;
|
dest = (my_dest_ptr) cinfo->dest;
|
||||||
@@ -233,7 +231,7 @@ jpeg_stdio_dest (j_compress_ptr cinfo, FILE * outfile)
|
|||||||
|
|
||||||
GLOBAL(void)
|
GLOBAL(void)
|
||||||
jpeg_mem_dest (j_compress_ptr cinfo,
|
jpeg_mem_dest (j_compress_ptr cinfo,
|
||||||
unsigned char ** outbuffer, unsigned long * outsize)
|
unsigned char ** outbuffer, size_t * outsize)
|
||||||
{
|
{
|
||||||
my_mem_dest_ptr dest;
|
my_mem_dest_ptr dest;
|
||||||
|
|
||||||
@@ -244,9 +242,8 @@ jpeg_mem_dest (j_compress_ptr cinfo,
|
|||||||
* can be written to the same buffer without re-executing jpeg_mem_dest.
|
* can be written to the same buffer without re-executing jpeg_mem_dest.
|
||||||
*/
|
*/
|
||||||
if (cinfo->dest == NULL) { /* first time for this JPEG object? */
|
if (cinfo->dest == NULL) { /* first time for this JPEG object? */
|
||||||
cinfo->dest = (struct jpeg_destination_mgr *)
|
cinfo->dest = (struct jpeg_destination_mgr *) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
|
((j_common_ptr) cinfo, JPOOL_PERMANENT, SIZEOF(my_mem_destination_mgr));
|
||||||
SIZEOF(my_mem_destination_mgr));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dest = (my_mem_dest_ptr) cinfo->dest;
|
dest = (my_mem_dest_ptr) cinfo->dest;
|
||||||
|
|||||||
Vendored
+15
-16
@@ -2,7 +2,7 @@
|
|||||||
* jdatasrc.c
|
* jdatasrc.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1994-1996, Thomas G. Lane.
|
* Copyright (C) 1994-1996, Thomas G. Lane.
|
||||||
* Modified 2009-2015 by Guido Vollbeding.
|
* Modified 2009-2019 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@@ -156,21 +156,23 @@ METHODDEF(void)
|
|||||||
skip_input_data (j_decompress_ptr cinfo, long num_bytes)
|
skip_input_data (j_decompress_ptr cinfo, long num_bytes)
|
||||||
{
|
{
|
||||||
struct jpeg_source_mgr * src = cinfo->src;
|
struct jpeg_source_mgr * src = cinfo->src;
|
||||||
|
size_t nbytes;
|
||||||
|
|
||||||
/* Just a dumb implementation for now. Could use fseek() except
|
/* Just a dumb implementation for now. Could use fseek() except
|
||||||
* it doesn't work on pipes. Not clear that being smart is worth
|
* it doesn't work on pipes. Not clear that being smart is worth
|
||||||
* any trouble anyway --- large skips are infrequent.
|
* any trouble anyway --- large skips are infrequent.
|
||||||
*/
|
*/
|
||||||
if (num_bytes > 0) {
|
if (num_bytes > 0) {
|
||||||
while (num_bytes > (long) src->bytes_in_buffer) {
|
nbytes = (size_t) num_bytes;
|
||||||
num_bytes -= (long) src->bytes_in_buffer;
|
while (nbytes > src->bytes_in_buffer) {
|
||||||
|
nbytes -= src->bytes_in_buffer;
|
||||||
(void) (*src->fill_input_buffer) (cinfo);
|
(void) (*src->fill_input_buffer) (cinfo);
|
||||||
/* note we assume that fill_input_buffer will never return FALSE,
|
/* note we assume that fill_input_buffer will never return FALSE,
|
||||||
* so suspension need not be handled.
|
* so suspension need not be handled.
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
src->next_input_byte += (size_t) num_bytes;
|
src->next_input_byte += nbytes;
|
||||||
src->bytes_in_buffer -= (size_t) num_bytes;
|
src->bytes_in_buffer -= nbytes;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -219,13 +221,11 @@ jpeg_stdio_src (j_decompress_ptr cinfo, FILE * infile)
|
|||||||
* manager serially with the same JPEG object. Caveat programmer.
|
* manager serially with the same JPEG object. Caveat programmer.
|
||||||
*/
|
*/
|
||||||
if (cinfo->src == NULL) { /* first time for this JPEG object? */
|
if (cinfo->src == NULL) { /* first time for this JPEG object? */
|
||||||
cinfo->src = (struct jpeg_source_mgr *)
|
cinfo->src = (struct jpeg_source_mgr *) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
|
((j_common_ptr) cinfo, JPOOL_PERMANENT, SIZEOF(my_source_mgr));
|
||||||
SIZEOF(my_source_mgr));
|
|
||||||
src = (my_src_ptr) cinfo->src;
|
src = (my_src_ptr) cinfo->src;
|
||||||
src->buffer = (JOCTET *)
|
src->buffer = (JOCTET *) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
|
((j_common_ptr) cinfo, JPOOL_PERMANENT, INPUT_BUF_SIZE * SIZEOF(JOCTET));
|
||||||
INPUT_BUF_SIZE * SIZEOF(JOCTET));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
src = (my_src_ptr) cinfo->src;
|
src = (my_src_ptr) cinfo->src;
|
||||||
@@ -247,7 +247,7 @@ jpeg_stdio_src (j_decompress_ptr cinfo, FILE * infile)
|
|||||||
|
|
||||||
GLOBAL(void)
|
GLOBAL(void)
|
||||||
jpeg_mem_src (j_decompress_ptr cinfo,
|
jpeg_mem_src (j_decompress_ptr cinfo,
|
||||||
const unsigned char * inbuffer, unsigned long insize)
|
const unsigned char * inbuffer, size_t insize)
|
||||||
{
|
{
|
||||||
struct jpeg_source_mgr * src;
|
struct jpeg_source_mgr * src;
|
||||||
|
|
||||||
@@ -259,9 +259,8 @@ jpeg_mem_src (j_decompress_ptr cinfo,
|
|||||||
* the first one.
|
* the first one.
|
||||||
*/
|
*/
|
||||||
if (cinfo->src == NULL) { /* first time for this JPEG object? */
|
if (cinfo->src == NULL) { /* first time for this JPEG object? */
|
||||||
cinfo->src = (struct jpeg_source_mgr *)
|
cinfo->src = (struct jpeg_source_mgr *) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
|
((j_common_ptr) cinfo, JPOOL_PERMANENT, SIZEOF(struct jpeg_source_mgr));
|
||||||
SIZEOF(struct jpeg_source_mgr));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
src = cinfo->src;
|
src = cinfo->src;
|
||||||
@@ -270,6 +269,6 @@ jpeg_mem_src (j_decompress_ptr cinfo,
|
|||||||
src->skip_input_data = skip_input_data;
|
src->skip_input_data = skip_input_data;
|
||||||
src->resync_to_restart = jpeg_resync_to_restart; /* use default method */
|
src->resync_to_restart = jpeg_resync_to_restart; /* use default method */
|
||||||
src->term_source = term_source;
|
src->term_source = term_source;
|
||||||
src->bytes_in_buffer = (size_t) insize;
|
src->bytes_in_buffer = insize;
|
||||||
src->next_input_byte = (const JOCTET *) inbuffer;
|
src->next_input_byte = (const JOCTET *) inbuffer;
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+59
-71
@@ -2,7 +2,7 @@
|
|||||||
* jdcolor.c
|
* jdcolor.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1997, Thomas G. Lane.
|
* Copyright (C) 1991-1997, Thomas G. Lane.
|
||||||
* Modified 2011-2017 by Guido Vollbeding.
|
* Modified 2011-2019 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@@ -124,28 +124,22 @@ build_ycc_rgb_table (j_decompress_ptr cinfo)
|
|||||||
INT32 x;
|
INT32 x;
|
||||||
SHIFT_TEMPS
|
SHIFT_TEMPS
|
||||||
|
|
||||||
cconvert->Cr_r_tab = (int *)
|
cconvert->Cr_r_tab = (int *) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, (MAXJSAMPLE+1) * SIZEOF(int));
|
||||||
(MAXJSAMPLE+1) * SIZEOF(int));
|
cconvert->Cb_b_tab = (int *) (*cinfo->mem->alloc_small)
|
||||||
cconvert->Cb_b_tab = (int *)
|
((j_common_ptr) cinfo, JPOOL_IMAGE, (MAXJSAMPLE+1) * SIZEOF(int));
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
cconvert->Cr_g_tab = (INT32 *) (*cinfo->mem->alloc_small)
|
||||||
(MAXJSAMPLE+1) * SIZEOF(int));
|
((j_common_ptr) cinfo, JPOOL_IMAGE, (MAXJSAMPLE+1) * SIZEOF(INT32));
|
||||||
cconvert->Cr_g_tab = (INT32 *)
|
cconvert->Cb_g_tab = (INT32 *) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, (MAXJSAMPLE+1) * SIZEOF(INT32));
|
||||||
(MAXJSAMPLE+1) * SIZEOF(INT32));
|
|
||||||
cconvert->Cb_g_tab = (INT32 *)
|
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
|
||||||
(MAXJSAMPLE+1) * SIZEOF(INT32));
|
|
||||||
|
|
||||||
for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {
|
for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {
|
||||||
/* i is the actual input pixel value, in the range 0..MAXJSAMPLE */
|
/* i is the actual input pixel value, in the range 0..MAXJSAMPLE */
|
||||||
/* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */
|
/* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */
|
||||||
/* Cr=>R value is nearest int to 1.402 * x */
|
/* Cr=>R value is nearest int to 1.402 * x */
|
||||||
cconvert->Cr_r_tab[i] = (int)
|
cconvert->Cr_r_tab[i] = (int) DESCALE(FIX(1.402) * x, SCALEBITS);
|
||||||
RIGHT_SHIFT(FIX(1.402) * x + ONE_HALF, SCALEBITS);
|
|
||||||
/* Cb=>B value is nearest int to 1.772 * x */
|
/* Cb=>B value is nearest int to 1.772 * x */
|
||||||
cconvert->Cb_b_tab[i] = (int)
|
cconvert->Cb_b_tab[i] = (int) DESCALE(FIX(1.772) * x, SCALEBITS);
|
||||||
RIGHT_SHIFT(FIX(1.772) * x + ONE_HALF, SCALEBITS);
|
|
||||||
/* Cr=>G value is scaled-up -0.714136286 * x */
|
/* Cr=>G value is scaled-up -0.714136286 * x */
|
||||||
cconvert->Cr_g_tab[i] = (- FIX(0.714136286)) * x;
|
cconvert->Cr_g_tab[i] = (- FIX(0.714136286)) * x;
|
||||||
/* Cb=>G value is scaled-up -0.344136286 * x */
|
/* Cb=>G value is scaled-up -0.344136286 * x */
|
||||||
@@ -164,28 +158,22 @@ build_bg_ycc_rgb_table (j_decompress_ptr cinfo)
|
|||||||
INT32 x;
|
INT32 x;
|
||||||
SHIFT_TEMPS
|
SHIFT_TEMPS
|
||||||
|
|
||||||
cconvert->Cr_r_tab = (int *)
|
cconvert->Cr_r_tab = (int *) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, (MAXJSAMPLE+1) * SIZEOF(int));
|
||||||
(MAXJSAMPLE+1) * SIZEOF(int));
|
cconvert->Cb_b_tab = (int *) (*cinfo->mem->alloc_small)
|
||||||
cconvert->Cb_b_tab = (int *)
|
((j_common_ptr) cinfo, JPOOL_IMAGE, (MAXJSAMPLE+1) * SIZEOF(int));
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
cconvert->Cr_g_tab = (INT32 *) (*cinfo->mem->alloc_small)
|
||||||
(MAXJSAMPLE+1) * SIZEOF(int));
|
((j_common_ptr) cinfo, JPOOL_IMAGE, (MAXJSAMPLE+1) * SIZEOF(INT32));
|
||||||
cconvert->Cr_g_tab = (INT32 *)
|
cconvert->Cb_g_tab = (INT32 *) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, (MAXJSAMPLE+1) * SIZEOF(INT32));
|
||||||
(MAXJSAMPLE+1) * SIZEOF(INT32));
|
|
||||||
cconvert->Cb_g_tab = (INT32 *)
|
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
|
||||||
(MAXJSAMPLE+1) * SIZEOF(INT32));
|
|
||||||
|
|
||||||
for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {
|
for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {
|
||||||
/* i is the actual input pixel value, in the range 0..MAXJSAMPLE */
|
/* i is the actual input pixel value, in the range 0..MAXJSAMPLE */
|
||||||
/* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */
|
/* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */
|
||||||
/* Cr=>R value is nearest int to 2.804 * x */
|
/* Cr=>R value is nearest int to 2.804 * x */
|
||||||
cconvert->Cr_r_tab[i] = (int)
|
cconvert->Cr_r_tab[i] = (int) DESCALE(FIX(2.804) * x, SCALEBITS);
|
||||||
RIGHT_SHIFT(FIX(2.804) * x + ONE_HALF, SCALEBITS);
|
|
||||||
/* Cb=>B value is nearest int to 3.544 * x */
|
/* Cb=>B value is nearest int to 3.544 * x */
|
||||||
cconvert->Cb_b_tab[i] = (int)
|
cconvert->Cb_b_tab[i] = (int) DESCALE(FIX(3.544) * x, SCALEBITS);
|
||||||
RIGHT_SHIFT(FIX(3.544) * x + ONE_HALF, SCALEBITS);
|
|
||||||
/* Cr=>G value is scaled-up -1.428272572 * x */
|
/* Cr=>G value is scaled-up -1.428272572 * x */
|
||||||
cconvert->Cr_g_tab[i] = (- FIX(1.428272572)) * x;
|
cconvert->Cr_g_tab[i] = (- FIX(1.428272572)) * x;
|
||||||
/* Cb=>G value is scaled-up -0.688272572 * x */
|
/* Cb=>G value is scaled-up -0.688272572 * x */
|
||||||
@@ -201,6 +189,7 @@ build_bg_ycc_rgb_table (j_decompress_ptr cinfo)
|
|||||||
* Note that we change from noninterleaved, one-plane-per-component format
|
* Note that we change from noninterleaved, one-plane-per-component format
|
||||||
* to interleaved-pixel format. The output buffer is therefore three times
|
* to interleaved-pixel format. The output buffer is therefore three times
|
||||||
* as wide as the input buffer.
|
* as wide as the input buffer.
|
||||||
|
*
|
||||||
* A starting row offset is provided only for the input buffer. The caller
|
* A starting row offset is provided only for the input buffer. The caller
|
||||||
* can easily adjust the passed output_buf value to accommodate any row
|
* can easily adjust the passed output_buf value to accommodate any row
|
||||||
* offset required on that side.
|
* offset required on that side.
|
||||||
@@ -264,9 +253,8 @@ build_rgb_y_table (j_decompress_ptr cinfo)
|
|||||||
INT32 i;
|
INT32 i;
|
||||||
|
|
||||||
/* Allocate and fill in the conversion tables. */
|
/* Allocate and fill in the conversion tables. */
|
||||||
cconvert->rgb_y_tab = rgb_y_tab = (INT32 *)
|
cconvert->rgb_y_tab = rgb_y_tab = (INT32 *) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, TABLE_SIZE * SIZEOF(INT32));
|
||||||
(TABLE_SIZE * SIZEOF(INT32)));
|
|
||||||
|
|
||||||
for (i = 0; i <= MAXJSAMPLE; i++) {
|
for (i = 0; i <= MAXJSAMPLE; i++) {
|
||||||
rgb_y_tab[i+R_Y_OFF] = FIX(0.299) * i;
|
rgb_y_tab[i+R_Y_OFF] = FIX(0.299) * i;
|
||||||
@@ -286,8 +274,8 @@ rgb_gray_convert (j_decompress_ptr cinfo,
|
|||||||
JSAMPARRAY output_buf, int num_rows)
|
JSAMPARRAY output_buf, int num_rows)
|
||||||
{
|
{
|
||||||
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
|
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
|
||||||
register INT32 * ctab = cconvert->rgb_y_tab;
|
|
||||||
register int r, g, b;
|
register int r, g, b;
|
||||||
|
register INT32 * ctab = cconvert->rgb_y_tab;
|
||||||
register JSAMPROW outptr;
|
register JSAMPROW outptr;
|
||||||
register JSAMPROW inptr0, inptr1, inptr2;
|
register JSAMPROW inptr0, inptr1, inptr2;
|
||||||
register JDIMENSION col;
|
register JDIMENSION col;
|
||||||
@@ -313,6 +301,7 @@ rgb_gray_convert (j_decompress_ptr cinfo,
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
* Convert some rows of samples to the output colorspace.
|
||||||
* [R-G,G,B-G] to [R,G,B] conversion with modulo calculation
|
* [R-G,G,B-G] to [R,G,B] conversion with modulo calculation
|
||||||
* (inverse color transform).
|
* (inverse color transform).
|
||||||
* This can be seen as an adaption of the general YCbCr->RGB
|
* This can be seen as an adaption of the general YCbCr->RGB
|
||||||
@@ -364,8 +353,8 @@ rgb1_gray_convert (j_decompress_ptr cinfo,
|
|||||||
JSAMPARRAY output_buf, int num_rows)
|
JSAMPARRAY output_buf, int num_rows)
|
||||||
{
|
{
|
||||||
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
|
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
|
||||||
register INT32 * ctab = cconvert->rgb_y_tab;
|
|
||||||
register int r, g, b;
|
register int r, g, b;
|
||||||
|
register INT32 * ctab = cconvert->rgb_y_tab;
|
||||||
register JSAMPROW outptr;
|
register JSAMPROW outptr;
|
||||||
register JSAMPROW inptr0, inptr1, inptr2;
|
register JSAMPROW inptr0, inptr1, inptr2;
|
||||||
register JDIMENSION col;
|
register JDIMENSION col;
|
||||||
@@ -396,6 +385,7 @@ rgb1_gray_convert (j_decompress_ptr cinfo,
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
* Convert some rows of samples to the output colorspace.
|
||||||
* No colorspace change, but conversion from separate-planes
|
* No colorspace change, but conversion from separate-planes
|
||||||
* to interleaved representation.
|
* to interleaved representation.
|
||||||
*/
|
*/
|
||||||
@@ -430,6 +420,7 @@ rgb_convert (j_decompress_ptr cinfo,
|
|||||||
/*
|
/*
|
||||||
* Color conversion for no colorspace change: just copy the data,
|
* Color conversion for no colorspace change: just copy the data,
|
||||||
* converting from separate-planes to interleaved representation.
|
* converting from separate-planes to interleaved representation.
|
||||||
|
* We assume out_color_components == num_components.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
METHODDEF(void)
|
METHODDEF(void)
|
||||||
@@ -437,20 +428,21 @@ null_convert (j_decompress_ptr cinfo,
|
|||||||
JSAMPIMAGE input_buf, JDIMENSION input_row,
|
JSAMPIMAGE input_buf, JDIMENSION input_row,
|
||||||
JSAMPARRAY output_buf, int num_rows)
|
JSAMPARRAY output_buf, int num_rows)
|
||||||
{
|
{
|
||||||
int ci;
|
|
||||||
register int nc = cinfo->num_components;
|
|
||||||
register JSAMPROW outptr;
|
register JSAMPROW outptr;
|
||||||
register JSAMPROW inptr;
|
register JSAMPROW inptr;
|
||||||
register JDIMENSION col;
|
register JDIMENSION count;
|
||||||
|
register int num_comps = cinfo->num_components;
|
||||||
JDIMENSION num_cols = cinfo->output_width;
|
JDIMENSION num_cols = cinfo->output_width;
|
||||||
|
int ci;
|
||||||
|
|
||||||
while (--num_rows >= 0) {
|
while (--num_rows >= 0) {
|
||||||
for (ci = 0; ci < nc; ci++) {
|
/* It seems fastest to make a separate pass for each component. */
|
||||||
|
for (ci = 0; ci < num_comps; ci++) {
|
||||||
inptr = input_buf[ci][input_row];
|
inptr = input_buf[ci][input_row];
|
||||||
outptr = output_buf[0] + ci;
|
outptr = output_buf[0] + ci;
|
||||||
for (col = 0; col < num_cols; col++) {
|
for (count = num_cols; count > 0; count--) {
|
||||||
*outptr = *inptr++; /* needn't bother with GETJSAMPLE() here */
|
*outptr = *inptr++; /* don't need GETJSAMPLE() here */
|
||||||
outptr += nc;
|
outptr += num_comps;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
input_row++;
|
input_row++;
|
||||||
@@ -504,9 +496,10 @@ gray_rgb_convert (j_decompress_ptr cinfo,
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Adobe-style YCCK->CMYK conversion.
|
* Convert some rows of samples to the output colorspace.
|
||||||
* We convert YCbCr to R=1-C, G=1-M, and B=1-Y using the same
|
* This version handles Adobe-style YCCK->CMYK conversion,
|
||||||
* conversion as above, while passing K (black) unchanged.
|
* where we convert YCbCr to R=1-C, G=1-M, and B=1-Y using the
|
||||||
|
* same conversion as above, while passing K (black) unchanged.
|
||||||
* We assume build_ycc_rgb_table has been called.
|
* We assume build_ycc_rgb_table has been called.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -577,9 +570,8 @@ jinit_color_deconverter (j_decompress_ptr cinfo)
|
|||||||
my_cconvert_ptr cconvert;
|
my_cconvert_ptr cconvert;
|
||||||
int ci;
|
int ci;
|
||||||
|
|
||||||
cconvert = (my_cconvert_ptr)
|
cconvert = (my_cconvert_ptr) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(my_color_deconverter));
|
||||||
SIZEOF(my_color_deconverter));
|
|
||||||
cinfo->cconvert = &cconvert->pub;
|
cinfo->cconvert = &cconvert->pub;
|
||||||
cconvert->pub.start_pass = start_pass_dcolor;
|
cconvert->pub.start_pass = start_pass_dcolor;
|
||||||
|
|
||||||
@@ -607,7 +599,6 @@ jinit_color_deconverter (j_decompress_ptr cinfo)
|
|||||||
default: /* JCS_UNKNOWN can be anything */
|
default: /* JCS_UNKNOWN can be anything */
|
||||||
if (cinfo->num_components < 1)
|
if (cinfo->num_components < 1)
|
||||||
ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
|
ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Support color transform only for RGB colorspaces */
|
/* Support color transform only for RGB colorspaces */
|
||||||
@@ -684,19 +675,18 @@ jinit_color_deconverter (j_decompress_ptr cinfo)
|
|||||||
|
|
||||||
case JCS_BG_RGB:
|
case JCS_BG_RGB:
|
||||||
cinfo->out_color_components = RGB_PIXELSIZE;
|
cinfo->out_color_components = RGB_PIXELSIZE;
|
||||||
if (cinfo->jpeg_color_space == JCS_BG_RGB) {
|
if (cinfo->jpeg_color_space != JCS_BG_RGB)
|
||||||
switch (cinfo->color_transform) {
|
|
||||||
case JCT_NONE:
|
|
||||||
cconvert->pub.color_convert = rgb_convert;
|
|
||||||
break;
|
|
||||||
case JCT_SUBTRACT_GREEN:
|
|
||||||
cconvert->pub.color_convert = rgb1_rgb_convert;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
||||||
|
switch (cinfo->color_transform) {
|
||||||
|
case JCT_NONE:
|
||||||
|
cconvert->pub.color_convert = rgb_convert;
|
||||||
|
break;
|
||||||
|
case JCT_SUBTRACT_GREEN:
|
||||||
|
cconvert->pub.color_convert = rgb1_rgb_convert;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case JCS_CMYK:
|
case JCS_CMYK:
|
||||||
@@ -714,14 +704,12 @@ jinit_color_deconverter (j_decompress_ptr cinfo)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default: /* permit null conversion to same output space */
|
||||||
/* Permit null conversion to same output space */
|
if (cinfo->out_color_space != cinfo->jpeg_color_space)
|
||||||
if (cinfo->out_color_space == cinfo->jpeg_color_space) {
|
/* unsupported non-null conversion */
|
||||||
cinfo->out_color_components = cinfo->num_components;
|
|
||||||
cconvert->pub.color_convert = null_convert;
|
|
||||||
} else /* unsupported non-null conversion */
|
|
||||||
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
||||||
break;
|
cinfo->out_color_components = cinfo->num_components;
|
||||||
|
cconvert->pub.color_convert = null_convert;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cinfo->quantize_colors)
|
if (cinfo->quantize_colors)
|
||||||
|
|||||||
Vendored
+1
-8
@@ -2,7 +2,7 @@
|
|||||||
* jdct.h
|
* jdct.h
|
||||||
*
|
*
|
||||||
* Copyright (C) 1994-1996, Thomas G. Lane.
|
* Copyright (C) 1994-1996, Thomas G. Lane.
|
||||||
* Modified 2002-2017 by Guido Vollbeding.
|
* Modified 2002-2019 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@@ -358,13 +358,6 @@ EXTERN(void) jpeg_idct_1x2
|
|||||||
|
|
||||||
#define FIX(x) ((INT32) ((x) * CONST_SCALE + 0.5))
|
#define FIX(x) ((INT32) ((x) * CONST_SCALE + 0.5))
|
||||||
|
|
||||||
/* Descale and correctly round an INT32 value that's scaled by N bits.
|
|
||||||
* We assume RIGHT_SHIFT rounds towards minus infinity, so adding
|
|
||||||
* the fudge factor is correct for either sign of X.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define DESCALE(x,n) RIGHT_SHIFT((x) + (ONE << ((n)-1)), n)
|
|
||||||
|
|
||||||
/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result.
|
/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result.
|
||||||
* This macro is used only when the two inputs will actually be no more than
|
* This macro is used only when the two inputs will actually be no more than
|
||||||
* 16 bits wide, so that a 16x16->32 bit multiply can be used instead of a
|
* 16 bits wide, so that a 16x16->32 bit multiply can be used instead of a
|
||||||
|
|||||||
Vendored
+56
-50
@@ -2,7 +2,7 @@
|
|||||||
* jdhuff.c
|
* jdhuff.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1997, Thomas G. Lane.
|
* Copyright (C) 1991-1997, Thomas G. Lane.
|
||||||
* Modified 2006-2016 by Guido Vollbeding.
|
* Modified 2006-2019 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@@ -341,13 +341,12 @@ jpeg_make_d_derived_tbl (j_decompress_ptr cinfo, boolean isDC, int tblno,
|
|||||||
htbl =
|
htbl =
|
||||||
isDC ? cinfo->dc_huff_tbl_ptrs[tblno] : cinfo->ac_huff_tbl_ptrs[tblno];
|
isDC ? cinfo->dc_huff_tbl_ptrs[tblno] : cinfo->ac_huff_tbl_ptrs[tblno];
|
||||||
if (htbl == NULL)
|
if (htbl == NULL)
|
||||||
ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);
|
htbl = jpeg_std_huff_table((j_common_ptr) cinfo, isDC, tblno);
|
||||||
|
|
||||||
/* Allocate a workspace if we haven't already done so. */
|
/* Allocate a workspace if we haven't already done so. */
|
||||||
if (*pdtbl == NULL)
|
if (*pdtbl == NULL)
|
||||||
*pdtbl = (d_derived_tbl *)
|
*pdtbl = (d_derived_tbl *) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(d_derived_tbl));
|
||||||
SIZEOF(d_derived_tbl));
|
|
||||||
dtbl = *pdtbl;
|
dtbl = *pdtbl;
|
||||||
dtbl->pub = htbl; /* fill in back link */
|
dtbl->pub = htbl; /* fill in back link */
|
||||||
|
|
||||||
@@ -706,7 +705,7 @@ process_restart (j_decompress_ptr cinfo)
|
|||||||
|
|
||||||
METHODDEF(boolean)
|
METHODDEF(boolean)
|
||||||
decode_mcu_DC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
decode_mcu_DC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
{
|
{
|
||||||
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
||||||
int Al = cinfo->Al;
|
int Al = cinfo->Al;
|
||||||
register int s, r;
|
register int s, r;
|
||||||
@@ -730,7 +729,7 @@ decode_mcu_DC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
if (! entropy->insufficient_data) {
|
if (! entropy->insufficient_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);
|
ASSIGN_STATE(state, entropy->saved);
|
||||||
|
|
||||||
/* Outer loop handles each block in the MCU */
|
/* Outer loop handles each block in the MCU */
|
||||||
@@ -759,12 +758,13 @@ 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);
|
ASSIGN_STATE(entropy->saved, state);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Account for restart interval (no-op if not using restarts) */
|
/* Account for restart interval if using restarts */
|
||||||
entropy->restarts_to_go--;
|
if (cinfo->restart_interval)
|
||||||
|
entropy->restarts_to_go--;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@@ -777,7 +777,7 @@ decode_mcu_DC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
|
|
||||||
METHODDEF(boolean)
|
METHODDEF(boolean)
|
||||||
decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
{
|
{
|
||||||
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
||||||
register int s, k, r;
|
register int s, k, r;
|
||||||
unsigned int EOBRUN;
|
unsigned int EOBRUN;
|
||||||
@@ -809,7 +809,7 @@ decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
if (EOBRUN) /* if it's a band of zeroes... */
|
if (EOBRUN) /* if it's a band of zeroes... */
|
||||||
EOBRUN--; /* ...process it now (we do nothing) */
|
EOBRUN--; /* ...process it now (we do nothing) */
|
||||||
else {
|
else {
|
||||||
BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
|
BITREAD_LOAD_STATE(cinfo, entropy->bitstate);
|
||||||
Se = cinfo->Se;
|
Se = cinfo->Se;
|
||||||
Al = cinfo->Al;
|
Al = cinfo->Al;
|
||||||
natural_order = cinfo->natural_order;
|
natural_order = cinfo->natural_order;
|
||||||
@@ -842,15 +842,16 @@ decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
BITREAD_SAVE_STATE(cinfo,entropy->bitstate);
|
BITREAD_SAVE_STATE(cinfo, entropy->bitstate);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Completed MCU, so update state */
|
/* Completed MCU, so update state */
|
||||||
entropy->saved.EOBRUN = EOBRUN; /* only part of saved state we need */
|
entropy->saved.EOBRUN = EOBRUN; /* only part of saved state we need */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Account for restart interval (no-op if not using restarts) */
|
/* Account for restart interval if using restarts */
|
||||||
entropy->restarts_to_go--;
|
if (cinfo->restart_interval)
|
||||||
|
entropy->restarts_to_go--;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@@ -864,9 +865,10 @@ decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
|
|
||||||
METHODDEF(boolean)
|
METHODDEF(boolean)
|
||||||
decode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
decode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
{
|
{
|
||||||
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
||||||
int p1, blkn;
|
JCOEF p1;
|
||||||
|
int blkn;
|
||||||
BITREAD_STATE_VARS;
|
BITREAD_STATE_VARS;
|
||||||
|
|
||||||
/* Process restart marker if needed; may have to suspend */
|
/* Process restart marker if needed; may have to suspend */
|
||||||
@@ -881,7 +883,7 @@ decode_mcu_DC_refine (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);
|
||||||
|
|
||||||
p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */
|
p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */
|
||||||
|
|
||||||
@@ -896,10 +898,11 @@ decode_mcu_DC_refine (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);
|
||||||
|
|
||||||
/* Account for restart interval (no-op if not using restarts) */
|
/* Account for restart interval if using restarts */
|
||||||
entropy->restarts_to_go--;
|
if (cinfo->restart_interval)
|
||||||
|
entropy->restarts_to_go--;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@@ -911,11 +914,12 @@ decode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
|
|
||||||
METHODDEF(boolean)
|
METHODDEF(boolean)
|
||||||
decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
||||||
{
|
{
|
||||||
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
|
||||||
register int s, k, r;
|
register int s, k, r;
|
||||||
unsigned int EOBRUN;
|
unsigned int EOBRUN;
|
||||||
int Se, p1, m1;
|
int Se;
|
||||||
|
JCOEF p1, m1;
|
||||||
const int * natural_order;
|
const int * natural_order;
|
||||||
JBLOCKROW block;
|
JBLOCKROW block;
|
||||||
JCOEFPTR thiscoef;
|
JCOEFPTR thiscoef;
|
||||||
@@ -937,11 +941,11 @@ decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
|
|
||||||
Se = cinfo->Se;
|
Se = cinfo->Se;
|
||||||
p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */
|
p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */
|
||||||
m1 = (-1) << cinfo->Al; /* -1 in the bit position being coded */
|
m1 = -p1; /* -1 in the bit position being coded */
|
||||||
natural_order = cinfo->natural_order;
|
natural_order = cinfo->natural_order;
|
||||||
|
|
||||||
/* Load up working state */
|
/* Load up working state */
|
||||||
BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
|
BITREAD_LOAD_STATE(cinfo, entropy->bitstate);
|
||||||
EOBRUN = entropy->saved.EOBRUN; /* only part of saved state we need */
|
EOBRUN = entropy->saved.EOBRUN; /* only part of saved state we need */
|
||||||
|
|
||||||
/* There is always only one block per MCU */
|
/* There is always only one block per MCU */
|
||||||
@@ -1043,12 +1047,13 @@ decode_mcu_AC_refine (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);
|
||||||
entropy->saved.EOBRUN = EOBRUN; /* only part of saved state we need */
|
entropy->saved.EOBRUN = EOBRUN; /* only part of saved state we need */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Account for restart interval (no-op if not using restarts) */
|
/* Account for restart interval if using restarts */
|
||||||
entropy->restarts_to_go--;
|
if (cinfo->restart_interval)
|
||||||
|
entropy->restarts_to_go--;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
@@ -1091,7 +1096,7 @@ decode_mcu_sub (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
Se = cinfo->lim_Se;
|
Se = cinfo->lim_Se;
|
||||||
|
|
||||||
/* 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);
|
ASSIGN_STATE(state, entropy->saved);
|
||||||
|
|
||||||
/* Outer loop handles each block in the MCU */
|
/* Outer loop handles each block in the MCU */
|
||||||
@@ -1178,12 +1183,13 @@ decode_mcu_sub (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);
|
ASSIGN_STATE(entropy->saved, state);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Account for restart interval (no-op if not using restarts) */
|
/* Account for restart interval if using restarts */
|
||||||
entropy->restarts_to_go--;
|
if (cinfo->restart_interval)
|
||||||
|
entropy->restarts_to_go--;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@@ -1215,7 +1221,7 @@ decode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
|
|||||||
if (! entropy->insufficient_data) {
|
if (! entropy->insufficient_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);
|
ASSIGN_STATE(state, entropy->saved);
|
||||||
|
|
||||||
/* Outer loop handles each block in the MCU */
|
/* Outer loop handles each block in the MCU */
|
||||||
@@ -1302,12 +1308,13 @@ decode_mcu (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);
|
ASSIGN_STATE(entropy->saved, state);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Account for restart interval (no-op if not using restarts) */
|
/* Account for restart interval if using restarts */
|
||||||
entropy->restarts_to_go--;
|
if (cinfo->restart_interval)
|
||||||
|
entropy->restarts_to_go--;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@@ -1343,11 +1350,11 @@ start_pass_huff_decoder (j_decompress_ptr cinfo)
|
|||||||
goto bad;
|
goto bad;
|
||||||
}
|
}
|
||||||
if (cinfo->Al > 13) { /* need not check for < 0 */
|
if (cinfo->Al > 13) { /* need not check for < 0 */
|
||||||
/* Arguably the maximum Al value should be less than 13 for 8-bit precision,
|
/* Arguably the maximum Al value should be less than 13 for 8-bit
|
||||||
* but the spec doesn't say so, and we try to be liberal about what we
|
* precision, but the spec doesn't say so, and we try to be liberal
|
||||||
* accept. Note: large Al values could result in out-of-range DC
|
* about what we accept. Note: large Al values could result in
|
||||||
* coefficients during early scans, leading to bizarre displays due to
|
* out-of-range DC coefficients during early scans, leading to bizarre
|
||||||
* overflows in the IDCT math. But we won't crash.
|
* displays due to overflows in the IDCT math. But we won't crash.
|
||||||
*/
|
*/
|
||||||
bad:
|
bad:
|
||||||
ERREXIT4(cinfo, JERR_BAD_PROGRESSION,
|
ERREXIT4(cinfo, JERR_BAD_PROGRESSION,
|
||||||
@@ -1451,7 +1458,8 @@ start_pass_huff_decoder (j_decompress_ptr cinfo)
|
|||||||
compptr = cinfo->cur_comp_info[ci];
|
compptr = cinfo->cur_comp_info[ci];
|
||||||
/* Precalculate which table to use for each block */
|
/* Precalculate which table to use for each block */
|
||||||
entropy->dc_cur_tbls[blkn] = entropy->dc_derived_tbls[compptr->dc_tbl_no];
|
entropy->dc_cur_tbls[blkn] = entropy->dc_derived_tbls[compptr->dc_tbl_no];
|
||||||
entropy->ac_cur_tbls[blkn] = entropy->ac_derived_tbls[compptr->ac_tbl_no];
|
entropy->ac_cur_tbls[blkn] = /* AC needs no table when not present */
|
||||||
|
cinfo->lim_Se ? entropy->ac_derived_tbls[compptr->ac_tbl_no] : NULL;
|
||||||
/* Decide whether we really care about the coefficient values */
|
/* Decide whether we really care about the coefficient values */
|
||||||
if (compptr->component_needed) {
|
if (compptr->component_needed) {
|
||||||
ci = compptr->DCT_v_scaled_size;
|
ci = compptr->DCT_v_scaled_size;
|
||||||
@@ -1494,7 +1502,6 @@ start_pass_huff_decoder (j_decompress_ptr cinfo)
|
|||||||
if (ci <= 0 || ci > 8) ci = 8;
|
if (ci <= 0 || ci > 8) ci = 8;
|
||||||
if (i <= 0 || i > 8) i = 8;
|
if (i <= 0 || i > 8) i = 8;
|
||||||
entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order[ci - 1][i - 1];
|
entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order[ci - 1][i - 1];
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
entropy->coef_limit[blkn] = 0;
|
entropy->coef_limit[blkn] = 0;
|
||||||
@@ -1522,9 +1529,8 @@ jinit_huff_decoder (j_decompress_ptr cinfo)
|
|||||||
huff_entropy_ptr entropy;
|
huff_entropy_ptr entropy;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
entropy = (huff_entropy_ptr)
|
entropy = (huff_entropy_ptr) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(huff_entropy_decoder));
|
||||||
SIZEOF(huff_entropy_decoder));
|
|
||||||
cinfo->entropy = &entropy->pub;
|
cinfo->entropy = &entropy->pub;
|
||||||
entropy->pub.start_pass = start_pass_huff_decoder;
|
entropy->pub.start_pass = start_pass_huff_decoder;
|
||||||
entropy->pub.finish_pass = finish_pass_huff;
|
entropy->pub.finish_pass = finish_pass_huff;
|
||||||
@@ -1532,9 +1538,9 @@ jinit_huff_decoder (j_decompress_ptr cinfo)
|
|||||||
if (cinfo->progressive_mode) {
|
if (cinfo->progressive_mode) {
|
||||||
/* Create progression status table */
|
/* Create progression status table */
|
||||||
int *coef_bit_ptr, ci;
|
int *coef_bit_ptr, ci;
|
||||||
cinfo->coef_bits = (int (*)[DCTSIZE2])
|
cinfo->coef_bits = (int (*)[DCTSIZE2]) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE,
|
||||||
cinfo->num_components*DCTSIZE2*SIZEOF(int));
|
cinfo->num_components * DCTSIZE2 * 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++)
|
||||||
for (i = 0; i < DCTSIZE2; i++)
|
for (i = 0; i < DCTSIZE2; i++)
|
||||||
@@ -1545,7 +1551,7 @@ jinit_huff_decoder (j_decompress_ptr cinfo)
|
|||||||
entropy->derived_tbls[i] = NULL;
|
entropy->derived_tbls[i] = NULL;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* Mark tables unallocated */
|
/* Mark derived tables unallocated */
|
||||||
for (i = 0; i < NUM_HUFF_TBLS; i++) {
|
for (i = 0; i < NUM_HUFF_TBLS; i++) {
|
||||||
entropy->dc_derived_tbls[i] = entropy->ac_derived_tbls[i] = NULL;
|
entropy->dc_derived_tbls[i] = entropy->ac_derived_tbls[i] = NULL;
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+7
-13
@@ -2,7 +2,7 @@
|
|||||||
* jdmarker.c
|
* jdmarker.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1998, Thomas G. Lane.
|
* Copyright (C) 1991-1998, Thomas G. Lane.
|
||||||
* Modified 2009-2013 by Guido Vollbeding.
|
* Modified 2009-2019 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@@ -496,8 +496,6 @@ get_dht (j_decompress_ptr cinfo)
|
|||||||
if (count > 256 || ((INT32) count) > length)
|
if (count > 256 || ((INT32) count) > length)
|
||||||
ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
|
ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
|
||||||
|
|
||||||
MEMZERO(huffval, SIZEOF(huffval)); /* pre-zero array for later copy */
|
|
||||||
|
|
||||||
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);
|
||||||
|
|
||||||
@@ -517,7 +515,8 @@ get_dht (j_decompress_ptr cinfo)
|
|||||||
*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));
|
MEMCOPY((*htblptr)->bits, bits, SIZEOF((*htblptr)->bits));
|
||||||
MEMCOPY((*htblptr)->huffval, huffval, SIZEOF((*htblptr)->huffval));
|
if (count > 0)
|
||||||
|
MEMCOPY((*htblptr)->huffval, huffval, count * SIZEOF(UINT8));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (length != 0)
|
if (length != 0)
|
||||||
@@ -577,14 +576,14 @@ get_dqt (j_decompress_ptr cinfo)
|
|||||||
count = DCTSIZE2;
|
count = DCTSIZE2;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (count) {
|
switch ((int) count) {
|
||||||
case (2*2): natural_order = jpeg_natural_order2; break;
|
case (2*2): natural_order = jpeg_natural_order2; break;
|
||||||
case (3*3): natural_order = jpeg_natural_order3; break;
|
case (3*3): natural_order = jpeg_natural_order3; break;
|
||||||
case (4*4): natural_order = jpeg_natural_order4; break;
|
case (4*4): natural_order = jpeg_natural_order4; break;
|
||||||
case (5*5): natural_order = jpeg_natural_order5; break;
|
case (5*5): natural_order = jpeg_natural_order5; break;
|
||||||
case (6*6): natural_order = jpeg_natural_order6; break;
|
case (6*6): natural_order = jpeg_natural_order6; break;
|
||||||
case (7*7): natural_order = jpeg_natural_order7; break;
|
case (7*7): natural_order = jpeg_natural_order7; break;
|
||||||
default: natural_order = jpeg_natural_order; break;
|
default: natural_order = jpeg_natural_order;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < count; i++) {
|
for (i = 0; i < count; i++) {
|
||||||
@@ -784,7 +783,6 @@ examine_app0 (j_decompress_ptr cinfo, JOCTET FAR * data,
|
|||||||
default:
|
default:
|
||||||
TRACEMS2(cinfo, 1, JTRC_JFIF_EXTENSION,
|
TRACEMS2(cinfo, 1, JTRC_JFIF_EXTENSION,
|
||||||
GETJOCTET(data[5]), (int) totallen);
|
GETJOCTET(data[5]), (int) totallen);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* Start of APP0 does not match "JFIF" or "JFXX", or too short */
|
/* Start of APP0 does not match "JFIF" or "JFXX", or too short */
|
||||||
@@ -858,7 +856,6 @@ get_interesting_appn (j_decompress_ptr cinfo)
|
|||||||
default:
|
default:
|
||||||
/* can't get here unless jpeg_save_markers chooses wrong processor */
|
/* can't get here unless jpeg_save_markers chooses wrong processor */
|
||||||
ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker);
|
ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* skip any remaining data -- could be lots */
|
/* skip any remaining data -- could be lots */
|
||||||
@@ -964,7 +961,6 @@ save_marker (j_decompress_ptr cinfo)
|
|||||||
default:
|
default:
|
||||||
TRACEMS2(cinfo, 1, JTRC_MISC_MARKER, cinfo->unread_marker,
|
TRACEMS2(cinfo, 1, JTRC_MISC_MARKER, cinfo->unread_marker,
|
||||||
(int) (data_length + length));
|
(int) (data_length + length));
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* skip any remaining data -- could be lots */
|
/* skip any remaining data -- could be lots */
|
||||||
@@ -1240,7 +1236,6 @@ read_markers (j_decompress_ptr cinfo)
|
|||||||
* ought to change!
|
* ought to change!
|
||||||
*/
|
*/
|
||||||
ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker);
|
ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
/* Successfully processed marker, so reset state variable */
|
/* Successfully processed marker, so reset state variable */
|
||||||
cinfo->unread_marker = 0;
|
cinfo->unread_marker = 0;
|
||||||
@@ -1416,9 +1411,8 @@ jinit_marker_reader (j_decompress_ptr cinfo)
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* Create subobject in permanent pool */
|
/* Create subobject in permanent pool */
|
||||||
marker = (my_marker_ptr)
|
marker = (my_marker_ptr) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
|
((j_common_ptr) cinfo, JPOOL_PERMANENT, SIZEOF(my_marker_reader));
|
||||||
SIZEOF(my_marker_reader));
|
|
||||||
cinfo->marker = &marker->pub;
|
cinfo->marker = &marker->pub;
|
||||||
/* Initialize public method pointers */
|
/* Initialize public method pointers */
|
||||||
marker->pub.reset_marker_reader = reset_marker_reader;
|
marker->pub.reset_marker_reader = reset_marker_reader;
|
||||||
|
|||||||
Vendored
+24
-23
@@ -2,7 +2,7 @@
|
|||||||
* jdmaster.c
|
* jdmaster.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1997, Thomas G. Lane.
|
* Copyright (C) 1991-1997, Thomas G. Lane.
|
||||||
* Modified 2002-2017 by Guido Vollbeding.
|
* Modified 2002-2019 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@@ -104,7 +104,7 @@ jpeg_calc_output_dimensions (j_decompress_ptr cinfo)
|
|||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
#ifdef IDCT_SCALING_SUPPORTED
|
#ifdef IDCT_SCALING_SUPPORTED
|
||||||
int ci;
|
int ci, ssize;
|
||||||
jpeg_component_info *compptr;
|
jpeg_component_info *compptr;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -124,19 +124,23 @@ jpeg_calc_output_dimensions (j_decompress_ptr cinfo)
|
|||||||
*/
|
*/
|
||||||
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++) {
|
||||||
int ssize = 1;
|
ssize = 1;
|
||||||
while (cinfo->min_DCT_h_scaled_size * ssize <=
|
if (! cinfo->raw_data_out)
|
||||||
(cinfo->do_fancy_upsampling ? DCTSIZE : DCTSIZE / 2) &&
|
while (cinfo->min_DCT_h_scaled_size * ssize <=
|
||||||
(cinfo->max_h_samp_factor % (compptr->h_samp_factor * ssize * 2)) == 0) {
|
(cinfo->do_fancy_upsampling ? DCTSIZE : DCTSIZE / 2) &&
|
||||||
ssize = ssize * 2;
|
(cinfo->max_h_samp_factor % (compptr->h_samp_factor * ssize * 2)) ==
|
||||||
}
|
0) {
|
||||||
|
ssize = ssize * 2;
|
||||||
|
}
|
||||||
compptr->DCT_h_scaled_size = cinfo->min_DCT_h_scaled_size * ssize;
|
compptr->DCT_h_scaled_size = cinfo->min_DCT_h_scaled_size * ssize;
|
||||||
ssize = 1;
|
ssize = 1;
|
||||||
while (cinfo->min_DCT_v_scaled_size * ssize <=
|
if (! cinfo->raw_data_out)
|
||||||
(cinfo->do_fancy_upsampling ? DCTSIZE : DCTSIZE / 2) &&
|
while (cinfo->min_DCT_v_scaled_size * ssize <=
|
||||||
(cinfo->max_v_samp_factor % (compptr->v_samp_factor * ssize * 2)) == 0) {
|
(cinfo->do_fancy_upsampling ? DCTSIZE : DCTSIZE / 2) &&
|
||||||
ssize = ssize * 2;
|
(cinfo->max_v_samp_factor % (compptr->v_samp_factor * ssize * 2)) ==
|
||||||
}
|
0) {
|
||||||
|
ssize = ssize * 2;
|
||||||
|
}
|
||||||
compptr->DCT_v_scaled_size = cinfo->min_DCT_v_scaled_size * ssize;
|
compptr->DCT_v_scaled_size = cinfo->min_DCT_v_scaled_size * ssize;
|
||||||
|
|
||||||
/* We don't support IDCT ratios larger than 2. */
|
/* We don't support IDCT ratios larger than 2. */
|
||||||
@@ -144,13 +148,10 @@ jpeg_calc_output_dimensions (j_decompress_ptr cinfo)
|
|||||||
compptr->DCT_h_scaled_size = compptr->DCT_v_scaled_size * 2;
|
compptr->DCT_h_scaled_size = compptr->DCT_v_scaled_size * 2;
|
||||||
else if (compptr->DCT_v_scaled_size > compptr->DCT_h_scaled_size * 2)
|
else if (compptr->DCT_v_scaled_size > compptr->DCT_h_scaled_size * 2)
|
||||||
compptr->DCT_v_scaled_size = compptr->DCT_h_scaled_size * 2;
|
compptr->DCT_v_scaled_size = compptr->DCT_h_scaled_size * 2;
|
||||||
}
|
|
||||||
|
|
||||||
/* Recompute downsampled dimensions of components;
|
/* Recompute downsampled dimensions of components;
|
||||||
* application needs to know these if using raw downsampled data.
|
* application needs to know these if using raw downsampled data.
|
||||||
*/
|
*/
|
||||||
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
|
|
||||||
ci++, compptr++) {
|
|
||||||
/* Size in samples, after IDCT scaling */
|
/* Size in samples, after IDCT scaling */
|
||||||
compptr->downsampled_width = (JDIMENSION)
|
compptr->downsampled_width = (JDIMENSION)
|
||||||
jdiv_round_up((long) cinfo->image_width *
|
jdiv_round_up((long) cinfo->image_width *
|
||||||
@@ -172,8 +173,10 @@ jpeg_calc_output_dimensions (j_decompress_ptr cinfo)
|
|||||||
break;
|
break;
|
||||||
case JCS_RGB:
|
case JCS_RGB:
|
||||||
case JCS_BG_RGB:
|
case JCS_BG_RGB:
|
||||||
|
#if RGB_PIXELSIZE != 3
|
||||||
cinfo->out_color_components = RGB_PIXELSIZE;
|
cinfo->out_color_components = RGB_PIXELSIZE;
|
||||||
break;
|
break;
|
||||||
|
#endif /* else share code with YCbCr */
|
||||||
case JCS_YCbCr:
|
case JCS_YCbCr:
|
||||||
case JCS_BG_YCC:
|
case JCS_BG_YCC:
|
||||||
cinfo->out_color_components = 3;
|
cinfo->out_color_components = 3;
|
||||||
@@ -184,7 +187,6 @@ jpeg_calc_output_dimensions (j_decompress_ptr cinfo)
|
|||||||
break;
|
break;
|
||||||
default: /* else must be same colorspace as in file */
|
default: /* else must be same colorspace as in file */
|
||||||
cinfo->out_color_components = cinfo->num_components;
|
cinfo->out_color_components = cinfo->num_components;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
cinfo->output_components = (cinfo->quantize_colors ? 1 :
|
cinfo->output_components = (cinfo->quantize_colors ? 1 :
|
||||||
cinfo->out_color_components);
|
cinfo->out_color_components);
|
||||||
@@ -525,9 +527,8 @@ jinit_master_decompress (j_decompress_ptr cinfo)
|
|||||||
{
|
{
|
||||||
my_master_ptr master;
|
my_master_ptr master;
|
||||||
|
|
||||||
master = (my_master_ptr)
|
master = (my_master_ptr) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(my_decomp_master));
|
||||||
SIZEOF(my_decomp_master));
|
|
||||||
cinfo->master = &master->pub;
|
cinfo->master = &master->pub;
|
||||||
master->pub.prepare_for_output_pass = prepare_for_output_pass;
|
master->pub.prepare_for_output_pass = prepare_for_output_pass;
|
||||||
master->pub.finish_output_pass = finish_output_pass;
|
master->pub.finish_output_pass = finish_output_pass;
|
||||||
|
|||||||
Vendored
+26
-39
@@ -2,7 +2,7 @@
|
|||||||
* jdmerge.c
|
* jdmerge.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1994-1996, Thomas G. Lane.
|
* Copyright (C) 1994-1996, Thomas G. Lane.
|
||||||
* Modified 2013-2017 by Guido Vollbeding.
|
* Modified 2013-2019 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@@ -95,28 +95,22 @@ build_ycc_rgb_table (j_decompress_ptr cinfo)
|
|||||||
INT32 x;
|
INT32 x;
|
||||||
SHIFT_TEMPS
|
SHIFT_TEMPS
|
||||||
|
|
||||||
upsample->Cr_r_tab = (int *)
|
upsample->Cr_r_tab = (int *) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, (MAXJSAMPLE+1) * SIZEOF(int));
|
||||||
(MAXJSAMPLE+1) * SIZEOF(int));
|
upsample->Cb_b_tab = (int *) (*cinfo->mem->alloc_small)
|
||||||
upsample->Cb_b_tab = (int *)
|
((j_common_ptr) cinfo, JPOOL_IMAGE, (MAXJSAMPLE+1) * SIZEOF(int));
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
upsample->Cr_g_tab = (INT32 *) (*cinfo->mem->alloc_small)
|
||||||
(MAXJSAMPLE+1) * SIZEOF(int));
|
((j_common_ptr) cinfo, JPOOL_IMAGE, (MAXJSAMPLE+1) * SIZEOF(INT32));
|
||||||
upsample->Cr_g_tab = (INT32 *)
|
upsample->Cb_g_tab = (INT32 *) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, (MAXJSAMPLE+1) * SIZEOF(INT32));
|
||||||
(MAXJSAMPLE+1) * SIZEOF(INT32));
|
|
||||||
upsample->Cb_g_tab = (INT32 *)
|
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
|
||||||
(MAXJSAMPLE+1) * SIZEOF(INT32));
|
|
||||||
|
|
||||||
for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {
|
for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {
|
||||||
/* i is the actual input pixel value, in the range 0..MAXJSAMPLE */
|
/* i is the actual input pixel value, in the range 0..MAXJSAMPLE */
|
||||||
/* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */
|
/* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */
|
||||||
/* Cr=>R value is nearest int to 1.402 * x */
|
/* Cr=>R value is nearest int to 1.402 * x */
|
||||||
upsample->Cr_r_tab[i] = (int)
|
upsample->Cr_r_tab[i] = (int) DESCALE(FIX(1.402) * x, SCALEBITS);
|
||||||
RIGHT_SHIFT(FIX(1.402) * x + ONE_HALF, SCALEBITS);
|
|
||||||
/* Cb=>B value is nearest int to 1.772 * x */
|
/* Cb=>B value is nearest int to 1.772 * x */
|
||||||
upsample->Cb_b_tab[i] = (int)
|
upsample->Cb_b_tab[i] = (int) DESCALE(FIX(1.772) * x, SCALEBITS);
|
||||||
RIGHT_SHIFT(FIX(1.772) * x + ONE_HALF, SCALEBITS);
|
|
||||||
/* Cr=>G value is scaled-up -0.714136286 * x */
|
/* Cr=>G value is scaled-up -0.714136286 * x */
|
||||||
upsample->Cr_g_tab[i] = (- FIX(0.714136286)) * x;
|
upsample->Cr_g_tab[i] = (- FIX(0.714136286)) * x;
|
||||||
/* Cb=>G value is scaled-up -0.344136286 * x */
|
/* Cb=>G value is scaled-up -0.344136286 * x */
|
||||||
@@ -135,28 +129,22 @@ build_bg_ycc_rgb_table (j_decompress_ptr cinfo)
|
|||||||
INT32 x;
|
INT32 x;
|
||||||
SHIFT_TEMPS
|
SHIFT_TEMPS
|
||||||
|
|
||||||
upsample->Cr_r_tab = (int *)
|
upsample->Cr_r_tab = (int *) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, (MAXJSAMPLE+1) * SIZEOF(int));
|
||||||
(MAXJSAMPLE+1) * SIZEOF(int));
|
upsample->Cb_b_tab = (int *) (*cinfo->mem->alloc_small)
|
||||||
upsample->Cb_b_tab = (int *)
|
((j_common_ptr) cinfo, JPOOL_IMAGE, (MAXJSAMPLE+1) * SIZEOF(int));
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
upsample->Cr_g_tab = (INT32 *) (*cinfo->mem->alloc_small)
|
||||||
(MAXJSAMPLE+1) * SIZEOF(int));
|
((j_common_ptr) cinfo, JPOOL_IMAGE, (MAXJSAMPLE+1) * SIZEOF(INT32));
|
||||||
upsample->Cr_g_tab = (INT32 *)
|
upsample->Cb_g_tab = (INT32 *) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, (MAXJSAMPLE+1) * SIZEOF(INT32));
|
||||||
(MAXJSAMPLE+1) * SIZEOF(INT32));
|
|
||||||
upsample->Cb_g_tab = (INT32 *)
|
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
|
||||||
(MAXJSAMPLE+1) * SIZEOF(INT32));
|
|
||||||
|
|
||||||
for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {
|
for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {
|
||||||
/* i is the actual input pixel value, in the range 0..MAXJSAMPLE */
|
/* i is the actual input pixel value, in the range 0..MAXJSAMPLE */
|
||||||
/* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */
|
/* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */
|
||||||
/* Cr=>R value is nearest int to 2.804 * x */
|
/* Cr=>R value is nearest int to 2.804 * x */
|
||||||
upsample->Cr_r_tab[i] = (int)
|
upsample->Cr_r_tab[i] = (int) DESCALE(FIX(2.804) * x, SCALEBITS);
|
||||||
RIGHT_SHIFT(FIX(2.804) * x + ONE_HALF, SCALEBITS);
|
|
||||||
/* Cb=>B value is nearest int to 3.544 * x */
|
/* Cb=>B value is nearest int to 3.544 * x */
|
||||||
upsample->Cb_b_tab[i] = (int)
|
upsample->Cb_b_tab[i] = (int) DESCALE(FIX(3.544) * x, SCALEBITS);
|
||||||
RIGHT_SHIFT(FIX(3.544) * x + ONE_HALF, SCALEBITS);
|
|
||||||
/* Cr=>G value is scaled-up -1.428272572 * x */
|
/* Cr=>G value is scaled-up -1.428272572 * x */
|
||||||
upsample->Cr_g_tab[i] = (- FIX(1.428272572)) * x;
|
upsample->Cr_g_tab[i] = (- FIX(1.428272572)) * x;
|
||||||
/* Cb=>G value is scaled-up -0.688272572 * x */
|
/* Cb=>G value is scaled-up -0.688272572 * x */
|
||||||
@@ -419,9 +407,8 @@ jinit_merged_upsampler (j_decompress_ptr cinfo)
|
|||||||
{
|
{
|
||||||
my_upsample_ptr upsample;
|
my_upsample_ptr upsample;
|
||||||
|
|
||||||
upsample = (my_upsample_ptr)
|
upsample = (my_upsample_ptr) (*cinfo->mem->alloc_small)
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE, SIZEOF(my_upsampler));
|
||||||
SIZEOF(my_upsampler));
|
|
||||||
cinfo->upsample = &upsample->pub;
|
cinfo->upsample = &upsample->pub;
|
||||||
upsample->pub.start_pass = start_pass_merged_upsample;
|
upsample->pub.start_pass = start_pass_merged_upsample;
|
||||||
upsample->pub.need_context_rows = FALSE;
|
upsample->pub.need_context_rows = FALSE;
|
||||||
@@ -432,9 +419,9 @@ jinit_merged_upsampler (j_decompress_ptr cinfo)
|
|||||||
upsample->pub.upsample = merged_2v_upsample;
|
upsample->pub.upsample = merged_2v_upsample;
|
||||||
upsample->upmethod = h2v2_merged_upsample;
|
upsample->upmethod = h2v2_merged_upsample;
|
||||||
/* Allocate a spare row buffer */
|
/* Allocate a spare row buffer */
|
||||||
upsample->spare_row = (JSAMPROW)
|
upsample->spare_row = (JSAMPROW) (*cinfo->mem->alloc_large)
|
||||||
(*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
((j_common_ptr) cinfo, JPOOL_IMAGE,
|
||||||
(size_t) (upsample->out_row_width * SIZEOF(JSAMPLE)));
|
(size_t) upsample->out_row_width * SIZEOF(JSAMPLE));
|
||||||
} else {
|
} else {
|
||||||
upsample->pub.upsample = merged_1v_upsample;
|
upsample->pub.upsample = merged_1v_upsample;
|
||||||
upsample->upmethod = h2v1_merged_upsample;
|
upsample->upmethod = h2v1_merged_upsample;
|
||||||
|
|||||||
Vendored
+2
-2
@@ -2,7 +2,7 @@
|
|||||||
* jerror.h
|
* jerror.h
|
||||||
*
|
*
|
||||||
* Copyright (C) 1994-1997, Thomas G. Lane.
|
* Copyright (C) 1994-1997, Thomas G. Lane.
|
||||||
* Modified 1997-2012 by Guido Vollbeding.
|
* Modified 1997-2018 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@@ -84,7 +84,7 @@ JMESSAGE(JERR_EOI_EXPECTED, "Didn't expect more than one scan")
|
|||||||
JMESSAGE(JERR_FILE_READ, "Input file read error")
|
JMESSAGE(JERR_FILE_READ, "Input file read error")
|
||||||
JMESSAGE(JERR_FILE_WRITE, "Output file write error --- out of disk space?")
|
JMESSAGE(JERR_FILE_WRITE, "Output file write error --- out of disk space?")
|
||||||
JMESSAGE(JERR_FRACT_SAMPLE_NOTIMPL, "Fractional sampling not implemented yet")
|
JMESSAGE(JERR_FRACT_SAMPLE_NOTIMPL, "Fractional sampling not implemented yet")
|
||||||
JMESSAGE(JERR_HUFF_CLEN_OVERFLOW, "Huffman code size table overflow")
|
JMESSAGE(JERR_HUFF_CLEN_OUTOFBOUNDS, "Huffman code size table out of bounds")
|
||||||
JMESSAGE(JERR_HUFF_MISSING_CODE, "Missing Huffman code table entry")
|
JMESSAGE(JERR_HUFF_MISSING_CODE, "Missing Huffman code table entry")
|
||||||
JMESSAGE(JERR_IMAGE_TOO_BIG, "Maximum supported image dimension is %u pixels")
|
JMESSAGE(JERR_IMAGE_TOO_BIG, "Maximum supported image dimension is %u pixels")
|
||||||
JMESSAGE(JERR_INPUT_EMPTY, "Empty input file")
|
JMESSAGE(JERR_INPUT_EMPTY, "Empty input file")
|
||||||
|
|||||||
Vendored
+61
-55
@@ -2,7 +2,7 @@
|
|||||||
* jfdctint.c
|
* jfdctint.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1996, Thomas G. Lane.
|
* Copyright (C) 1991-1996, Thomas G. Lane.
|
||||||
* Modification developed 2003-2015 by Guido Vollbeding.
|
* Modification developed 2003-2018 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@@ -3261,78 +3261,84 @@ jpeg_fdct_6x3 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
|
|||||||
GLOBAL(void)
|
GLOBAL(void)
|
||||||
jpeg_fdct_4x2 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
|
jpeg_fdct_4x2 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
|
||||||
{
|
{
|
||||||
INT32 tmp0, tmp1;
|
DCTELEM tmp0, tmp2, tmp10, tmp12, tmp4, tmp5;
|
||||||
INT32 tmp10, tmp11;
|
INT32 tmp1, tmp3, tmp11, tmp13;
|
||||||
DCTELEM *dataptr;
|
INT32 z1, z2, z3;
|
||||||
JSAMPROW elemptr;
|
JSAMPROW elemptr;
|
||||||
int ctr;
|
|
||||||
SHIFT_TEMPS
|
SHIFT_TEMPS
|
||||||
|
|
||||||
/* Pre-zero output coefficient block. */
|
/* Pre-zero output coefficient block. */
|
||||||
MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
|
MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
|
||||||
|
|
||||||
/* Pass 1: process rows.
|
/* Pass 1: process rows.
|
||||||
* Note results are scaled up by sqrt(8) compared to a true DCT;
|
* Note results are scaled up by sqrt(8) compared to a true DCT.
|
||||||
* furthermore, we scale the results by 2**PASS1_BITS.
|
|
||||||
* We must also scale the output by (8/4)*(8/2) = 2**3, which we add here.
|
|
||||||
* 4-point FDCT kernel,
|
* 4-point FDCT kernel,
|
||||||
* cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point FDCT].
|
* cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point FDCT].
|
||||||
*/
|
*/
|
||||||
|
|
||||||
dataptr = data;
|
/* Row 0 */
|
||||||
for (ctr = 0; ctr < 2; ctr++) {
|
elemptr = sample_data[0] + start_col;
|
||||||
elemptr = sample_data[ctr] + start_col;
|
|
||||||
|
|
||||||
/* Even part */
|
/* Even part */
|
||||||
|
|
||||||
tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[3]);
|
tmp4 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[3]);
|
||||||
tmp1 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[2]);
|
tmp5 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[2]);
|
||||||
|
|
||||||
tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[3]);
|
tmp0 = tmp4 + tmp5;
|
||||||
tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[2]);
|
tmp2 = tmp4 - tmp5;
|
||||||
|
|
||||||
/* Apply unsigned->signed conversion. */
|
/* Odd part */
|
||||||
dataptr[0] = (DCTELEM)
|
|
||||||
((tmp0 + tmp1 - 4 * CENTERJSAMPLE) << (PASS1_BITS+3));
|
|
||||||
dataptr[2] = (DCTELEM) ((tmp0 - tmp1) << (PASS1_BITS+3));
|
|
||||||
|
|
||||||
/* Odd part */
|
z2 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[3]);
|
||||||
|
z3 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[2]);
|
||||||
|
|
||||||
tmp0 = MULTIPLY(tmp10 + tmp11, FIX_0_541196100); /* c6 */
|
z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */
|
||||||
/* Add fudge factor here for final descale. */
|
/* Add fudge factor here for final descale. */
|
||||||
tmp0 += ONE << (CONST_BITS-PASS1_BITS-4);
|
z1 += ONE << (CONST_BITS-3-1);
|
||||||
|
tmp1 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */
|
||||||
|
tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */
|
||||||
|
|
||||||
dataptr[1] = (DCTELEM)
|
/* Row 1 */
|
||||||
RIGHT_SHIFT(tmp0 + MULTIPLY(tmp10, FIX_0_765366865), /* c2-c6 */
|
elemptr = sample_data[1] + start_col;
|
||||||
CONST_BITS-PASS1_BITS-3);
|
|
||||||
dataptr[3] = (DCTELEM)
|
|
||||||
RIGHT_SHIFT(tmp0 - MULTIPLY(tmp11, FIX_1_847759065), /* c2+c6 */
|
|
||||||
CONST_BITS-PASS1_BITS-3);
|
|
||||||
|
|
||||||
dataptr += DCTSIZE; /* advance pointer to next row */
|
/* Even part */
|
||||||
}
|
|
||||||
|
tmp4 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[3]);
|
||||||
|
tmp5 = GETJSAMPLE(elemptr[1]) + GETJSAMPLE(elemptr[2]);
|
||||||
|
|
||||||
|
tmp10 = tmp4 + tmp5;
|
||||||
|
tmp12 = tmp4 - tmp5;
|
||||||
|
|
||||||
|
/* Odd part */
|
||||||
|
|
||||||
|
z2 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[3]);
|
||||||
|
z3 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[2]);
|
||||||
|
|
||||||
|
z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */
|
||||||
|
tmp11 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */
|
||||||
|
tmp13 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */
|
||||||
|
|
||||||
/* Pass 2: process columns.
|
/* Pass 2: process columns.
|
||||||
* We remove the PASS1_BITS scaling, but leave the results scaled up
|
* We leave the results scaled up by an overall factor of 8.
|
||||||
* by an overall factor of 8.
|
* We must also scale the output by (8/4)*(8/2) = 2**3.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
dataptr = data;
|
/* Column 0 */
|
||||||
for (ctr = 0; ctr < 4; ctr++) {
|
/* Apply unsigned->signed conversion. */
|
||||||
/* Even part */
|
data[DCTSIZE*0] = (tmp0 + tmp10 - 8 * CENTERJSAMPLE) << 3;
|
||||||
|
data[DCTSIZE*1] = (tmp0 - tmp10) << 3;
|
||||||
|
|
||||||
/* Add fudge factor here for final descale. */
|
/* Column 1 */
|
||||||
tmp0 = dataptr[DCTSIZE*0] + (ONE << (PASS1_BITS-1));
|
data[DCTSIZE*0+1] = (DCTELEM) RIGHT_SHIFT(tmp1 + tmp11, CONST_BITS-3);
|
||||||
tmp1 = dataptr[DCTSIZE*1];
|
data[DCTSIZE*1+1] = (DCTELEM) RIGHT_SHIFT(tmp1 - tmp11, CONST_BITS-3);
|
||||||
|
|
||||||
dataptr[DCTSIZE*0] = (DCTELEM) RIGHT_SHIFT(tmp0 + tmp1, PASS1_BITS);
|
/* Column 2 */
|
||||||
|
data[DCTSIZE*0+2] = (tmp2 + tmp12) << 3;
|
||||||
|
data[DCTSIZE*1+2] = (tmp2 - tmp12) << 3;
|
||||||
|
|
||||||
/* Odd part */
|
/* Column 3 */
|
||||||
|
data[DCTSIZE*0+3] = (DCTELEM) RIGHT_SHIFT(tmp3 + tmp13, CONST_BITS-3);
|
||||||
dataptr[DCTSIZE*1] = (DCTELEM) RIGHT_SHIFT(tmp0 - tmp1, PASS1_BITS);
|
data[DCTSIZE*1+3] = (DCTELEM) RIGHT_SHIFT(tmp3 - tmp13, CONST_BITS-3);
|
||||||
|
|
||||||
dataptr++; /* advance pointer to next column */
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -4312,7 +4318,6 @@ jpeg_fdct_2x4 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
|
|||||||
|
|
||||||
/* Pass 1: process rows.
|
/* Pass 1: process rows.
|
||||||
* Note results are scaled up by sqrt(8) compared to a true DCT.
|
* Note results are scaled up by sqrt(8) compared to a true DCT.
|
||||||
* We must also scale the output by (8/2)*(8/4) = 2**3, which we add here.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
dataptr = data;
|
dataptr = data;
|
||||||
@@ -4325,17 +4330,18 @@ jpeg_fdct_2x4 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
|
|||||||
tmp1 = GETJSAMPLE(elemptr[1]);
|
tmp1 = GETJSAMPLE(elemptr[1]);
|
||||||
|
|
||||||
/* Apply unsigned->signed conversion. */
|
/* Apply unsigned->signed conversion. */
|
||||||
dataptr[0] = (DCTELEM) ((tmp0 + tmp1 - 2 * CENTERJSAMPLE) << 3);
|
dataptr[0] = (DCTELEM) (tmp0 + tmp1 - 2 * CENTERJSAMPLE);
|
||||||
|
|
||||||
/* Odd part */
|
/* Odd part */
|
||||||
|
|
||||||
dataptr[1] = (DCTELEM) ((tmp0 - tmp1) << 3);
|
dataptr[1] = (DCTELEM) (tmp0 - tmp1);
|
||||||
|
|
||||||
dataptr += DCTSIZE; /* advance pointer to next row */
|
dataptr += DCTSIZE; /* advance pointer to next row */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Pass 2: process columns.
|
/* Pass 2: process columns.
|
||||||
* We leave the results scaled up by an overall factor of 8.
|
* We leave the results scaled up by an overall factor of 8.
|
||||||
|
* We must also scale the output by (8/2)*(8/4) = 2**3.
|
||||||
* 4-point FDCT kernel,
|
* 4-point FDCT kernel,
|
||||||
* cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point FDCT].
|
* cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point FDCT].
|
||||||
*/
|
*/
|
||||||
@@ -4350,21 +4356,21 @@ jpeg_fdct_2x4 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
|
|||||||
tmp10 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*3];
|
tmp10 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*3];
|
||||||
tmp11 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*2];
|
tmp11 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*2];
|
||||||
|
|
||||||
dataptr[DCTSIZE*0] = (DCTELEM) (tmp0 + tmp1);
|
dataptr[DCTSIZE*0] = (DCTELEM) ((tmp0 + tmp1) << 3);
|
||||||
dataptr[DCTSIZE*2] = (DCTELEM) (tmp0 - tmp1);
|
dataptr[DCTSIZE*2] = (DCTELEM) ((tmp0 - tmp1) << 3);
|
||||||
|
|
||||||
/* Odd part */
|
/* Odd part */
|
||||||
|
|
||||||
tmp0 = MULTIPLY(tmp10 + tmp11, FIX_0_541196100); /* c6 */
|
tmp0 = MULTIPLY(tmp10 + tmp11, FIX_0_541196100); /* c6 */
|
||||||
/* Add fudge factor here for final descale. */
|
/* Add fudge factor here for final descale. */
|
||||||
tmp0 += ONE << (CONST_BITS-1);
|
tmp0 += ONE << (CONST_BITS-3-1);
|
||||||
|
|
||||||
dataptr[DCTSIZE*1] = (DCTELEM)
|
dataptr[DCTSIZE*1] = (DCTELEM)
|
||||||
RIGHT_SHIFT(tmp0 + MULTIPLY(tmp10, FIX_0_765366865), /* c2-c6 */
|
RIGHT_SHIFT(tmp0 + MULTIPLY(tmp10, FIX_0_765366865), /* c2-c6 */
|
||||||
CONST_BITS);
|
CONST_BITS-3);
|
||||||
dataptr[DCTSIZE*3] = (DCTELEM)
|
dataptr[DCTSIZE*3] = (DCTELEM)
|
||||||
RIGHT_SHIFT(tmp0 - MULTIPLY(tmp11, FIX_1_847759065), /* c2+c6 */
|
RIGHT_SHIFT(tmp0 - MULTIPLY(tmp11, FIX_1_847759065), /* c2+c6 */
|
||||||
CONST_BITS);
|
CONST_BITS-3);
|
||||||
|
|
||||||
dataptr++; /* advance pointer to next column */
|
dataptr++; /* advance pointer to next column */
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+6
-6
@@ -2,7 +2,7 @@
|
|||||||
* jidctint.c
|
* jidctint.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1998, Thomas G. Lane.
|
* Copyright (C) 1991-1998, Thomas G. Lane.
|
||||||
* Modification developed 2002-2016 by Guido Vollbeding.
|
* Modification developed 2002-2018 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@@ -1474,7 +1474,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).
|
||||||
@@ -3675,7 +3675,7 @@ jpeg_idct_10x5 (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 8x4 output block.
|
* producing an 8x4 output block.
|
||||||
*
|
*
|
||||||
* 4-point IDCT in pass 1 (columns), 8-point in pass 2 (rows).
|
* 4-point IDCT in pass 1 (columns), 8-point in pass 2 (rows).
|
||||||
*/
|
*/
|
||||||
@@ -3835,7 +3835,7 @@ jpeg_idct_8x4 (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 reduced-size 6x3 output block.
|
* producing a 6x3 output block.
|
||||||
*
|
*
|
||||||
* 3-point IDCT in pass 1 (columns), 6-point in pass 2 (rows).
|
* 3-point IDCT in pass 1 (columns), 6-point in pass 2 (rows).
|
||||||
*/
|
*/
|
||||||
@@ -4082,7 +4082,7 @@ jpeg_idct_2x1 (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 8x16 output block.
|
* producing an 8x16 output block.
|
||||||
*
|
*
|
||||||
* 16-point IDCT in pass 1 (columns), 8-point in pass 2 (rows).
|
* 16-point IDCT in pass 1 (columns), 8-point in pass 2 (rows).
|
||||||
*/
|
*/
|
||||||
@@ -5004,7 +5004,7 @@ jpeg_idct_4x8 (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 reduced-size 3x6 output block.
|
* producing a 3x6 output block.
|
||||||
*
|
*
|
||||||
* 6-point IDCT in pass 1 (columns), 3-point in pass 2 (rows).
|
* 6-point IDCT in pass 1 (columns), 3-point in pass 2 (rows).
|
||||||
*/
|
*/
|
||||||
|
|||||||
Vendored
+28
-32
@@ -2,7 +2,7 @@
|
|||||||
* jmemmgr.c
|
* jmemmgr.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1997, Thomas G. Lane.
|
* Copyright (C) 1991-1997, Thomas G. Lane.
|
||||||
* Modified 2011-2012 by Guido Vollbeding.
|
* Modified 2011-2019 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@@ -130,7 +130,7 @@ typedef struct {
|
|||||||
jvirt_barray_ptr virt_barray_list;
|
jvirt_barray_ptr virt_barray_list;
|
||||||
|
|
||||||
/* This counts total space obtained from jpeg_get_small/large */
|
/* This counts total space obtained from jpeg_get_small/large */
|
||||||
long total_space_allocated;
|
size_t total_space_allocated;
|
||||||
|
|
||||||
/* alloc_sarray and alloc_barray set this value for use by virtual
|
/* alloc_sarray and alloc_barray set this value for use by virtual
|
||||||
* array routines.
|
* array routines.
|
||||||
@@ -195,7 +195,7 @@ print_mem_stats (j_common_ptr cinfo, int pool_id)
|
|||||||
* This is helpful because message parm array can't handle longs.
|
* This is helpful because message parm array can't handle longs.
|
||||||
*/
|
*/
|
||||||
fprintf(stderr, "Freeing pool %d, total space = %ld\n",
|
fprintf(stderr, "Freeing pool %d, total space = %ld\n",
|
||||||
pool_id, mem->total_space_allocated);
|
pool_id, (long) mem->total_space_allocated);
|
||||||
|
|
||||||
for (lhdr_ptr = mem->large_list[pool_id]; lhdr_ptr != NULL;
|
for (lhdr_ptr = mem->large_list[pool_id]; lhdr_ptr != NULL;
|
||||||
lhdr_ptr = lhdr_ptr->hdr.next) {
|
lhdr_ptr = lhdr_ptr->hdr.next) {
|
||||||
@@ -260,11 +260,11 @@ alloc_small (j_common_ptr cinfo, int pool_id, size_t sizeofobject)
|
|||||||
{
|
{
|
||||||
my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
|
my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
|
||||||
small_pool_ptr hdr_ptr, prev_hdr_ptr;
|
small_pool_ptr hdr_ptr, prev_hdr_ptr;
|
||||||
char * data_ptr;
|
|
||||||
size_t odd_bytes, min_request, slop;
|
size_t odd_bytes, min_request, slop;
|
||||||
|
char * data_ptr;
|
||||||
|
|
||||||
/* Check for unsatisfiable request (do now to ensure no overflow below) */
|
/* Check for unsatisfiable request (do now to ensure no overflow below) */
|
||||||
if (sizeofobject > (size_t) (MAX_ALLOC_CHUNK-SIZEOF(small_pool_hdr)))
|
if (sizeofobject > (size_t) MAX_ALLOC_CHUNK - SIZEOF(small_pool_hdr))
|
||||||
out_of_memory(cinfo, 1); /* request exceeds malloc's ability */
|
out_of_memory(cinfo, 1); /* request exceeds malloc's ability */
|
||||||
|
|
||||||
/* Round up the requested size to a multiple of SIZEOF(ALIGN_TYPE) */
|
/* Round up the requested size to a multiple of SIZEOF(ALIGN_TYPE) */
|
||||||
@@ -293,8 +293,8 @@ alloc_small (j_common_ptr cinfo, int pool_id, size_t sizeofobject)
|
|||||||
else
|
else
|
||||||
slop = extra_pool_slop[pool_id];
|
slop = extra_pool_slop[pool_id];
|
||||||
/* Don't ask for more than MAX_ALLOC_CHUNK */
|
/* Don't ask for more than MAX_ALLOC_CHUNK */
|
||||||
if (slop > (size_t) (MAX_ALLOC_CHUNK-min_request))
|
if (slop > (size_t) MAX_ALLOC_CHUNK - min_request)
|
||||||
slop = (size_t) (MAX_ALLOC_CHUNK-min_request);
|
slop = (size_t) MAX_ALLOC_CHUNK - min_request;
|
||||||
/* Try to get space, if fail reduce slop and try again */
|
/* Try to get space, if fail reduce slop and try again */
|
||||||
for (;;) {
|
for (;;) {
|
||||||
hdr_ptr = (small_pool_ptr) jpeg_get_small(cinfo, min_request + slop);
|
hdr_ptr = (small_pool_ptr) jpeg_get_small(cinfo, min_request + slop);
|
||||||
@@ -348,7 +348,7 @@ alloc_large (j_common_ptr cinfo, int pool_id, size_t sizeofobject)
|
|||||||
size_t odd_bytes;
|
size_t odd_bytes;
|
||||||
|
|
||||||
/* Check for unsatisfiable request (do now to ensure no overflow below) */
|
/* Check for unsatisfiable request (do now to ensure no overflow below) */
|
||||||
if (sizeofobject > (size_t) (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr)))
|
if (sizeofobject > (size_t) MAX_ALLOC_CHUNK - SIZEOF(large_pool_hdr))
|
||||||
out_of_memory(cinfo, 3); /* request exceeds malloc's ability */
|
out_of_memory(cinfo, 3); /* request exceeds malloc's ability */
|
||||||
|
|
||||||
/* Round up the requested size to a multiple of SIZEOF(ALIGN_TYPE) */
|
/* Round up the requested size to a multiple of SIZEOF(ALIGN_TYPE) */
|
||||||
@@ -404,7 +404,7 @@ alloc_sarray (j_common_ptr cinfo, int pool_id,
|
|||||||
long ltemp;
|
long ltemp;
|
||||||
|
|
||||||
/* Calculate max # of rows allowed in one allocation chunk */
|
/* Calculate max # of rows allowed in one allocation chunk */
|
||||||
ltemp = (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr)) /
|
ltemp = (MAX_ALLOC_CHUNK - SIZEOF(large_pool_hdr)) /
|
||||||
((long) samplesperrow * SIZEOF(JSAMPLE));
|
((long) samplesperrow * SIZEOF(JSAMPLE));
|
||||||
if (ltemp <= 0)
|
if (ltemp <= 0)
|
||||||
ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);
|
ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);
|
||||||
@@ -416,15 +416,14 @@ alloc_sarray (j_common_ptr cinfo, int pool_id,
|
|||||||
|
|
||||||
/* Get space for row pointers (small object) */
|
/* Get space for row pointers (small object) */
|
||||||
result = (JSAMPARRAY) alloc_small(cinfo, pool_id,
|
result = (JSAMPARRAY) alloc_small(cinfo, pool_id,
|
||||||
(size_t) (numrows * SIZEOF(JSAMPROW)));
|
(size_t) numrows * SIZEOF(JSAMPROW));
|
||||||
|
|
||||||
/* Get the rows themselves (large objects) */
|
/* Get the rows themselves (large objects) */
|
||||||
currow = 0;
|
currow = 0;
|
||||||
while (currow < numrows) {
|
while (currow < numrows) {
|
||||||
rowsperchunk = MIN(rowsperchunk, numrows - currow);
|
rowsperchunk = MIN(rowsperchunk, numrows - currow);
|
||||||
workspace = (JSAMPROW) alloc_large(cinfo, pool_id,
|
workspace = (JSAMPROW) alloc_large(cinfo, pool_id,
|
||||||
(size_t) ((size_t) rowsperchunk * (size_t) samplesperrow
|
(size_t) rowsperchunk * (size_t) samplesperrow * SIZEOF(JSAMPLE));
|
||||||
* SIZEOF(JSAMPLE)));
|
|
||||||
for (i = rowsperchunk; i > 0; i--) {
|
for (i = rowsperchunk; i > 0; i--) {
|
||||||
result[currow++] = workspace;
|
result[currow++] = workspace;
|
||||||
workspace += samplesperrow;
|
workspace += samplesperrow;
|
||||||
@@ -452,7 +451,7 @@ alloc_barray (j_common_ptr cinfo, int pool_id,
|
|||||||
long ltemp;
|
long ltemp;
|
||||||
|
|
||||||
/* Calculate max # of rows allowed in one allocation chunk */
|
/* Calculate max # of rows allowed in one allocation chunk */
|
||||||
ltemp = (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr)) /
|
ltemp = (MAX_ALLOC_CHUNK - SIZEOF(large_pool_hdr)) /
|
||||||
((long) blocksperrow * SIZEOF(JBLOCK));
|
((long) blocksperrow * SIZEOF(JBLOCK));
|
||||||
if (ltemp <= 0)
|
if (ltemp <= 0)
|
||||||
ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);
|
ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);
|
||||||
@@ -464,15 +463,14 @@ alloc_barray (j_common_ptr cinfo, int pool_id,
|
|||||||
|
|
||||||
/* Get space for row pointers (small object) */
|
/* Get space for row pointers (small object) */
|
||||||
result = (JBLOCKARRAY) alloc_small(cinfo, pool_id,
|
result = (JBLOCKARRAY) alloc_small(cinfo, pool_id,
|
||||||
(size_t) (numrows * SIZEOF(JBLOCKROW)));
|
(size_t) numrows * SIZEOF(JBLOCKROW));
|
||||||
|
|
||||||
/* Get the rows themselves (large objects) */
|
/* Get the rows themselves (large objects) */
|
||||||
currow = 0;
|
currow = 0;
|
||||||
while (currow < numrows) {
|
while (currow < numrows) {
|
||||||
rowsperchunk = MIN(rowsperchunk, numrows - currow);
|
rowsperchunk = MIN(rowsperchunk, numrows - currow);
|
||||||
workspace = (JBLOCKROW) alloc_large(cinfo, pool_id,
|
workspace = (JBLOCKROW) alloc_large(cinfo, pool_id,
|
||||||
(size_t) ((size_t) rowsperchunk * (size_t) blocksperrow
|
(size_t) rowsperchunk * (size_t) blocksperrow * SIZEOF(JBLOCK));
|
||||||
* SIZEOF(JBLOCK)));
|
|
||||||
for (i = rowsperchunk; i > 0; i--) {
|
for (i = rowsperchunk; i > 0; i--) {
|
||||||
result[currow++] = workspace;
|
result[currow++] = workspace;
|
||||||
workspace += blocksperrow;
|
workspace += blocksperrow;
|
||||||
@@ -585,8 +583,8 @@ realize_virt_arrays (j_common_ptr cinfo)
|
|||||||
/* Allocate the in-memory buffers for any unrealized virtual arrays */
|
/* Allocate the in-memory buffers for any unrealized virtual arrays */
|
||||||
{
|
{
|
||||||
my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
|
my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
|
||||||
long space_per_minheight, maximum_space, avail_mem;
|
long bytesperrow, space_per_minheight, maximum_space;
|
||||||
long minheights, max_minheights;
|
long avail_mem, minheights, max_minheights;
|
||||||
jvirt_sarray_ptr sptr;
|
jvirt_sarray_ptr sptr;
|
||||||
jvirt_barray_ptr bptr;
|
jvirt_barray_ptr bptr;
|
||||||
|
|
||||||
@@ -598,18 +596,16 @@ realize_virt_arrays (j_common_ptr cinfo)
|
|||||||
maximum_space = 0;
|
maximum_space = 0;
|
||||||
for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) {
|
for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) {
|
||||||
if (sptr->mem_buffer == NULL) { /* if not realized yet */
|
if (sptr->mem_buffer == NULL) { /* if not realized yet */
|
||||||
space_per_minheight += (long) sptr->maxaccess *
|
bytesperrow = (long) sptr->samplesperrow * SIZEOF(JSAMPLE);
|
||||||
(long) sptr->samplesperrow * SIZEOF(JSAMPLE);
|
space_per_minheight += (long) sptr->maxaccess * bytesperrow;
|
||||||
maximum_space += (long) sptr->rows_in_array *
|
maximum_space += (long) sptr->rows_in_array * bytesperrow;
|
||||||
(long) sptr->samplesperrow * SIZEOF(JSAMPLE);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) {
|
for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) {
|
||||||
if (bptr->mem_buffer == NULL) { /* if not realized yet */
|
if (bptr->mem_buffer == NULL) { /* if not realized yet */
|
||||||
space_per_minheight += (long) bptr->maxaccess *
|
bytesperrow = (long) bptr->blocksperrow * SIZEOF(JBLOCK);
|
||||||
(long) bptr->blocksperrow * SIZEOF(JBLOCK);
|
space_per_minheight += (long) bptr->maxaccess * bytesperrow;
|
||||||
maximum_space += (long) bptr->rows_in_array *
|
maximum_space += (long) bptr->rows_in_array * bytesperrow;
|
||||||
(long) bptr->blocksperrow * SIZEOF(JBLOCK);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -618,7 +614,7 @@ realize_virt_arrays (j_common_ptr cinfo)
|
|||||||
|
|
||||||
/* Determine amount of memory to actually use; this is system-dependent. */
|
/* Determine amount of memory to actually use; this is system-dependent. */
|
||||||
avail_mem = jpeg_mem_available(cinfo, space_per_minheight, maximum_space,
|
avail_mem = jpeg_mem_available(cinfo, space_per_minheight, maximum_space,
|
||||||
mem->total_space_allocated);
|
(long) mem->total_space_allocated);
|
||||||
|
|
||||||
/* If the maximum space needed is available, make all the buffers full
|
/* If the maximum space needed is available, make all the buffers full
|
||||||
* height; otherwise parcel it out with the same number of minheights
|
* height; otherwise parcel it out with the same number of minheights
|
||||||
@@ -694,7 +690,7 @@ do_sarray_io (j_common_ptr cinfo, jvirt_sarray_ptr ptr, boolean writing)
|
|||||||
long bytesperrow, file_offset, byte_count, rows, thisrow, i;
|
long bytesperrow, file_offset, byte_count, rows, thisrow, i;
|
||||||
|
|
||||||
bytesperrow = (long) ptr->samplesperrow * SIZEOF(JSAMPLE);
|
bytesperrow = (long) ptr->samplesperrow * SIZEOF(JSAMPLE);
|
||||||
file_offset = ptr->cur_start_row * bytesperrow;
|
file_offset = (long) ptr->cur_start_row * bytesperrow;
|
||||||
/* Loop to read or write each allocation chunk in mem_buffer */
|
/* Loop to read or write each allocation chunk in mem_buffer */
|
||||||
for (i = 0; i < (long) ptr->rows_in_mem; i += ptr->rowsperchunk) {
|
for (i = 0; i < (long) ptr->rows_in_mem; i += ptr->rowsperchunk) {
|
||||||
/* One chunk, but check for short chunk at end of buffer */
|
/* One chunk, but check for short chunk at end of buffer */
|
||||||
@@ -727,7 +723,7 @@ do_barray_io (j_common_ptr cinfo, jvirt_barray_ptr ptr, boolean writing)
|
|||||||
long bytesperrow, file_offset, byte_count, rows, thisrow, i;
|
long bytesperrow, file_offset, byte_count, rows, thisrow, i;
|
||||||
|
|
||||||
bytesperrow = (long) ptr->blocksperrow * SIZEOF(JBLOCK);
|
bytesperrow = (long) ptr->blocksperrow * SIZEOF(JBLOCK);
|
||||||
file_offset = ptr->cur_start_row * bytesperrow;
|
file_offset = (long) ptr->cur_start_row * bytesperrow;
|
||||||
/* Loop to read or write each allocation chunk in mem_buffer */
|
/* Loop to read or write each allocation chunk in mem_buffer */
|
||||||
for (i = 0; i < (long) ptr->rows_in_mem; i += ptr->rowsperchunk) {
|
for (i = 0; i < (long) ptr->rows_in_mem; i += ptr->rowsperchunk) {
|
||||||
/* One chunk, but check for short chunk at end of buffer */
|
/* One chunk, but check for short chunk at end of buffer */
|
||||||
@@ -771,7 +767,7 @@ access_virt_sarray (j_common_ptr cinfo, jvirt_sarray_ptr ptr,
|
|||||||
|
|
||||||
/* Make the desired part of the virtual array accessible */
|
/* Make the desired part of the virtual array accessible */
|
||||||
if (start_row < ptr->cur_start_row ||
|
if (start_row < ptr->cur_start_row ||
|
||||||
end_row > ptr->cur_start_row+ptr->rows_in_mem) {
|
end_row > ptr->cur_start_row + ptr->rows_in_mem) {
|
||||||
if (! ptr->b_s_open)
|
if (! ptr->b_s_open)
|
||||||
ERREXIT(cinfo, JERR_VIRTUAL_BUG);
|
ERREXIT(cinfo, JERR_VIRTUAL_BUG);
|
||||||
/* Flush old buffer contents if necessary */
|
/* Flush old buffer contents if necessary */
|
||||||
@@ -856,7 +852,7 @@ access_virt_barray (j_common_ptr cinfo, jvirt_barray_ptr ptr,
|
|||||||
|
|
||||||
/* Make the desired part of the virtual array accessible */
|
/* Make the desired part of the virtual array accessible */
|
||||||
if (start_row < ptr->cur_start_row ||
|
if (start_row < ptr->cur_start_row ||
|
||||||
end_row > ptr->cur_start_row+ptr->rows_in_mem) {
|
end_row > ptr->cur_start_row + ptr->rows_in_mem) {
|
||||||
if (! ptr->b_s_open)
|
if (! ptr->b_s_open)
|
||||||
ERREXIT(cinfo, JERR_VIRTUAL_BUG);
|
ERREXIT(cinfo, JERR_VIRTUAL_BUG);
|
||||||
/* Flush old buffer contents if necessary */
|
/* Flush old buffer contents if necessary */
|
||||||
@@ -1093,7 +1089,7 @@ jinit_memory_mgr (j_common_ptr cinfo)
|
|||||||
mem->total_space_allocated = SIZEOF(my_memory_mgr);
|
mem->total_space_allocated = SIZEOF(my_memory_mgr);
|
||||||
|
|
||||||
/* Declare ourselves open for business */
|
/* Declare ourselves open for business */
|
||||||
cinfo->mem = & mem->pub;
|
cinfo->mem = &mem->pub;
|
||||||
|
|
||||||
/* Check for an environment variable JPEGMEM; if found, override the
|
/* Check for an environment variable JPEGMEM; if found, override the
|
||||||
* default max_memory setting from jpeg_mem_init. Note that the
|
* default max_memory setting from jpeg_mem_init. Note that the
|
||||||
|
|||||||
Vendored
+6
-2
@@ -2,6 +2,7 @@
|
|||||||
* jmemnobs.c
|
* jmemnobs.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1992-1996, Thomas G. Lane.
|
* Copyright (C) 1992-1996, Thomas G. Lane.
|
||||||
|
* Modified 2019 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@@ -12,7 +13,7 @@
|
|||||||
* This is very portable in the sense that it'll compile on almost anything,
|
* This is very portable in the sense that it'll compile on almost anything,
|
||||||
* but you'd better have lots of main memory (or virtual memory) if you want
|
* but you'd better have lots of main memory (or virtual memory) if you want
|
||||||
* to process big images.
|
* to process big images.
|
||||||
* Note that the max_memory_to_use option is ignored by this implementation.
|
* Note that the max_memory_to_use option is respected by this implementation.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define JPEG_INTERNALS
|
#define JPEG_INTERNALS
|
||||||
@@ -66,13 +67,16 @@ jpeg_free_large (j_common_ptr cinfo, void FAR * object, size_t sizeofobject)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* This routine computes the total memory space available for allocation.
|
* This routine computes the total memory space available for allocation.
|
||||||
* Here we always say, "we got all you want bud!"
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
GLOBAL(long)
|
GLOBAL(long)
|
||||||
jpeg_mem_available (j_common_ptr cinfo, long min_bytes_needed,
|
jpeg_mem_available (j_common_ptr cinfo, long min_bytes_needed,
|
||||||
long max_bytes_needed, long already_allocated)
|
long max_bytes_needed, long already_allocated)
|
||||||
{
|
{
|
||||||
|
if (cinfo->mem->max_memory_to_use)
|
||||||
|
return cinfo->mem->max_memory_to_use - already_allocated;
|
||||||
|
|
||||||
|
/* Here we say, "we got all you want bud!" */
|
||||||
return max_bytes_needed;
|
return max_bytes_needed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Vendored
+8
-1
@@ -2,7 +2,7 @@
|
|||||||
* jpegint.h
|
* jpegint.h
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1997, Thomas G. Lane.
|
* Copyright (C) 1991-1997, Thomas G. Lane.
|
||||||
* Modified 1997-2017 by Guido Vollbeding.
|
* Modified 1997-2019 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@@ -302,6 +302,13 @@ struct jpeg_color_quantizer {
|
|||||||
#define RIGHT_SHIFT(x,shft) ((x) >> (shft))
|
#define RIGHT_SHIFT(x,shft) ((x) >> (shft))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Descale and correctly round an INT32 value that's scaled by N bits.
|
||||||
|
* We assume RIGHT_SHIFT rounds towards minus infinity, so adding
|
||||||
|
* the fudge factor is correct for either sign of X.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define DESCALE(x,n) RIGHT_SHIFT((x) + ((INT32) 1 << ((n)-1)), n)
|
||||||
|
|
||||||
|
|
||||||
/* Short forms of external names for systems with brain-damaged linkers. */
|
/* Short forms of external names for systems with brain-damaged linkers. */
|
||||||
|
|
||||||
|
|||||||
Vendored
+7
-4
@@ -2,7 +2,7 @@
|
|||||||
* jpeglib.h
|
* jpeglib.h
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1998, Thomas G. Lane.
|
* Copyright (C) 1991-1998, Thomas G. Lane.
|
||||||
* Modified 2002-2017 by Guido Vollbeding.
|
* Modified 2002-2019 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@@ -39,7 +39,7 @@ extern "C" {
|
|||||||
|
|
||||||
#define JPEG_LIB_VERSION 90 /* Compatibility version 9.0 */
|
#define JPEG_LIB_VERSION 90 /* Compatibility version 9.0 */
|
||||||
#define JPEG_LIB_VERSION_MAJOR 9
|
#define JPEG_LIB_VERSION_MAJOR 9
|
||||||
#define JPEG_LIB_VERSION_MINOR 3
|
#define JPEG_LIB_VERSION_MINOR 4
|
||||||
|
|
||||||
|
|
||||||
/* Various constants determining the sizes of things.
|
/* Various constants determining the sizes of things.
|
||||||
@@ -909,6 +909,7 @@ typedef JMETHOD(boolean, jpeg_marker_parser_method, (j_decompress_ptr cinfo));
|
|||||||
#define jpeg_suppress_tables jSuppressTables
|
#define jpeg_suppress_tables jSuppressTables
|
||||||
#define jpeg_alloc_quant_table jAlcQTable
|
#define jpeg_alloc_quant_table jAlcQTable
|
||||||
#define jpeg_alloc_huff_table jAlcHTable
|
#define jpeg_alloc_huff_table jAlcHTable
|
||||||
|
#define jpeg_std_huff_table jStdHTable
|
||||||
#define jpeg_start_compress jStrtCompress
|
#define jpeg_start_compress jStrtCompress
|
||||||
#define jpeg_write_scanlines jWrtScanlines
|
#define jpeg_write_scanlines jWrtScanlines
|
||||||
#define jpeg_finish_compress jFinCompress
|
#define jpeg_finish_compress jFinCompress
|
||||||
@@ -977,10 +978,10 @@ EXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FILE * infile));
|
|||||||
/* Data source and destination managers: memory buffers. */
|
/* Data source and destination managers: memory buffers. */
|
||||||
EXTERN(void) jpeg_mem_dest JPP((j_compress_ptr cinfo,
|
EXTERN(void) jpeg_mem_dest JPP((j_compress_ptr cinfo,
|
||||||
unsigned char ** outbuffer,
|
unsigned char ** outbuffer,
|
||||||
unsigned long * outsize));
|
size_t * outsize));
|
||||||
EXTERN(void) jpeg_mem_src JPP((j_decompress_ptr cinfo,
|
EXTERN(void) jpeg_mem_src JPP((j_decompress_ptr cinfo,
|
||||||
const unsigned char * inbuffer,
|
const unsigned char * inbuffer,
|
||||||
unsigned long insize));
|
size_t insize));
|
||||||
|
|
||||||
/* Default parameter setup for compression */
|
/* Default parameter setup for compression */
|
||||||
EXTERN(void) jpeg_set_defaults JPP((j_compress_ptr cinfo));
|
EXTERN(void) jpeg_set_defaults JPP((j_compress_ptr cinfo));
|
||||||
@@ -1005,6 +1006,8 @@ EXTERN(void) jpeg_suppress_tables JPP((j_compress_ptr cinfo,
|
|||||||
boolean suppress));
|
boolean suppress));
|
||||||
EXTERN(JQUANT_TBL *) jpeg_alloc_quant_table JPP((j_common_ptr cinfo));
|
EXTERN(JQUANT_TBL *) jpeg_alloc_quant_table JPP((j_common_ptr cinfo));
|
||||||
EXTERN(JHUFF_TBL *) jpeg_alloc_huff_table JPP((j_common_ptr cinfo));
|
EXTERN(JHUFF_TBL *) jpeg_alloc_huff_table JPP((j_common_ptr cinfo));
|
||||||
|
EXTERN(JHUFF_TBL *) jpeg_std_huff_table JPP((j_common_ptr cinfo,
|
||||||
|
boolean isDC, int tblno));
|
||||||
|
|
||||||
/* Main entry points for compression */
|
/* Main entry points for compression */
|
||||||
EXTERN(void) jpeg_start_compress JPP((j_compress_ptr cinfo,
|
EXTERN(void) jpeg_start_compress JPP((j_compress_ptr cinfo,
|
||||||
|
|||||||
Vendored
+3
-3
@@ -2,7 +2,7 @@
|
|||||||
* jutils.c
|
* jutils.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-1996, Thomas G. Lane.
|
* Copyright (C) 1991-1996, Thomas G. Lane.
|
||||||
* Modified 2009-2011 by Guido Vollbeding.
|
* Modified 2009-2019 by Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@@ -185,7 +185,7 @@ jcopy_sample_rows (JSAMPARRAY input_array, int source_row,
|
|||||||
{
|
{
|
||||||
register JSAMPROW inptr, outptr;
|
register JSAMPROW inptr, outptr;
|
||||||
#ifdef FMEMCOPY
|
#ifdef FMEMCOPY
|
||||||
register size_t count = (size_t) (num_cols * SIZEOF(JSAMPLE));
|
register size_t count = (size_t) num_cols * SIZEOF(JSAMPLE);
|
||||||
#else
|
#else
|
||||||
register JDIMENSION count;
|
register JDIMENSION count;
|
||||||
#endif
|
#endif
|
||||||
@@ -213,7 +213,7 @@ jcopy_block_row (JBLOCKROW input_row, JBLOCKROW output_row,
|
|||||||
/* Copy a row of coefficient blocks from one place to another. */
|
/* Copy a row of coefficient blocks from one place to another. */
|
||||||
{
|
{
|
||||||
#ifdef FMEMCOPY
|
#ifdef FMEMCOPY
|
||||||
FMEMCOPY(output_row, input_row, num_blocks * (DCTSIZE2 * SIZEOF(JCOEF)));
|
FMEMCOPY(output_row, input_row, (size_t) num_blocks * (DCTSIZE2 * SIZEOF(JCOEF)));
|
||||||
#else
|
#else
|
||||||
register JCOEFPTR inptr, outptr;
|
register JCOEFPTR inptr, outptr;
|
||||||
register long count;
|
register long count;
|
||||||
|
|||||||
Vendored
+3
-3
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* jversion.h
|
* jversion.h
|
||||||
*
|
*
|
||||||
* Copyright (C) 1991-2018, Thomas G. Lane, Guido Vollbeding.
|
* Copyright (C) 1991-2020, Thomas G. Lane, Guido Vollbeding.
|
||||||
* This file is part of the Independent JPEG Group's software.
|
* This file is part of the Independent JPEG Group's software.
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
* For conditions of distribution and use, see the accompanying README file.
|
||||||
*
|
*
|
||||||
@@ -9,6 +9,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#define JVERSION "9c 14-Jan-2018"
|
#define JVERSION "9d 12-Jan-2020"
|
||||||
|
|
||||||
#define JCOPYRIGHT "Copyright (C) 2018, Thomas G. Lane, Guido Vollbeding"
|
#define JCOPYRIGHT "Copyright (C) 2020, Thomas G. Lane, Guido Vollbeding"
|
||||||
|
|||||||
Vendored
+2
-2
@@ -74,7 +74,7 @@ if(MSVC)
|
|||||||
add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
|
add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
|
||||||
endif(MSVC)
|
endif(MSVC)
|
||||||
|
|
||||||
add_library(${PNG_LIBRARY} STATIC ${lib_srcs} ${lib_hdrs})
|
add_library(${PNG_LIBRARY} STATIC ${OPENCV_3RDPARTY_EXCLUDE_FROM_ALL} ${lib_srcs} ${lib_hdrs})
|
||||||
target_link_libraries(${PNG_LIBRARY} ${ZLIB_LIBRARIES})
|
target_link_libraries(${PNG_LIBRARY} ${ZLIB_LIBRARIES})
|
||||||
|
|
||||||
ocv_warnings_disable(CMAKE_C_FLAGS -Wundef -Wcast-align -Wimplicit-fallthrough -Wunused-parameter -Wsign-compare)
|
ocv_warnings_disable(CMAKE_C_FLAGS -Wundef -Wcast-align -Wimplicit-fallthrough -Wunused-parameter -Wsign-compare)
|
||||||
@@ -92,7 +92,7 @@ if(ENABLE_SOLUTION_FOLDERS)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(NOT BUILD_SHARED_LIBS)
|
if(NOT BUILD_SHARED_LIBS)
|
||||||
ocv_install_target(${PNG_LIBRARY} EXPORT OpenCVModules ARCHIVE DESTINATION ${OPENCV_3P_LIB_INSTALL_PATH} COMPONENT dev)
|
ocv_install_target(${PNG_LIBRARY} EXPORT OpenCVModules ARCHIVE DESTINATION ${OPENCV_3P_LIB_INSTALL_PATH} COMPONENT dev OPTIONAL)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
ocv_install_3rdparty_licenses(libpng LICENSE README)
|
ocv_install_3rdparty_licenses(libpng LICENSE README)
|
||||||
|
|||||||
Vendored
+3
-5
@@ -22,7 +22,7 @@
|
|||||||
# sqfu@openailab.com
|
# sqfu@openailab.com
|
||||||
#
|
#
|
||||||
|
|
||||||
SET(TENGINE_COMMIT_VERSION "2f3cd86217f3530c8e4a82f3ed5af14c7a4e3943")
|
SET(TENGINE_COMMIT_VERSION "8a4c58e0e05cd850f4bb0936a330edc86dc0e28c")
|
||||||
SET(OCV_TENGINE_DIR "${OpenCV_BINARY_DIR}/3rdparty/libtengine")
|
SET(OCV_TENGINE_DIR "${OpenCV_BINARY_DIR}/3rdparty/libtengine")
|
||||||
SET(OCV_TENGINE_SOURCE_PATH "${OCV_TENGINE_DIR}/Tengine-${TENGINE_COMMIT_VERSION}")
|
SET(OCV_TENGINE_SOURCE_PATH "${OCV_TENGINE_DIR}/Tengine-${TENGINE_COMMIT_VERSION}")
|
||||||
|
|
||||||
@@ -34,7 +34,7 @@ IF(EXISTS "${OCV_TENGINE_SOURCE_PATH}")
|
|||||||
ELSE()
|
ELSE()
|
||||||
SET(OCV_TENGINE_FILENAME "${TENGINE_COMMIT_VERSION}.zip")#name2
|
SET(OCV_TENGINE_FILENAME "${TENGINE_COMMIT_VERSION}.zip")#name2
|
||||||
SET(OCV_TENGINE_URL "https://github.com/OAID/Tengine/archive/") #url2
|
SET(OCV_TENGINE_URL "https://github.com/OAID/Tengine/archive/") #url2
|
||||||
SET(tengine_md5sum 9124324b6e2b350012e46ae1db4bad7d) #md5sum2
|
SET(tengine_md5sum f51ca8f3963faeeff3f019a6f6edc206) #md5sum2
|
||||||
|
|
||||||
#MESSAGE(STATUS "**** TENGINE DOWNLOAD BEGIN ****")
|
#MESSAGE(STATUS "**** TENGINE DOWNLOAD BEGIN ****")
|
||||||
ocv_download(FILENAME ${OCV_TENGINE_FILENAME}
|
ocv_download(FILENAME ${OCV_TENGINE_FILENAME}
|
||||||
@@ -69,7 +69,6 @@ if(BUILD_TENGINE)
|
|||||||
elseif(${ANDROID_ABI} STREQUAL "arm64-v8a")
|
elseif(${ANDROID_ABI} STREQUAL "arm64-v8a")
|
||||||
SET(CONFIG_ARCH_ARM64 ON)
|
SET(CONFIG_ARCH_ARM64 ON)
|
||||||
endif()
|
endif()
|
||||||
SET(Tengine_LIB "tengine" CACHE INTERNAL "")
|
|
||||||
else()
|
else()
|
||||||
# linux system
|
# linux system
|
||||||
if(CMAKE_SYSTEM_PROCESSOR STREQUAL arm)
|
if(CMAKE_SYSTEM_PROCESSOR STREQUAL arm)
|
||||||
@@ -77,7 +76,6 @@ if(BUILD_TENGINE)
|
|||||||
elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64) ## AARCH64
|
elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64) ## AARCH64
|
||||||
SET(CONFIG_ARCH_ARM64 ON)
|
SET(CONFIG_ARCH_ARM64 ON)
|
||||||
endif()
|
endif()
|
||||||
SET(Tengine_LIB "tengine" CACHE INTERNAL "")
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
SET(BUILT_IN_OPENCV ON) ## set for tengine compile discern .
|
SET(BUILT_IN_OPENCV ON) ## set for tengine compile discern .
|
||||||
@@ -86,6 +84,6 @@ if(BUILD_TENGINE)
|
|||||||
add_subdirectory("${OCV_TENGINE_SOURCE_PATH}" "${OCV_TENGINE_DIR}/build")
|
add_subdirectory("${OCV_TENGINE_SOURCE_PATH}" "${OCV_TENGINE_DIR}/build")
|
||||||
else()
|
else()
|
||||||
message(WARNING "TENGINE: Missing 'CMakeLists.txt' in source code package: ${OCV_TENGINE_SOURCE_PATH}")
|
message(WARNING "TENGINE: Missing 'CMakeLists.txt' in source code package: ${OCV_TENGINE_SOURCE_PATH}")
|
||||||
SET(HAVE_TENGINE 1)
|
|
||||||
endif()
|
endif()
|
||||||
|
SET(Tengine_LIB "tengine" CACHE INTERNAL "")
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
Vendored
+5
-2
@@ -239,6 +239,9 @@ if(HOST_BIG_ENDIAN)
|
|||||||
else()
|
else()
|
||||||
set(HOST_BIG_ENDIAN 0)
|
set(HOST_BIG_ENDIAN 0)
|
||||||
endif()
|
endif()
|
||||||
|
if(HOST_BIG_ENDIAN)
|
||||||
|
add_definitions(-DWORDS_BIGENDIAN)
|
||||||
|
endif()
|
||||||
|
|
||||||
# IEEE floating point
|
# IEEE floating point
|
||||||
set(HAVE_IEEEFP 1 CACHE STRING "IEEE floating point is available")
|
set(HAVE_IEEEFP 1 CACHE STRING "IEEE floating point is available")
|
||||||
@@ -462,7 +465,7 @@ ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4456 /wd4457 /wd4312) # vs2015
|
|||||||
|
|
||||||
ocv_warnings_disable(CMAKE_C_FLAGS /wd4267 /wd4244 /wd4018 /wd4311 /wd4312)
|
ocv_warnings_disable(CMAKE_C_FLAGS /wd4267 /wd4244 /wd4018 /wd4311 /wd4312)
|
||||||
|
|
||||||
add_library(${TIFF_LIBRARY} STATIC ${lib_srcs})
|
add_library(${TIFF_LIBRARY} STATIC ${OPENCV_3RDPARTY_EXCLUDE_FROM_ALL} ${lib_srcs})
|
||||||
target_link_libraries(${TIFF_LIBRARY} ${ZLIB_LIBRARIES})
|
target_link_libraries(${TIFF_LIBRARY} ${ZLIB_LIBRARIES})
|
||||||
|
|
||||||
set_target_properties(${TIFF_LIBRARY}
|
set_target_properties(${TIFF_LIBRARY}
|
||||||
@@ -479,7 +482,7 @@ if(ENABLE_SOLUTION_FOLDERS)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(NOT BUILD_SHARED_LIBS)
|
if(NOT BUILD_SHARED_LIBS)
|
||||||
ocv_install_target(${TIFF_LIBRARY} EXPORT OpenCVModules ARCHIVE DESTINATION ${OPENCV_3P_LIB_INSTALL_PATH} COMPONENT dev)
|
ocv_install_target(${TIFF_LIBRARY} EXPORT OpenCVModules ARCHIVE DESTINATION ${OPENCV_3P_LIB_INSTALL_PATH} COMPONENT dev OPTIONAL)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
ocv_install_3rdparty_licenses(libtiff COPYRIGHT)
|
ocv_install_3rdparty_licenses(libtiff COPYRIGHT)
|
||||||
|
|||||||
Vendored
+2326
File diff suppressed because it is too large
Load Diff
Vendored
+8
-4
@@ -24,6 +24,10 @@
|
|||||||
#ifndef _LIBPORT_
|
#ifndef _LIBPORT_
|
||||||
#define _LIBPORT_
|
#define _LIBPORT_
|
||||||
|
|
||||||
|
#if defined(HAVE_CONFIG_H)
|
||||||
|
# include <tif_config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
int getopt(int argc, char * const argv[], const char *optstring);
|
int getopt(int argc, char * const argv[], const char *optstring);
|
||||||
extern char *optarg;
|
extern char *optarg;
|
||||||
extern int opterr;
|
extern int opterr;
|
||||||
@@ -36,16 +40,16 @@ int strcasecmp(const char *s1, const char *s2);
|
|||||||
# define HAVE_GETOPT 1
|
# define HAVE_GETOPT 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if HAVE_STRTOL
|
#if !defined(HAVE_STRTOL)
|
||||||
long strtol(const char *nptr, char **endptr, int base);
|
long strtol(const char *nptr, char **endptr, int base);
|
||||||
#endif
|
#endif
|
||||||
#if HAVE_STRTOLL
|
#if !defined(HAVE_STRTOLL)
|
||||||
long long strtoll(const char *nptr, char **endptr, int base);
|
long long strtoll(const char *nptr, char **endptr, int base);
|
||||||
#endif
|
#endif
|
||||||
#if HAVE_STRTOUL
|
#if !defined(HAVE_STRTOUL)
|
||||||
unsigned long strtoul(const char *nptr, char **endptr, int base);
|
unsigned long strtoul(const char *nptr, char **endptr, int base);
|
||||||
#endif
|
#endif
|
||||||
#if HAVE_STRTOULL
|
#if !defined(HAVE_STRTOULL)
|
||||||
unsigned long long strtoull(const char *nptr, char **endptr, int base);
|
unsigned long long strtoull(const char *nptr, char **endptr, int base);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
Vendored
+62
-27
@@ -35,27 +35,61 @@
|
|||||||
uint32
|
uint32
|
||||||
_TIFFMultiply32(TIFF* tif, uint32 first, uint32 second, const char* where)
|
_TIFFMultiply32(TIFF* tif, uint32 first, uint32 second, const char* where)
|
||||||
{
|
{
|
||||||
uint32 bytes = first * second;
|
if (second && first > TIFF_UINT32_MAX / second) {
|
||||||
|
|
||||||
if (second && bytes / second != first) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, where, "Integer overflow in %s", where);
|
TIFFErrorExt(tif->tif_clientdata, where, "Integer overflow in %s", where);
|
||||||
bytes = 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return bytes;
|
return first * second;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64
|
uint64
|
||||||
_TIFFMultiply64(TIFF* tif, uint64 first, uint64 second, const char* where)
|
_TIFFMultiply64(TIFF* tif, uint64 first, uint64 second, const char* where)
|
||||||
{
|
{
|
||||||
uint64 bytes = first * second;
|
if (second && first > TIFF_UINT64_MAX / second) {
|
||||||
|
|
||||||
if (second && bytes / second != first) {
|
|
||||||
TIFFErrorExt(tif->tif_clientdata, where, "Integer overflow in %s", where);
|
TIFFErrorExt(tif->tif_clientdata, where, "Integer overflow in %s", where);
|
||||||
bytes = 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return bytes;
|
return first * second;
|
||||||
|
}
|
||||||
|
|
||||||
|
tmsize_t
|
||||||
|
_TIFFMultiplySSize(TIFF* tif, tmsize_t first, tmsize_t second, const char* where)
|
||||||
|
{
|
||||||
|
if( first <= 0 || second <= 0 )
|
||||||
|
{
|
||||||
|
if( tif != NULL && where != NULL )
|
||||||
|
{
|
||||||
|
TIFFErrorExt(tif->tif_clientdata, where,
|
||||||
|
"Invalid argument to _TIFFMultiplySSize() in %s", where);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( first > TIFF_TMSIZE_T_MAX / second )
|
||||||
|
{
|
||||||
|
if( tif != NULL && where != NULL )
|
||||||
|
{
|
||||||
|
TIFFErrorExt(tif->tif_clientdata, where,
|
||||||
|
"Integer overflow in %s", where);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return first * second;
|
||||||
|
}
|
||||||
|
|
||||||
|
tmsize_t _TIFFCastUInt64ToSSize(TIFF* tif, uint64 val, const char* module)
|
||||||
|
{
|
||||||
|
if( val > (uint64)TIFF_TMSIZE_T_MAX )
|
||||||
|
{
|
||||||
|
if( tif != NULL && module != NULL )
|
||||||
|
{
|
||||||
|
TIFFErrorExt(tif->tif_clientdata,module,"Integer overflow");
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return (tmsize_t)val;
|
||||||
}
|
}
|
||||||
|
|
||||||
void*
|
void*
|
||||||
@@ -63,13 +97,14 @@ _TIFFCheckRealloc(TIFF* tif, void* buffer,
|
|||||||
tmsize_t nmemb, tmsize_t elem_size, const char* what)
|
tmsize_t nmemb, tmsize_t elem_size, const char* what)
|
||||||
{
|
{
|
||||||
void* cp = NULL;
|
void* cp = NULL;
|
||||||
tmsize_t bytes = nmemb * elem_size;
|
tmsize_t count = _TIFFMultiplySSize(tif, nmemb, elem_size, NULL);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* XXX: Check for integer overflow.
|
* Check for integer overflow.
|
||||||
*/
|
*/
|
||||||
if (nmemb && elem_size && bytes / elem_size == nmemb)
|
if (count != 0)
|
||||||
cp = _TIFFrealloc(buffer, bytes);
|
{
|
||||||
|
cp = _TIFFrealloc(buffer, count);
|
||||||
|
}
|
||||||
|
|
||||||
if (cp == NULL) {
|
if (cp == NULL) {
|
||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
||||||
@@ -235,7 +270,7 @@ TIFFVGetFieldDefaulted(TIFF* tif, uint32 tag, va_list ap)
|
|||||||
return (1);
|
return (1);
|
||||||
case TIFFTAG_EXTRASAMPLES:
|
case TIFFTAG_EXTRASAMPLES:
|
||||||
*va_arg(ap, uint16 *) = td->td_extrasamples;
|
*va_arg(ap, uint16 *) = td->td_extrasamples;
|
||||||
*va_arg(ap, uint16 **) = td->td_sampleinfo;
|
*va_arg(ap, const uint16 **) = td->td_sampleinfo;
|
||||||
return (1);
|
return (1);
|
||||||
case TIFFTAG_MATTEING:
|
case TIFFTAG_MATTEING:
|
||||||
*va_arg(ap, uint16 *) =
|
*va_arg(ap, uint16 *) =
|
||||||
@@ -257,8 +292,8 @@ TIFFVGetFieldDefaulted(TIFF* tif, uint32 tag, va_list ap)
|
|||||||
case TIFFTAG_YCBCRCOEFFICIENTS:
|
case TIFFTAG_YCBCRCOEFFICIENTS:
|
||||||
{
|
{
|
||||||
/* defaults are from CCIR Recommendation 601-1 */
|
/* defaults are from CCIR Recommendation 601-1 */
|
||||||
static float ycbcrcoeffs[] = { 0.299f, 0.587f, 0.114f };
|
static const float ycbcrcoeffs[] = { 0.299f, 0.587f, 0.114f };
|
||||||
*va_arg(ap, float **) = ycbcrcoeffs;
|
*va_arg(ap, const float **) = ycbcrcoeffs;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
case TIFFTAG_YCBCRSUBSAMPLING:
|
case TIFFTAG_YCBCRSUBSAMPLING:
|
||||||
@@ -270,14 +305,14 @@ TIFFVGetFieldDefaulted(TIFF* tif, uint32 tag, va_list ap)
|
|||||||
return (1);
|
return (1);
|
||||||
case TIFFTAG_WHITEPOINT:
|
case TIFFTAG_WHITEPOINT:
|
||||||
{
|
{
|
||||||
static float whitepoint[2];
|
|
||||||
|
|
||||||
/* TIFF 6.0 specification tells that it is no default
|
/* TIFF 6.0 specification tells that it is no default
|
||||||
value for the WhitePoint, but AdobePhotoshop TIFF
|
value for the WhitePoint, but AdobePhotoshop TIFF
|
||||||
Technical Note tells that it should be CIE D50. */
|
Technical Note tells that it should be CIE D50. */
|
||||||
whitepoint[0] = D50_X0 / (D50_X0 + D50_Y0 + D50_Z0);
|
static const float whitepoint[] = {
|
||||||
whitepoint[1] = D50_Y0 / (D50_X0 + D50_Y0 + D50_Z0);
|
D50_X0 / (D50_X0 + D50_Y0 + D50_Z0),
|
||||||
*va_arg(ap, float **) = whitepoint;
|
D50_Y0 / (D50_X0 + D50_Y0 + D50_Z0)
|
||||||
|
};
|
||||||
|
*va_arg(ap, const float **) = whitepoint;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
case TIFFTAG_TRANSFERFUNCTION:
|
case TIFFTAG_TRANSFERFUNCTION:
|
||||||
@@ -286,16 +321,16 @@ TIFFVGetFieldDefaulted(TIFF* tif, uint32 tag, va_list ap)
|
|||||||
TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "No space for \"TransferFunction\" tag");
|
TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "No space for \"TransferFunction\" tag");
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
*va_arg(ap, uint16 **) = td->td_transferfunction[0];
|
*va_arg(ap, const uint16 **) = td->td_transferfunction[0];
|
||||||
if (td->td_samplesperpixel - td->td_extrasamples > 1) {
|
if (td->td_samplesperpixel - td->td_extrasamples > 1) {
|
||||||
*va_arg(ap, uint16 **) = td->td_transferfunction[1];
|
*va_arg(ap, const uint16 **) = td->td_transferfunction[1];
|
||||||
*va_arg(ap, uint16 **) = td->td_transferfunction[2];
|
*va_arg(ap, const uint16 **) = td->td_transferfunction[2];
|
||||||
}
|
}
|
||||||
return (1);
|
return (1);
|
||||||
case TIFFTAG_REFERENCEBLACKWHITE:
|
case TIFFTAG_REFERENCEBLACKWHITE:
|
||||||
if (!td->td_refblackwhite && !TIFFDefaultRefBlackWhite(td))
|
if (!td->td_refblackwhite && !TIFFDefaultRefBlackWhite(td))
|
||||||
return (0);
|
return (0);
|
||||||
*va_arg(ap, float **) = td->td_refblackwhite;
|
*va_arg(ap, const float **) = td->td_refblackwhite;
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
Vendored
+1
-1
@@ -264,7 +264,7 @@ TIFFGetConfiguredCODECs()
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
codecs = new_codecs;
|
codecs = new_codecs;
|
||||||
_TIFFmemcpy(codecs + i - 1, cd, sizeof(TIFFCodec));
|
_TIFFmemcpy(codecs + i - 1, cd->info, sizeof(TIFFCodec));
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
for (c = _TIFFBuiltinCODECS; c->name; c++) {
|
for (c = _TIFFBuiltinCODECS; c->name; c++) {
|
||||||
|
|||||||
Vendored
+79
-28
@@ -29,6 +29,7 @@
|
|||||||
* (and also some miscellaneous stuff)
|
* (and also some miscellaneous stuff)
|
||||||
*/
|
*/
|
||||||
#include "tiffiop.h"
|
#include "tiffiop.h"
|
||||||
|
#include <float.h> /*--: for Rational2Double */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* These are used in the backwards compatibility code...
|
* These are used in the backwards compatibility code...
|
||||||
@@ -46,8 +47,8 @@ setByteArray(void** vpp, void* vp, size_t nmemb, size_t elem_size)
|
|||||||
*vpp = 0;
|
*vpp = 0;
|
||||||
}
|
}
|
||||||
if (vp) {
|
if (vp) {
|
||||||
tmsize_t bytes = (tmsize_t)(nmemb * elem_size);
|
tmsize_t bytes = _TIFFMultiplySSize(NULL, nmemb, elem_size, NULL);
|
||||||
if (elem_size && bytes / elem_size == nmemb)
|
if (bytes)
|
||||||
*vpp = (void*) _TIFFmalloc(bytes);
|
*vpp = (void*) _TIFFmalloc(bytes);
|
||||||
if (*vpp)
|
if (*vpp)
|
||||||
_TIFFmemcpy(*vpp, vp, bytes);
|
_TIFFmemcpy(*vpp, vp, bytes);
|
||||||
@@ -123,7 +124,7 @@ setExtraSamples(TIFF* tif, va_list ap, uint32* v)
|
|||||||
{
|
{
|
||||||
TIFFWarningExt(tif->tif_clientdata,module,
|
TIFFWarningExt(tif->tif_clientdata,module,
|
||||||
"ExtraSamples tag value is changing, "
|
"ExtraSamples tag value is changing, "
|
||||||
"but TransferFunction was read with a different value. Cancelling it");
|
"but TransferFunction was read with a different value. Canceling it");
|
||||||
TIFFClrFieldBit(tif,FIELD_TRANSFERFUNCTION);
|
TIFFClrFieldBit(tif,FIELD_TRANSFERFUNCTION);
|
||||||
_TIFFfree(td->td_transferfunction[0]);
|
_TIFFfree(td->td_transferfunction[0]);
|
||||||
td->td_transferfunction[0] = NULL;
|
td->td_transferfunction[0] = NULL;
|
||||||
@@ -205,7 +206,7 @@ _TIFFVSetField(TIFF* tif, uint32 tag, va_list ap)
|
|||||||
/*
|
/*
|
||||||
* If the data require post-decoding processing to byte-swap
|
* If the data require post-decoding processing to byte-swap
|
||||||
* samples, set it up here. Note that since tags are required
|
* samples, set it up here. Note that since tags are required
|
||||||
* to be ordered, compression code can override this behaviour
|
* to be ordered, compression code can override this behavior
|
||||||
* in the setup method if it wants to roll the post decoding
|
* in the setup method if it wants to roll the post decoding
|
||||||
* work in with its normal work.
|
* work in with its normal work.
|
||||||
*/
|
*/
|
||||||
@@ -275,7 +276,7 @@ _TIFFVSetField(TIFF* tif, uint32 tag, va_list ap)
|
|||||||
{
|
{
|
||||||
TIFFWarningExt(tif->tif_clientdata,module,
|
TIFFWarningExt(tif->tif_clientdata,module,
|
||||||
"SamplesPerPixel tag value is changing, "
|
"SamplesPerPixel tag value is changing, "
|
||||||
"but SMinSampleValue tag was read with a different value. Cancelling it");
|
"but SMinSampleValue tag was read with a different value. Canceling it");
|
||||||
TIFFClrFieldBit(tif,FIELD_SMINSAMPLEVALUE);
|
TIFFClrFieldBit(tif,FIELD_SMINSAMPLEVALUE);
|
||||||
_TIFFfree(td->td_sminsamplevalue);
|
_TIFFfree(td->td_sminsamplevalue);
|
||||||
td->td_sminsamplevalue = NULL;
|
td->td_sminsamplevalue = NULL;
|
||||||
@@ -284,7 +285,7 @@ _TIFFVSetField(TIFF* tif, uint32 tag, va_list ap)
|
|||||||
{
|
{
|
||||||
TIFFWarningExt(tif->tif_clientdata,module,
|
TIFFWarningExt(tif->tif_clientdata,module,
|
||||||
"SamplesPerPixel tag value is changing, "
|
"SamplesPerPixel tag value is changing, "
|
||||||
"but SMaxSampleValue tag was read with a different value. Cancelling it");
|
"but SMaxSampleValue tag was read with a different value. Canceling it");
|
||||||
TIFFClrFieldBit(tif,FIELD_SMAXSAMPLEVALUE);
|
TIFFClrFieldBit(tif,FIELD_SMAXSAMPLEVALUE);
|
||||||
_TIFFfree(td->td_smaxsamplevalue);
|
_TIFFfree(td->td_smaxsamplevalue);
|
||||||
td->td_smaxsamplevalue = NULL;
|
td->td_smaxsamplevalue = NULL;
|
||||||
@@ -296,7 +297,7 @@ _TIFFVSetField(TIFF* tif, uint32 tag, va_list ap)
|
|||||||
{
|
{
|
||||||
TIFFWarningExt(tif->tif_clientdata,module,
|
TIFFWarningExt(tif->tif_clientdata,module,
|
||||||
"SamplesPerPixel tag value is changing, "
|
"SamplesPerPixel tag value is changing, "
|
||||||
"but TransferFunction was read with a different value. Cancelling it");
|
"but TransferFunction was read with a different value. Canceling it");
|
||||||
TIFFClrFieldBit(tif,FIELD_TRANSFERFUNCTION);
|
TIFFClrFieldBit(tif,FIELD_TRANSFERFUNCTION);
|
||||||
_TIFFfree(td->td_transferfunction[0]);
|
_TIFFfree(td->td_transferfunction[0]);
|
||||||
td->td_transferfunction[0] = NULL;
|
td->td_transferfunction[0] = NULL;
|
||||||
@@ -393,7 +394,7 @@ _TIFFVSetField(TIFF* tif, uint32 tag, va_list ap)
|
|||||||
if (tif->tif_mode != O_RDONLY)
|
if (tif->tif_mode != O_RDONLY)
|
||||||
goto badvalue32;
|
goto badvalue32;
|
||||||
TIFFWarningExt(tif->tif_clientdata, tif->tif_name,
|
TIFFWarningExt(tif->tif_clientdata, tif->tif_name,
|
||||||
"Nonstandard tile width %d, convert file", v32);
|
"Nonstandard tile width %u, convert file", v32);
|
||||||
}
|
}
|
||||||
td->td_tilewidth = v32;
|
td->td_tilewidth = v32;
|
||||||
tif->tif_flags |= TIFF_ISTILED;
|
tif->tif_flags |= TIFF_ISTILED;
|
||||||
@@ -404,7 +405,7 @@ _TIFFVSetField(TIFF* tif, uint32 tag, va_list ap)
|
|||||||
if (tif->tif_mode != O_RDONLY)
|
if (tif->tif_mode != O_RDONLY)
|
||||||
goto badvalue32;
|
goto badvalue32;
|
||||||
TIFFWarningExt(tif->tif_clientdata, tif->tif_name,
|
TIFFWarningExt(tif->tif_clientdata, tif->tif_name,
|
||||||
"Nonstandard tile length %d, convert file", v32);
|
"Nonstandard tile length %u, convert file", v32);
|
||||||
}
|
}
|
||||||
td->td_tilelength = v32;
|
td->td_tilelength = v32;
|
||||||
tif->tif_flags |= TIFF_ISTILED;
|
tif->tif_flags |= TIFF_ISTILED;
|
||||||
@@ -559,6 +560,10 @@ _TIFFVSetField(TIFF* tif, uint32 tag, va_list ap)
|
|||||||
* Set custom value ... save a copy of the custom tag value.
|
* Set custom value ... save a copy of the custom tag value.
|
||||||
*/
|
*/
|
||||||
tv_size = _TIFFDataSize(fip->field_type);
|
tv_size = _TIFFDataSize(fip->field_type);
|
||||||
|
/*--: Rational2Double: For Rationals evaluate "set_field_type" to determine internal storage size. */
|
||||||
|
if (fip->field_type == TIFF_RATIONAL || fip->field_type == TIFF_SRATIONAL) {
|
||||||
|
tv_size = _TIFFSetGetFieldSize(fip->set_field_type);
|
||||||
|
}
|
||||||
if (tv_size == 0) {
|
if (tv_size == 0) {
|
||||||
status = 0;
|
status = 0;
|
||||||
TIFFErrorExt(tif->tif_clientdata, module,
|
TIFFErrorExt(tif->tif_clientdata, module,
|
||||||
@@ -638,6 +643,7 @@ _TIFFVSetField(TIFF* tif, uint32 tag, va_list ap)
|
|||||||
|| fip->field_writecount == TIFF_VARIABLE2
|
|| fip->field_writecount == TIFF_VARIABLE2
|
||||||
|| fip->field_writecount == TIFF_SPP
|
|| fip->field_writecount == TIFF_SPP
|
||||||
|| tv->count > 1) {
|
|| tv->count > 1) {
|
||||||
|
/*--: Rational2Double: For Rationals tv_size is set above to 4 or 8 according to fip->set_field_type! */
|
||||||
_TIFFmemcpy(tv->value, va_arg(ap, void *),
|
_TIFFmemcpy(tv->value, va_arg(ap, void *),
|
||||||
tv->count * tv_size);
|
tv->count * tv_size);
|
||||||
} else {
|
} else {
|
||||||
@@ -698,6 +704,22 @@ _TIFFVSetField(TIFF* tif, uint32 tag, va_list ap)
|
|||||||
break;
|
break;
|
||||||
case TIFF_RATIONAL:
|
case TIFF_RATIONAL:
|
||||||
case TIFF_SRATIONAL:
|
case TIFF_SRATIONAL:
|
||||||
|
/*-- Rational2Double: For Rationals tv_size is set above to 4 or 8 according to fip->set_field_type! */
|
||||||
|
{
|
||||||
|
if (tv_size == 8) {
|
||||||
|
double v2 = va_arg(ap, double);
|
||||||
|
_TIFFmemcpy(val, &v2, tv_size);
|
||||||
|
} else {
|
||||||
|
/*-- default should be tv_size == 4 */
|
||||||
|
float v3 = (float)va_arg(ap, double);
|
||||||
|
_TIFFmemcpy(val, &v3, tv_size);
|
||||||
|
/*-- ToDo: After Testing, this should be removed and tv_size==4 should be set as default. */
|
||||||
|
if (tv_size != 4) {
|
||||||
|
TIFFErrorExt(0,"TIFFLib: _TIFFVSetField()", "Rational2Double: .set_field_type in not 4 but %d", tv_size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
case TIFF_FLOAT:
|
case TIFF_FLOAT:
|
||||||
{
|
{
|
||||||
float v2 = _TIFFClampDoubleToFloat(va_arg(ap, double));
|
float v2 = _TIFFClampDoubleToFloat(va_arg(ap, double));
|
||||||
@@ -1011,19 +1033,19 @@ _TIFFVGetField(TIFF* tif, uint32 tag, va_list ap)
|
|||||||
*va_arg(ap, uint16*) = td->td_halftonehints[1];
|
*va_arg(ap, uint16*) = td->td_halftonehints[1];
|
||||||
break;
|
break;
|
||||||
case TIFFTAG_COLORMAP:
|
case TIFFTAG_COLORMAP:
|
||||||
*va_arg(ap, uint16**) = td->td_colormap[0];
|
*va_arg(ap, const uint16**) = td->td_colormap[0];
|
||||||
*va_arg(ap, uint16**) = td->td_colormap[1];
|
*va_arg(ap, const uint16**) = td->td_colormap[1];
|
||||||
*va_arg(ap, uint16**) = td->td_colormap[2];
|
*va_arg(ap, const uint16**) = td->td_colormap[2];
|
||||||
break;
|
break;
|
||||||
case TIFFTAG_STRIPOFFSETS:
|
case TIFFTAG_STRIPOFFSETS:
|
||||||
case TIFFTAG_TILEOFFSETS:
|
case TIFFTAG_TILEOFFSETS:
|
||||||
_TIFFFillStriles( tif );
|
_TIFFFillStriles( tif );
|
||||||
*va_arg(ap, uint64**) = td->td_stripoffset;
|
*va_arg(ap, const uint64**) = td->td_stripoffset_p;
|
||||||
break;
|
break;
|
||||||
case TIFFTAG_STRIPBYTECOUNTS:
|
case TIFFTAG_STRIPBYTECOUNTS:
|
||||||
case TIFFTAG_TILEBYTECOUNTS:
|
case TIFFTAG_TILEBYTECOUNTS:
|
||||||
_TIFFFillStriles( tif );
|
_TIFFFillStriles( tif );
|
||||||
*va_arg(ap, uint64**) = td->td_stripbytecount;
|
*va_arg(ap, const uint64**) = td->td_stripbytecount_p;
|
||||||
break;
|
break;
|
||||||
case TIFFTAG_MATTEING:
|
case TIFFTAG_MATTEING:
|
||||||
*va_arg(ap, uint16*) =
|
*va_arg(ap, uint16*) =
|
||||||
@@ -1032,7 +1054,7 @@ _TIFFVGetField(TIFF* tif, uint32 tag, va_list ap)
|
|||||||
break;
|
break;
|
||||||
case TIFFTAG_EXTRASAMPLES:
|
case TIFFTAG_EXTRASAMPLES:
|
||||||
*va_arg(ap, uint16*) = td->td_extrasamples;
|
*va_arg(ap, uint16*) = td->td_extrasamples;
|
||||||
*va_arg(ap, uint16**) = td->td_sampleinfo;
|
*va_arg(ap, const uint16**) = td->td_sampleinfo;
|
||||||
break;
|
break;
|
||||||
case TIFFTAG_TILEWIDTH:
|
case TIFFTAG_TILEWIDTH:
|
||||||
*va_arg(ap, uint32*) = td->td_tilewidth;
|
*va_arg(ap, uint32*) = td->td_tilewidth;
|
||||||
@@ -1067,7 +1089,7 @@ _TIFFVGetField(TIFF* tif, uint32 tag, va_list ap)
|
|||||||
break;
|
break;
|
||||||
case TIFFTAG_SUBIFD:
|
case TIFFTAG_SUBIFD:
|
||||||
*va_arg(ap, uint16*) = td->td_nsubifd;
|
*va_arg(ap, uint16*) = td->td_nsubifd;
|
||||||
*va_arg(ap, uint64**) = td->td_subifd;
|
*va_arg(ap, const uint64**) = td->td_subifd;
|
||||||
break;
|
break;
|
||||||
case TIFFTAG_YCBCRPOSITIONING:
|
case TIFFTAG_YCBCRPOSITIONING:
|
||||||
*va_arg(ap, uint16*) = td->td_ycbcrpositioning;
|
*va_arg(ap, uint16*) = td->td_ycbcrpositioning;
|
||||||
@@ -1077,20 +1099,20 @@ _TIFFVGetField(TIFF* tif, uint32 tag, va_list ap)
|
|||||||
*va_arg(ap, uint16*) = td->td_ycbcrsubsampling[1];
|
*va_arg(ap, uint16*) = td->td_ycbcrsubsampling[1];
|
||||||
break;
|
break;
|
||||||
case TIFFTAG_TRANSFERFUNCTION:
|
case TIFFTAG_TRANSFERFUNCTION:
|
||||||
*va_arg(ap, uint16**) = td->td_transferfunction[0];
|
*va_arg(ap, const uint16**) = td->td_transferfunction[0];
|
||||||
if (td->td_samplesperpixel - td->td_extrasamples > 1) {
|
if (td->td_samplesperpixel - td->td_extrasamples > 1) {
|
||||||
*va_arg(ap, uint16**) = td->td_transferfunction[1];
|
*va_arg(ap, const uint16**) = td->td_transferfunction[1];
|
||||||
*va_arg(ap, uint16**) = td->td_transferfunction[2];
|
*va_arg(ap, const uint16**) = td->td_transferfunction[2];
|
||||||
} else {
|
} else {
|
||||||
*va_arg(ap, uint16**) = NULL;
|
*va_arg(ap, const uint16**) = NULL;
|
||||||
*va_arg(ap, uint16**) = NULL;
|
*va_arg(ap, const uint16**) = NULL;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TIFFTAG_REFERENCEBLACKWHITE:
|
case TIFFTAG_REFERENCEBLACKWHITE:
|
||||||
*va_arg(ap, float**) = td->td_refblackwhite;
|
*va_arg(ap, const float**) = td->td_refblackwhite;
|
||||||
break;
|
break;
|
||||||
case TIFFTAG_INKNAMES:
|
case TIFFTAG_INKNAMES:
|
||||||
*va_arg(ap, char**) = td->td_inknames;
|
*va_arg(ap, const char**) = td->td_inknames;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
@@ -1132,7 +1154,7 @@ _TIFFVGetField(TIFF* tif, uint32 tag, va_list ap)
|
|||||||
*va_arg(ap, uint32*) = (uint32)tv->count;
|
*va_arg(ap, uint32*) = (uint32)tv->count;
|
||||||
else /* Assume TIFF_VARIABLE */
|
else /* Assume TIFF_VARIABLE */
|
||||||
*va_arg(ap, uint16*) = (uint16)tv->count;
|
*va_arg(ap, uint16*) = (uint16)tv->count;
|
||||||
*va_arg(ap, void **) = tv->value;
|
*va_arg(ap, const void **) = tv->value;
|
||||||
ret_val = 1;
|
ret_val = 1;
|
||||||
} else if (fip->field_tag == TIFFTAG_DOTRANGE
|
} else if (fip->field_tag == TIFFTAG_DOTRANGE
|
||||||
&& strcmp(fip->field_name,"DotRange") == 0) {
|
&& strcmp(fip->field_name,"DotRange") == 0) {
|
||||||
@@ -1200,6 +1222,23 @@ _TIFFVGetField(TIFF* tif, uint32 tag, va_list ap)
|
|||||||
break;
|
break;
|
||||||
case TIFF_RATIONAL:
|
case TIFF_RATIONAL:
|
||||||
case TIFF_SRATIONAL:
|
case TIFF_SRATIONAL:
|
||||||
|
{
|
||||||
|
/*-- Rational2Double: For Rationals evaluate "set_field_type" to determine internal storage size and return value size. */
|
||||||
|
int tv_size = _TIFFSetGetFieldSize(fip->set_field_type);
|
||||||
|
if (tv_size == 8) {
|
||||||
|
*va_arg(ap, double*) = *(double *)val;
|
||||||
|
ret_val = 1;
|
||||||
|
} else {
|
||||||
|
/*-- default should be tv_size == 4 */
|
||||||
|
*va_arg(ap, float*) = *(float *)val;
|
||||||
|
ret_val = 1;
|
||||||
|
/*-- ToDo: After Testing, this should be removed and tv_size==4 should be set as default. */
|
||||||
|
if (tv_size != 4) {
|
||||||
|
TIFFErrorExt(0,"TIFFLib: _TIFFVGetField()", "Rational2Double: .set_field_type in not 4 but %d", tv_size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
case TIFF_FLOAT:
|
case TIFF_FLOAT:
|
||||||
*va_arg(ap, float*) =
|
*va_arg(ap, float*) =
|
||||||
*(float *)val;
|
*(float *)val;
|
||||||
@@ -1282,8 +1321,9 @@ TIFFFreeDirectory(TIFF* tif)
|
|||||||
CleanupField(td_transferfunction[0]);
|
CleanupField(td_transferfunction[0]);
|
||||||
CleanupField(td_transferfunction[1]);
|
CleanupField(td_transferfunction[1]);
|
||||||
CleanupField(td_transferfunction[2]);
|
CleanupField(td_transferfunction[2]);
|
||||||
CleanupField(td_stripoffset);
|
CleanupField(td_stripoffset_p);
|
||||||
CleanupField(td_stripbytecount);
|
CleanupField(td_stripbytecount_p);
|
||||||
|
td->td_stripoffsetbyteallocsize = 0;
|
||||||
TIFFClrFieldBit(tif, FIELD_YCBCRSUBSAMPLING);
|
TIFFClrFieldBit(tif, FIELD_YCBCRSUBSAMPLING);
|
||||||
TIFFClrFieldBit(tif, FIELD_YCBCRPOSITIONING);
|
TIFFClrFieldBit(tif, FIELD_YCBCRPOSITIONING);
|
||||||
|
|
||||||
@@ -1296,10 +1336,8 @@ TIFFFreeDirectory(TIFF* tif)
|
|||||||
td->td_customValueCount = 0;
|
td->td_customValueCount = 0;
|
||||||
CleanupField(td_customValues);
|
CleanupField(td_customValues);
|
||||||
|
|
||||||
#if defined(DEFER_STRILE_LOAD)
|
|
||||||
_TIFFmemset( &(td->td_stripoffset_entry), 0, sizeof(TIFFDirEntry));
|
_TIFFmemset( &(td->td_stripoffset_entry), 0, sizeof(TIFFDirEntry));
|
||||||
_TIFFmemset( &(td->td_stripbytecount_entry), 0, sizeof(TIFFDirEntry));
|
_TIFFmemset( &(td->td_stripbytecount_entry), 0, sizeof(TIFFDirEntry));
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
#undef CleanupField
|
#undef CleanupField
|
||||||
|
|
||||||
@@ -1365,6 +1403,17 @@ TIFFCreateEXIFDirectory(TIFF* tif)
|
|||||||
return TIFFCreateCustomDirectory(tif, exifFieldArray);
|
return TIFFCreateCustomDirectory(tif, exifFieldArray);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Creates the EXIF GPS custom directory
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
TIFFCreateGPSDirectory(TIFF* tif)
|
||||||
|
{
|
||||||
|
const TIFFFieldArray* gpsFieldArray;
|
||||||
|
gpsFieldArray = _TIFFGetGpsFields();
|
||||||
|
return TIFFCreateCustomDirectory(tif, gpsFieldArray);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Setup a default directory structure.
|
* Setup a default directory structure.
|
||||||
*/
|
*/
|
||||||
@@ -1387,7 +1436,9 @@ TIFFDefaultDirectory(TIFF* tif)
|
|||||||
td->td_tilewidth = 0;
|
td->td_tilewidth = 0;
|
||||||
td->td_tilelength = 0;
|
td->td_tilelength = 0;
|
||||||
td->td_tiledepth = 1;
|
td->td_tiledepth = 1;
|
||||||
|
#ifdef STRIPBYTECOUNTSORTED_UNUSED
|
||||||
td->td_stripbytecountsorted = 1; /* Our own arrays always sorted. */
|
td->td_stripbytecountsorted = 1; /* Our own arrays always sorted. */
|
||||||
|
#endif
|
||||||
td->td_resolutionunit = RESUNIT_INCH;
|
td->td_resolutionunit = RESUNIT_INCH;
|
||||||
td->td_sampleformat = SAMPLEFORMAT_UINT;
|
td->td_sampleformat = SAMPLEFORMAT_UINT;
|
||||||
td->td_imagedepth = 1;
|
td->td_imagedepth = 1;
|
||||||
|
|||||||
Vendored
+10
-4
@@ -58,6 +58,7 @@ typedef struct {
|
|||||||
uint32 toff_long;
|
uint32 toff_long;
|
||||||
uint64 toff_long8;
|
uint64 toff_long8;
|
||||||
} tdir_offset; /* either offset or the data itself if fits */
|
} tdir_offset; /* either offset or the data itself if fits */
|
||||||
|
uint8 tdir_ignore; /* flag status to ignore tag when parsing tags in tif_dirread.c */
|
||||||
} TIFFDirEntry;
|
} TIFFDirEntry;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -97,13 +98,14 @@ typedef struct {
|
|||||||
* number of striles */
|
* number of striles */
|
||||||
uint32 td_stripsperimage;
|
uint32 td_stripsperimage;
|
||||||
uint32 td_nstrips; /* size of offset & bytecount arrays */
|
uint32 td_nstrips; /* size of offset & bytecount arrays */
|
||||||
uint64* td_stripoffset;
|
uint64* td_stripoffset_p; /* should be accessed with TIFFGetStrileOffset */
|
||||||
uint64* td_stripbytecount;
|
uint64* td_stripbytecount_p; /* should be accessed with TIFFGetStrileByteCount */
|
||||||
|
uint32 td_stripoffsetbyteallocsize; /* number of elements currently allocated for td_stripoffset/td_stripbytecount. Only used if TIFF_LAZYSTRILELOAD is set */
|
||||||
|
#ifdef STRIPBYTECOUNTSORTED_UNUSED
|
||||||
int td_stripbytecountsorted; /* is the bytecount array sorted ascending? */
|
int td_stripbytecountsorted; /* is the bytecount array sorted ascending? */
|
||||||
#if defined(DEFER_STRILE_LOAD)
|
#endif
|
||||||
TIFFDirEntry td_stripoffset_entry; /* for deferred loading */
|
TIFFDirEntry td_stripoffset_entry; /* for deferred loading */
|
||||||
TIFFDirEntry td_stripbytecount_entry; /* for deferred loading */
|
TIFFDirEntry td_stripbytecount_entry; /* for deferred loading */
|
||||||
#endif
|
|
||||||
uint16 td_nsubifd;
|
uint16 td_nsubifd;
|
||||||
uint64* td_subifd;
|
uint64* td_subifd;
|
||||||
/* YCbCr parameters */
|
/* YCbCr parameters */
|
||||||
@@ -118,6 +120,8 @@ typedef struct {
|
|||||||
|
|
||||||
int td_customValueCount;
|
int td_customValueCount;
|
||||||
TIFFTagValue *td_customValues;
|
TIFFTagValue *td_customValues;
|
||||||
|
|
||||||
|
unsigned char td_deferstrilearraywriting; /* see TIFFDeferStrileArrayWriting() */
|
||||||
} TIFFDirectory;
|
} TIFFDirectory;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -257,6 +261,7 @@ extern "C" {
|
|||||||
|
|
||||||
extern const TIFFFieldArray* _TIFFGetFields(void);
|
extern const TIFFFieldArray* _TIFFGetFields(void);
|
||||||
extern const TIFFFieldArray* _TIFFGetExifFields(void);
|
extern const TIFFFieldArray* _TIFFGetExifFields(void);
|
||||||
|
extern const TIFFFieldArray* _TIFFGetGpsFields(void);
|
||||||
extern void _TIFFSetupFields(TIFF* tif, const TIFFFieldArray* infoarray);
|
extern void _TIFFSetupFields(TIFF* tif, const TIFFFieldArray* infoarray);
|
||||||
extern void _TIFFPrintFieldInfo(TIFF*, FILE*);
|
extern void _TIFFPrintFieldInfo(TIFF*, FILE*);
|
||||||
|
|
||||||
@@ -265,6 +270,7 @@ extern int _TIFFFillStriles(TIFF*);
|
|||||||
typedef enum {
|
typedef enum {
|
||||||
tfiatImage,
|
tfiatImage,
|
||||||
tfiatExif,
|
tfiatExif,
|
||||||
|
tfiatGps, /* EXIF-GPS fields array type */
|
||||||
tfiatOther
|
tfiatOther
|
||||||
} TIFFFieldArrayType;
|
} TIFFFieldArrayType;
|
||||||
|
|
||||||
|
|||||||
Vendored
+207
-37
@@ -47,9 +47,19 @@
|
|||||||
#endif
|
#endif
|
||||||
static const TIFFFieldArray tiffFieldArray;
|
static const TIFFFieldArray tiffFieldArray;
|
||||||
static const TIFFFieldArray exifFieldArray;
|
static const TIFFFieldArray exifFieldArray;
|
||||||
|
static const TIFFFieldArray gpsFieldArray;
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
#pragma warning( pop )
|
#pragma warning( pop )
|
||||||
#endif
|
#endif
|
||||||
|
/*--: Rational2Double: --
|
||||||
|
* The Rational2Double upgraded libtiff functionality allows the definition and achievement of true double-precision accuracy
|
||||||
|
* for TIFF tags of RATIONAL type and field_bit=FIELD_CUSTOM using the set_field_type = TIFF_SETGET_DOUBLE.
|
||||||
|
* Unfortunately, that changes the old implemented interface for TIFFGetField().
|
||||||
|
* In order to keep the old TIFFGetField() interface behavior those tags have to be redefined with set_field_type = TIFF_SETGET_FLOAT!
|
||||||
|
*
|
||||||
|
* Rational custom arrays are already defined as _Cxx_FLOAT, thus can stay.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
static const TIFFField
|
static const TIFFField
|
||||||
tiffFields[] = {
|
tiffFields[] = {
|
||||||
@@ -75,12 +85,12 @@ tiffFields[] = {
|
|||||||
{ TIFFTAG_STRIPBYTECOUNTS, -1, -1, TIFF_LONG8, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_STRIPBYTECOUNTS, 0, 0, "StripByteCounts", NULL },
|
{ TIFFTAG_STRIPBYTECOUNTS, -1, -1, TIFF_LONG8, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_STRIPBYTECOUNTS, 0, 0, "StripByteCounts", NULL },
|
||||||
{ TIFFTAG_MINSAMPLEVALUE, -2, -1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_MINSAMPLEVALUE, 1, 0, "MinSampleValue", NULL },
|
{ TIFFTAG_MINSAMPLEVALUE, -2, -1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_MINSAMPLEVALUE, 1, 0, "MinSampleValue", NULL },
|
||||||
{ TIFFTAG_MAXSAMPLEVALUE, -2, -1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_MAXSAMPLEVALUE, 1, 0, "MaxSampleValue", NULL },
|
{ TIFFTAG_MAXSAMPLEVALUE, -2, -1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_MAXSAMPLEVALUE, 1, 0, "MaxSampleValue", NULL },
|
||||||
{ TIFFTAG_XRESOLUTION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_RESOLUTION, 1, 0, "XResolution", NULL },
|
{ TIFFTAG_XRESOLUTION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_RESOLUTION, 1, 0, "XResolution", NULL },
|
||||||
{ TIFFTAG_YRESOLUTION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_RESOLUTION, 1, 0, "YResolution", NULL },
|
{ TIFFTAG_YRESOLUTION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_RESOLUTION, 1, 0, "YResolution", NULL },
|
||||||
{ TIFFTAG_PLANARCONFIG, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_PLANARCONFIG, 0, 0, "PlanarConfiguration", NULL },
|
{ TIFFTAG_PLANARCONFIG, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_PLANARCONFIG, 0, 0, "PlanarConfiguration", NULL },
|
||||||
{ TIFFTAG_PAGENAME, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "PageName", NULL },
|
{ TIFFTAG_PAGENAME, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "PageName", NULL },
|
||||||
{ TIFFTAG_XPOSITION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_POSITION, 1, 0, "XPosition", NULL },
|
{ TIFFTAG_XPOSITION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_POSITION, 1, 0, "XPosition", NULL },
|
||||||
{ TIFFTAG_YPOSITION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_POSITION, 1, 0, "YPosition", NULL },
|
{ TIFFTAG_YPOSITION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_POSITION, 1, 0, "YPosition", NULL },
|
||||||
{ TIFFTAG_FREEOFFSETS, -1, -1, TIFF_LONG8, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_IGNORE, 0, 0, "FreeOffsets", NULL },
|
{ TIFFTAG_FREEOFFSETS, -1, -1, TIFF_LONG8, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_IGNORE, 0, 0, "FreeOffsets", NULL },
|
||||||
{ TIFFTAG_FREEBYTECOUNTS, -1, -1, TIFF_LONG8, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_IGNORE, 0, 0, "FreeByteCounts", NULL },
|
{ TIFFTAG_FREEBYTECOUNTS, -1, -1, TIFF_LONG8, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_IGNORE, 0, 0, "FreeByteCounts", NULL },
|
||||||
{ TIFFTAG_GRAYRESPONSEUNIT, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_IGNORE, 1, 0, "GrayResponseUnit", NULL },
|
{ TIFFTAG_GRAYRESPONSEUNIT, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UNDEFINED, TIFF_SETGET_UNDEFINED, FIELD_IGNORE, 1, 0, "GrayResponseUnit", NULL },
|
||||||
@@ -135,14 +145,18 @@ tiffFields[] = {
|
|||||||
{ TIFFTAG_PIXAR_MATRIX_WORLDTOSCREEN, 16, 16, TIFF_FLOAT, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "MatrixWorldToScreen", NULL },
|
{ TIFFTAG_PIXAR_MATRIX_WORLDTOSCREEN, 16, 16, TIFF_FLOAT, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "MatrixWorldToScreen", NULL },
|
||||||
{ TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA, 16, 16, TIFF_FLOAT, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "MatrixWorldToCamera", NULL },
|
{ TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA, 16, 16, TIFF_FLOAT, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "MatrixWorldToCamera", NULL },
|
||||||
{ TIFFTAG_CFAREPEATPATTERNDIM, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_C0_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "CFARepeatPatternDim", NULL },
|
{ TIFFTAG_CFAREPEATPATTERNDIM, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_C0_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "CFARepeatPatternDim", NULL },
|
||||||
{ TIFFTAG_CFAPATTERN, 4, 4, TIFF_BYTE, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "CFAPattern" , NULL},
|
{ TIFFTAG_CFAPATTERN, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "CFAPattern" , NULL},
|
||||||
{ TIFFTAG_COPYRIGHT, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Copyright", NULL },
|
{ TIFFTAG_COPYRIGHT, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Copyright", NULL },
|
||||||
/* end Pixar tags */
|
/* end Pixar tags */
|
||||||
{ TIFFTAG_RICHTIFFIPTC, -3, -3, TIFF_LONG, 0, TIFF_SETGET_C32_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "RichTIFFIPTC", NULL },
|
{ TIFFTAG_RICHTIFFIPTC, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "RichTIFFIPTC", NULL },
|
||||||
{ TIFFTAG_PHOTOSHOP, -3, -3, TIFF_BYTE, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "Photoshop", NULL },
|
{ TIFFTAG_PHOTOSHOP, -3, -3, TIFF_BYTE, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "Photoshop", NULL },
|
||||||
{ TIFFTAG_EXIFIFD, 1, 1, TIFF_IFD8, 0, TIFF_SETGET_IFD8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "EXIFIFDOffset", (TIFFFieldArray*) &exifFieldArray },
|
/*--: EXIFIFD and GPSIFD specified as TIFF_LONG by Aware-Systems and not TIFF_IFD8 as in original LibTiff.
|
||||||
|
* However, for IFD-like tags, libtiff uses the data type TIFF_IFD8 in tiffFields[]-tag definition combined with
|
||||||
|
* a special handling procedure in order to write either a 32-bit value and the TIFF_IFD type-id into ClassicTIFF files
|
||||||
|
* or a 64-bit value and the TIFF_IFD8 type-id into BigTIFF files. */
|
||||||
|
{ TIFFTAG_EXIFIFD, 1, 1, TIFF_IFD8, 0, TIFF_SETGET_IFD8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "EXIFIFDOffset", (TIFFFieldArray*) &exifFieldArray },
|
||||||
{ TIFFTAG_ICCPROFILE, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "ICC Profile", NULL },
|
{ TIFFTAG_ICCPROFILE, -3, -3, TIFF_UNDEFINED, 0, TIFF_SETGET_C32_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "ICC Profile", NULL },
|
||||||
{ TIFFTAG_GPSIFD, 1, 1, TIFF_IFD8, 0, TIFF_SETGET_IFD8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "GPSIFDOffset", NULL },
|
{ TIFFTAG_GPSIFD, 1, 1, TIFF_IFD8, 0, TIFF_SETGET_IFD8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "GPSIFDOffset", (TIFFFieldArray*) &gpsFieldArray },
|
||||||
{ TIFFTAG_FAXRECVPARAMS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UINT32, FIELD_CUSTOM, TRUE, FALSE, "FaxRecvParams", NULL },
|
{ TIFFTAG_FAXRECVPARAMS, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UINT32, FIELD_CUSTOM, TRUE, FALSE, "FaxRecvParams", NULL },
|
||||||
{ TIFFTAG_FAXSUBADDRESS, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_ASCII, FIELD_CUSTOM, TRUE, FALSE, "FaxSubAddress", NULL },
|
{ TIFFTAG_FAXSUBADDRESS, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_ASCII, FIELD_CUSTOM, TRUE, FALSE, "FaxSubAddress", NULL },
|
||||||
{ TIFFTAG_FAXRECVTIME, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UINT32, FIELD_CUSTOM, TRUE, FALSE, "FaxRecvTime", NULL },
|
{ TIFFTAG_FAXRECVTIME, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UINT32, FIELD_CUSTOM, TRUE, FALSE, "FaxRecvTime", NULL },
|
||||||
@@ -163,7 +177,7 @@ tiffFields[] = {
|
|||||||
{ TIFFTAG_BLACKLEVELDELTAV, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "BlackLevelDeltaV", NULL },
|
{ TIFFTAG_BLACKLEVELDELTAV, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "BlackLevelDeltaV", NULL },
|
||||||
{ TIFFTAG_WHITELEVEL, -1, -1, TIFF_LONG, 0, TIFF_SETGET_C16_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "WhiteLevel", NULL },
|
{ TIFFTAG_WHITELEVEL, -1, -1, TIFF_LONG, 0, TIFF_SETGET_C16_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "WhiteLevel", NULL },
|
||||||
{ TIFFTAG_DEFAULTSCALE, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "DefaultScale", NULL },
|
{ TIFFTAG_DEFAULTSCALE, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "DefaultScale", NULL },
|
||||||
{ TIFFTAG_BESTQUALITYSCALE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "BestQualityScale", NULL },
|
{ TIFFTAG_BESTQUALITYSCALE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "BestQualityScale", NULL },
|
||||||
{ TIFFTAG_DEFAULTCROPORIGIN, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "DefaultCropOrigin", NULL },
|
{ TIFFTAG_DEFAULTCROPORIGIN, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "DefaultCropOrigin", NULL },
|
||||||
{ TIFFTAG_DEFAULTCROPSIZE, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "DefaultCropSize", NULL },
|
{ TIFFTAG_DEFAULTCROPSIZE, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "DefaultCropSize", NULL },
|
||||||
{ TIFFTAG_COLORMATRIX1, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "ColorMatrix1", NULL },
|
{ TIFFTAG_COLORMATRIX1, -1, -1, TIFF_SRATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "ColorMatrix1", NULL },
|
||||||
@@ -175,16 +189,16 @@ tiffFields[] = {
|
|||||||
{ TIFFTAG_ANALOGBALANCE, -1, -1, TIFF_RATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "AnalogBalance", NULL },
|
{ TIFFTAG_ANALOGBALANCE, -1, -1, TIFF_RATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "AnalogBalance", NULL },
|
||||||
{ TIFFTAG_ASSHOTNEUTRAL, -1, -1, TIFF_RATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "AsShotNeutral", NULL },
|
{ TIFFTAG_ASSHOTNEUTRAL, -1, -1, TIFF_RATIONAL, 0, TIFF_SETGET_C16_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "AsShotNeutral", NULL },
|
||||||
{ TIFFTAG_ASSHOTWHITEXY, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "AsShotWhiteXY", NULL },
|
{ TIFFTAG_ASSHOTWHITEXY, 2, 2, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "AsShotWhiteXY", NULL },
|
||||||
{ TIFFTAG_BASELINEEXPOSURE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "BaselineExposure", NULL },
|
{ TIFFTAG_BASELINEEXPOSURE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "BaselineExposure", NULL },
|
||||||
{ TIFFTAG_BASELINENOISE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "BaselineNoise", NULL },
|
{ TIFFTAG_BASELINENOISE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "BaselineNoise", NULL },
|
||||||
{ TIFFTAG_BASELINESHARPNESS, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "BaselineSharpness", NULL },
|
{ TIFFTAG_BASELINESHARPNESS, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "BaselineSharpness", NULL },
|
||||||
{ TIFFTAG_BAYERGREENSPLIT, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "BayerGreenSplit", NULL },
|
{ TIFFTAG_BAYERGREENSPLIT, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "BayerGreenSplit", NULL },
|
||||||
{ TIFFTAG_LINEARRESPONSELIMIT, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "LinearResponseLimit", NULL },
|
{ TIFFTAG_LINEARRESPONSELIMIT, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "LinearResponseLimit", NULL },
|
||||||
{ TIFFTAG_CAMERASERIALNUMBER, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CameraSerialNumber", NULL },
|
{ TIFFTAG_CAMERASERIALNUMBER, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CameraSerialNumber", NULL },
|
||||||
{ TIFFTAG_LENSINFO, 4, 4, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "LensInfo", NULL },
|
{ TIFFTAG_LENSINFO, 4, 4, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "LensInfo", NULL },
|
||||||
{ TIFFTAG_CHROMABLURRADIUS, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "ChromaBlurRadius", NULL },
|
{ TIFFTAG_CHROMABLURRADIUS, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "ChromaBlurRadius", NULL },
|
||||||
{ TIFFTAG_ANTIALIASSTRENGTH, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "AntiAliasStrength", NULL },
|
{ TIFFTAG_ANTIALIASSTRENGTH, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "AntiAliasStrength", NULL },
|
||||||
{ TIFFTAG_SHADOWSCALE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "ShadowScale", NULL },
|
{ TIFFTAG_SHADOWSCALE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "ShadowScale", NULL },
|
||||||
{ TIFFTAG_DNGPRIVATEDATA, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "DNGPrivateData", NULL },
|
{ TIFFTAG_DNGPRIVATEDATA, -1, -1, TIFF_BYTE, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 1, "DNGPrivateData", NULL },
|
||||||
{ TIFFTAG_MAKERNOTESAFETY, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "MakerNoteSafety", NULL },
|
{ TIFFTAG_MAKERNOTESAFETY, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "MakerNoteSafety", NULL },
|
||||||
{ TIFFTAG_CALIBRATIONILLUMINANT1, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "CalibrationIlluminant1", NULL },
|
{ TIFFTAG_CALIBRATIONILLUMINANT1, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 0, 0, "CalibrationIlluminant1", NULL },
|
||||||
@@ -217,47 +231,68 @@ tiffFields[] = {
|
|||||||
/* begin pseudo tags */
|
/* begin pseudo tags */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* EXIF tags (Version 2.31, July 2016 plus version 2.32 May 2019)
|
||||||
|
*/
|
||||||
static const TIFFField
|
static const TIFFField
|
||||||
exifFields[] = {
|
exifFields[] = {
|
||||||
{ EXIFTAG_EXPOSURETIME, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExposureTime", NULL },
|
{ EXIFTAG_EXPOSURETIME, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExposureTime", NULL },
|
||||||
{ EXIFTAG_FNUMBER, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FNumber", NULL },
|
{ EXIFTAG_FNUMBER, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FNumber", NULL },
|
||||||
{ EXIFTAG_EXPOSUREPROGRAM, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExposureProgram", NULL },
|
{ EXIFTAG_EXPOSUREPROGRAM, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExposureProgram", NULL },
|
||||||
{ EXIFTAG_SPECTRALSENSITIVITY, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SpectralSensitivity", NULL },
|
{ EXIFTAG_SPECTRALSENSITIVITY, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SpectralSensitivity", NULL },
|
||||||
{ EXIFTAG_ISOSPEEDRATINGS, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_C16_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ISOSpeedRatings", NULL },
|
{ EXIFTAG_ISOSPEEDRATINGS, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_C16_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "ISOSpeedRatings", NULL },
|
||||||
{ EXIFTAG_OECF, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "OptoelectricConversionFactor", NULL },
|
{ EXIFTAG_OECF, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "OptoelectricConversionFactor", NULL },
|
||||||
|
{ EXIFTAG_SENSITIVITYTYPE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SensitivityType", NULL },
|
||||||
|
{ EXIFTAG_STANDARDOUTPUTSENSITIVITY, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "StandardOutputSensitivity", NULL },
|
||||||
|
{ EXIFTAG_RECOMMENDEDEXPOSUREINDEX, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "RecommendedExposureIndex", NULL },
|
||||||
|
{ EXIFTAG_ISOSPEED, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ISOSpeed", NULL },
|
||||||
|
{ EXIFTAG_ISOSPEEDLATITUDEYYY, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ISOSpeedLatitudeyyy", NULL },
|
||||||
|
{ EXIFTAG_ISOSPEEDLATITUDEZZZ, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ISOSpeedLatitudezzz", NULL },
|
||||||
{ EXIFTAG_EXIFVERSION, 4, 4, TIFF_UNDEFINED, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExifVersion", NULL },
|
{ EXIFTAG_EXIFVERSION, 4, 4, TIFF_UNDEFINED, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExifVersion", NULL },
|
||||||
{ EXIFTAG_DATETIMEORIGINAL, 20, 20, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DateTimeOriginal", NULL },
|
{ EXIFTAG_DATETIMEORIGINAL, 20, 20, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DateTimeOriginal", NULL },
|
||||||
{ EXIFTAG_DATETIMEDIGITIZED, 20, 20, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DateTimeDigitized", NULL },
|
{ EXIFTAG_DATETIMEDIGITIZED, 20, 20, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DateTimeDigitized", NULL },
|
||||||
|
{ EXIFTAG_OFFSETTIME, 7, 7, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "OffsetTime", NULL },
|
||||||
|
{ EXIFTAG_OFFSETTIMEORIGINAL, 7, 7, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "OffsetTimeOriginal", NULL },
|
||||||
|
{ EXIFTAG_OFFSETTIMEDIGITIZED, 7, 7, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "OffsetTimeDigitized", NULL },
|
||||||
{ EXIFTAG_COMPONENTSCONFIGURATION, 4, 4, TIFF_UNDEFINED, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ComponentsConfiguration", NULL },
|
{ EXIFTAG_COMPONENTSCONFIGURATION, 4, 4, TIFF_UNDEFINED, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ComponentsConfiguration", NULL },
|
||||||
{ EXIFTAG_COMPRESSEDBITSPERPIXEL, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CompressedBitsPerPixel", NULL },
|
{ EXIFTAG_COMPRESSEDBITSPERPIXEL, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CompressedBitsPerPixel", NULL },
|
||||||
{ EXIFTAG_SHUTTERSPEEDVALUE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ShutterSpeedValue", NULL },
|
{ EXIFTAG_SHUTTERSPEEDVALUE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ShutterSpeedValue", NULL },
|
||||||
{ EXIFTAG_APERTUREVALUE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ApertureValue", NULL },
|
{ EXIFTAG_APERTUREVALUE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ApertureValue", NULL },
|
||||||
{ EXIFTAG_BRIGHTNESSVALUE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "BrightnessValue", NULL },
|
{ EXIFTAG_BRIGHTNESSVALUE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "BrightnessValue", NULL },
|
||||||
{ EXIFTAG_EXPOSUREBIASVALUE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExposureBiasValue", NULL },
|
{ EXIFTAG_EXPOSUREBIASVALUE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExposureBiasValue", NULL },
|
||||||
{ EXIFTAG_MAXAPERTUREVALUE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "MaxApertureValue", NULL },
|
{ EXIFTAG_MAXAPERTUREVALUE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "MaxApertureValue", NULL },
|
||||||
{ EXIFTAG_SUBJECTDISTANCE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubjectDistance", NULL },
|
/*--: EXIFTAG_SUBJECTDISTANCE: LibTiff returns value of "-1" if numerator equals 4294967295 (0xFFFFFFFF) to indicate infinite distance!
|
||||||
|
* However, there are two other EXIF tags where numerator indicates a special value and six other cases where the denominator indicates special values,
|
||||||
|
* which are not treated within LibTiff!! */
|
||||||
|
{ EXIFTAG_SUBJECTDISTANCE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubjectDistance", NULL },
|
||||||
{ EXIFTAG_METERINGMODE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "MeteringMode", NULL },
|
{ EXIFTAG_METERINGMODE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "MeteringMode", NULL },
|
||||||
{ EXIFTAG_LIGHTSOURCE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "LightSource", NULL },
|
{ EXIFTAG_LIGHTSOURCE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "LightSource", NULL },
|
||||||
{ EXIFTAG_FLASH, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Flash", NULL },
|
{ EXIFTAG_FLASH, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Flash", NULL },
|
||||||
{ EXIFTAG_FOCALLENGTH, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FocalLength", NULL },
|
{ EXIFTAG_FOCALLENGTH, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FocalLength", NULL },
|
||||||
{ EXIFTAG_SUBJECTAREA, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_C16_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "SubjectArea", NULL },
|
{ EXIFTAG_SUBJECTAREA, -1, -1, TIFF_SHORT, 0, TIFF_SETGET_C16_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "SubjectArea", NULL },
|
||||||
{ EXIFTAG_MAKERNOTE, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "MakerNote", NULL },
|
{ EXIFTAG_MAKERNOTE, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "MakerNote", NULL },
|
||||||
{ EXIFTAG_USERCOMMENT, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "UserComment", NULL },
|
{ EXIFTAG_USERCOMMENT, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "UserComment", NULL },
|
||||||
{ EXIFTAG_SUBSECTIME, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubSecTime", NULL },
|
{ EXIFTAG_SUBSECTIME, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubSecTime", NULL },
|
||||||
{ EXIFTAG_SUBSECTIMEORIGINAL, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubSecTimeOriginal", NULL },
|
{ EXIFTAG_SUBSECTIMEORIGINAL, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubSecTimeOriginal", NULL },
|
||||||
{ EXIFTAG_SUBSECTIMEDIGITIZED, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubSecTimeDigitized", NULL },
|
{ EXIFTAG_SUBSECTIMEDIGITIZED, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubSecTimeDigitized", NULL },
|
||||||
|
{ EXIFTAG_TEMPERATURE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Temperature", NULL },
|
||||||
|
{ EXIFTAG_HUMIDITY, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Humidity", NULL },
|
||||||
|
{ EXIFTAG_PRESSURE, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Pressure", NULL },
|
||||||
|
{ EXIFTAG_WATERDEPTH, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "WaterDepth", NULL },
|
||||||
|
{ EXIFTAG_ACCELERATION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Acceleration", NULL },
|
||||||
|
{ EXIFTAG_CAMERAELEVATIONANGLE, 1, 1, TIFF_SRATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CameraElevationAngle", NULL },
|
||||||
{ EXIFTAG_FLASHPIXVERSION, 4, 4, TIFF_UNDEFINED, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FlashpixVersion", NULL },
|
{ EXIFTAG_FLASHPIXVERSION, 4, 4, TIFF_UNDEFINED, 0, TIFF_SETGET_C0_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FlashpixVersion", NULL },
|
||||||
{ EXIFTAG_COLORSPACE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ColorSpace", NULL },
|
{ EXIFTAG_COLORSPACE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ColorSpace", NULL },
|
||||||
{ EXIFTAG_PIXELXDIMENSION, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "PixelXDimension", NULL },
|
{ EXIFTAG_PIXELXDIMENSION, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "PixelXDimension", NULL },
|
||||||
{ EXIFTAG_PIXELYDIMENSION, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "PixelYDimension", NULL },
|
{ EXIFTAG_PIXELYDIMENSION, 1, 1, TIFF_LONG, 0, TIFF_SETGET_UINT32, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "PixelYDimension", NULL },
|
||||||
{ EXIFTAG_RELATEDSOUNDFILE, 13, 13, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "RelatedSoundFile", NULL },
|
{ EXIFTAG_RELATEDSOUNDFILE, 13, 13, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "RelatedSoundFile", NULL },
|
||||||
{ EXIFTAG_FLASHENERGY, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FlashEnergy", NULL },
|
{ EXIFTAG_FLASHENERGY, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FlashEnergy", NULL },
|
||||||
{ EXIFTAG_SPATIALFREQUENCYRESPONSE, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "SpatialFrequencyResponse", NULL },
|
{ EXIFTAG_SPATIALFREQUENCYRESPONSE, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "SpatialFrequencyResponse", NULL },
|
||||||
{ EXIFTAG_FOCALPLANEXRESOLUTION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FocalPlaneXResolution", NULL },
|
{ EXIFTAG_FOCALPLANEXRESOLUTION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FocalPlaneXResolution", NULL },
|
||||||
{ EXIFTAG_FOCALPLANEYRESOLUTION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FocalPlaneYResolution", NULL },
|
{ EXIFTAG_FOCALPLANEYRESOLUTION, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FocalPlaneYResolution", NULL },
|
||||||
{ EXIFTAG_FOCALPLANERESOLUTIONUNIT, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FocalPlaneResolutionUnit", NULL },
|
{ EXIFTAG_FOCALPLANERESOLUTIONUNIT, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FocalPlaneResolutionUnit", NULL },
|
||||||
{ EXIFTAG_SUBJECTLOCATION, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_C0_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubjectLocation", NULL },
|
{ EXIFTAG_SUBJECTLOCATION, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_C0_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubjectLocation", NULL },
|
||||||
{ EXIFTAG_EXPOSUREINDEX, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExposureIndex", NULL },
|
{ EXIFTAG_EXPOSUREINDEX, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExposureIndex", NULL },
|
||||||
{ EXIFTAG_SENSINGMETHOD, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SensingMethod", NULL },
|
{ EXIFTAG_SENSINGMETHOD, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SensingMethod", NULL },
|
||||||
{ EXIFTAG_FILESOURCE, 1, 1, TIFF_UNDEFINED, 0, TIFF_SETGET_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FileSource", NULL },
|
{ EXIFTAG_FILESOURCE, 1, 1, TIFF_UNDEFINED, 0, TIFF_SETGET_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FileSource", NULL },
|
||||||
{ EXIFTAG_SCENETYPE, 1, 1, TIFF_UNDEFINED, 0, TIFF_SETGET_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SceneType", NULL },
|
{ EXIFTAG_SCENETYPE, 1, 1, TIFF_UNDEFINED, 0, TIFF_SETGET_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SceneType", NULL },
|
||||||
@@ -265,22 +300,79 @@ exifFields[] = {
|
|||||||
{ EXIFTAG_CUSTOMRENDERED, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CustomRendered", NULL },
|
{ EXIFTAG_CUSTOMRENDERED, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CustomRendered", NULL },
|
||||||
{ EXIFTAG_EXPOSUREMODE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExposureMode", NULL },
|
{ EXIFTAG_EXPOSUREMODE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ExposureMode", NULL },
|
||||||
{ EXIFTAG_WHITEBALANCE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "WhiteBalance", NULL },
|
{ EXIFTAG_WHITEBALANCE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "WhiteBalance", NULL },
|
||||||
{ EXIFTAG_DIGITALZOOMRATIO, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DigitalZoomRatio", NULL },
|
{ EXIFTAG_DIGITALZOOMRATIO, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "DigitalZoomRatio", NULL },
|
||||||
{ EXIFTAG_FOCALLENGTHIN35MMFILM, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FocalLengthIn35mmFilm", NULL },
|
{ EXIFTAG_FOCALLENGTHIN35MMFILM, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "FocalLengthIn35mmFilm", NULL },
|
||||||
{ EXIFTAG_SCENECAPTURETYPE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SceneCaptureType", NULL },
|
{ EXIFTAG_SCENECAPTURETYPE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SceneCaptureType", NULL },
|
||||||
{ EXIFTAG_GAINCONTROL, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_DOUBLE, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "GainControl", NULL },
|
{ EXIFTAG_GAINCONTROL, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "GainControl", NULL },
|
||||||
{ EXIFTAG_CONTRAST, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Contrast", NULL },
|
{ EXIFTAG_CONTRAST, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Contrast", NULL },
|
||||||
{ EXIFTAG_SATURATION, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Saturation", NULL },
|
{ EXIFTAG_SATURATION, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Saturation", NULL },
|
||||||
{ EXIFTAG_SHARPNESS, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Sharpness", NULL },
|
{ EXIFTAG_SHARPNESS, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Sharpness", NULL },
|
||||||
{ EXIFTAG_DEVICESETTINGDESCRIPTION, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "DeviceSettingDescription", NULL },
|
{ EXIFTAG_DEVICESETTINGDESCRIPTION, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "DeviceSettingDescription", NULL },
|
||||||
{ EXIFTAG_SUBJECTDISTANCERANGE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubjectDistanceRange", NULL },
|
{ EXIFTAG_SUBJECTDISTANCERANGE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SubjectDistanceRange", NULL },
|
||||||
{ EXIFTAG_IMAGEUNIQUEID, 33, 33, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ImageUniqueID", NULL }
|
{ EXIFTAG_IMAGEUNIQUEID, 33, 33, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "ImageUniqueID", NULL },
|
||||||
|
{ EXIFTAG_CAMERAOWNERNAME, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CameraOwnerName", NULL },
|
||||||
|
{ EXIFTAG_BODYSERIALNUMBER, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "BodySerialNumber", NULL },
|
||||||
|
{ EXIFTAG_LENSSPECIFICATION, 4, 4, TIFF_RATIONAL, 0, TIFF_SETGET_C0_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "LensSpecification", NULL },
|
||||||
|
{ EXIFTAG_LENSMAKE, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "LensMake", NULL },
|
||||||
|
{ EXIFTAG_LENSMODEL, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "LensModel", NULL },
|
||||||
|
{ EXIFTAG_LENSSERIALNUMBER, -1, -1, TIFF_ASCII, 0, TIFF_SETGET_ASCII, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "LensSerialNumber", NULL },
|
||||||
|
{ EXIFTAG_GAMMA, 1, 1, TIFF_RATIONAL, 0, TIFF_SETGET_FLOAT, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "Gamma", NULL },
|
||||||
|
{ EXIFTAG_COMPOSITEIMAGE, 1, 1, TIFF_SHORT, 0, TIFF_SETGET_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "CompositeImage", NULL },
|
||||||
|
{ EXIFTAG_SOURCEIMAGENUMBEROFCOMPOSITEIMAGE, 2, 2, TIFF_SHORT, 0, TIFF_SETGET_C0_UINT16, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 0, "SourceImageNumberOfCompositeImage", NULL },
|
||||||
|
{ EXIFTAG_SOURCEEXPOSURETIMESOFCOMPOSITEIMAGE, -1, -1, TIFF_UNDEFINED, 0, TIFF_SETGET_C16_UINT8, TIFF_SETGET_UNDEFINED, FIELD_CUSTOM, 1, 1, "SourceExposureTimesOfCompositeImage", NULL }
|
||||||
|
};
|
||||||
|
/*
|
||||||
|
* EXIF-GPS tags (Version 2.31, July 2016; nothing changed for version 2.32 May 2019)
|
||||||
|
*/
|
||||||
|
|
||||||
|
static TIFFField
|
||||||
|
gpsFields[] = {
|
||||||
|
/* For the GPS tag definitions in gpsFields[] the standard definition for Rationals is TIFF_SETGET_DOUBLE and TIFF_SETGET_C0_FLOAT.
|
||||||
|
*-- ATTENTION: After the upgrade with Rational2Double, the GPSTAG values can now be written and also read in double precision!
|
||||||
|
* In order to achieve double precision for GPS tags:
|
||||||
|
* Standard definitions for GPSTAG is kept to TIFF_SETGET_DOUBLE
|
||||||
|
* and TIFF_SETGET_C0_FLOAT is changed to TIFF_SETGET_C0_DOUBLE.
|
||||||
|
*/
|
||||||
|
{ GPSTAG_VERSIONID , 4, 4, TIFF_BYTE , 0, TIFF_SETGET_C0_UINT8 , TIFF_SETGET_UINT8 , FIELD_CUSTOM , 1, 0, "VersionID", NULL },
|
||||||
|
{ GPSTAG_LATITUDEREF , 2, 2, TIFF_ASCII , 0, TIFF_SETGET_ASCII , TIFF_SETGET_UNDEFINED , FIELD_CUSTOM , 1, 0, "LatitudeRef", NULL },
|
||||||
|
{ GPSTAG_LATITUDE , 3, 3, TIFF_RATIONAL , 0, TIFF_SETGET_C0_DOUBLE , TIFF_SETGET_UNDEFINED , FIELD_CUSTOM , 1, 0, "Latitude", NULL },
|
||||||
|
{ GPSTAG_LONGITUDEREF , 2, 2, TIFF_ASCII , 0, TIFF_SETGET_ASCII , TIFF_SETGET_UNDEFINED , FIELD_CUSTOM , 1, 0, "LongitudeRef", NULL },
|
||||||
|
{ GPSTAG_LONGITUDE , 3, 3, TIFF_RATIONAL , 0, TIFF_SETGET_C0_DOUBLE , TIFF_SETGET_UNDEFINED , FIELD_CUSTOM , 1, 0, "Longitude", NULL },
|
||||||
|
{ GPSTAG_ALTITUDEREF , 1, 1, TIFF_BYTE , 0, TIFF_SETGET_UINT8 , TIFF_SETGET_UNDEFINED , FIELD_CUSTOM , 1, 0, "AltitudeRef", NULL },
|
||||||
|
{ GPSTAG_ALTITUDE , 1, 1, TIFF_RATIONAL , 0, TIFF_SETGET_DOUBLE , TIFF_SETGET_UNDEFINED , FIELD_CUSTOM , 1, 0, "Altitude", NULL },
|
||||||
|
{ GPSTAG_TIMESTAMP , 3, 3, TIFF_RATIONAL , 0, TIFF_SETGET_C0_DOUBLE , TIFF_SETGET_UNDEFINED , FIELD_CUSTOM , 1, 0, "TimeStamp", NULL },
|
||||||
|
{ GPSTAG_SATELLITES , -1, -1, TIFF_ASCII , 0, TIFF_SETGET_ASCII , TIFF_SETGET_UNDEFINED , FIELD_CUSTOM , 1, 0, "Satellites", NULL },
|
||||||
|
{ GPSTAG_STATUS , 2, 2, TIFF_ASCII , 0, TIFF_SETGET_ASCII , TIFF_SETGET_UNDEFINED , FIELD_CUSTOM , 1, 0, "Status", NULL },
|
||||||
|
{ GPSTAG_MEASUREMODE , 2, 2, TIFF_ASCII , 0, TIFF_SETGET_ASCII , TIFF_SETGET_UNDEFINED , FIELD_CUSTOM , 1, 0, "MeasureMode", NULL },
|
||||||
|
{ GPSTAG_DOP , 1, 1, TIFF_RATIONAL , 0, TIFF_SETGET_DOUBLE , TIFF_SETGET_UNDEFINED , FIELD_CUSTOM , 1, 0, "DOP", NULL },
|
||||||
|
{ GPSTAG_SPEEDREF , 2, 2, TIFF_ASCII , 0, TIFF_SETGET_ASCII , TIFF_SETGET_UNDEFINED , FIELD_CUSTOM , 1, 0, "SpeedRef", NULL },
|
||||||
|
{ GPSTAG_SPEED , 1, 1, TIFF_RATIONAL , 0, TIFF_SETGET_DOUBLE , TIFF_SETGET_UNDEFINED , FIELD_CUSTOM , 1, 0, "Speed", NULL },
|
||||||
|
{ GPSTAG_TRACKREF , 2, 2, TIFF_ASCII , 0, TIFF_SETGET_ASCII , TIFF_SETGET_UNDEFINED , FIELD_CUSTOM , 1, 0, "TrackRef", NULL },
|
||||||
|
{ GPSTAG_TRACK , 1, 1, TIFF_RATIONAL , 0, TIFF_SETGET_DOUBLE , TIFF_SETGET_UNDEFINED , FIELD_CUSTOM , 1, 0, "Track", NULL },
|
||||||
|
{ GPSTAG_IMGDIRECTIONREF , 2, 2, TIFF_ASCII , 0, TIFF_SETGET_ASCII , TIFF_SETGET_UNDEFINED , FIELD_CUSTOM , 1, 0, "ImgDirectionRef", NULL },
|
||||||
|
{ GPSTAG_IMGDIRECTION , 1, 1, TIFF_RATIONAL , 0, TIFF_SETGET_DOUBLE , TIFF_SETGET_UNDEFINED , FIELD_CUSTOM , 1, 0, "ImgDirection", NULL },
|
||||||
|
{ GPSTAG_MAPDATUM , -1, -1, TIFF_ASCII , 0, TIFF_SETGET_ASCII , TIFF_SETGET_UNDEFINED , FIELD_CUSTOM , 1, 0, "MapDatum", NULL },
|
||||||
|
{ GPSTAG_DESTLATITUDEREF , 2, 2, TIFF_ASCII , 0, TIFF_SETGET_ASCII , TIFF_SETGET_UNDEFINED , FIELD_CUSTOM , 1, 0, "DestLatitudeRef", NULL },
|
||||||
|
{ GPSTAG_DESTLATITUDE , 3, 3, TIFF_RATIONAL , 0, TIFF_SETGET_C0_DOUBLE , TIFF_SETGET_UNDEFINED , FIELD_CUSTOM , 1, 0, "DestLatitude", NULL },
|
||||||
|
{ GPSTAG_DESTLONGITUDEREF , 2, 2, TIFF_ASCII , 0, TIFF_SETGET_ASCII , TIFF_SETGET_UNDEFINED , FIELD_CUSTOM , 1, 0, "DestLongitudeRef", NULL },
|
||||||
|
{ GPSTAG_DESTLONGITUDE , 3, 3, TIFF_RATIONAL , 0, TIFF_SETGET_C0_DOUBLE , TIFF_SETGET_UNDEFINED , FIELD_CUSTOM , 1, 0, "DestLongitude", NULL },
|
||||||
|
{ GPSTAG_DESTBEARINGREF , 2, 2, TIFF_ASCII , 0, TIFF_SETGET_ASCII , TIFF_SETGET_UNDEFINED , FIELD_CUSTOM , 1, 0, "DestBearingRef", NULL },
|
||||||
|
{ GPSTAG_DESTBEARING , 1, 1, TIFF_RATIONAL , 0, TIFF_SETGET_DOUBLE , TIFF_SETGET_UNDEFINED , FIELD_CUSTOM , 1, 0, "DestBearing", NULL },
|
||||||
|
{ GPSTAG_DESTDISTANCEREF , 2, 2, TIFF_ASCII , 0, TIFF_SETGET_ASCII , TIFF_SETGET_UNDEFINED , FIELD_CUSTOM , 1, 0, "DestDistanceRef", NULL },
|
||||||
|
{ GPSTAG_DESTDISTANCE , 1, 1, TIFF_RATIONAL , 0, TIFF_SETGET_DOUBLE , TIFF_SETGET_UNDEFINED , FIELD_CUSTOM , 1, 0, "DestDistance", NULL },
|
||||||
|
{ GPSTAG_PROCESSINGMETHOD , -1, -1, TIFF_UNDEFINED , 0, TIFF_SETGET_C16_UINT8 , TIFF_SETGET_UNDEFINED , FIELD_CUSTOM , 1, 1, "ProcessingMethod", NULL },
|
||||||
|
{ GPSTAG_AREAINFORMATION , -1, -1, TIFF_UNDEFINED , 0, TIFF_SETGET_C16_UINT8 , TIFF_SETGET_UNDEFINED , FIELD_CUSTOM , 1, 1, "AreaInformation", NULL },
|
||||||
|
{ GPSTAG_DATESTAMP , 11, 11, TIFF_ASCII , 0, TIFF_SETGET_ASCII , TIFF_SETGET_UNDEFINED , FIELD_CUSTOM , 1, 0, "DateStamp", NULL },
|
||||||
|
{ GPSTAG_DIFFERENTIAL , 1, 1, TIFF_SHORT , 0, TIFF_SETGET_UINT16 , TIFF_SETGET_UNDEFINED , FIELD_CUSTOM , 1, 0, "Differential", NULL },
|
||||||
|
{ GPSTAG_GPSHPOSITIONINGERROR , 1, 1, TIFF_RATIONAL , 0, TIFF_SETGET_DOUBLE , TIFF_SETGET_UNDEFINED , FIELD_CUSTOM , 1, 0, "HorizontalPositioningError", NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
static const TIFFFieldArray
|
static const TIFFFieldArray
|
||||||
tiffFieldArray = { tfiatImage, 0, TIFFArrayCount(tiffFields), (TIFFField*) tiffFields };
|
tiffFieldArray = { tfiatImage, 0, TIFFArrayCount(tiffFields), (TIFFField*) tiffFields };
|
||||||
static const TIFFFieldArray
|
static const TIFFFieldArray
|
||||||
exifFieldArray = { tfiatExif, 0, TIFFArrayCount(exifFields), (TIFFField*) exifFields };
|
exifFieldArray = { tfiatExif, 0, TIFFArrayCount(exifFields), (TIFFField*) exifFields };
|
||||||
|
static const TIFFFieldArray
|
||||||
|
gpsFieldArray = { tfiatGps, 0, TIFFArrayCount(gpsFields), (TIFFField*) gpsFields };
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We have our own local lfind() equivalent to avoid subtle differences
|
* We have our own local lfind() equivalent to avoid subtle differences
|
||||||
@@ -313,6 +405,12 @@ _TIFFGetExifFields(void)
|
|||||||
return(&exifFieldArray);
|
return(&exifFieldArray);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const TIFFFieldArray*
|
||||||
|
_TIFFGetGpsFields(void)
|
||||||
|
{
|
||||||
|
return(&gpsFieldArray);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
_TIFFSetupFields(TIFF* tif, const TIFFFieldArray* fieldarray)
|
_TIFFSetupFields(TIFF* tif, const TIFFFieldArray* fieldarray)
|
||||||
{
|
{
|
||||||
@@ -502,6 +600,82 @@ _TIFFDataSize(TIFFDataType type)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Rational2Double:
|
||||||
|
* Return size of TIFFSetGetFieldType in bytes.
|
||||||
|
*
|
||||||
|
* XXX: TIFF_RATIONAL values for FIELD_CUSTOM are stored internally as 4-byte float.
|
||||||
|
* However, some of them should be stored internally as 8-byte double.
|
||||||
|
* This is now managed by the SetGetField of the tag-definition!
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
_TIFFSetGetFieldSize(TIFFSetGetFieldType setgettype)
|
||||||
|
{
|
||||||
|
switch (setgettype)
|
||||||
|
{
|
||||||
|
case TIFF_SETGET_UNDEFINED:
|
||||||
|
case TIFF_SETGET_ASCII:
|
||||||
|
case TIFF_SETGET_C0_ASCII:
|
||||||
|
case TIFF_SETGET_C16_ASCII:
|
||||||
|
case TIFF_SETGET_C32_ASCII:
|
||||||
|
case TIFF_SETGET_OTHER:
|
||||||
|
return 0;
|
||||||
|
case TIFF_SETGET_UINT8:
|
||||||
|
case TIFF_SETGET_SINT8:
|
||||||
|
case TIFF_SETGET_C0_UINT8:
|
||||||
|
case TIFF_SETGET_C0_SINT8:
|
||||||
|
case TIFF_SETGET_C16_UINT8:
|
||||||
|
case TIFF_SETGET_C16_SINT8:
|
||||||
|
case TIFF_SETGET_C32_UINT8:
|
||||||
|
case TIFF_SETGET_C32_SINT8:
|
||||||
|
return 1;
|
||||||
|
case TIFF_SETGET_UINT16:
|
||||||
|
case TIFF_SETGET_SINT16:
|
||||||
|
case TIFF_SETGET_C0_UINT16:
|
||||||
|
case TIFF_SETGET_C0_SINT16:
|
||||||
|
case TIFF_SETGET_C16_UINT16:
|
||||||
|
case TIFF_SETGET_C16_SINT16:
|
||||||
|
case TIFF_SETGET_C32_UINT16:
|
||||||
|
case TIFF_SETGET_C32_SINT16:
|
||||||
|
return 2;
|
||||||
|
case TIFF_SETGET_INT:
|
||||||
|
case TIFF_SETGET_UINT32:
|
||||||
|
case TIFF_SETGET_SINT32:
|
||||||
|
case TIFF_SETGET_FLOAT:
|
||||||
|
case TIFF_SETGET_UINT16_PAIR:
|
||||||
|
case TIFF_SETGET_C0_UINT32:
|
||||||
|
case TIFF_SETGET_C0_SINT32:
|
||||||
|
case TIFF_SETGET_C0_FLOAT:
|
||||||
|
case TIFF_SETGET_C16_UINT32:
|
||||||
|
case TIFF_SETGET_C16_SINT32:
|
||||||
|
case TIFF_SETGET_C16_FLOAT:
|
||||||
|
case TIFF_SETGET_C32_UINT32:
|
||||||
|
case TIFF_SETGET_C32_SINT32:
|
||||||
|
case TIFF_SETGET_C32_FLOAT:
|
||||||
|
return 4;
|
||||||
|
case TIFF_SETGET_UINT64:
|
||||||
|
case TIFF_SETGET_SINT64:
|
||||||
|
case TIFF_SETGET_DOUBLE:
|
||||||
|
case TIFF_SETGET_IFD8:
|
||||||
|
case TIFF_SETGET_C0_UINT64:
|
||||||
|
case TIFF_SETGET_C0_SINT64:
|
||||||
|
case TIFF_SETGET_C0_DOUBLE:
|
||||||
|
case TIFF_SETGET_C0_IFD8:
|
||||||
|
case TIFF_SETGET_C16_UINT64:
|
||||||
|
case TIFF_SETGET_C16_SINT64:
|
||||||
|
case TIFF_SETGET_C16_DOUBLE:
|
||||||
|
case TIFF_SETGET_C16_IFD8:
|
||||||
|
case TIFF_SETGET_C32_UINT64:
|
||||||
|
case TIFF_SETGET_C32_SINT64:
|
||||||
|
case TIFF_SETGET_C32_DOUBLE:
|
||||||
|
case TIFF_SETGET_C32_IFD8:
|
||||||
|
return 8;
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
} /*-- _TIFFSetGetFieldSize --- */
|
||||||
|
|
||||||
|
|
||||||
const TIFFField*
|
const TIFFField*
|
||||||
TIFFFindField(TIFF* tif, uint32 tag, TIFFDataType dt)
|
TIFFFindField(TIFF* tif, uint32 tag, TIFFDataType dt)
|
||||||
{
|
{
|
||||||
@@ -1062,10 +1236,6 @@ _TIFFCheckFieldIsValidForCodec(TIFF *tif, ttag_t tag)
|
|||||||
if (tag == TIFFTAG_LERC_PARAMETERS)
|
if (tag == TIFFTAG_LERC_PARAMETERS)
|
||||||
return 1;
|
return 1;
|
||||||
break;
|
break;
|
||||||
case COMPRESSION_WEBP:
|
|
||||||
if (tag == TIFFTAG_PREDICTOR)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+852
-359
File diff suppressed because it is too large
Load Diff
Vendored
+786
-55
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user