Compare commits
585 Commits
Author | SHA1 | Date |
---|---|---|
|
dcd1d20a75 | 2 days ago |
|
f9b79e67fd | 5 days ago |
|
024d7f73b8 | 5 days ago |
|
476fa0ab7c | 5 days ago |
|
9ea9043a0e | 5 days ago |
|
8acd884797 | 5 days ago |
|
bbcd2691ed | 5 days ago |
|
c65ffab9dd | 5 days ago |
|
99d08c30ef | 5 days ago |
|
a38e3801ae | 5 days ago |
|
a9ac0743f7 | 6 days ago |
|
a7c4356d93 | 6 days ago |
|
2baf96fe67 | 6 days ago |
|
913747e6c3 | 6 days ago |
|
0b1aa8a13a | 1 week ago |
|
b5aec7ae17 | 1 week ago |
|
6f3cae9d02 | 1 week ago |
|
7a67a142cb | 1 week ago |
|
0a6850d92b | 1 week ago |
|
42dab55bc4 | 1 week ago |
|
662d3307b0 | 1 week ago |
|
2b9c1feae5 | 1 week ago |
|
aa04fca845 | 1 week ago |
|
a72118a5a6 | 1 week ago |
|
d50b21d0d6 | 1 week ago |
|
6255fa932c | 1 week ago |
|
8aec5f30ef | 2 weeks ago |
|
c23f30ce71 | 2 weeks ago |
|
118ffdc638 | 2 weeks ago |
|
058e4b2f46 | 2 weeks ago |
|
48d61baf6f | 2 weeks ago |
|
9ff07b8c12 | 2 weeks ago |
|
69958ba1d2 | 2 weeks ago |
|
3979e03882 | 2 weeks ago |
|
b96fe6bbfd | 3 weeks ago |
|
94edf1324f | 3 weeks ago |
|
18efb1e439 | 3 weeks ago |
|
b2a1a5cde3 | 3 weeks ago |
|
cdf664b448 | 3 weeks ago |
|
e549126563 | 3 weeks ago |
|
1322ddd8b2 | 3 weeks ago |
|
139a6a5fde | 3 weeks ago |
|
9721eced21 | 3 weeks ago |
|
b425713f63 | 3 weeks ago |
|
7e3ff1b741 | 3 weeks ago |
|
284f61a86e | 3 weeks ago |
|
aa4ca70d07 | 3 weeks ago |
|
6e1655813d | 3 weeks ago |
|
8468978f19 | 3 weeks ago |
|
ce2b36422c | 3 weeks ago |
|
38bfd44bcd | 3 weeks ago |
|
5ac7838839 | 3 weeks ago |
|
86b7e63849 | 3 weeks ago |
|
adb24119ef | 3 weeks ago |
|
436058fefa | 3 weeks ago |
|
7a6497ee40 | 3 weeks ago |
|
03110ac486 | 3 weeks ago |
|
8612c66ed3 | 3 weeks ago |
|
60989b5c40 | 4 weeks ago |
|
4df8d72c42 | 4 weeks ago |
|
f3e5cda1da | 4 weeks ago |
|
6d68a33224 | 4 weeks ago |
|
9d0f93b6ff | 4 weeks ago |
|
789547b503 | 4 weeks ago |
|
514fc054a7 | 4 weeks ago |
|
afc69b9dff | 4 weeks ago |
|
d29fb0280c | 4 weeks ago |
|
eca28cd6f7 | 4 weeks ago |
|
9efab780cf | 4 weeks ago |
|
c60587661b | 4 weeks ago |
|
1b40738b71 | 4 weeks ago |
|
8bff5f0741 | 4 weeks ago |
|
3c58e63c6a | 4 weeks ago |
|
450556375e | 4 weeks ago |
|
4cb359d0fd | 4 weeks ago |
|
a39614c581 | 4 weeks ago |
|
8c702f86c6 | 4 weeks ago |
|
81d4cd700c | 4 weeks ago |
|
15873ca510 | 4 weeks ago |
|
f06a7dfcff | 4 weeks ago |
|
1fbb9ffe51 | 4 weeks ago |
|
1772027e9e | 4 weeks ago |
|
8ff8a4bb1e | 4 weeks ago |
|
c071d8ec71 | 4 weeks ago |
|
e47acced9b | 4 weeks ago |
|
4bc9005ebb | 4 weeks ago |
|
5eb8e630c6 | 4 weeks ago |
|
02e66332ea | 4 weeks ago |
|
bd3451f47c | 4 weeks ago |
|
812688ae68 | 4 weeks ago |
|
5de3b6e73e | 4 weeks ago |
|
c34a649fa5 | 4 weeks ago |
|
cf557a599a | 4 weeks ago |
|
fd15553e70 | 4 weeks ago |
|
deb8b06820 | 4 weeks ago |
|
740dc120f6 | 4 weeks ago |
|
f66955ba99 | 4 weeks ago |
|
fed87bc421 | 4 weeks ago |
|
3bec3c924b | 4 weeks ago |
|
0d97a04da0 | 4 weeks ago |
|
0a88e9b918 | 4 weeks ago |
|
e5fd96efce | 4 weeks ago |
|
621bbb9c78 | 1 month ago |
|
c7351b8000 | 1 month ago |
|
d27321974f | 1 month ago |
|
75864122c5 | 1 month ago |
|
4eb14e755c | 1 month ago |
|
a22f41d537 | 1 month ago |
|
a58544eab1 | 1 month ago |
|
ebf8312f6f | 1 month ago |
|
46ec0a4f39 | 1 month ago |
|
189ebe3f41 | 1 month ago |
|
ba42b72744 | 1 month ago |
|
92ce03d2e8 | 1 month ago |
|
553bae38d9 | 1 month ago |
|
d3b493efbc | 1 month ago |
|
90df33d1f7 | 1 month ago |
|
38edbefcda | 1 month ago |
|
707aa9bd94 | 1 month ago |
|
6239916828 | 1 month ago |
|
3f4531ecd6 | 1 month ago |
|
5945fc1d1c | 1 month ago |
|
0f54876da8 | 1 month ago |
|
f433903745 | 1 month ago |
|
f216640381 | 1 month ago |
|
afae4794d3 | 1 month ago |
|
d96f337162 | 1 month ago |
|
ba500120b4 | 1 month ago |
|
6b8e477ed1 | 1 month ago |
|
f7ae9d42d2 | 1 month ago |
|
31d65ea586 | 1 month ago |
|
911a39a22f | 1 month ago |
|
1f07b07004 | 1 month ago |
|
6bc8849d3c | 1 month ago |
|
c67bebed88 | 1 month ago |
|
f7912c8882 | 1 month ago |
|
35b31577b2 | 1 month ago |
|
f8e627abc5 | 1 month ago |
|
92412cf7d7 | 1 month ago |
|
4222c6ff8a | 1 month ago |
|
2bba3867e9 | 1 month ago |
|
5df43d28d6 | 1 month ago |
|
724db375ca | 1 month ago |
|
2b416c3f0d | 1 month ago |
|
713f69048f | 1 month ago |
|
c85a5b9371 | 1 month ago |
|
031dc97548 | 1 month ago |
|
456268c682 | 1 month ago |
|
cc55b5aa4d | 1 month ago |
|
7558b79c5e | 1 month ago |
|
0d2090153f | 1 month ago |
|
024cca3104 | 1 month ago |
|
be9f65d3a3 | 1 month ago |
|
792a694f66 | 1 month ago |
|
b916e63a00 | 1 month ago |
|
eb5af62ad3 | 1 month ago |
|
67479e0acc | 1 month ago |
|
05b9a7a5e5 | 1 month ago |
|
c1a06203e3 | 1 month ago |
|
02fc11fc22 | 1 month ago |
|
026bd1a022 | 1 month ago |
|
200131ec67 | 1 month ago |
|
0b08c08d81 | 1 month ago |
|
75f0fdc73c | 1 month ago |
|
a7f4866ac8 | 1 month ago |
|
bc823212aa | 1 month ago |
|
7e23d09814 | 1 month ago |
|
5e869d0f92 | 1 month ago |
|
c6dbc278da | 1 month ago |
|
a248c9e297 | 1 month ago |
|
185ed0abff | 1 month ago |
|
3a0ae0ab75 | 1 month ago |
|
69bc6dced9 | 1 month ago |
|
6e1625b58d | 1 month ago |
|
115a22dd47 | 1 month ago |
|
c104f26f7d | 1 month ago |
|
d36d0d916d | 1 month ago |
|
0c57bca352 | 1 month ago |
|
8abeaf9e04 | 1 month ago |
|
f0b82e235e | 1 month ago |
|
3db1ae1c08 | 1 month ago |
|
43148b5962 | 1 month ago |
|
a58e86b519 | 1 month ago |
|
a6bfbdcea2 | 1 month ago |
|
752b5fe318 | 1 month ago |
|
4ca40f0424 | 1 month ago |
|
d75ad0949e | 1 month ago |
|
e3388d77c3 | 1 month ago |
|
4067f2d6ed | 1 month ago |
|
aeb8e49b81 | 1 month ago |
|
3bc6775f84 | 1 month ago |
|
dc17a15210 | 1 month ago |
|
e4e174a083 | 1 month ago |
|
44d780a0ce | 1 month ago |
|
0097f11b69 | 1 month ago |
|
b533cd645f | 1 month ago |
|
e0063691f0 | 1 month ago |
|
31039c213d | 1 month ago |
|
86f22853ca | 1 month ago |
|
b3024a934b | 1 month ago |
|
b1b2b0d550 | 1 month ago |
|
0c1143d0d0 | 1 month ago |
|
362a23f58d | 1 month ago |
|
ce762add59 | 1 month ago |
|
8e44768f7e | 1 month ago |
|
fc7fc294eb | 1 month ago |
|
ee0a2b632e | 1 month ago |
|
d94124aa3c | 1 month ago |
|
22b81f8c46 | 1 month ago |
|
2811c694b7 | 1 month ago |
|
06f38f3ff0 | 1 month ago |
|
f8ccfbba76 | 1 month ago |
|
96b07fa223 | 1 month ago |
|
ae6d49ed99 | 1 month ago |
|
5d57a099cd | 1 month ago |
|
c8f34e9319 | 1 month ago |
|
e01b32e166 | 1 month ago |
|
db2ff686c6 | 1 month ago |
|
e022748f71 | 1 month ago |
|
c6405cf287 | 1 month ago |
|
38fe69d93b | 1 month ago |
|
e75fe1648c | 1 month ago |
|
ab438f68b8 | 1 month ago |
|
ba37692f73 | 1 month ago |
|
97c8cc3038 | 2 months ago |
|
5872857f8d | 2 months ago |
|
9c7be4fe96 | 2 months ago |
|
4e5b1b7b2a | 2 months ago |
|
cbf60b12f6 | 2 months ago |
|
9a88a2dcd2 | 2 months ago |
|
00a8de5e54 | 2 months ago |
|
1fcc231ac1 | 2 months ago |
|
667ebb60c8 | 2 months ago |
|
dcf3dffe02 | 2 months ago |
|
20c5eebd20 | 2 months ago |
|
eeabd15b87 | 2 months ago |
|
d930f65393 | 2 months ago |
|
3974564746 | 2 months ago |
|
3c5f49a563 | 2 months ago |
|
b1b70395c7 | 2 months ago |
|
21aac05206 | 2 months ago |
|
e2c4e51550 | 2 months ago |
|
75a7c17d62 | 2 months ago |
|
d9b75e2c2f | 2 months ago |
|
f90cbd0446 | 2 months ago |
|
a90617698b | 2 months ago |
|
738f4f230a | 2 months ago |
|
55bda9770e | 2 months ago |
|
e580737761 | 2 months ago |
|
c0e0b3874f | 2 months ago |
|
31391c2bab | 2 months ago |
|
025c9fb07f | 2 months ago |
|
07f7744ad8 | 2 months ago |
|
58d8c614ab | 2 months ago |
|
82e8212027 | 2 months ago |
|
32a1fbbeb1 | 2 months ago |
|
2dd6cb8f31 | 2 months ago |
|
0d8bb73f17 | 2 months ago |
|
89b263e4de | 2 months ago |
|
2d600c18e4 | 2 months ago |
|
424bd6ee88 | 2 months ago |
|
987d2e8053 | 2 months ago |
|
387673bf99 | 2 months ago |
|
8bb1c53bc2 | 2 months ago |
|
7ae8505809 | 2 months ago |
|
d2881112f2 | 2 months ago |
|
40d36e1577 | 2 months ago |
|
47ff714ae5 | 2 months ago |
|
f8784c5b26 | 2 months ago |
|
ee492d0e60 | 2 months ago |
|
8fd275a6e7 | 2 months ago |
|
a9fd536a8a | 2 months ago |
|
142fca3dd0 | 2 months ago |
|
ed35d74c94 | 2 months ago |
|
cd520ebefe | 2 months ago |
|
9ff79bbe1b | 2 months ago |
|
6598b45d3e | 2 months ago |
|
62de685e4e | 2 months ago |
|
a0c4651e97 | 2 months ago |
|
883e9f94e4 | 2 months ago |
|
44a5a32741 | 2 months ago |
|
31e33b065b | 2 months ago |
|
5a8be5883b | 2 months ago |
|
b734a9cc2a | 2 months ago |
|
be7b992bdd | 2 months ago |
|
2b06803252 | 2 months ago |
|
396d20ea3f | 2 months ago |
|
fde6514d16 | 2 months ago |
|
f6d3ccbfa1 | 2 months ago |
|
754d3bebb7 | 2 months ago |
|
a04db636c6 | 2 months ago |
|
6e379548e6 | 2 months ago |
|
38a8498dbc | 2 months ago |
|
5dae67b03b | 2 months ago |
|
b821156ca1 | 2 months ago |
|
870cffab5c | 2 months ago |
|
55c3776ac8 | 2 months ago |
|
126c1f5e1b | 2 months ago |
|
28be0c4c80 | 2 months ago |
|
8c3103eef6 | 2 months ago |
|
e59f6fbbea | 2 months ago |
|
b216ad7546 | 2 months ago |
|
c3e4ef0847 | 2 months ago |
|
101d2b945a | 2 months ago |
|
7ea3b47abb | 2 months ago |
|
cf6c5c8158 | 2 months ago |
|
b9fe6ce048 | 2 months ago |
|
138040baa8 | 2 months ago |
|
e21e409712 | 2 months ago |
|
b3f3703c74 | 2 months ago |
|
f445f5f6c8 | 2 months ago |
|
cafa30c728 | 2 months ago |
|
167878de1a | 2 months ago |
|
c51fb6924b | 2 months ago |
|
ec6a27df28 | 2 months ago |
|
11e5b98a90 | 2 months ago |
|
d4c5986943 | 2 months ago |
|
5a91bd8dcb | 2 months ago |
|
4c42820cea | 2 months ago |
|
db78ce7728 | 2 months ago |
|
b5a188a5b4 | 2 months ago |
|
90465c4ac1 | 2 months ago |
|
7ef6086f50 | 2 months ago |
|
5151f9291a | 2 months ago |
|
7037eab930 | 2 months ago |
|
2d67c94bc9 | 2 months ago |
|
39b94cee90 | 2 months ago |
|
801a9e98ba | 2 months ago |
|
868fbebb6b | 2 months ago |
|
1806c36148 | 2 months ago |
|
f2f29482a0 | 2 months ago |
|
a52255e9d9 | 2 months ago |
|
2cc92025fc | 2 months ago |
|
744057c407 | 2 months ago |
|
d23116aa57 | 2 months ago |
|
3fab6d4542 | 2 months ago |
|
21c789155c | 2 months ago |
|
11dbea7170 | 2 months ago |
|
17ae352c31 | 2 months ago |
|
31c0d81e13 | 2 months ago |
|
18ecc420ed | 2 months ago |
|
b58969cc5e | 2 months ago |
|
9bb9b6848c | 2 months ago |
|
7a557ac8fd | 2 months ago |
|
e0a23a6c3b | 2 months ago |
|
2d0fe6609b | 2 months ago |
|
7e57c3cc08 | 2 months ago |
|
0fc7ff436e | 2 months ago |
|
2009c6d472 | 2 months ago |
|
24333d1882 | 2 months ago |
|
04abdbeb61 | 2 months ago |
|
4106ce8cb3 | 2 months ago |
|
7ad52b042c | 2 months ago |
|
6925da78b1 | 2 months ago |
|
9f00a81b8e | 2 months ago |
|
1c8372d5a2 | 2 months ago |
|
1782269938 | 2 months ago |
|
8398ae8246 | 2 months ago |
|
49aff958d0 | 2 months ago |
|
b6932b116e | 2 months ago |
|
4976337878 | 2 months ago |
|
897b53e44e | 2 months ago |
|
621cf4f3ba | 2 months ago |
|
476ebbd5e0 | 2 months ago |
|
c54cecacf0 | 2 months ago |
|
9fedc2532c | 2 months ago |
|
8e9597eaf4 | 2 months ago |
|
b94039cbd6 | 2 months ago |
|
6d2f4c7535 | 2 months ago |
|
252e2575f5 | 2 months ago |
|
6587298604 | 2 months ago |
|
eb96c9c6c7 | 2 months ago |
|
d1d34ebcfc | 2 months ago |
|
3a0a8b71a0 | 2 months ago |
|
030ca9c7d7 | 2 months ago |
|
a9535f2df7 | 2 months ago |
|
1ba1b9d56a | 2 months ago |
|
7a51b96100 | 2 months ago |
|
8a7d571e0e | 2 months ago |
|
2336758523 | 2 months ago |
|
95213a4ecd | 2 months ago |
|
8f49d82dec | 2 months ago |
|
0170e21b1d | 2 months ago |
|
94ca4f77a4 | 2 months ago |
|
2af459d57a | 2 months ago |
|
1f3943b34b | 2 months ago |
|
ec5799f167 | 2 months ago |
|
9f23994521 | 2 months ago |
|
e3aa7d04eb | 2 months ago |
|
5049677133 | 2 months ago |
|
eb5aa8396a | 2 months ago |
|
d35bf3d71c | 2 months ago |
|
17e2ae7fd9 | 2 months ago |
|
8108bf4c7c | 2 months ago |
|
996cb9109f | 2 months ago |
|
164b14697c | 2 months ago |
|
74f42bcfd3 | 2 months ago |
|
3ea1fbde25 | 2 months ago |
|
2c53f2fc0a | 2 months ago |
|
a74db09f67 | 2 months ago |
|
ae213c7a9b | 2 months ago |
|
13cb6722f3 | 2 months ago |
|
820158e650 | 2 months ago |
|
78cacaeba1 | 2 months ago |
|
40e9533d31 | 2 months ago |
|
357c58112f | 2 months ago |
|
4afdbdae62 | 2 months ago |
|
79dc4e8ec7 | 2 months ago |
|
6388002df2 | 2 months ago |
|
ebe52ca252 | 2 months ago |
|
ce81c8dd4f | 2 months ago |
|
7033ad7e0b | 2 months ago |
|
9397d53107 | 2 months ago |
|
48856f0c0b | 2 months ago |
|
2d5cc27c0e | 2 months ago |
|
e3c74db577 | 2 months ago |
|
dada0e876f | 2 months ago |
|
9170d2bec0 | 2 months ago |
|
06842bca13 | 2 months ago |
|
410ded43f1 | 2 months ago |
|
1d92d624f8 | 2 months ago |
|
5a26bd6353 | 2 months ago |
|
f247a6f4e0 | 2 months ago |
|
991fc0a449 | 3 months ago |
|
ac357883ac | 3 months ago |
|
604819a8a1 | 3 months ago |
|
95c0fb4415 | 3 months ago |
|
4e10f77ce3 | 3 months ago |
|
3575377767 | 3 months ago |
|
f577a1be3d | 3 months ago |
|
0b8c29eb91 | 3 months ago |
|
4b09ea6428 | 3 months ago |
|
2b5916c9ce | 3 months ago |
|
0b5e19541e | 3 months ago |
|
bae16b9427 | 3 months ago |
|
22bc6af87c | 3 months ago |
|
8951b8cdaf | 3 months ago |
|
ae9ea20948 | 3 months ago |
|
963ac6bdaf | 3 months ago |
|
a2aef51df6 | 3 months ago |
|
182c592f98 | 3 months ago |
|
c09ed76819 | 3 months ago |
|
3b492e7ea3 | 3 months ago |
|
bd7d4132e2 | 3 months ago |
|
9c2346befd | 3 months ago |
|
385c456401 | 3 months ago |
|
c5d9e19aff | 3 months ago |
|
9a227b149e | 3 months ago |
|
49b614b7b9 | 3 months ago |
|
4033f978a5 | 3 months ago |
|
3c7e35b5ee | 3 months ago |
|
e6228f7dfa | 3 months ago |
|
8381d6a0b9 | 3 months ago |
|
a42bf5390c | 3 months ago |
|
44aeadbe2d | 3 months ago |
|
d7a9212d90 | 3 months ago |
|
c106ae42fd | 3 months ago |
|
5f4af242be | 3 months ago |
|
7212994a5f | 3 months ago |
|
09dae14725 | 3 months ago |
|
7b0c32e7b9 | 3 months ago |
|
b0c9e5f412 | 3 months ago |
|
180b2efe0b | 3 months ago |
|
bd81fd52d0 | 3 months ago |
|
eaf7bfb875 | 3 months ago |
|
82ebd92ad2 | 3 months ago |
|
ae3f25b14a | 3 months ago |
|
9017c2bd7d | 3 months ago |
|
b1071b52c5 | 3 months ago |
|
89443efa26 | 3 months ago |
|
d8defe3b63 | 3 months ago |
|
496a6fbdce | 3 months ago |
|
3a9b85c868 | 3 months ago |
|
e280e76015 | 3 months ago |
|
41208a587c | 3 months ago |
|
b381fa562f | 3 months ago |
|
0375b13c67 | 3 months ago |
|
864a8dc0dd | 3 months ago |
|
a506598b42 | 3 months ago |
|
441cdc40b1 | 3 months ago |
|
ab91aa6cef | 3 months ago |
|
b40f77076d | 3 months ago |
|
3fdf189af5 | 3 months ago |
|
447f9999eb | 3 months ago |
|
0c33cc68c4 | 3 months ago |
|
e999149187 | 3 months ago |
|
0aabc2af52 | 3 months ago |
|
c17dc6a83e | 3 months ago |
|
026508615d | 3 months ago |
|
deaf5ec7e1 | 3 months ago |
|
c8610406ef | 3 months ago |
|
3902d69997 | 3 months ago |
|
22e81844ac | 3 months ago |
|
4c426cf5ff | 3 months ago |
|
8f9fa84028 | 3 months ago |
|
1925e923e2 | 3 months ago |
|
9aa25b6d66 | 3 months ago |
|
0cb2927b13 | 3 months ago |
|
5578b2e40f | 3 months ago |
|
f0c6738887 | 3 months ago |
|
9f8e92030a | 3 months ago |
|
f5c38b5127 | 3 months ago |
|
b18b9f54e4 | 3 months ago |
|
808271c7f1 | 3 months ago |
|
21fd57061c | 3 months ago |
|
32698886d0 | 3 months ago |
|
3dbb79e94c | 3 months ago |
|
ca7e8e5acf | 3 months ago |
|
c8966009b8 | 3 months ago |
|
ccc0e0e334 | 3 months ago |
|
5d312ed1f0 | 3 months ago |
|
120d7fdde7 | 3 months ago |
|
238f0aeb4f | 3 months ago |
|
69a3997805 | 3 months ago |
|
ebcd0c4dca | 3 months ago |
|
e74c0185a5 | 3 months ago |
|
b08adad0a4 | 3 months ago |
|
955efa5389 | 3 months ago |
|
2c0b32fe64 | 3 months ago |
|
28315925ee | 3 months ago |
|
1fd8c79f58 | 3 months ago |
|
b4e7cf8fab | 3 months ago |
|
56d42d8774 | 3 months ago |
|
fe97b3c5bc | 3 months ago |
|
1583dc6a46 | 3 months ago |
|
44dc885717 | 3 months ago |
|
fb42203056 | 3 months ago |
|
5cf252b12f | 3 months ago |
|
6a80e97a43 | 3 months ago |
|
4d5020803c | 3 months ago |
|
e05bcedb6e | 3 months ago |
|
296858be26 | 3 months ago |
|
34a1c4377b | 3 months ago |
|
620af9bb26 | 3 months ago |
|
7624c2b249 | 3 months ago |
|
d939b8089e | 3 months ago |
|
99784847e3 | 3 months ago |
|
eba500f734 | 3 months ago |
|
454c5d6cc6 | 3 months ago |
|
c07508a711 | 3 months ago |
|
d51ff00473 | 3 months ago |
|
b23224415e | 3 months ago |
|
4e80dced8b | 3 months ago |
|
b579a0062d | 3 months ago |
|
2ae0368468 | 3 months ago |
|
9ad980f666 | 3 months ago |
|
0cfd48ff92 | 3 months ago |
|
0957cc3a12 | 3 months ago |
|
6dee0b0ad4 | 3 months ago |
|
d37d4e0c13 | 3 months ago |
|
c308feff90 | 3 months ago |
|
0f50e62000 | 3 months ago |
|
24321ae011 | 3 months ago |
|
bdfe3e2bd7 | 3 months ago |
|
485301e714 | 3 months ago |
|
64316cedf3 | 3 months ago |
|
b5eb21d063 | 3 months ago |
|
feb4981377 | 3 months ago |
|
4109741628 | 3 months ago |
|
fedae228b1 | 3 months ago |
|
0d92c10c60 | 3 months ago |
|
8b51cfdefb | 3 months ago |
|
a7d3266624 | 3 months ago |
|
b8416b8e1b | 3 months ago |
|
2e12a1ac84 | 3 months ago |
|
3453e2d221 | 3 months ago |
|
12197fa28d | 3 months ago |
|
a1601cd71c | 3 months ago |
|
a14c76c4ed | 3 months ago |
|
4cae89014d | 3 months ago |
|
89fe772caa | 3 months ago |
|
216a053086 | 3 months ago |
|
52608b8324 | 3 months ago |
|
5734762c07 | 3 months ago |
|
3a8ef64e2f | 3 months ago |
|
4ba4be427e | 3 months ago |
|
5c7f6abb71 | 3 months ago |
|
02663dd08b | 3 months ago |
|
fd84d84157 | 3 months ago |
|
70b795fe27 | 3 months ago |
|
d206a59d9a | 3 months ago |
|
ee93791683 | 3 months ago |
|
53578065f1 | 3 months ago |
|
6f56bf0fe3 | 3 months ago |
|
d1298663f3 | 3 months ago |
@ -0,0 +1,227 @@
|
||||
#!/system/bin/sh
|
||||
|
||||
# ==============================================
|
||||
# Configuration parameters - modify as needed
|
||||
# ==============================================
|
||||
ETH_IP="192.168.68.91" # Ethernet IP address
|
||||
ETH_NETMASK="24" # Subnet mask (CIDR format)
|
||||
ETH_NETWORK="192.168.68.0" # Network address
|
||||
ETH_BROADCAST="192.168.68.255" # Broadcast address
|
||||
ETH_GATEWAY="192.168.68.1" # Default gateway
|
||||
ROUTE_TABLE="20" # Routing table number
|
||||
MAX_INIT_WAIT=150 # Maximum seconds to wait for ethernet interface
|
||||
MAX_UP_WAIT=10 # Maximum seconds to wait for interface to come UP
|
||||
MAX_ROUTE_WAIT=5 # Maximum seconds to wait for routing rules
|
||||
|
||||
# For debugging only - comment out in production
|
||||
# set -x
|
||||
|
||||
ANDROID_VERSION=$(getprop ro.build.version.release 2>/dev/null | cut -d '.' -f1)
|
||||
|
||||
# Record script start time
|
||||
SCRIPT_START=$(date +%s)
|
||||
|
||||
# Cleanup function - handles unexpected interruptions
|
||||
cleanup() {
|
||||
echo "Script interrupted, cleaning up..." >&2
|
||||
# Add additional cleanup code here if needed
|
||||
exit 1
|
||||
}
|
||||
trap cleanup INT TERM
|
||||
|
||||
# Get script directory for finding tools like ethtool
|
||||
SCRIPT_PATH="$0"
|
||||
# Ensure path is absolute
|
||||
case "$SCRIPT_PATH" in
|
||||
/*) ;; # Already absolute path
|
||||
*) SCRIPT_PATH="$PWD/$SCRIPT_PATH" ;;
|
||||
esac
|
||||
SCRIPT_DIR=$(dirname "$SCRIPT_PATH")
|
||||
echo "Script directory detected as: $SCRIPT_DIR"
|
||||
|
||||
# Only configure rp_filter for eth0 interface
|
||||
echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter 2>/dev/null || true
|
||||
|
||||
# Wait for eth0 interface to appear
|
||||
WAITED=0
|
||||
while [ $WAITED -lt $MAX_INIT_WAIT ]; do
|
||||
if [ -d "/sys/class/net/eth0" ]; then
|
||||
echo "eth0 found after $WAITED seconds"
|
||||
break
|
||||
fi
|
||||
echo "Wait eth0... ($WAITED/$MAX_INIT_WAIT)"
|
||||
sleep 0.1
|
||||
WAITED=$((WAITED+1))
|
||||
done
|
||||
|
||||
# Check if eth0 exists
|
||||
if ! [ -d "/sys/class/net/eth0" ]; then
|
||||
echo "Error: eth0 not exists" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check physical connection status
|
||||
if [ -f "/sys/class/net/eth0/carrier" ]; then
|
||||
CARRIER=$(cat /sys/class/net/eth0/carrier)
|
||||
echo "Physical connection status: $CARRIER (1=connected, 0=disconnected)"
|
||||
if [ "$CARRIER" != "1" ]; then
|
||||
echo "Warning: Ethernet physical connection may have issues, please check the cable" >&2
|
||||
fi
|
||||
fi
|
||||
|
||||
# Clear previous configuration
|
||||
/system/bin/ip link set eth0 down
|
||||
/system/bin/ip addr flush dev eth0
|
||||
/system/bin/ip route flush dev eth0
|
||||
/system/bin/ip route flush table $ROUTE_TABLE
|
||||
/system/bin/ip rule del to $ETH_NETWORK/$ETH_NETMASK 2>/dev/null || true
|
||||
|
||||
# Configure physical layer with ethtool (while interface is DOWN)
|
||||
if [ -x "$SCRIPT_DIR/ethtool" ]; then
|
||||
echo "Using ethtool from script directory: $SCRIPT_DIR/ethtool"
|
||||
"$SCRIPT_DIR/ethtool" -s eth0 speed 10 duplex full autoneg off
|
||||
# Try alternative path next
|
||||
elif [ -x "/data/data/com.xypower.mpapp/files/ethtool" ]; then
|
||||
echo "Configuring eth0 to 10Mbps full duplex..."
|
||||
/data/data/com.xypower.mpapp/files/ethtool -s eth0 speed 10 duplex full autoneg off
|
||||
else
|
||||
echo "Warning: ethtool not found, falling back to sysfs configuration" >&2
|
||||
# Try sysfs configuration as fallback
|
||||
if [ -f "/sys/class/net/eth0/speed" ]; then
|
||||
echo "off" > /sys/class/net/eth0/autoneg 2>/dev/null || true
|
||||
echo "10" > /sys/class/net/eth0/speed 2>/dev/null || true
|
||||
echo "full" > /sys/class/net/eth0/duplex 2>/dev/null || true
|
||||
fi
|
||||
fi
|
||||
|
||||
# ====================================================
|
||||
# MTK Android 9 IP configuration with loss prevention
|
||||
# ====================================================
|
||||
|
||||
# Configure IP address first while interface is DOWN
|
||||
echo "Setting IP address while interface is DOWN..."
|
||||
/system/bin/ip addr add $ETH_IP/$ETH_NETMASK broadcast $ETH_BROADCAST dev eth0
|
||||
PRE_UP_IP=$(/system/bin/ip addr show eth0 | grep -c "inet $ETH_IP")
|
||||
echo "IP configuration before UP: $PRE_UP_IP (1=configured, 0=missing)"
|
||||
|
||||
# Enable interface and wait for UP
|
||||
echo "Bringing up interface..."
|
||||
/system/bin/ip link set eth0 up
|
||||
if [ "$ANDROID_VERSION" = "9" ]; then
|
||||
sleep 3
|
||||
else
|
||||
# Use standard configuration for other devices
|
||||
sleep 1
|
||||
fi
|
||||
|
||||
# Check if IP was lost after interface UP (common issue on MTK devices)
|
||||
POST_UP_IP=$(/system/bin/ip addr show eth0 | grep -c "inet $ETH_IP")
|
||||
echo "IP configuration after UP: $POST_UP_IP (1=retained, 0=lost)"
|
||||
|
||||
# IP address lost detection and recovery
|
||||
if [ "$PRE_UP_IP" = "1" ] && [ "$POST_UP_IP" = "0" ]; then
|
||||
echo "Warning: IP address was lost after bringing interface up - MTK issue detected"
|
||||
echo "Reapplying IP configuration..."
|
||||
/system/bin/ip addr add $ETH_IP/$ETH_NETMASK broadcast $ETH_BROADCAST dev eth0
|
||||
|
||||
# Check if reapplied configuration worked
|
||||
FIXED_IP=$(/system/bin/ip addr show eth0 | grep -c "inet $ETH_IP")
|
||||
echo "IP reapplication result: $FIXED_IP (1=success, 0=still missing)"
|
||||
|
||||
# If standard method fails, try MTK-specific approaches
|
||||
if [ "$FIXED_IP" = "0" ]; then
|
||||
echo "Standard IP configuration failed, trying MTK-specific methods"
|
||||
|
||||
# Try ifconfig if available (works better on some MTK devices)
|
||||
if command -v ifconfig >/dev/null 2>&1; then
|
||||
echo "Using ifconfig method..."
|
||||
ifconfig eth0 $ETH_IP netmask 255.255.255.0 up
|
||||
sleep 1
|
||||
fi
|
||||
|
||||
# Try Android's netd service if available
|
||||
if [ -x "/system/bin/ndc" ]; then
|
||||
echo "Using MTK netd service..."
|
||||
/system/bin/ndc network interface setcfg eth0 $ETH_IP 255.255.255.0 up
|
||||
sleep 1
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
# Use loop to wait for interface UP instead of fixed sleep
|
||||
WAITED=0
|
||||
while [ $WAITED -lt $MAX_UP_WAIT ]; do
|
||||
# Check both link status and IP configuration
|
||||
IF_STATUS=$(/system/bin/ip link show eth0 | grep -c ",UP")
|
||||
IP_STATUS=$(/system/bin/ip addr show eth0 | grep -c "inet $ETH_IP")
|
||||
|
||||
if [ "$IF_STATUS" = "1" ] && [ "$IP_STATUS" = "1" ]; then
|
||||
echo "Interface is UP with correct IP after $WAITED seconds"
|
||||
break
|
||||
fi
|
||||
|
||||
echo "Waiting for interface UP with IP... ($WAITED/$MAX_UP_WAIT)"
|
||||
|
||||
# If interface is UP but IP is missing, reapply IP
|
||||
if [ "$IF_STATUS" = "1" ] && [ "$IP_STATUS" = "0" ]; then
|
||||
echo "Interface UP but IP missing, reapplying IP..."
|
||||
/system/bin/ip addr add $ETH_IP/$ETH_NETMASK broadcast $ETH_BROADCAST dev eth0
|
||||
fi
|
||||
|
||||
sleep 0.5
|
||||
WAITED=$((WAITED+1))
|
||||
done
|
||||
|
||||
# Final status check
|
||||
FINAL_IF_STATUS=$(/system/bin/ip link show eth0 | grep -c ",UP")
|
||||
FINAL_IP_STATUS=$(/system/bin/ip addr show eth0 | grep -c "inet $ETH_IP")
|
||||
|
||||
if [ "$FINAL_IF_STATUS" != "1" ] || [ "$FINAL_IP_STATUS" != "1" ]; then
|
||||
echo "Warning: Failed to achieve stable interface state with IP" >&2
|
||||
echo "Final interface status: $FINAL_IF_STATUS (1=UP, 0=DOWN)"
|
||||
echo "Final IP status: $FINAL_IP_STATUS (1=configured, 0=missing)"
|
||||
/system/bin/ip addr show eth0
|
||||
else
|
||||
echo "Successfully configured eth0 with IP $ETH_IP"
|
||||
fi
|
||||
|
||||
# First add to main routing table
|
||||
/system/bin/ip route add $ETH_NETWORK/$ETH_NETMASK dev eth0 proto static scope link
|
||||
|
||||
# Then add to specified routing table
|
||||
/system/bin/ip route add $ETH_NETWORK/$ETH_NETMASK dev eth0 proto static scope link table $ROUTE_TABLE
|
||||
ADD_ROUTE_STATUS=$?
|
||||
|
||||
if [ $ADD_ROUTE_STATUS -eq 0 ]; then
|
||||
echo "Add route successfully"
|
||||
else
|
||||
echo "Failed to add route: $ADD_ROUTE_STATUS" >&2
|
||||
fi
|
||||
|
||||
# Only clear ARP and neighbor cache for eth0
|
||||
/system/bin/ip neigh flush dev eth0
|
||||
|
||||
# Add routing rules - only flush cache once after rule is added
|
||||
/system/bin/ip rule add from all to $ETH_NETWORK/$ETH_NETMASK lookup $ROUTE_TABLE prio 1000
|
||||
/system/bin/ip route flush cache dev eth0
|
||||
|
||||
# Only enable forwarding for eth0 interface
|
||||
echo 1 > /proc/sys/net/ipv4/conf/eth0/forwarding 2>/dev/null || true
|
||||
|
||||
# Wait for routing rules to take effect - using loop check instead of fixed wait
|
||||
WAITED=0
|
||||
while [ $WAITED -lt $MAX_ROUTE_WAIT ]; do
|
||||
if /system/bin/ip rule | grep -q "$ETH_NETWORK/$ETH_NETMASK"; then
|
||||
echo "Routing rules are now effective after $WAITED seconds"
|
||||
break
|
||||
fi
|
||||
echo "Waiting for routing rules to take effect... ($WAITED/$MAX_ROUTE_WAIT)"
|
||||
sleep 0.5
|
||||
WAITED=$((WAITED+1))
|
||||
done
|
||||
|
||||
# Display execution time
|
||||
SCRIPT_END=$(date +%s)
|
||||
TOTAL_TIME=$((SCRIPT_END - SCRIPT_START))
|
||||
echo "Total script execution time: $TOTAL_TIME seconds"
|
||||
exit 0
|
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,100 @@
|
||||
//
|
||||
// Created by Matthew on 2025/3/5.
|
||||
//
|
||||
|
||||
#ifndef MICROPHOTO_PTZCONTROLLER_H
|
||||
#define MICROPHOTO_PTZCONTROLLER_H
|
||||
|
||||
#include <Buffer.h>
|
||||
#include <thread>
|
||||
#include <vector>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <mutex>
|
||||
#include <SemaphoreEx.h>
|
||||
#include <Client/Device.h>
|
||||
|
||||
enum PROC_PTZ_STATE
|
||||
{
|
||||
PTZS_POWER_OFF = 0,
|
||||
PTZS_IDLE = 1,
|
||||
PTZS_SELF_TESTING = 2,
|
||||
PTZS_MOVING = 3,
|
||||
PTZS_TAKING_PHOTO = 4,
|
||||
PTZS_PHOTO_SELF_TESTING = 5,
|
||||
};
|
||||
|
||||
#define CAMERA_SELF_TEST_TIME 150 /* Camera self-test time (excluding PTZ self-test)*/
|
||||
#define MOVE_PRESET_WAIT_TIME 20 /* Waiting for the maximum time for the PTZ to move to the preset position*/
|
||||
#define CAMERA_CLOSE_DELAYTIME 360 /* Auto Power-Off Timer Setting After Manual Power-On (for Camera)*/
|
||||
#define PHOTO_OPEN_POWER 16000
|
||||
#define WAIT_TIME_AUTO_CLOSE 2 /* In order to automatically capture multiple preset point images at the same time and prevent the camera from self checking every time it takes a picture.*/
|
||||
|
||||
class PtzPhotoParams
|
||||
{
|
||||
public:
|
||||
PtzPhotoParams(const IDevice::PHOTO_INFO& photoInfo, const std::string& path, const std::vector<IDevice::OSD_INFO>& osds) :
|
||||
mPhotoInfo(photoInfo), mPath(path), mOsds(osds)
|
||||
{
|
||||
}
|
||||
|
||||
~PtzPhotoParams()
|
||||
{
|
||||
}
|
||||
|
||||
IDevice::PHOTO_INFO mPhotoInfo;
|
||||
std::string mPath;
|
||||
std::vector<IDevice::OSD_INFO> mOsds;
|
||||
};
|
||||
|
||||
struct SERIAL_CMD
|
||||
{
|
||||
uint8_t channel;
|
||||
uint8_t preset;
|
||||
time_t ts;
|
||||
int cmdidx;
|
||||
uint32_t delayTime;
|
||||
uint8_t bImageSize;
|
||||
char serfile[128];
|
||||
uint32_t baud;
|
||||
int addr;
|
||||
std::shared_ptr<PtzPhotoParams> photoParams;
|
||||
};
|
||||
|
||||
|
||||
class CPhoneDevice;
|
||||
class PtzController
|
||||
{
|
||||
public:
|
||||
PtzController(CPhoneDevice* pPhoneDevice);
|
||||
|
||||
void Startup();
|
||||
// ();
|
||||
void AddCommand(uint8_t channel, int cmdidx, uint8_t bImageSize, uint8_t preset, const char *serfile, uint32_t baud, int addr);
|
||||
void AddPhotoCommand(IDevice::PHOTO_INFO& photoInfo, const std::string& path, const std::vector<IDevice::OSD_INFO>& osds);
|
||||
|
||||
void ExitAndWait();
|
||||
|
||||
protected:
|
||||
static void PtzThreadProc(PtzController* pThis);
|
||||
|
||||
void PtzProc();
|
||||
|
||||
|
||||
protected:
|
||||
|
||||
|
||||
protected:
|
||||
std::mutex m_locker;
|
||||
std::vector<SERIAL_CMD> m_cmds;
|
||||
|
||||
CSemaphore m_sem;
|
||||
bool m_exit;
|
||||
|
||||
std::thread m_thread;
|
||||
|
||||
CPhoneDevice* m_pPhoneDevice;
|
||||
};
|
||||
|
||||
|
||||
#endif //MICROPHOTO_PTZCONTROLLER_H
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,724 @@
|
||||
/* Copyright Statement:
|
||||
*
|
||||
* This software/firmware and related documentation ("MediaTek Software") are
|
||||
* protected under relevant copyright laws. The information contained herein is
|
||||
* confidential and proprietary to MediaTek Inc. and/or its licensors. Without
|
||||
* the prior written permission of MediaTek inc. and/or its licensors, any
|
||||
* reproduction, modification, use or disclosure of MediaTek Software, and
|
||||
* information contained herein, in whole or in part, shall be strictly
|
||||
* prohibited.
|
||||
*
|
||||
* MediaTek Inc. (C) 2010. All rights reserved.
|
||||
*
|
||||
* BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
|
||||
* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
|
||||
* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
|
||||
* ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
|
||||
* WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
|
||||
* NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
|
||||
* RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
|
||||
* INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
|
||||
* TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
|
||||
* RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
|
||||
* OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
|
||||
* SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
|
||||
* RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
|
||||
* STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
|
||||
* ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
|
||||
* RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
|
||||
* MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
|
||||
* CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
|
||||
*
|
||||
* The following software/firmware and/or related documentation ("MediaTek
|
||||
* Software") have been modified by MediaTek Inc. All revisions are subject to
|
||||
* any receiver's applicable license agreements with MediaTek Inc.
|
||||
*/
|
||||
|
||||
#ifndef _MTK_HARDWARE_MTKCAM_INCLUDE_MTKCAM_UTILS_METADATA_HAL_MTKPLATFORMMETADATATAG_H_
|
||||
#define _MTK_HARDWARE_MTKCAM_INCLUDE_MTKCAM_UTILS_METADATA_HAL_MTKPLATFORMMETADATATAG_H_
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
******************************************************************************/
|
||||
typedef enum mtk_platform_metadata_section {
|
||||
MTK_HAL_REQUEST = 0xC000, // MTK HAL internal metadata become from 0xC000 0000
|
||||
MTK_P1NODE,
|
||||
MTK_P2NODE,
|
||||
MTK_3A_TUNINING,
|
||||
MTK_3A_EXIF,
|
||||
MTK_MF_EXIF,
|
||||
MTK_EIS,
|
||||
MTK_STEREO,
|
||||
MTK_FRAMESYNC,
|
||||
MTK_VHDR,
|
||||
MTK_PIPELINE,
|
||||
MTK_NR,
|
||||
MTK_PLUGIN,
|
||||
MTK_DUALZOOM,
|
||||
MTK_FEATUREPIPE,
|
||||
MTK_POSTPROC,
|
||||
MTK_FEATURE,
|
||||
MTK_FSC,
|
||||
} mtk_platform_metadata_section_t;
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
******************************************************************************/
|
||||
typedef enum mtk_platform_metadata_section_start {
|
||||
MTK_HAL_REQUEST_START = MTK_HAL_REQUEST << 16,
|
||||
MTK_P1NODE_START = MTK_P1NODE << 16,
|
||||
MTK_P2NODE_START = MTK_P2NODE << 16,
|
||||
MTK_3A_TUNINING_START = MTK_3A_TUNINING << 16,
|
||||
MTK_3A_EXIF_START = MTK_3A_EXIF << 16,
|
||||
MTK_EIS_START = MTK_EIS << 16,
|
||||
MTK_STEREO_START = MTK_STEREO << 16,
|
||||
MTK_FRAMESYNC_START = MTK_FRAMESYNC << 16,
|
||||
MTK_VHDR_START = MTK_VHDR << 16,
|
||||
MTK_PIPELINE_START = MTK_PIPELINE << 16,
|
||||
MTK_NR_START = MTK_NR << 16,
|
||||
MTK_PLUGIN_START = MTK_PLUGIN << 16,
|
||||
MTK_DUALZOOM_START = MTK_DUALZOOM << 16,
|
||||
MTK_FEATUREPIPE_START = MTK_FEATUREPIPE << 16,
|
||||
MTK_POSTPROC_START = MTK_POSTPROC << 16,
|
||||
MTK_FEATURE_START = MTK_FEATURE << 16,
|
||||
MTK_FSC_START = MTK_FSC << 16,
|
||||
} mtk_platform_metadata_section_start_t;
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
******************************************************************************/
|
||||
typedef enum mtk_platform_metadata_tag {
|
||||
MTK_HAL_REQUEST_REQUIRE_EXIF = MTK_HAL_REQUEST_START, //MUINT8
|
||||
MTK_HAL_REQUEST_DUMP_EXIF, //MUINT8
|
||||
MTK_HAL_REQUEST_REPEAT, //MUINT8
|
||||
MTK_HAL_REQUEST_DUMMY, //MUINT8
|
||||
MTK_HAL_REQUEST_SENSOR_SIZE, //MSize
|
||||
MTK_HAL_REQUEST_SENSOR_ID, //MINT32
|
||||
MTK_HAL_REQUEST_DEVICE_ID, //MINT32
|
||||
MTK_HAL_REQUEST_HIGH_QUALITY_CAP, //MUINT8
|
||||
MTK_HAL_REQUEST_ISO_SPEED, //MINT32
|
||||
MTK_HAL_REQUEST_BRIGHTNESS_MODE, //MINT32
|
||||
MTK_HAL_REQUEST_CONTRAST_MODE, //MINT32
|
||||
MTK_HAL_REQUEST_HUE_MODE, //MINT32
|
||||
MTK_HAL_REQUEST_SATURATION_MODE, //MINT32
|
||||
MTK_HAL_REQUEST_EDGE_MODE, //MINT32
|
||||
MTK_HAL_REQUEST_PASS1_DISABLE, //MINT32
|
||||
MTK_HAL_REQUEST_ERROR_FRAME, // used for error handling //MUINT8
|
||||
MTK_HAL_REQUEST_PRECAPTURE_START, // 4cell //MUINT8
|
||||
MTK_HAL_REQUEST_AF_TRIGGER_START, // 4cell //MUINT8
|
||||
MTK_HAL_REQUEST_IMG_IMGO_FORMAT, //MINT32
|
||||
MTK_HAL_REQUEST_IMG_RRZO_FORMAT, //MINT32
|
||||
MTK_HAL_REQUEST_INDEX, //MINT32
|
||||
MTK_HAL_REQUEST_COUNT, //MINT32
|
||||
MTK_HAL_REQUEST_SMVR_FPS, //MUINT8 // 0: NOT batch request
|
||||
MTK_HAL_REQUEST_REMOSAIC_ENABLE, //MUINT8 // 0: preview mode 1: capture mode
|
||||
MTK_HAL_REQUEST_INDEX_BSS, //MINT32
|
||||
MTK_HAL_REQUEST_ZSD_CAPTURE_INTENT, //MUINT8
|
||||
MTK_HAL_REQUEST_REAL_CAPTURE_SIZE, //MSize
|
||||
MTK_HAL_REQUEST_VIDEO_SIZE, //MSize
|
||||
MTK_HAL_REQUEST_RAW_IMAGE_INFO, //MINT32 // index[0]: raw fmt, index[1]: raw stride, index[2]: raw size(width), index[3]: raw size(height)
|
||||
MTK_HAL_REQUEST_ISP_PIPELINE_MODE, //MINT32
|
||||
MTK_P1NODE_SCALAR_CROP_REGION = MTK_P1NODE_START, //MRect
|
||||
MTK_P1NODE_BIN_CROP_REGION, //MRect
|
||||
MTK_P1NODE_DMA_CROP_REGION, //MRect
|
||||
MTK_P1NODE_BIN_SIZE, //MSize
|
||||
MTK_P1NODE_RESIZER_SIZE, //MSize
|
||||
MTK_P1NODE_RESIZER_SET_SIZE, //MSize
|
||||
MTK_P1NODE_CTRL_RESIZE_FLUSH, //MBOOL
|
||||
MTK_P1NODE_CTRL_READOUT_FLUSH, //MBOOL
|
||||
MTK_P1NODE_CTRL_RECONFIG_SENSOR_SETTING, //MBOOL
|
||||
MTK_P1NODE_PROCESSOR_MAGICNUM, //MINT32
|
||||
MTK_P1NODE_MIN_FRM_DURATION, //MINT64
|
||||
MTK_P1NODE_RAW_TYPE, //MINT32
|
||||
MTK_P1NODE_SENSOR_CROP_REGION, //MRect
|
||||
MTK_P1NODE_YUV_RESIZER1_CROP_REGION, //MRect
|
||||
MTK_P1NODE_YUV_RESIZER2_CROP_REGION, //MRect
|
||||
MTK_P1NODE_YUV_RESIZER1_SIZE, //MSize
|
||||
MTK_P1NODE_SENSOR_MODE, //MINT32
|
||||
MTK_P1NODE_SENSOR_VHDR_MODE, //MINT32
|
||||
MTK_P1NODE_METADATA_TAG_INDEX, //MINT32
|
||||
MTK_P1NODE_RSS_SIZE, //MSize
|
||||
MTK_P1NODE_SENSOR_STATUS, //MINT32
|
||||
MTK_P1NODE_SENSOR_RAW_ORDER, //MINT32
|
||||
MTK_P1NODE_TWIN_SWITCH, //MINT32
|
||||
MTK_P1NODE_TWIN_STATUS, //MINT32
|
||||
MTK_P1NODE_RESIZE_QUALITY_SWITCH, //MINT32
|
||||
MTK_P1NODE_RESIZE_QUALITY_STATUS, //MINT32
|
||||
MTK_P1NODE_RESIZE_QUALITY_LEVEL, //MINT32
|
||||
MTK_P1NODE_RESIZE_QUALITY_SWITCHING, //MBOOL
|
||||
MTK_P1NODE_RESUME_SHUTTER_TIME_US, //MINT32
|
||||
MTK_P1NODE_FRAME_START_TIMESTAMP, //MINT64
|
||||
MTK_P1NODE_FRAME_START_TIMESTAMP_BOOT, //MINT64
|
||||
MTK_P1NODE_REQUEST_PROCESSED_WITHOUT_WB, //MBOOL
|
||||
MTK_P1NODE_ISNEED_GMV, //MBOOL
|
||||
MTK_P2NODE_HIGH_SPEED_VDO_FPS = MTK_P2NODE_START, //MINT32
|
||||
MTK_P2NODE_HIGH_SPEED_VDO_SIZE, //MSize
|
||||
MTK_P2NODE_CTRL_CALTM_ENABLE, //MBOOL
|
||||
MTK_P2NODE_FD_CROP_REGION, //MRect
|
||||
MTK_P2NODE_CROP_REGION, //MRect // for removing black edge
|
||||
MTK_P2NODE_DSDN_ENABLE, //MBOOL // for DSDN on/off controled by Policy
|
||||
MTK_P2NODE_SENSOR_CROP_REGION, //MRect
|
||||
MTK_3A_AE_HIGH_ISO_BINNING, //MBOOL // for 3HDR high iso binning mode
|
||||
MTK_SENSOR_SCALER_CROP_REGION, //MRect
|
||||
MTK_PROCESSOR_CAMINFO = MTK_3A_TUNINING_START, //IMemory
|
||||
MTK_ISP_ATMS_MAPPING_INFO, //IMemory
|
||||
MTK_3A_ISP_PROFILE, //MUINT8
|
||||
MTK_3A_ISP_P1_PROFILE, //MUINT8
|
||||
MTK_CAMINFO_LCSOUT_INFO, //IMemory
|
||||
MTK_3A_ISP_BYPASS_LCE, //MBOOL
|
||||
MTK_3A_ISP_DISABLE_NR, //MBOOL
|
||||
MTK_3A_ISP_NR3D_SW_PARAMS, //MINT32[14] //GMVX, GMVY, confX, confY, MAX_GMV, frameReset, GMV_Status,ISO_cutoff
|
||||
MTK_3A_ISP_NR3D_HW_PARAMS, //IMemory
|
||||
MTK_3A_ISP_LCE_GAIN, //MINT32, bits[0:15]: LCE gain, bits[16:31]: LCE gain confidence ratio (0-100)
|
||||
MTK_3A_ISP_FUS_NUM, //MINT32
|
||||
MTK_3A_AE_CAP_PARAM, //IMemory
|
||||
MTK_3A_AE_CAP_SINGLE_FRAME_HDR, //MUINT8
|
||||
MTK_3A_AE_BV_TRIGGER, //MBOOL
|
||||
MTK_3A_AF_LENS_POSITION, //MINT32
|
||||
MTK_3A_FLICKER_RESULT, //MINT32
|
||||
MTK_3A_DUMMY_BEFORE_REQUEST_FRAME, //MBOOL // Dummy frame before capture, only for capture intent, preview don't use
|
||||
MTK_3A_DUMMY_AFTER_REQUEST_FRAME, //MBOOL // Dummy frame after capture, only for capture intent, preview don't use
|
||||
MTK_3A_MANUAL_AWB_COLORTEMPERATURE_MAX, //MINT32
|
||||
MTK_3A_MANUAL_AWB_COLORTEMPERATURE_MIN, //MINT32
|
||||
MTK_3A_MANUAL_AWB_COLORTEMPERATURE, //MINT32
|
||||
MTK_3A_HDR_MODE, //MUINT8
|
||||
MTK_3A_AE_HDR_MIXED_ISO, //MUINT32
|
||||
MTK_3A_AE_ZSL_STABLE, //MINT32 ( MBOOL )
|
||||
MTK_3A_PGN_ENABLE, //MUINT8
|
||||
MTK_3A_SKIP_HIGH_QUALITY_CAPTURE, //MUINT8
|
||||
MTK_3A_AI_SHUTTER, //MBOOL
|
||||
MTK_3A_FEATURE_AE_EXPOSURE_LEVEL, //MINT32
|
||||
MTK_3A_FEATURE_AE_TARGET_MODE, //MINT32
|
||||
MTK_3A_OPEN_ID, //MINT32
|
||||
MTK_LSC_TBL_DATA, //IMemory
|
||||
MTK_LSC_TSF_DATA, //IMemory
|
||||
MTK_LSC_TSF_DUMP_NO, //IMemory
|
||||
MTK_ISP_P2_ORIGINAL_SIZE, //MSize
|
||||
MTK_ISP_P2_CROP_REGION, //MRect
|
||||
MTK_ISP_P2_RESIZER_SIZE, //MSize
|
||||
MTK_ISP_P2_IN_IMG_FMT, //MINT32, 0 or not exist: RAW->YUV, 1: YUV->YUV
|
||||
MTK_ISP_P2_TUNING_UPDATE_MODE, //MUINT8, [0 or not exist]: as default; [1]: keep existed parameters but some parts will be updated; [2]: keep all existed parameters (force mode) [3] LPCNR Pass1 [4] LPCNR Pass2
|
||||
MTK_ISP_P2_IN_IMG_RES_REVISED, //MINT32, describes P2 input image revised resolution. bit[0:15] width in pixel, bit[16:31] height in pixel. May be not exist.
|
||||
MTK_ISP_APP_TARGET_SIZE, //MINT32, describes APP Target resolution. bit[0:15] width in pixel, bit[16:31] height in pixel. May be not exist.
|
||||
MTK_MSF_SCALE_INDEX, //MINT32, which scale stage index, would only exist with scaling flow
|
||||
MTK_MSF_FRAME_NUM, //MINT32, After BSS which frame number is this stage using
|
||||
MTK_TOTAL_MULTI_FRAME_NUM, //MINT32, MSYUV fuction used this input to know frame nunber
|
||||
MTK_TOTAL_MULTI_FRAME_NUM_CAPTURED, //MINT32, MSF function used
|
||||
MTK_SW_DSDN_VERSION, //MINT32, distinguish different dsdn version
|
||||
MTK_ISP_COLOR_SPACE, //MINT32
|
||||
MTK_ISP_DRC_CURVE, //IMemory
|
||||
MTK_ISP_DRC_CURVE_SIZE, //MINT32
|
||||
MTK_ISP_FEO_DATA, //IMemory
|
||||
MTK_ISP_FEO_ENABLE, //MINT32
|
||||
MTK_ISP_FEO_INFO, //IMemory
|
||||
MTK_ISP_HLR_RATIO, //MINT32, which is a HDR ratio applied in HLR
|
||||
MTK_ISP_STAGE, //MINT32
|
||||
MTK_FOCUS_AREA_POSITION, //MINT32
|
||||
MTK_FOCUS_AREA_SIZE, //MSize
|
||||
MTK_FOCUS_AREA_RESULT, //MUINT8
|
||||
MTK_FOCUS_PAUSE, //MUINT8
|
||||
MTK_FOCUS_MZ_ON, //MUINT8
|
||||
MTK_3A_AF_FOCUS_VALUE, //MINT64
|
||||
MTK_3A_PRV_CROP_REGION, //MRect
|
||||
MTK_3A_ISP_MDP_TARGET_SIZE, //MSize
|
||||
MTK_3A_REPEAT_RESULT, //MUINT8
|
||||
MTK_3A_SKIP_PRECAPTURE, //MBOOL //if CUST_ENABLE_FLASH_DURING_TOUCH is true, MW can skip precapture
|
||||
MTK_3A_SKIP_BAD_FRAME, //MBOOL
|
||||
MTK_3A_FLARE_IN_MANUAL_CTRL_ENABLE, //MBOOL
|
||||
MTK_3A_DYNAMIC_SUBSAMPLE_COUNT, //MINT32 30fps = 1, 60fps = 2, ... , 120fps = 4
|
||||
MTK_3A_AE_LV_VALUE, //MINT32
|
||||
MTK_APP_CONTROL, //MINT32
|
||||
MTK_3A_CUST_PARAMS, //IMemory
|
||||
MTK_3A_SETTING_CUST_PARAMS, //IMemory
|
||||
MTK_3A_PERFRAME_INFO, //IMemory
|
||||
MTK_SENSOR_MODE_INFO_ACTIVE_ARRAY_CROP_REGION, //MRect
|
||||
MTK_3A_AE_BV, //MINT32
|
||||
MTK_3A_AE_CWV, //MINT32
|
||||
MTK_ISP_P2_PROCESSED_RAW, //MINT32
|
||||
MTK_3A_EXIF_METADATA = MTK_3A_EXIF_START, //IMetadata
|
||||
MTK_EIS_REGION = MTK_EIS_START, //MINT32
|
||||
MTK_EIS_INFO, //MINT64
|
||||
MTK_EIS_VIDEO_SIZE, //MRect
|
||||
MTK_EIS_NEED_OVERRIDE_TIMESTAMP, //MBOOL
|
||||
MTK_EIS_LMV_DATA, //IMemory
|
||||
MTK_STEREO_JPS_MAIN1_CROP = MTK_STEREO_START, //MRect
|
||||
MTK_STEREO_JPS_MAIN2_CROP, //MRect
|
||||
MTK_STEREO_SYNC2A_MODE, //MINT32
|
||||
MTK_STEREO_SYNCAF_MODE, //MINT32
|
||||
MTK_STEREO_HW_FRM_SYNC_MODE, //MINT32
|
||||
MTK_STEREO_NOTIFY, //MINT32
|
||||
MTK_STEREO_SYNC2A_MASTER_SLAVE, //MINT32[2]
|
||||
MTK_STEREO_SYNC2A_STATUS, //IMemory
|
||||
MTK_JPG_ENCODE_TYPE, //MINT8
|
||||
MTK_CONVERGENCE_DEPTH_OFFSET, //MFLOAT
|
||||
MTK_N3D_WARPING_MATRIX_SIZE, //MUINT32
|
||||
MTK_P1NODE_MAIN2_HAL_META, //IMetadata
|
||||
MTK_P2NODE_BOKEH_ISP_PROFILE, //MUINT8
|
||||
MTK_STEREO_FEATURE_DENOISE_MODE, //MINT32
|
||||
MTK_STEREO_FEATURE_SENSOR_PROFILE, //MINT32
|
||||
MTK_P1NODE_MAIN2_APP_META, //IMetadata
|
||||
MTK_STEREO_FEATURE_OPEN_ID, //MINT32
|
||||
MTK_STEREO_FRAME_PER_CAPTURE, //MINT32
|
||||
MTK_STEREO_ENABLE_MFB, //MINT32
|
||||
MTK_STEREO_BSS_RESULT, //MINT32
|
||||
MTK_STEREO_FEATURE_FOV_CROP_REGION, //MINT32[6] // p.x, p.y, p.w, p.h, srcW, srcH
|
||||
MTK_STEREO_DCMF_FEATURE_MODE, //MINT32 // mtk_platform_metadata_enum_dcmf_feature_mode
|
||||
MTK_STEREO_HDR_EV, //MINT32
|
||||
MTK_STEREO_DELAY_FRAME_COUNT, //MINT32
|
||||
MTK_STEREO_DCMF_DEPTHMAP_SIZE, //MSize
|
||||
MTK_STEREO_WITH_CAMSV, //MBOOL
|
||||
MTK_FRAMESYNC_ID = MTK_FRAMESYNC_START, //MINT32
|
||||
MTK_FRAMESYNC_TOLERANCE, //MINT64
|
||||
MTK_FRAMESYNC_FAILHANDLE, //MINT32
|
||||
MTK_FRAMESYNC_RESULT, //MINT64
|
||||
MTK_FRAMESYNC_TYPE, //MINT32
|
||||
MTK_FRAMESYNC_MODE, //MUINT8
|
||||
MTK_VHDR_LCEI_DATA = MTK_VHDR_START, //Memory
|
||||
MTK_VHDR_IMGO_3A_ISP_PROFILE, //MUINT8
|
||||
MTK_HDR_FEATURE_HDR_HAL_MODE,
|
||||
MTK_3A_FEATURE_AE_VALID_EXPOSURE_NUM,
|
||||
MTK_VHDR_MULTIFRAME_TIMESTAMP, //MINT64
|
||||
MTK_VHDR_MULTIFRAME_EXPOSURE_TIME, //MINT64
|
||||
MTK_PIPELINE_UNIQUE_KEY = MTK_PIPELINE_START, //MINT32
|
||||
MTK_PIPELINE_FRAME_NUMBER, //MINT32
|
||||
MTK_PIPELINE_REQUEST_NUMBER, //MINT32
|
||||
MTK_PIPELINE_EV_VALUE, //MINT32
|
||||
MTK_PIPELINE_DUMP_UNIQUE_KEY, //MINT32
|
||||
MTK_PIPELINE_DUMP_FRAME_NUMBER, //MINT32
|
||||
MTK_PIPELINE_DUMP_REQUEST_NUMBER, //MINT32
|
||||
MTK_PIPELINE_VIDEO_RECORD, //MINT32
|
||||
MTK_NR_MODE = MTK_NR_START, //MINT32
|
||||
MTK_NR_MNR_THRESHOLD_ISO, //MINT32
|
||||
MTK_NR_SWNR_THRESHOLD_ISO, //MINT32
|
||||
MTK_REAL_LV, //MINT32
|
||||
MTK_ANALOG_GAIN, //MUINT32
|
||||
MTK_AWB_RGAIN, //MINT32
|
||||
MTK_AWB_GGAIN, //MINT32
|
||||
MTK_AWB_BGAIN, //MINT32
|
||||
MTK_PLUGIN_MODE = MTK_PLUGIN_START, //MINT64
|
||||
MTK_PLUGIN_COMBINATION_KEY, //MINT64
|
||||
MTK_PLUGIN_P2_COMBINATION, //MINT64
|
||||
MTK_PLUGIN_PROCESSED_FRAME_COUNT, //MINT32
|
||||
MTK_PLUGIN_CUSTOM_HINT, //MINT32
|
||||
MTK_PLUGIN_DETACT_JOB_SYNC_TOKEN, //MINT64, may be not exists.
|
||||
MTK_PLUGIN_UNIQUEKEY,
|
||||
MTK_DUALZOOM_DROP_REQ = MTK_DUALZOOM_START, //MINT32
|
||||
MTK_DUALZOOM_FORCE_ENABLE_P2, //MINT32
|
||||
MTK_DUALZOOM_DO_FRAME_SYNC, //MINT32
|
||||
MTK_DUALZOOM_ZOOM_FACTOR, //MINT32
|
||||
MTK_DUALZOOM_DO_FOV, //MINT32
|
||||
MTK_DUALZOOM_FOV_RECT_INFO, //MINT32
|
||||
MTK_DUALZOOM_FOV_CALB_INFO, //MINT32
|
||||
MTK_DUALZOOM_FOV_MARGIN_PIXEL, //MSize
|
||||
MTK_DUALCAM_AF_STATE, //MUINT8
|
||||
MTK_DUALCAM_LENS_STATE, //MUINT8
|
||||
MTK_DUALCAM_TIMESTAMP, //MINT64
|
||||
MTK_DUALZOOM_3DNR_MODE, //MINT32
|
||||
MTK_DUALZOOM_ZOOMRATIO, //MINT32
|
||||
MTK_DUALZOOM_CENTER_SHIFT, //MINT32
|
||||
MTK_DUALZOOM_FOV_RATIO, //MFLOAT
|
||||
MTK_DUALZOOM_REAL_MASTER, //MINT32
|
||||
MTK_DUALZOOM_FD_TARGET_MASTER, //MINT32
|
||||
MTK_DUALZOOM_FD_REAL_MASTER, //MINT32 // maybe not set
|
||||
MTK_LMV_SEND_SWITCH_OUT, //MINT32
|
||||
MTK_LMV_SWITCH_OUT_RESULT, //MINT32
|
||||
MTK_LMV_VALIDITY, //MINT32
|
||||
MTK_VSDOF_P1_MAIN1_ISO, //MINT32
|
||||
MTK_DUALZOOM_IS_STANDBY, //MBOOL
|
||||
MTK_DUALZOOM_CAP_CROP, //MRect
|
||||
MTK_DUALZOOM_MASTER_UPDATE_MODE, //MBOOL
|
||||
MTK_DUALZOOM_STREAMING_NR, //MINT32
|
||||
MTK_FEATUREPIPE_APP_MODE = MTK_FEATUREPIPE_START, //MINT32
|
||||
MTK_POSTPROC_TYPE = MTK_POSTPROC_START, //MINT32
|
||||
MTK_FEATURE_STREAMING = MTK_FEATURE_START, //MINT64
|
||||
MTK_FEATURE_CAPTURE, //MINT64
|
||||
MTK_FEATURE_CAPTURE_PHYSICAL, //MINT64
|
||||
MTK_FEATURE_FREE_MEMORY_MBYTE, //MINT32
|
||||
MTK_FEATURE_MFNR_NVRAM_QUERY_INDEX, //MINT32
|
||||
MTK_FEATURE_MFNR_NVRAM_DECISION_ISO, //MINT32
|
||||
MTK_FEATURE_MFNR_TUNING_INDEX_HINT, //MINT64
|
||||
MTK_FEATURE_MFNR_FINAL_EXP, //MINT32
|
||||
MTK_FEATURE_MFNR_OPEN_ID, //MINT32
|
||||
MTK_FEATURE_AINR_MDLA_MODE, //MINT32
|
||||
MTK_ISP_AINR_MDLA_MODE, //MINT32
|
||||
MTK_ISP_LTM_BIT_MODE, //MINT32
|
||||
MTK_FEATURE_BSS_SELECTED_FRAME_COUNT, //MINT32
|
||||
MTK_FEATURE_BSS_FORCE_DROP_NUM, //MINT32
|
||||
MTK_FEATURE_BSS_FIXED_LSC_TBL_DATA, //MUINT8
|
||||
MTK_FEATURE_BSS_PROCESS, //MINT32
|
||||
MTK_FEATURE_BSS_ISGOLDEN, //MBOOL
|
||||
MTK_FEATURE_BSS_REORDER, //MBOOL
|
||||
MTK_FEATURE_BSS_MANUAL_ORDER, //MUINT8
|
||||
MTK_FEATURE_BSS_RRZO_DATA, //MUINT8
|
||||
MTK_FEATURE_BSS_DOWNSAMPLE, //MBOOL
|
||||
MTK_FEATURE_PACK_RRZO, //MUINT8
|
||||
MTK_FEATURE_FACE_RECTANGLES, //MRect array
|
||||
MTK_FEATURE_FACE_POSE_ORIENTATIONS, //MINT32[n*3] array, each struct include: xAsix, yAsix, zAsix
|
||||
MTK_FEATURE_CAP_YUV_PROCESSING, //MUINT8
|
||||
MTK_FEATURE_CAP_PIPE_DCE_CONTROL, //MUINT8
|
||||
MTK_FEATURE_MULTIFRAMENODE_BYPASSED, //MUINT8
|
||||
MTK_FEATURE_FACE_APPLIED_GAMMA, //MINT32
|
||||
MTK_FEATURE_CAP_PQ_USERID, //MINT64
|
||||
MTK_FEATURE_FLIP_IN_P2A, //MINT32
|
||||
MTK_FSC_CROP_DATA = MTK_FSC_START, //IMemory
|
||||
MTK_FSC_WARP_DATA, //IMemory
|
||||
MTK_STAGGER_ME_META, //IMetadata
|
||||
MTK_STAGGER_SE_META, //IMetadata
|
||||
MTK_STAGGER_BLOB_IMGO_ORDER //MUINT8
|
||||
} mtk_platform_metadata_tag_t;
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
******************************************************************************/
|
||||
typedef enum mtk_platform_3a_exif_metadata_tag {
|
||||
MTK_3A_EXIF_FNUMBER, //MINT32
|
||||
MTK_3A_EXIF_FOCAL_LENGTH, //MINT32
|
||||
MTK_3A_EXIF_FOCAL_LENGTH_35MM, //MINT32
|
||||
MTK_3A_EXIF_SCENE_MODE, //MINT32
|
||||
MTK_3A_EXIF_AWB_MODE, //MINT32
|
||||
MTK_3A_EXIF_LIGHT_SOURCE, //MINT32
|
||||
MTK_3A_EXIF_EXP_PROGRAM, //MINT32
|
||||
MTK_3A_EXIF_SCENE_CAP_TYPE, //MINT32
|
||||
MTK_3A_EXIF_FLASH_LIGHT_TIME_US, //MINT32
|
||||
MTK_3A_EXIF_AE_METER_MODE, //MINT32
|
||||
MTK_3A_EXIF_AE_EXP_BIAS, //MINT32
|
||||
MTK_3A_EXIF_CAP_EXPOSURE_TIME, //MINT32
|
||||
MTK_3A_EXIF_AE_ISO_SPEED, //MINT32
|
||||
MTK_3A_EXIF_REAL_ISO_VALUE, //MINT32
|
||||
MTK_3A_EXIF_AE_BRIGHTNESS_VALUE, //MINT32
|
||||
MTK_3A_EXIF_FLASH_FIRING_STATUS, //MINT32
|
||||
MTK_3A_EXIF_FLASH_RETURN_DETECTION, //MINT32
|
||||
MTK_3A_EXIF_FLASH_MODE, //MINT32
|
||||
MTK_3A_EXIF_FLASH_FUNCTION, //MINT32
|
||||
MTK_3A_EXIF_FLASH_REDEYE, //MINT32
|
||||
MTK_3A_EXIF_DEBUGINFO_BEGIN, // debug info begin
|
||||
// key: MINT32
|
||||
MTK_3A_EXIF_DBGINFO_AAA_KEY = MTK_3A_EXIF_DEBUGINFO_BEGIN, //MINT32
|
||||
MTK_3A_EXIF_DBGINFO_AAA_DATA,
|
||||
MTK_3A_EXIF_DBGINFO_SDINFO_KEY,
|
||||
MTK_3A_EXIF_DBGINFO_SDINFO_DATA,
|
||||
MTK_3A_EXIF_DBGINFO_ISP_KEY,
|
||||
MTK_3A_EXIF_DBGINFO_ISP_DATA,
|
||||
//
|
||||
MTK_CMN_EXIF_DBGINFO_KEY,
|
||||
MTK_CMN_EXIF_DBGINFO_DATA,
|
||||
//
|
||||
MTK_MF_EXIF_DBGINFO_MF_KEY,
|
||||
MTK_MF_EXIF_DBGINFO_MF_DATA,
|
||||
//
|
||||
MTK_N3D_EXIF_DBGINFO_KEY,
|
||||
MTK_N3D_EXIF_DBGINFO_DATA,
|
||||
//
|
||||
MTK_POSTNR_EXIF_DBGINFO_NR_KEY,
|
||||
MTK_POSTNR_EXIF_DBGINFO_NR_DATA,
|
||||
//
|
||||
MTK_RESVB_EXIF_DBGINFO_KEY,
|
||||
MTK_RESVB_EXIF_DBGINFO_DATA,
|
||||
//
|
||||
MTK_RESVC_EXIF_DBGINFO_KEY,
|
||||
MTK_RESVC_EXIF_DBGINFO_DATA,
|
||||
// data: Memory
|
||||
MTK_3A_EXIF_DEBUGINFO_END, // debug info end
|
||||
} mtk_platform_3a_exif_metadata_tag_t;
|
||||
|
||||
// MTK_3A_FEATURE_AE_EXPOSURE_LEVEL
|
||||
typedef enum mtk_camera_metadata_enum_ae_exposure_level {
|
||||
MTK_3A_FEATURE_AE_EXPOSURE_LEVEL_NONE = 0,
|
||||
MTK_3A_FEATURE_AE_EXPOSURE_LEVEL_SHORT,
|
||||
MTK_3A_FEATURE_AE_EXPOSURE_LEVEL_NORMAL,
|
||||
MTK_3A_FEATURE_AE_EXPOSURE_LEVEL_LONG,
|
||||
} mtk_camera_metadata_enum_ae_exposure_level_t;
|
||||
|
||||
// MTK_3A_FEATURE_AE_TARGET_MODE
|
||||
typedef enum mtk_camera_metadata_enum_ae_target_mode {
|
||||
MTK_3A_FEATURE_AE_TARGET_MODE_NORMAL = 0,
|
||||
MTK_3A_FEATURE_AE_TARGET_MODE_IVHDR,
|
||||
MTK_3A_FEATURE_AE_TARGET_MODE_MVHDR,
|
||||
MTK_3A_FEATURE_AE_TARGET_MODE_ZVHDR,
|
||||
MTK_3A_FEATURE_AE_TARGET_MODE_LE_FIX,
|
||||
MTK_3A_FEATURE_AE_TARGET_MODE_SE_FIX,
|
||||
MTK_3A_FEATURE_AE_TARGET_MODE_4CELL_MVHDR,
|
||||
MTK_3A_FEATURE_AE_TARGET_MODE_MSTREAM_VHDR,
|
||||
MTK_3A_FEATURE_AE_TARGET_MODE_MSTREAM_VHDR_RTO1X,
|
||||
MTK_3A_FEATURE_AE_TARGET_MODE_STAGGER_2EXP,
|
||||
MTK_3A_FEATURE_AE_TARGET_MODE_STAGGER_3EXP,
|
||||
} mtk_camera_metadata_enum_ae_target_mode_t;
|
||||
|
||||
//MTK_3A_FEATURE_AE_VALID_EXPOSURE_NUM
|
||||
typedef enum mtk_camera_metadata_enum_stagger_valid_exposure_num {
|
||||
MTK_STAGGER_VALID_EXPOSURE_NON = 0,
|
||||
MTK_STAGGER_VALID_EXPOSURE_1 = 1,
|
||||
MTK_STAGGER_VALID_EXPOSURE_2 = 2,
|
||||
MTK_STAGGER_VALID_EXPOSURE_3 = 3
|
||||
} mtk_camera_metadata_enum_stagger_valid_exposure_num_t;
|
||||
|
||||
//MTK_3A_ISP_FUS_NUM
|
||||
typedef enum mtk_camera_metadata_enum_3a_isp_fus_num {
|
||||
MTK_3A_ISP_FUS_NUM_NON = 0,
|
||||
MTK_3A_ISP_FUS_NUM_1 = 1,
|
||||
MTK_3A_ISP_FUS_NUM_2 = 2,
|
||||
MTK_3A_ISP_FUS_NUM_3 = 3,
|
||||
} mtk_camera_metadata_enum_3a_isp_fus_num_t;
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
******************************************************************************/
|
||||
typedef enum mtk_platform_metadata_enum_nr_mode {
|
||||
MTK_NR_MODE_OFF = 0,
|
||||
MTK_NR_MODE_MNR,
|
||||
MTK_NR_MODE_SWNR,
|
||||
MTK_NR_MODE_AUTO
|
||||
} mtk_platform_metadata_enum_nr_mode_t;
|
||||
|
||||
typedef enum mtk_platform_metadata_enum_mfb_mode {
|
||||
MTK_MFB_MODE_OFF = 0,
|
||||
MTK_MFB_MODE_MFLL,
|
||||
MTK_MFB_MODE_AIS,
|
||||
MTK_MFB_MODE_NUM,
|
||||
} mtk_platform_metadata_enum_mfb_mode_t;
|
||||
|
||||
typedef enum mtk_platform_metadata_enum_custom_hint {
|
||||
MTK_CUSTOM_HINT_0 = 0,
|
||||
MTK_CUSTOM_HINT_1,
|
||||
MTK_CUSTOM_HINT_2,
|
||||
MTK_CUSTOM_HINT_3,
|
||||
MTK_CUSTOM_HINT_4,
|
||||
MTK_CUSTOM_HINT_NUM,
|
||||
} mtk_platform_metadata_enum_custom_hint_t;
|
||||
|
||||
typedef enum mtk_platform_metadata_enum_plugin_mode {
|
||||
MTK_PLUGIN_MODE_COMBINATION = 1 << 0,
|
||||
MTK_PLUGIN_MODE_NR = 1 << 1,
|
||||
MTK_PLUGIN_MODE_HDR = 1 << 2,
|
||||
MTK_PLUGIN_MODE_MFNR = 1 << 3,
|
||||
MTK_PLUGIN_MODE_COPY = 1 << 4,
|
||||
MTK_PLUGIN_MODE_TEST_PRV = 1 << 5,
|
||||
MTK_PLUGIN_MODE_BMDN = 1 << 6,
|
||||
MTK_PLUGIN_MODE_MFHR = 1 << 7,
|
||||
MTK_PLUGIN_MODE_BMDN_3rdParty = 1 << 8,
|
||||
MTK_PLUGIN_MODE_MFHR_3rdParty = 1 << 9,
|
||||
MTK_PLUGIN_MODE_FUSION_3rdParty = 1 << 10,
|
||||
MTK_PLUGIN_MODE_VSDOF_3rdParty = 1 << 11,
|
||||
MTK_PLUGIN_MODE_COLLECT = 1 << 12,
|
||||
MTK_PLUGIN_MODE_HDR_3RD_PARTY = 1 << 13,
|
||||
MTK_PLUGIN_MODE_MFNR_3RD_PARTY = 1 << 14,
|
||||
MTK_PLUGIN_MODE_BOKEH_3RD_PARTY = 1 << 15,
|
||||
MTK_PLUGIN_MODE_DCMF_3RD_PARTY = 1 << 16,
|
||||
} mtk_platform_metadata_enum_plugin_mode_t;
|
||||
|
||||
typedef enum mtk_platform_metadata_enum_p2_plugin_combination {
|
||||
MTK_P2_RAW_PROCESSOR = 1 << 0,
|
||||
MTK_P2_ISP_PROCESSOR = 1 << 1,
|
||||
MTK_P2_YUV_PROCESSOR = 1 << 2,
|
||||
MTK_P2_MDP_PROCESSOR = 1 << 3,
|
||||
MTK_P2_CAPTURE_REQUEST = 1 << 4,
|
||||
MTK_P2_PREVIEW_REQUEST = 1 << 5
|
||||
} mtk_platform_metadata_enum_p2_plugin_combination;
|
||||
|
||||
typedef enum mtk_platform_metadata_enum_isp_color_space {
|
||||
MTK_ISP_COLOR_SPACE_SRGB = 0 ,
|
||||
MTK_ISP_COLOR_SPACE_DISPLAY_P3 = 1 ,
|
||||
MTK_ISP_COLOR_SPACE_CUSTOM_1 = 2
|
||||
} mtk_platform_metadata_enum_isp_color_space;
|
||||
|
||||
typedef enum mtk_platform_metadata_enum_dualzoom_drop_req {
|
||||
MTK_DUALZOOM_DROP_NEVER_DROP = 0,
|
||||
MTK_DUALZOOM_DROP_NONE = 1,
|
||||
MTK_DUALZOOM_DROP_DIRECTLY = 2,
|
||||
MTK_DUALZOOM_DROP_NEED_P1,
|
||||
MTK_DUALZOOM_DROP_NEED_SYNCMGR,
|
||||
MTK_DUALZOOM_DROP_NEED_SYNCMGR_NEED_STREAM_F_PIPE,
|
||||
} mtk_platform_metadata_enum_dualzoom_drop_req_t;
|
||||
|
||||
typedef enum mtk_platform_metadata_enum_p1_sensor_status {
|
||||
MTK_P1_SENSOR_STATUS_NONE = 0,
|
||||
MTK_P1_SENSOR_STATUS_STREAMING = 1,
|
||||
MTK_P1_SENSOR_STATUS_SW_STANDBY = 2,
|
||||
MTK_P1_SENSOR_STATUS_HW_STANDBY = 3,
|
||||
} mtk_platform_metadata_enum_p1_sensor_status_t;
|
||||
|
||||
typedef enum mtk_platform_metadata_enum_p1_twin_switch {
|
||||
MTK_P1_TWIN_SWITCH_NONE = 0,
|
||||
MTK_P1_TWIN_SWITCH_ONE_TG = 1,
|
||||
MTK_P1_TWIN_SWITCH_TWO_TG = 2
|
||||
} mtk_platform_metadata_enum_p1_twin_switch_t;
|
||||
|
||||
typedef enum mtk_platform_metadata_enum_p1_twin_status {
|
||||
MTK_P1_TWIN_STATUS_NONE = 0,
|
||||
MTK_P1_TWIN_STATUS_TG_MODE_1 = 1,
|
||||
MTK_P1_TWIN_STATUS_TG_MODE_2 = 2,
|
||||
MTK_P1_TWIN_STATUS_TG_MODE_3 = 3,
|
||||
} mtk_platform_metadata_enum_p1_twin_status_t;
|
||||
|
||||
typedef enum mtk_platform_metadata_enum_p1_resize_quality_switch {
|
||||
MTK_P1_RESIZE_QUALITY_SWITCH_NONE = 0,
|
||||
MTK_P1_RESIZE_QUALITY_SWITCH_L_L = 1,
|
||||
MTK_P1_RESIZE_QUALITY_SWITCH_L_H = 2,
|
||||
MTK_P1_RESIZE_QUALITY_SWITCH_H_L = 3,
|
||||
MTK_P1_RESIZE_QUALITY_SWITCH_H_H = 4,
|
||||
} mtk_platform_metadata_enum_p1_resize_quality_switch_t;
|
||||
|
||||
typedef enum mtk_platform_metadata_enum_p1_resize_quality_status {
|
||||
MTK_P1_RESIZE_QUALITY_STATUS_NONE = 0,
|
||||
MTK_P1_RESIZE_QUALITY_STATUS_ACCEPT = 1,
|
||||
MTK_P1_RESIZE_QUALITY_STATUS_IGNORE = 2,
|
||||
MTK_P1_RESIZE_QUALITY_STATUS_REJECT = 3,
|
||||
MTK_P1_RESIZE_QUALITY_STATUS_ILLEGAL = 4,
|
||||
} mtk_platform_metadata_enum_p1_resize_quality_status_t;
|
||||
|
||||
typedef enum mtk_platform_metadata_enum_p1_resize_quality_level {
|
||||
MTK_P1_RESIZE_QUALITY_LEVEL_UNKNOWN = 0,
|
||||
MTK_P1_RESIZE_QUALITY_LEVEL_L = 1,
|
||||
MTK_P1_RESIZE_QUALITY_LEVEL_H = 2,
|
||||
} mtk_platform_metadata_enum_p1_resize_quality_level_t;
|
||||
|
||||
typedef enum mtk_platform_metadata_enum_lmv_result {
|
||||
MTK_LMV_RESULT_OK = 0,
|
||||
MTK_LMV_RESULT_FAILED,
|
||||
MTK_LMV_RESULT_SWITCHING
|
||||
} mtk_platform_metadata_enum_lmv_result_t;
|
||||
|
||||
typedef enum mtk_platform_metadata_enum_featurepipe_app_mode {
|
||||
MTK_FEATUREPIPE_PHOTO_PREVIEW = 0,
|
||||
MTK_FEATUREPIPE_VIDEO_PREVIEW = 1,
|
||||
MTK_FEATUREPIPE_VIDEO_RECORD = 2,
|
||||
MTK_FEATUREPIPE_VIDEO_STOP = 3,
|
||||
} mtk_platform_metadata_enum_featurepipe_app_mode_t;
|
||||
|
||||
typedef enum mtk_platform_metadata_enum_dcmf_feature_mode {
|
||||
MTK_DCMF_FEATURE_BOKEH = 0,
|
||||
MTK_DCMF_FEATURE_MFNR_BOKEH = 1,
|
||||
MTK_DCMF_FEATURE_HDR_BOKEH = 2,
|
||||
} mtk_platform_metadata_enum_dcmf_feature_mode_t;
|
||||
|
||||
typedef enum mtk_platform_metadata_enum_smvr_fps {
|
||||
MTK_SMVR_FPS_30 = 0,
|
||||
MTK_SMVR_FPS_120 = 1,
|
||||
MTK_SMVR_FPS_240 = 2,
|
||||
MTK_SMVR_FPS_480 = 3,
|
||||
MTK_SMVR_FPS_960 = 4,
|
||||
} mtk_platform_metadata_enum_smvr_fps_t;
|
||||
|
||||
//MTK_FRAMESYNC_FAILHANDLE
|
||||
typedef enum mtk_platform_metadata_enum_fremesync_failhandle {
|
||||
MTK_FRAMESYNC_FAILHANDLE_CONTINUE,
|
||||
MTK_FRAMESYNC_FAILHANDLE_DROP,
|
||||
} mtk_platform_metadata_enum_fremesync_failhandle_t;
|
||||
|
||||
//MTK_FRAMESYNC_RESULT
|
||||
typedef enum mtk_platform_metadata_enum_fremesync_result {
|
||||
MTK_FRAMESYNC_RESULT_PASS,
|
||||
MTK_FRAMESYNC_RESULT_FAIL_CONTINUE,
|
||||
MTK_FRAMESYNC_RESULT_FAIL_DROP,
|
||||
} mtk_platform_metadata_enum_fremesync_result_t;
|
||||
|
||||
//MTK_FRAMESYNC_MODE
|
||||
typedef enum mtk_platform_metadata_enum_fremesync_mode {
|
||||
MTK_FRAMESYNC_MODE_VSYNC_ALIGNMENT,
|
||||
MTK_FRAMESYNC_MODE_READOUT_CENTER_ALIGNMENT,
|
||||
} mtk_platform_metadata_enum_fremesync_mode_t;
|
||||
|
||||
//MTK_FEATURE_MULTIFRAMENODE_BYPASSED
|
||||
typedef enum mtk_platform_metadata_enum_multiframenode_bypassed {
|
||||
MTK_FEATURE_MULTIFRAMENODE_NOT_BYPASSED = 0,
|
||||
MTK_FEATURE_MULTIFRAMENODE_TO_BE_BYPASSED = 1
|
||||
} mtk_platform_metadata_enum_mfllnode_bypassed_t;
|
||||
|
||||
//MTK_FEATURE_BSS_PROCESS
|
||||
typedef enum mtk_platform_metadata_enum_bss_processing {
|
||||
MTK_FEATURE_BSS_PROCESS_ENABLE = 0,
|
||||
MTK_FEATURE_BSS_PROCESS_DISABLE = 1
|
||||
} mtk_platform_metadata_enum_bss_processing_t;
|
||||
|
||||
//MTK_FEATURE_BSS_MANUAL_ORDER
|
||||
typedef enum mtk_platform_metadata_enum_bss_manual_order {
|
||||
MTK_FEATURE_BSS_MANUAL_ORDER_OFF = 0,
|
||||
MTK_FEATURE_BSS_MANUAL_ORDER_GOLDEN = 1
|
||||
} mtk_platform_metadata_enum_bss_manual_order_t;
|
||||
|
||||
//MTK_FEATURE_CAP_YUV_PROCESSING
|
||||
typedef enum mtk_platform_metadata_enum_cap_yuv_processing {
|
||||
MTK_FEATURE_CAP_YUV_PROCESSING_NOT_NEEDED = 0,
|
||||
MTK_FEATURE_CAP_YUV_PROCESSING_NEEDED = 1
|
||||
} mtk_platform_metadata_enum_cap_yuv_processing_t;
|
||||
|
||||
//MTK_FEATURE_CAP_PIPE_DCE_CONTROL
|
||||
typedef enum mtk_platform_metadata_enum_cap_pipe_control {
|
||||
MTK_FEATURE_CAP_PIPE_DCE_ENABLE_BUT_NOT_APPLY = 2,
|
||||
MTK_FEATURE_CAP_PIPE_DCE_MANUAL_DISABLE = 1,
|
||||
MTK_FEATURE_CAP_PIPE_DCE_DEFAULT_APPLY = 0
|
||||
} mtk_platform_metadata_enum_cap_pipe_dce_control_t;
|
||||
|
||||
// MTK_FEATURE_AINR_MDLA_MODE, MTK_ISP_AINR_MDLA_MODE
|
||||
typedef enum mtk_platform_metadata_enum_ainr_mdla_mode {
|
||||
MTK_FEATURE_AINR_MDLA_MODE_NONE = 0,
|
||||
MTK_FEATURE_AINR_MDLA_MODE_DRCOUT_16BIT = 1,
|
||||
MTK_FEATURE_AINR_MDLA_MODE_NNOUT_12BIT = 2,
|
||||
MTK_FEATURE_AINR_MDLA_MODE_NNOUT_16BIT = 3,
|
||||
} mtk_platform_metadata_enum_ainr_mdla_mode_t;
|
||||
|
||||
//MTK_ISP_P2_PROCESSED_RAW
|
||||
typedef enum mtk_platform_metadata_enum_p2_processed_raw {
|
||||
MTK_ISP_P2_PROCESSED_RAW_NOT_NEEDED = 0,
|
||||
MTK_ISP_P2_PROCESSED_RAW_NEEDED = 1
|
||||
} mtk_platform_metadata_enum_p2_processed_raw_t;
|
||||
|
||||
//MTK_DUALZOOM_STREAMING_NR
|
||||
typedef enum mtk_platform_metadata_enum_dualzoom_streaming_nr {
|
||||
MTK_DUALZOOM_STREAMING_NR_AUTO = 0,
|
||||
MTK_DUALZOOM_STREAMING_NR_OFF = 1
|
||||
} mtk_platform_metadata_enum_dualzoom_streaming_nr_t;
|
||||
|
||||
//MTK_STAGGER_BLOB_IMGO_ORDER
|
||||
typedef enum mtk_platform_metadata_enum_stagger_blob_imgo_order {
|
||||
MTK_STAGGER_IMGO_NONE = 0,
|
||||
MTK_STAGGER_IMGO_NE = 1,
|
||||
MTK_STAGGER_IMGO_ME = 2,
|
||||
MTK_STAGGER_IMGO_SE = 3
|
||||
} mtk_platform_metadata_enum_stagger_blob_imgo_order_t;
|
||||
|
||||
//MTK_3A_EXIF_FLASH_FIRING_STATUS
|
||||
typedef enum mtk_platform_metadata_enum_3a_exif_flash_firing_status_t {
|
||||
MTK_3A_EXIF_FLASH_FIRING_STATUS_NOT_FIRED = 0,
|
||||
MTK_3A_EXIF_FLASH_FIRING_STATUS_FIRED = 1,
|
||||
} mtk_platform_metadata_enum_3a_exif_flash_firing_status_t;
|
||||
|
||||
//MTK_3A_EXIF_FLASH_RETURN_DETECTION
|
||||
typedef enum mtk_platform_metadata_enum_3a_exif_flash_return_detection_t {
|
||||
MTK_3A_EXIF_FLASH_RETURN_DETECTION_NOT_SUPPORT = 0,
|
||||
MTK_3A_EXIF_FLASH_RETURN_DETECTION_RESERVED = 1,
|
||||
MTK_3A_EXIF_FLASH_RETURN_DETECTION_STROBE_NOT_DETECTED = 2,
|
||||
MTK_3A_EXIF_FLASH_RETURN_DETECTION_STROBE_DETECTED = 3,
|
||||
} mtk_platform_metadata_enum_3a_exif_flash_return_detection_t;
|
||||
|
||||
//MTK_3A_EXIF_FLASH_MODE
|
||||
typedef enum mtk_platform_metadata_enum_3a_exif_flash_mode_t {
|
||||
MTK_3A_EXIF_FLASH_MODE_UNKNOWN = 0,
|
||||
MTK_3A_EXIF_FLASH_MODE_COMPULSORY_FIRING = 1,
|
||||
MTK_3A_EXIF_FLASH_MODE_COMPULSORY_SUPPRESSION = 2,
|
||||
MTK_3A_EXIF_FLASH_MODE_AUTO = 3,
|
||||
} mtk_platform_metadata_enum_3a_exif_flash_mode_t;
|
||||
|
||||
//MTK_3A_EXIF_FLASH_FUNCTION
|
||||
typedef enum mtk_platform_metadata_enum_3a_exif_flash_function_t {
|
||||
MTK_3A_EXIF_FLASH_FUNCTION_SUPPORT = 0,
|
||||
MTK_3A_EXIF_FLASH_FUNCTION_NOT_SUPPORT = 1,
|
||||
} mtk_platform_metadata_enum_3a_exif_flash_function_t;
|
||||
|
||||
//MTK_3A_EXIF_FLASH_REDEYE
|
||||
typedef enum mtk_platform_metadata_enum_3a_exif_flash_redeye_t {
|
||||
MTK_3A_EXIF_FLASH_REDEYE_NOT_SUPPORT = 0,
|
||||
MTK_3A_EXIF_FLASH_REDEYE_SUPPORT = 1,
|
||||
} mtk_platform_metadata_enum_3a_exif_flash_redeye_t;
|
||||
|
||||
//MTK_FEATURE_ABF
|
||||
typedef enum mtk_platform_metadata_enum_abf_mode {
|
||||
MTK_ABF_MODE_OFF = 0,
|
||||
MTK_ABF_MODE_ON,
|
||||
} mtk_platform_metadata_enum_abf_mode_t;
|
||||
|
||||
#endif
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,547 @@
|
||||
//
|
||||
// Created by Matthew on 2025/3/11.
|
||||
//
|
||||
|
||||
#include "Streaming.h"
|
||||
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <thread>
|
||||
#include <atomic>
|
||||
|
||||
#include <android/api-level.h>
|
||||
#include <android/log.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
|
||||
extern "C" {
|
||||
#include <libavformat/avformat.h>
|
||||
#include <libavcodec/avcodec.h>
|
||||
#include <libavutil/avutil.h>
|
||||
#include <libavutil/opt.h>
|
||||
#include <libavutil/time.h>
|
||||
}
|
||||
|
||||
extern void ffmpeg_log_callback(void *ptr, int level, const char *fmt, va_list vl);
|
||||
|
||||
#if 0
|
||||
StreamForwarder::~StreamForwarder() {
|
||||
stop();
|
||||
if (inputCtx) {
|
||||
avformat_close_input(&inputCtx);
|
||||
}
|
||||
if (outputCtx) {
|
||||
if (outputCtx->pb) {
|
||||
avio_closep(&outputCtx->pb);
|
||||
}
|
||||
avformat_free_context(outputCtx);
|
||||
}
|
||||
}
|
||||
|
||||
bool StreamForwarder::initialize(const std::string& inputUrl, const std::string& outputUrl) {
|
||||
if (!openInput(inputUrl)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!openOutput(outputUrl)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool StreamForwarder::openInput(const std::string& inputUrl) {
|
||||
inputCtx = avformat_alloc_context();
|
||||
if (!inputCtx) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (avformat_open_input(&inputCtx, inputUrl.c_str(), nullptr, nullptr) < 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (avformat_find_stream_info(inputCtx, nullptr) < 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool StreamForwarder::openOutput(const std::string& outputUrl) {
|
||||
int ret = avformat_alloc_output_context2(&outputCtx, nullptr, "flv", outputUrl.c_str());
|
||||
if (ret < 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Copy streams from input to output
|
||||
for (unsigned int i = 0; i < inputCtx->nb_streams; i++) {
|
||||
AVStream* inStream = inputCtx->streams[i];
|
||||
AVStream* outStream = avformat_new_stream(outputCtx, inStream->codec->codec);
|
||||
if (!outStream) {
|
||||
return false;
|
||||
}
|
||||
|
||||
ret = avcodec_copy_context(outStream->codec, inStream->codec);
|
||||
if (ret < 0) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Open output file
|
||||
if (!(outputCtx->oformat->flags & AVFMT_NOFILE)) {
|
||||
ret = avio_open(&outputCtx->pb, outputUrl.c_str(), AVIO_FLAG_WRITE);
|
||||
if (ret < 0) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Write header
|
||||
ret = avformat_write_header(outputCtx, nullptr);
|
||||
if (ret < 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void StreamForwarder::setFrameCallback(std::function<void(uint8_t*, int, int, int)> callback) {
|
||||
frameCallback = callback;
|
||||
}
|
||||
|
||||
void StreamForwarder::start() {
|
||||
isRunning = true;
|
||||
forwardPackets();
|
||||
}
|
||||
|
||||
void StreamForwarder::stop() {
|
||||
isRunning = false;
|
||||
}
|
||||
|
||||
void StreamForwarder::forwardPackets() {
|
||||
AVPacket packet;
|
||||
AVFrame* frame = av_frame_alloc();
|
||||
|
||||
while (isRunning) {
|
||||
if (av_read_frame(inputCtx, &packet) < 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
// Process video frames if callback is set
|
||||
if (frameCallback && packet.stream_index == 0) { // Assuming video is stream 0
|
||||
AVCodecContext* codecCtx = inputCtx->streams[packet.stream_index]->codec;
|
||||
int ret = avcodec_send_packet(codecCtx, &packet);
|
||||
if (ret < 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
while (ret >= 0) {
|
||||
ret = avcodec_receive_frame(codecCtx, frame);
|
||||
if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
|
||||
break;
|
||||
} else if (ret < 0) {
|
||||
goto end;
|
||||
}
|
||||
|
||||
processFrame(frame);
|
||||
}
|
||||
}
|
||||
|
||||
// Forward packet
|
||||
av_packet_rescale_ts(&packet,
|
||||
inputCtx->streams[packet.stream_index]->time_base,
|
||||
outputCtx->streams[packet.stream_index]->time_base);
|
||||
|
||||
int ret = av_interleaved_write_frame(outputCtx, &packet);
|
||||
if (ret < 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
av_packet_unref(&packet);
|
||||
}
|
||||
|
||||
end:
|
||||
av_frame_free(&frame);
|
||||
av_write_trailer(outputCtx);
|
||||
}
|
||||
|
||||
void StreamForwarder::processFrame(AVFrame* frame) {
|
||||
if (frameCallback) {
|
||||
frameCallback(frame->data[0], frame->linesize[0],
|
||||
frame->width, frame->height);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
RtspForwarder::RtspForwarder(const std::string& input, const std::string& output)
|
||||
: inputUrl(input), outputUrl(output), isRunning(false)
|
||||
{
|
||||
}
|
||||
|
||||
bool RtspForwarder::isStreaming() const
|
||||
{
|
||||
return isRunning;
|
||||
}
|
||||
|
||||
bool RtspForwarder::start()
|
||||
{
|
||||
run();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool RtspForwarder::stop()
|
||||
{
|
||||
isRunning = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
int RtspForwarder::run()
|
||||
{
|
||||
#ifndef NDEBUG
|
||||
|
||||
// Set the custom log callback
|
||||
av_log_set_callback(ffmpeg_log_callback);
|
||||
av_log_set_level(AV_LOG_DEBUG);
|
||||
|
||||
#endif
|
||||
isRunning = true;
|
||||
AVFormatContext* inputFormatContext = nullptr;
|
||||
AVFormatContext* outputFormatContext = nullptr;
|
||||
int ret;
|
||||
int videoStreamIndex = -1;
|
||||
int64_t startTime = AV_NOPTS_VALUE;
|
||||
AVBSFContext* bsf_ctx = nullptr;
|
||||
|
||||
std::string url = inputUrl;
|
||||
if (!m_userName.empty())
|
||||
{
|
||||
char auth[512] = { 0 };
|
||||
snprintf(auth, sizeof(auth), "%s:%s@", m_userName.c_str(), m_password.c_str());
|
||||
|
||||
url.insert(url.begin() + 7, auth, auth + strlen(auth));
|
||||
}
|
||||
|
||||
// Input options
|
||||
AVDictionary* inputOptions = nullptr;
|
||||
av_dict_set(&inputOptions, "rtsp_transport", "tcp", 0);
|
||||
av_dict_set(&inputOptions, "stimeout", "5000000", 0); // 5 second timeout
|
||||
// av_dict_set(&inputOptions, "buffer_size", "1024000", 0); // 1MB buffer
|
||||
|
||||
std::cout << "Opening input: " << url << std::endl;
|
||||
|
||||
// Open input
|
||||
ret = avformat_open_input(&inputFormatContext, url.c_str(), nullptr, &inputOptions);
|
||||
av_dict_free(&inputOptions);
|
||||
if (ret < 0) {
|
||||
std::cerr << "Could not open input: " << av_err2str(ret) << std::endl;
|
||||
return ret;
|
||||
}
|
||||
|
||||
// Get stream info
|
||||
ret = avformat_find_stream_info(inputFormatContext, nullptr);
|
||||
if (ret < 0) {
|
||||
// std::cerr << "Failed to get stream info: " << av_err2str(ret) << std::endl;
|
||||
avformat_close_input(&inputFormatContext);
|
||||
return ret;
|
||||
}
|
||||
|
||||
// Find video stream
|
||||
for (unsigned i = 0; i < inputFormatContext->nb_streams; i++) {
|
||||
if (inputFormatContext->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
|
||||
videoStreamIndex = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (videoStreamIndex == -1) {
|
||||
// std::cerr << "No video stream found" << std::endl;
|
||||
avformat_close_input(&inputFormatContext);
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Create stream mapping
|
||||
std::vector<int> streamMapping(inputFormatContext->nb_streams, -1);
|
||||
int outputStreamIdx = 0;
|
||||
|
||||
|
||||
// Allocate output context
|
||||
ret = avformat_alloc_output_context2(&outputFormatContext, nullptr, "rtsp", outputUrl.c_str());
|
||||
if ((ret < 0) || !outputFormatContext) {
|
||||
std::cerr << "Could not create output context" << std::endl;
|
||||
avformat_close_input(&inputFormatContext);
|
||||
return false;
|
||||
}
|
||||
|
||||
// FIXED VERSION - remove the redundant stream creation
|
||||
for (unsigned i = 0; i < inputFormatContext->nb_streams; i++) {
|
||||
AVStream* inStream = inputFormatContext->streams[i];
|
||||
const AVCodecParameters *in_codecpar = inStream->codecpar;
|
||||
|
||||
// Skip non-video streams if needed
|
||||
if (in_codecpar->codec_type != AVMEDIA_TYPE_VIDEO) {
|
||||
streamMapping[i] = -1;
|
||||
continue;
|
||||
}
|
||||
|
||||
// Create only ONE stream per input stream
|
||||
const AVCodec *codec = avcodec_find_decoder(in_codecpar->codec_id);
|
||||
AVStream *outStream = avformat_new_stream(outputFormatContext, codec);
|
||||
if (!outStream) {
|
||||
return false;
|
||||
}
|
||||
|
||||
ret = avcodec_parameters_copy(outStream->codecpar, in_codecpar);
|
||||
outStream->codecpar->codec_tag = 0;
|
||||
outStream->time_base = (AVRational){1, 90000};
|
||||
outStream->avg_frame_rate = inStream->avg_frame_rate;
|
||||
|
||||
// Map input stream to output stream
|
||||
streamMapping[i] = outputStreamIdx++;
|
||||
}
|
||||
|
||||
const AVBitStreamFilter* filter = av_bsf_get_by_name("h264_mp4toannexb");
|
||||
if (filter)
|
||||
{
|
||||
for (unsigned i = 0; i < outputFormatContext->nb_streams; i++) {
|
||||
AVStream* stream = outputFormatContext->streams[i];
|
||||
if (stream->codecpar->codec_id == AV_CODEC_ID_H264) {
|
||||
ret = av_bsf_alloc(filter, &bsf_ctx);
|
||||
if (ret < 0) {
|
||||
std::cerr << "Failed to allocate bitstream filter context: " << av_err2str(ret) << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
// Copy parameters from input to bsf
|
||||
ret = avcodec_parameters_copy(bsf_ctx->par_in, stream->codecpar);
|
||||
if (ret < 0) {
|
||||
std::cerr << "Failed to copy parameters to bsf: " << av_err2str(ret) << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
// Initialize the bsf context
|
||||
ret = av_bsf_init(bsf_ctx);
|
||||
if (ret < 0) {
|
||||
std::cerr << "Failed to initialize bitstream filter: " << av_err2str(ret) << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
// Update output parameters
|
||||
ret = avcodec_parameters_copy(stream->codecpar, bsf_ctx->par_out);
|
||||
if (ret < 0) {
|
||||
std::cerr << "Failed to copy parameters from bsf: " << av_err2str(ret) << std::endl;
|
||||
return false;
|
||||
}
|
||||
break; // Only apply to the first H.264 stream
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
AVDictionary* outputOptions = nullptr;
|
||||
av_dict_set(&outputOptions, "rtsp_transport", "tcp", 0);
|
||||
av_dict_set(&outputOptions, "rtsp_flags", "filter_src", 0);
|
||||
av_dict_set(&outputOptions, "timeout", "5000000", 0);
|
||||
av_dict_set(&outputOptions, "allowed_media_types", "video", 0);
|
||||
av_dict_set(&outputOptions, "buffer_size", "1024000", 0); // 1MB buffer
|
||||
av_dict_set(&outputOptions, "fflags", "nobuffer", 0); // Reduce latency
|
||||
av_dict_set(&outputOptions, "muxdelay", "0.1", 0); // Reduce delay
|
||||
av_dict_set(&outputOptions, "max_delay", "500000", 0);
|
||||
av_dict_set(&outputOptions, "preset", "ultrafast", 0);
|
||||
av_dict_set(&outputOptions, "tune", "zerolatency", 0);
|
||||
av_dict_set(&outputOptions, "rtsp_flags", "prefer_tcp", 0);
|
||||
|
||||
// Open output
|
||||
if (!(outputFormatContext->oformat->flags & AVFMT_NOFILE)) {
|
||||
|
||||
// Output options
|
||||
|
||||
// ret = avio_open(&outputFormatContext->pb, outputUrl.c_str(), AVIO_FLAG_WRITE);
|
||||
ret = avio_open2(&outputFormatContext->pb, outputFormatContext->url, AVIO_FLAG_WRITE, NULL, &outputOptions);
|
||||
|
||||
if (ret < 0) {
|
||||
char errbuf[AV_ERROR_MAX_STRING_SIZE] = { 0 };
|
||||
av_strerror(ret, errbuf, AV_ERROR_MAX_STRING_SIZE);
|
||||
std::cerr << "Could not open output URL: " << errbuf << std::endl;
|
||||
avformat_close_input(&inputFormatContext);
|
||||
avformat_free_context(outputFormatContext);
|
||||
av_dict_free(&outputOptions);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
// Write header
|
||||
ret = avformat_write_header(outputFormatContext, &outputOptions);
|
||||
av_dict_free(&outputOptions);
|
||||
if (ret < 0) {
|
||||
char errbuf[AV_ERROR_MAX_STRING_SIZE] = { 0 };
|
||||
av_strerror(ret, errbuf, AV_ERROR_MAX_STRING_SIZE);
|
||||
std::cerr << "Error writing header: " << errbuf << std::endl;
|
||||
avformat_close_input(&inputFormatContext);
|
||||
if (!(outputFormatContext->oformat->flags & AVFMT_NOFILE))
|
||||
avio_closep(&outputFormatContext->pb);
|
||||
avformat_free_context(outputFormatContext);
|
||||
return ret;
|
||||
}
|
||||
|
||||
// Main loop - read and write packets
|
||||
AVPacket packet;
|
||||
AVMediaType medaiType;
|
||||
while (isRunning) {
|
||||
ret = av_read_frame(inputFormatContext, &packet);
|
||||
if (ret < 0) {
|
||||
if (ret == AVERROR_EOF || ret == AVERROR(EAGAIN)) {
|
||||
std::cerr << "End of stream or timeout, reconnecting in "
|
||||
<< reconnectDelayMs << "ms" << std::endl;
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(reconnectDelayMs));
|
||||
avformat_close_input(&inputFormatContext);
|
||||
ret = avformat_open_input(&inputFormatContext, inputUrl.c_str(), nullptr, &inputOptions);
|
||||
if (ret < 0) continue;
|
||||
ret = avformat_find_stream_info(inputFormatContext, nullptr);
|
||||
if (ret < 0) continue;
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
// Later when writing packets:
|
||||
int original_stream_index = packet.stream_index;
|
||||
if (streamMapping[original_stream_index] >= 0) {
|
||||
packet.stream_index = streamMapping[original_stream_index];
|
||||
// Write packet...
|
||||
} else {
|
||||
// Skip this packet
|
||||
av_packet_unref(&packet);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Skip audio packets
|
||||
medaiType = inputFormatContext->streams[original_stream_index]->codecpar->codec_type;
|
||||
if (medaiType == AVMEDIA_TYPE_AUDIO || medaiType == AVMEDIA_TYPE_DATA)
|
||||
{
|
||||
av_packet_unref(&packet);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
#if 0
|
||||
// Fix timestamps if enabled
|
||||
if (fixTimestamps) {
|
||||
// Handle timestamp issues similar to FFmpeg warning
|
||||
AVStream* inStream = inputFormatContext->streams[packet.stream_index];
|
||||
AVStream* outStream = outputFormatContext->streams[packet.stream_index];
|
||||
|
||||
if (packet.pts == AV_NOPTS_VALUE) {
|
||||
// Generate PTS if missing
|
||||
if (startTime == AV_NOPTS_VALUE) {
|
||||
startTime = av_gettime();
|
||||
}
|
||||
packet.pts = av_rescale_q(av_gettime() - startTime,
|
||||
AV_TIME_BASE_Q,
|
||||
inStream->time_base);
|
||||
packet.dts = packet.pts;
|
||||
}
|
||||
|
||||
// Rescale timestamps to output timebase
|
||||
packet.pts = av_rescale_q_rnd(packet.pts,
|
||||
inStream->time_base,
|
||||
outStream->time_base,
|
||||
static_cast<AVRounding>(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX));
|
||||
packet.dts = av_rescale_q_rnd(packet.dts,
|
||||
inStream->time_base,
|
||||
outStream->time_base,
|
||||
static_cast<AVRounding>(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX));
|
||||
packet.duration = av_rescale_q(packet.duration,
|
||||
inStream->time_base,
|
||||
outStream->time_base);
|
||||
}
|
||||
|
||||
// Write packet to output
|
||||
ret = av_interleaved_write_frame(outputFormatContext, &packet);
|
||||
av_packet_unref(&packet);
|
||||
if (ret < 0) {
|
||||
std::cerr << "Error writing frame: " << av_err2str(ret) << std::endl;
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
AVStream *in_stream = inputFormatContext->streams[original_stream_index];
|
||||
AVStream *out_stream = outputFormatContext->streams[packet.stream_index];
|
||||
av_packet_rescale_ts(&packet, in_stream->time_base, out_stream->time_base);
|
||||
|
||||
// CRITICAL: Fix timestamp issues
|
||||
if (packet.dts != AV_NOPTS_VALUE && packet.pts != AV_NOPTS_VALUE && packet.dts > packet.pts) {
|
||||
packet.dts = packet.pts;
|
||||
}
|
||||
|
||||
// Handle missing timestamps
|
||||
if (packet.pts == AV_NOPTS_VALUE) {
|
||||
if (startTime == AV_NOPTS_VALUE) {
|
||||
startTime = av_gettime();
|
||||
}
|
||||
packet.pts = av_rescale_q(av_gettime() - startTime,
|
||||
AV_TIME_BASE_Q,
|
||||
out_stream->time_base);
|
||||
packet.dts = packet.pts;
|
||||
}
|
||||
|
||||
packet.pos = -1;
|
||||
|
||||
// Apply bitstream filter if it's H.264
|
||||
if (bsf_ctx && out_stream->codecpar->codec_id == AV_CODEC_ID_H264) {
|
||||
ret = av_bsf_send_packet(bsf_ctx, &packet);
|
||||
if (ret < 0) {
|
||||
std::cerr << "Error sending packet to bitstream filter: " << av_err2str(ret) << std::endl;
|
||||
break;
|
||||
}
|
||||
|
||||
while (ret >= 0) {
|
||||
ret = av_bsf_receive_packet(bsf_ctx, &packet);
|
||||
if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
|
||||
// Need more input or end of file
|
||||
break;
|
||||
} else if (ret < 0) {
|
||||
std::cerr << "Error receiving packet from bitstream filter: " << av_err2str(ret) << std::endl;
|
||||
break;
|
||||
}
|
||||
|
||||
// Write the filtered packet
|
||||
ret = av_interleaved_write_frame(outputFormatContext, &packet);
|
||||
av_packet_unref(&packet);
|
||||
if (ret < 0) {
|
||||
char errbuf[AV_ERROR_MAX_STRING_SIZE] = { 0 };
|
||||
av_strerror(ret, errbuf, AV_ERROR_MAX_STRING_SIZE);
|
||||
std::cerr << "Error writing frame: " << errbuf << std::endl;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Write the packet without filtering
|
||||
ret = av_interleaved_write_frame(outputFormatContext, &packet);
|
||||
av_packet_unref(&packet);
|
||||
if (ret < 0) {
|
||||
char errbuf[AV_ERROR_MAX_STRING_SIZE] = { 0 };
|
||||
av_strerror(ret, errbuf, AV_ERROR_MAX_STRING_SIZE);
|
||||
std::cerr << "Error writing frame: " << errbuf << std::endl;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
cleanup:
|
||||
// Free the bitstream filter context
|
||||
if (bsf_ctx) {
|
||||
av_bsf_free(&bsf_ctx);
|
||||
}
|
||||
|
||||
// Write trailer
|
||||
av_write_trailer(outputFormatContext);
|
||||
|
||||
// Cleanup
|
||||
avformat_close_input(&inputFormatContext);
|
||||
if (outputFormatContext && !(outputFormatContext->oformat->flags & AVFMT_NOFILE))
|
||||
avio_closep(&outputFormatContext->pb);
|
||||
avformat_free_context(outputFormatContext);
|
||||
|
||||
return ret;
|
||||
}
|
@ -0,0 +1,90 @@
|
||||
//
|
||||
// Created by Matthew on 2025/3/11.
|
||||
//
|
||||
|
||||
#ifndef MICROPHOTO_STREAMING_H
|
||||
#define MICROPHOTO_STREAMING_H
|
||||
|
||||
#include <string>
|
||||
#include <memory>
|
||||
#include <functional>
|
||||
#include <iostream>
|
||||
#include <thread>
|
||||
#include <atomic>
|
||||
|
||||
|
||||
#include <android/multinetwork.h>
|
||||
|
||||
extern "C" {
|
||||
#include <libavcodec/avcodec.h>
|
||||
#include <libavformat/avformat.h>
|
||||
#include <libavutil/avutil.h>
|
||||
#include <libswscale/swscale.h>
|
||||
}
|
||||
|
||||
class Streaming
|
||||
{
|
||||
public:
|
||||
virtual ~Streaming() {}
|
||||
virtual bool start() { return false; }
|
||||
virtual bool stop() { return false; }
|
||||
virtual bool isStreaming() const { return false; }
|
||||
|
||||
void setAuth(const std::string& userName, const std::string& password)
|
||||
{
|
||||
m_userName = userName;
|
||||
m_password = password;
|
||||
}
|
||||
protected:
|
||||
std::string m_userName;
|
||||
std::string m_password;
|
||||
};
|
||||
|
||||
|
||||
#if 0
|
||||
class StreamForwarder : public Streaming
|
||||
{
|
||||
private:
|
||||
AVFormatContext* inputCtx = nullptr;
|
||||
AVFormatContext* outputCtx = nullptr;
|
||||
bool isRunning = false;
|
||||
|
||||
public:
|
||||
StreamForwarder() = default;
|
||||
virtual ~StreamForwarder();
|
||||
|
||||
bool initialize(const std::string& inputUrl, const std::string& outputUrl);
|
||||
virtual void start();
|
||||
virtual void stop();
|
||||
|
||||
private:
|
||||
bool openInput(const std::string& inputUrl);
|
||||
bool openOutput(const std::string& outputUrl);
|
||||
void forwardPackets();
|
||||
void setFrameCallback(std::function<void(uint8_t*, int, int, int)> callback);
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
class RtspForwarder : public Streaming {
|
||||
private:
|
||||
std::string inputUrl;
|
||||
std::string outputUrl;
|
||||
std::atomic<bool> isRunning;
|
||||
|
||||
// Options
|
||||
int reconnectDelayMs = 5000;
|
||||
bool fixTimestamps = true;
|
||||
|
||||
public:
|
||||
RtspForwarder(const std::string& input, const std::string& output);
|
||||
|
||||
virtual bool start();
|
||||
virtual bool stop();
|
||||
virtual bool isStreaming() const;
|
||||
|
||||
|
||||
int run();
|
||||
};
|
||||
|
||||
#endif //MICROPHOTO_STREAMING_H
|
@ -0,0 +1,330 @@
|
||||
//
|
||||
// Created by Matthew on 2025/3/4.
|
||||
//
|
||||
|
||||
#include "HangYuCtrl.h"
|
||||
#include "netcamera.h"
|
||||
#include "httpclient.h"
|
||||
#include <LogThread.h>
|
||||
|
||||
#include <SpecData_JSON.h>
|
||||
|
||||
#include <cstring>
|
||||
#include <algorithm>
|
||||
|
||||
HangYuCtrl::~HangYuCtrl()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
bool HangYuCtrl::SetResolution(uint8_t channel, uint8_t streamID, uint32_t resX, uint32_t resY)
|
||||
{
|
||||
//流类型范围1-4,1为主流
|
||||
char url[128] = { 0 };
|
||||
snprintf(url, sizeof(url), "http://%s/Streams/%u/1", m_ip.c_str(), (uint32_t)channel);
|
||||
|
||||
std::vector<uint8_t> resData;
|
||||
|
||||
int res = DoGetRequest(url, HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, resData);
|
||||
if (res != 0 || resData.empty())
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
std::string xmlString(resData.begin(), resData.end());
|
||||
|
||||
size_t widthStart = xmlString.find("<ResolutionWidth>");
|
||||
size_t widthEnd = xmlString.find("</ResolutionWidth>");
|
||||
if (widthStart != std::string::npos && widthEnd != std::string::npos) {
|
||||
widthStart += std::string("<ResolutionWidth>").length();
|
||||
xmlString.replace(widthStart, widthEnd - widthStart, std::to_string(resX));
|
||||
}
|
||||
|
||||
size_t heightStart = xmlString.find("<ResolutionHeigth>");
|
||||
size_t heightEnd = xmlString.find("</ResolutionHeigth>");
|
||||
if (heightStart != std::string::npos && heightEnd != std::string::npos) {
|
||||
heightStart += std::string("<ResolutionHeigth>").length();
|
||||
xmlString.replace(heightStart, heightEnd - heightStart, std::to_string(resY));
|
||||
}
|
||||
|
||||
res = DoPutRequest(url, HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, xmlString.c_str(), resData);
|
||||
|
||||
if (res != 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool HangYuCtrl::SetOsd(uint8_t channel, std::string osdstring, uint8_t pos)
|
||||
{
|
||||
// /LAPI/V1.0/Channels/<ID>/Media/OSDs/Contents
|
||||
//左上OSD
|
||||
|
||||
bool hasDateTime = (osdstring.find("$$DATETIME$$") != std::string::npos);
|
||||
size_t posi = osdstring.find("$$DATETIME$$");
|
||||
if (posi != std::string::npos) {
|
||||
size_t endPos = posi + 12;
|
||||
while (endPos < osdstring.size() && (osdstring[endPos] == ' ' || osdstring[endPos] == '\n')) {
|
||||
endPos++;
|
||||
}
|
||||
osdstring.erase(posi, endPos - posi);
|
||||
}
|
||||
|
||||
char url[128] = { 0 };
|
||||
snprintf(url, sizeof(url), "http://%s/Pictures/%u/MultiOSDV2", m_ip.c_str(), (uint32_t)channel);
|
||||
std::vector<uint8_t> resData;
|
||||
std::replace(osdstring.begin(), osdstring.end(), '\n', '^');
|
||||
string xmlString = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?><MultiLineOSD><DisplayTime><Enable>" + string(hasDateTime ? "true" : "false") + "</Enable><PosX>8</PosX><PosY>0</PosY></DisplayTime><OSD><ID>1</ID><Enable>false</Enable><Text>"+ osdstring+ "</Text><x>8</x><y>" + string(hasDateTime ? "24" : "0") + "</y></MultiLineOSD>";
|
||||
int res = DoPutRequest(url, HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, xmlString.c_str(), resData);
|
||||
return res;
|
||||
}
|
||||
|
||||
void HangYuCtrl::EnableOsd(bool enable, uint8_t channel)
|
||||
{
|
||||
//航煜 只能显示时间和一个OSD
|
||||
char url[128] = { 0 };
|
||||
snprintf(url, sizeof(url), "http://%s/Pictures/%u/MultiOSDV2", m_ip.c_str(), (uint32_t)channel);
|
||||
|
||||
std::vector<uint8_t> resData;
|
||||
|
||||
int res = DoGetRequest(url, HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, resData);
|
||||
if (res != 0 || resData.empty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
std::string xmlString(resData.begin(), resData.end());
|
||||
|
||||
std::string enableStartTag = "<Enable>";
|
||||
std::string enableEndTag = "</Enable>";
|
||||
|
||||
size_t pos = 0;
|
||||
while ((pos = xmlString.find(enableStartTag, pos)) != std::string::npos) {
|
||||
size_t startPos = pos + enableStartTag.length();
|
||||
size_t endPos = xmlString.find(enableEndTag, startPos);
|
||||
if (endPos == std::string::npos) {
|
||||
break;
|
||||
}
|
||||
std::string newValue = enable ? "true" : "false";
|
||||
xmlString.replace(startPos, endPos - startPos, newValue);
|
||||
pos = endPos + enableEndTag.length();
|
||||
}
|
||||
|
||||
res = DoPutRequest(url, HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, xmlString.c_str(), resData);
|
||||
|
||||
if (res != 0)
|
||||
{
|
||||
// return;
|
||||
}
|
||||
}
|
||||
|
||||
std::string HangYuCtrl::GetStreamingUrl(uint8_t channel)
|
||||
{
|
||||
// /LAPI/V1.0/Channels/<ID>/Media/Video/Streams/<ID>/LiveStreamURL?TransType=<Tran
|
||||
// sType>&TransProtocol=<TransProtocol>
|
||||
char url[128] = { 0 };
|
||||
snprintf(url, sizeof(url), "http://%s/Streams/%u/1/Transport", m_ip.c_str(), (uint32_t)channel);
|
||||
|
||||
std::vector<uint8_t> resData;
|
||||
|
||||
int res = 0;
|
||||
for (int idx = 0; idx < 10; idx++)
|
||||
{
|
||||
res = DoGetRequest(url, HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, resData);
|
||||
if (res == 0 && !resData.empty())
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (res != 0 || resData.empty())
|
||||
{
|
||||
return "";
|
||||
}
|
||||
|
||||
resData.push_back(0);
|
||||
const char* start = strstr((const char*)&resData[0], "<RTSPURI>");
|
||||
if (start == NULL)
|
||||
{
|
||||
return "";
|
||||
}
|
||||
start += 9;
|
||||
const char* end = strstr(start, "</RTSPURI>");
|
||||
if (end == NULL)
|
||||
{
|
||||
return "";
|
||||
}
|
||||
|
||||
return std::string(start, end);
|
||||
}
|
||||
|
||||
bool HangYuCtrl::UpdateTime(time_t ts)
|
||||
{
|
||||
// /LAPI/V1.0/System/Time
|
||||
|
||||
// <?xml version="1.0" encoding="utf-8"?>
|
||||
//<Time>
|
||||
//<DateTimeFormat>
|
||||
//<!--req,string,YYYYMMDDWhhmmss,YYYYMMDDhhmmss,MMDDYYYYWhhmmss,MMD
|
||||
// DYYYYhhmmss,DDMMYYYYWhhmmss,DDMMYYYYhhmmss-->
|
||||
//</DateTimeFormat>
|
||||
//<TimeFormat><!--req,xs:string,12hour,24hour--></TimeFormat>
|
||||
//<SystemTime><!--req,xs:datetime,” 20040503T173008+08”--></SystemTime>
|
||||
//<SyncNTPFlag><!--req,xs:string,"Sync,NoSync"--></SyncNTPFlag>
|
||||
//</Time>
|
||||
|
||||
std::string reqData = "<?xml version=\"1.0\" encoding=\"utf-8\"?><Time><SystemTime>"
|
||||
+ FormatLocalDateTime("%d%02d%02dT%02d%02d%02d") + "+08</SystemTime></Time>";
|
||||
|
||||
std::string url = "http://" + m_ip + "/System/Time";
|
||||
std::vector<uint8_t> resData;
|
||||
int res = DoPutRequest(url.c_str(), HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, reqData.c_str(), resData);
|
||||
|
||||
if (res != 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool HangYuCtrl::TakePhoto(uint8_t streamID, std::vector<uint8_t>& img)
|
||||
{
|
||||
bool res = false;
|
||||
|
||||
std::vector<uint8_t> data;
|
||||
|
||||
// /Snapshot/%u/1/RemoteImageCaptureV2?ImageFormat=jpg
|
||||
char url[128] = { 0 };
|
||||
snprintf(url, sizeof(url), "http://%s/Snapshot/%u/1/RemoteImageCaptureV2?ImageFormat=jpg", m_ip.c_str(), (uint32_t)streamID);
|
||||
|
||||
int nRet = DoGetRequest(url, HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, img, &m_lastErrorCode);
|
||||
if (0 == nRet)
|
||||
{
|
||||
bool qualityDowngraded = false;
|
||||
std::string originalConfig;
|
||||
if (img.size() < 1000)
|
||||
{
|
||||
qualityDowngraded = DowngradeQuality(originalConfig);
|
||||
XYLOG(XYLOG_SEVERITY_INFO,"Reduce Img Quality");
|
||||
}
|
||||
nRet = DoGetRequest(url, HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, img, &m_lastErrorCode);
|
||||
if (!originalConfig.empty())
|
||||
{
|
||||
UpdateQuality(originalConfig);
|
||||
}
|
||||
|
||||
std::vector<uint8_t> header = {0xFF, 0xD8, 0xFF, 0xE0}; // JPEG
|
||||
std::vector<uint8_t>::iterator it = std::search(img.begin(), img.end(), header.begin(), header.end());
|
||||
if (it != img.end() && it != img.begin())
|
||||
{
|
||||
img.erase(img.begin(), it);
|
||||
#ifndef NDEBUG
|
||||
int aa = 0;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
return nRet == 0;
|
||||
}
|
||||
|
||||
bool HangYuCtrl::DowngradeQuality(std::string& originalConfig)
|
||||
{
|
||||
bool res = false;
|
||||
char url[64] = { 0 };
|
||||
snprintf(url, sizeof(url), "http://%s/Snapshot/Config", m_ip.c_str());
|
||||
|
||||
std::vector<uint8_t> data;
|
||||
int nRet = DoGetRequest(url, HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, data);
|
||||
if (0 == nRet)
|
||||
{
|
||||
std::string str = ByteArrayToString(&data[0], data.size());
|
||||
originalConfig = str;
|
||||
if (replaceAll(str, "<Quality>middle</Quality>", "<Quality>low</Quality>") == 0)
|
||||
{
|
||||
res = (replaceAll(str, "<Quality>high</Quality>", "<Quality>middle</Quality>") != 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
res = true;
|
||||
}
|
||||
|
||||
if (!res)
|
||||
{
|
||||
return res;
|
||||
}
|
||||
|
||||
data.clear();
|
||||
if (res)
|
||||
{
|
||||
nRet = DoPutRequest(url, HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, str.c_str(), data);
|
||||
return 0 == nRet;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool HangYuCtrl::UpdateQuality(const std::string& originalConfig)
|
||||
{
|
||||
std::vector<uint8_t> data;
|
||||
char url[64] = { 0 };
|
||||
snprintf(url, sizeof(url), "http://%s/Snapshot/Config", m_ip.c_str());
|
||||
int nRet = DoPutRequest(url, HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, originalConfig.c_str(), data);
|
||||
return 0 == nRet;
|
||||
}
|
||||
|
||||
bool HangYuCtrl::UpgradeQuality()
|
||||
{
|
||||
bool res = false;
|
||||
char url[64] = { 0 };
|
||||
snprintf(url, sizeof(url), "http://%s/Snapshot/Config", m_ip.c_str());
|
||||
|
||||
std::vector<uint8_t> data;
|
||||
int nRet = DoGetRequest(url, HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, data);
|
||||
if (0 == nRet)
|
||||
{
|
||||
std::string str = ByteArrayToString(&data[0], data.size());
|
||||
if (replaceAll(str, "<Quality>low</Quality>", "<Quality>middle</Quality>") == 0)
|
||||
{
|
||||
res = (replaceAll(str, "<Quality>middle</Quality>", "<Quality>high</Quality>") != 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
res = true;
|
||||
}
|
||||
|
||||
if (!res)
|
||||
{
|
||||
return res;
|
||||
}
|
||||
|
||||
data.clear();
|
||||
if (res)
|
||||
{
|
||||
nRet = DoPutRequest(url, HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, str.c_str(), data);
|
||||
return 0 == nRet;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool HangYuCtrl::QueryQuality(std::string& qualityContents)
|
||||
{
|
||||
char url[64] = { 0 };
|
||||
snprintf(url, sizeof(url), "http://%s/Snapshot/Config", m_ip.c_str());
|
||||
|
||||
std::vector<uint8_t> data;
|
||||
int nRet = DoGetRequest(url, HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, data);
|
||||
if (0 == nRet && !data.empty())
|
||||
{
|
||||
qualityContents = ByteArrayToString(&data[0], data.size());
|
||||
}
|
||||
return (0 == nRet);
|
||||
}
|
||||
|
||||
bool HangYuCtrl::TakeVideo(uint8_t streamID, uint32_t duration, std::string path)
|
||||
{
|
||||
return false;
|
||||
}
|
@ -0,0 +1,34 @@
|
||||
//
|
||||
// Created by Matthew on 2025/3/4.
|
||||
//
|
||||
|
||||
#ifndef __MICROPHOTO_HANGYUCTRL_H__
|
||||
#define __MICROPHOTO_HANGYUCTRL_H__
|
||||
|
||||
#include "VendorCtrl.h"
|
||||
|
||||
class HangYuCtrl : public VendorCtrl
|
||||
{
|
||||
public:
|
||||
using VendorCtrl::VendorCtrl;
|
||||
virtual ~HangYuCtrl();
|
||||
|
||||
virtual bool SetOsd(uint8_t channel, std::string osd, uint8_t pos);
|
||||
virtual void EnableOsd(bool enable, uint8_t channel);
|
||||
virtual std::string GetStreamingUrl(uint8_t channel);
|
||||
virtual bool UpdateTime(time_t ts);
|
||||
virtual bool TakePhoto(uint8_t streamID, std::vector<uint8_t>& img);
|
||||
virtual bool TakeVideo(uint8_t streamID, uint32_t duration, std::string path);
|
||||
virtual bool HasAuthOnStreaming() const { return true; }
|
||||
virtual bool SetResolution(uint8_t channel, uint8_t streamID, uint32_t resX, uint32_t resY);
|
||||
|
||||
private:
|
||||
bool QueryQuality(std::string& qualityContents);
|
||||
bool DowngradeQuality(std::string& originalConfig);
|
||||
bool UpdateQuality(const std::string& originalConfig);
|
||||
bool UpgradeQuality();
|
||||
|
||||
};
|
||||
|
||||
|
||||
#endif //__MICROPHOTO_HANGYUCTRL_H__
|
@ -0,0 +1,204 @@
|
||||
//
|
||||
// Created by Matthew on 2025/3/4.
|
||||
//
|
||||
|
||||
#include "HikonCtrl.h"
|
||||
#include "netcamera.h"
|
||||
#include "httpclient.h"
|
||||
#include <LogThread.h>
|
||||
|
||||
#include <SpecData_JSON.h>
|
||||
|
||||
#include <cstring>
|
||||
#include <algorithm>
|
||||
|
||||
HikonCtrl::~HikonCtrl()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
bool HikonCtrl::SetResolution(uint8_t channel, uint8_t streamID, uint32_t resX, uint32_t resY)
|
||||
{
|
||||
//流类型范围1-4,1为主流
|
||||
char url[128] = { 0 };
|
||||
snprintf(url, sizeof(url), "http://%s/Streams/%u/1", m_ip.c_str(), (uint32_t)channel);
|
||||
|
||||
std::vector<uint8_t> resData;
|
||||
|
||||
int res = DoGetRequest(url, HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, resData);
|
||||
if (res != 0 || resData.empty())
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
std::string xmlString(resData.begin(), resData.end());
|
||||
|
||||
size_t widthStart = xmlString.find("<ResolutionWidth>");
|
||||
size_t widthEnd = xmlString.find("</ResolutionWidth>");
|
||||
if (widthStart != std::string::npos && widthEnd != std::string::npos) {
|
||||
widthStart += std::string("<ResolutionWidth>").length();
|
||||
xmlString.replace(widthStart, widthEnd - widthStart, std::to_string(resX));
|
||||
}
|
||||
|
||||
size_t heightStart = xmlString.find("<ResolutionHeigth>");
|
||||
size_t heightEnd = xmlString.find("</ResolutionHeigth>");
|
||||
if (heightStart != std::string::npos && heightEnd != std::string::npos) {
|
||||
heightStart += std::string("<ResolutionHeigth>").length();
|
||||
xmlString.replace(heightStart, heightEnd - heightStart, std::to_string(resY));
|
||||
}
|
||||
|
||||
res = DoPutRequest(url, HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, xmlString.c_str(), resData);
|
||||
|
||||
if (res != 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool HikonCtrl::SetOsd(uint8_t channel, std::string osdstring, uint8_t pos)
|
||||
{
|
||||
// /LAPI/V1.0/Channels/<ID>/Media/OSDs/Contents
|
||||
//左上OSD
|
||||
|
||||
bool hasDateTime = (osdstring.find("$$DATETIME$$") != std::string::npos);
|
||||
size_t posi = osdstring.find("$$DATETIME$$");
|
||||
if (posi != std::string::npos) {
|
||||
size_t endPos = posi + 12;
|
||||
while (endPos < osdstring.size() && (osdstring[endPos] == ' ' || osdstring[endPos] == '\n')) {
|
||||
endPos++;
|
||||
}
|
||||
osdstring.erase(posi, endPos - posi);
|
||||
}
|
||||
|
||||
char url[128] = { 0 };
|
||||
snprintf(url, sizeof(url), "http://%s/Pictures/%u/MultiOSDV2", m_ip.c_str(), (uint32_t)channel);
|
||||
std::vector<uint8_t> resData;
|
||||
std::replace(osdstring.begin(), osdstring.end(), '\n', '^');
|
||||
string xmlString = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?><MultiLineOSD><DisplayTime><Enable>" + string(hasDateTime ? "true" : "false") + "</Enable><PosX>8</PosX><PosY>0</PosY></DisplayTime><OSD><ID>1</ID><Enable>false</Enable><Text>"+ osdstring+ "</Text><x>8</x><y>" + string(hasDateTime ? "24" : "0") + "</y></MultiLineOSD>";
|
||||
int res = DoPutRequest(url, HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, xmlString.c_str(), resData);
|
||||
return res;
|
||||
}
|
||||
|
||||
void HikonCtrl::EnableOsd(bool enable, uint8_t channel)
|
||||
{
|
||||
//航煜 只能显示时间和一个OSD
|
||||
char url[128] = { 0 };
|
||||
snprintf(url, sizeof(url), "http://%s/Pictures/%u/MultiOSDV2", m_ip.c_str(), (uint32_t)channel);
|
||||
|
||||
std::vector<uint8_t> resData;
|
||||
|
||||
int res = DoGetRequest(url, HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, resData);
|
||||
if (res != 0 || resData.empty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
std::string xmlString(resData.begin(), resData.end());
|
||||
|
||||
std::string enableStartTag = "<Enable>";
|
||||
std::string enableEndTag = "</Enable>";
|
||||
|
||||
size_t pos = 0;
|
||||
while ((pos = xmlString.find(enableStartTag, pos)) != std::string::npos) {
|
||||
size_t startPos = pos + enableStartTag.length();
|
||||
size_t endPos = xmlString.find(enableEndTag, startPos);
|
||||
if (endPos == std::string::npos) {
|
||||
break;
|
||||
}
|
||||
std::string newValue = enable ? "true" : "false";
|
||||
xmlString.replace(startPos, endPos - startPos, newValue);
|
||||
pos = endPos + enableEndTag.length();
|
||||
}
|
||||
|
||||
res = DoPutRequest(url, HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, xmlString.c_str(), resData);
|
||||
|
||||
if (res != 0)
|
||||
{
|
||||
// return;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
std::string HikonCtrl::GetStreamingUrl(uint8_t channel)
|
||||
{
|
||||
// /LAPI/V1.0/Channels/<ID>/Media/Video/Streams/<ID>/LiveStreamURL?TransType=<Tran
|
||||
// sType>&TransProtocol=<TransProtocol>
|
||||
char url[128] = { 0 };
|
||||
snprintf(url, sizeof(url), "http://%s/Streams/%u/1/Transport", m_ip.c_str(), (uint32_t)channel);
|
||||
|
||||
std::vector<uint8_t> resData;
|
||||
|
||||
int res = 0;
|
||||
for (int idx = 0; idx < 10; idx++)
|
||||
{
|
||||
res = DoGetRequest(url, HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, resData);
|
||||
if (res == 0 && !resData.empty())
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (res != 0 || resData.empty())
|
||||
{
|
||||
return "";
|
||||
}
|
||||
|
||||
resData.push_back(0);
|
||||
const char* start = strstr((const char*)&resData[0], "<RTSPURI>");
|
||||
if (start == NULL)
|
||||
{
|
||||
return "";
|
||||
}
|
||||
start += 9;
|
||||
const char* end = strstr(start, "</RTSPURI>");
|
||||
if (end == NULL)
|
||||
{
|
||||
return "";
|
||||
}
|
||||
|
||||
return std::string(start, end);
|
||||
}
|
||||
|
||||
bool HikonCtrl::UpdateTime(time_t ts)
|
||||
{
|
||||
// /LAPI/V1.0/System/Time
|
||||
|
||||
// <?xml version="1.0" encoding="utf-8"?>
|
||||
//<Time>
|
||||
//<DateTimeFormat>
|
||||
//<!--req,string,YYYYMMDDWhhmmss,YYYYMMDDhhmmss,MMDDYYYYWhhmmss,MMD
|
||||
// DYYYYhhmmss,DDMMYYYYWhhmmss,DDMMYYYYhhmmss-->
|
||||
//</DateTimeFormat>
|
||||
//<TimeFormat><!--req,xs:string,12hour,24hour--></TimeFormat>
|
||||
//<SystemTime><!--req,xs:datetime,” 20040503T173008+08”--></SystemTime>
|
||||
//<SyncNTPFlag><!--req,xs:string,"Sync,NoSync"--></SyncNTPFlag>
|
||||
//</Time>
|
||||
|
||||
std::string reqData = "<?xml version=\"1.0\" encoding=\"utf-8\"?><Time><SystemTime>"
|
||||
+ FormatLocalDateTime("%d%02d%02dT%02d%02d%02d") + "+08</SystemTime></Time>";
|
||||
|
||||
std::string url = "http://" + m_ip + "/System/Time";
|
||||
std::vector<uint8_t> resData;
|
||||
int res = DoPutRequest(url.c_str(), HTTP_AUTH_TYPE_BASIC, m_userName.c_str(), m_password.c_str(), m_netHandle, reqData.c_str(), resData);
|
||||
|
||||
if (res != 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool HikonCtrl::TakePhoto(uint8_t streamID, std::vector<uint8_t>& img)
|
||||
{
|
||||
char url[128] = { 0 };
|
||||
snprintf(url, sizeof(url), "http://%s/ISAPI/Streaming/channels/1/picture?", m_ip.c_str());
|
||||
int nRet = DoGetRequest(url, HTTP_AUTH_TYPE_DIGEST, m_userName.c_str(), m_password.c_str(), m_netHandle, img, &m_lastErrorCode);
|
||||
return nRet == 0;
|
||||
}
|
||||
|
||||
bool HikonCtrl::TakeVideo(uint8_t streamID, uint32_t duration, std::string path)
|
||||
{
|
||||
return false;
|
||||
}
|
@ -0,0 +1,34 @@
|
||||
//
|
||||
// Created by Matthew on 2025/3/4.
|
||||
//
|
||||
|
||||
#ifndef __MICROPHOTO_HIKONCTRL_H__
|
||||
#define __MICROPHOTO_HIKONCTRL_H__
|
||||
|
||||
#include "VendorCtrl.h"
|
||||
|
||||
class HikonCtrl : public VendorCtrl
|
||||
{
|
||||
public:
|
||||
using VendorCtrl::VendorCtrl;
|
||||
virtual ~HikonCtrl();
|
||||
|
||||
virtual bool SetOsd(uint8_t channel, std::string osd, uint8_t pos);
|
||||
virtual void EnableOsd(bool enable, uint8_t channel);
|
||||
virtual std::string GetStreamingUrl(uint8_t channel);
|
||||
virtual bool UpdateTime(time_t ts);
|
||||
virtual bool TakePhoto(uint8_t streamID, std::vector<uint8_t>& img);
|
||||
virtual bool TakeVideo(uint8_t streamID, uint32_t duration, std::string path);
|
||||
virtual bool HasAuthOnStreaming() const { return true; }
|
||||
virtual bool SetResolution(uint8_t channel, uint8_t streamID, uint32_t resX, uint32_t resY);
|
||||
|
||||
private:
|
||||
bool QueryQuality(std::string& qualityContents);
|
||||
bool DowngradeQuality(std::string& originalConfig);
|
||||
bool UpdateQuality(const std::string& originalConfig);
|
||||
bool UpgradeQuality();
|
||||
|
||||
};
|
||||
|
||||
|
||||
#endif //__MICROPHOTO_HIKONCTRL_H__
|
@ -1,222 +0,0 @@
|
||||
package com.xypower.mpapp;
|
||||
|
||||
import android.app.Service;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.graphics.Rect;
|
||||
import android.os.IBinder;
|
||||
import android.text.Editable;
|
||||
import android.text.TextWatcher;
|
||||
import android.util.Log;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.WindowManager;
|
||||
import android.view.inputmethod.InputMethodManager;
|
||||
import android.widget.Button;
|
||||
import android.widget.EditText;
|
||||
import android.widget.TextView;
|
||||
|
||||
public class FloatingWindow extends Service {
|
||||
|
||||
private Context mContext;
|
||||
private WindowManager mWindowManager;
|
||||
private View mView;
|
||||
|
||||
@Override
|
||||
public IBinder onBind(Intent intent) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate() {
|
||||
super.onCreate();
|
||||
mContext = this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int onStartCommand(Intent intent, int flags, int startId) {
|
||||
mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
|
||||
|
||||
allAboutLayout(intent);
|
||||
moveView();
|
||||
|
||||
return super.onStartCommand(intent, flags, startId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
|
||||
try {
|
||||
if (mView != null) {
|
||||
mWindowManager.removeView(mView);
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
// ex.printStackTrace();
|
||||
Log.e("FW", "Exception " + ex.getMessage());
|
||||
}
|
||||
|
||||
super.onDestroy();
|
||||
}
|
||||
|
||||
WindowManager.LayoutParams mWindowsParams;
|
||||
private void moveView() {
|
||||
/*
|
||||
DisplayMetrics metrics = mContext.getResources().getDisplayMetrics();
|
||||
int width = (int) (metrics.widthPixels * 1f);
|
||||
int height = (int) (metrics.heightPixels * 1f);
|
||||
|
||||
mWindowsParams = new WindowManager.LayoutParams(
|
||||
width,//WindowManager.LayoutParams.WRAP_CONTENT,
|
||||
height,//WindowManager.LayoutParams.WRAP_CONTENT,
|
||||
//WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
|
||||
|
||||
(Build.VERSION.SDK_INT <= 25) ? WindowManager.LayoutParams.TYPE_PHONE : WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
|
||||
,
|
||||
|
||||
//WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
|
||||
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
|
||||
| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN // Not displaying keyboard on bg activity's EditText
|
||||
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
|
||||
| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
|
||||
| WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
|
||||
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON,
|
||||
//WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, //Not work with EditText on keyboard
|
||||
PixelFormat.TRANSLUCENT);
|
||||
|
||||
|
||||
mWindowsParams.gravity = Gravity.TOP | Gravity.LEFT;
|
||||
//params.x = 0;
|
||||
mWindowsParams.y = 100;
|
||||
mWindowManager.addView(mView, mWindowsParams);
|
||||
|
||||
mView.setOnTouchListener(new View.OnTouchListener() {
|
||||
private int initialX;
|
||||
private int initialY;
|
||||
private float initialTouchX;
|
||||
private float initialTouchY;
|
||||
|
||||
long startTime = System.currentTimeMillis();
|
||||
@Override
|
||||
public boolean onTouch(View v, MotionEvent event) {
|
||||
if (System.currentTimeMillis() - startTime <= 300) {
|
||||
return false;
|
||||
}
|
||||
if (isViewInBounds(mView, (int) (event.getRawX()), (int) (event.getRawY()))) {
|
||||
editTextReceiveFocus();
|
||||
} else {
|
||||
editTextDontReceiveFocus();
|
||||
}
|
||||
|
||||
switch (event.getAction()) {
|
||||
case MotionEvent.ACTION_DOWN:
|
||||
initialX = mWindowsParams.x;
|
||||
initialY = mWindowsParams.y;
|
||||
initialTouchX = event.getRawX();
|
||||
initialTouchY = event.getRawY();
|
||||
break;
|
||||
case MotionEvent.ACTION_UP:
|
||||
break;
|
||||
case MotionEvent.ACTION_MOVE:
|
||||
mWindowsParams.x = initialX + (int) (event.getRawX() - initialTouchX);
|
||||
mWindowsParams.y = initialY + (int) (event.getRawY() - initialTouchY);
|
||||
mWindowManager.updateViewLayout(mView, mWindowsParams);
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
*/
|
||||
}
|
||||
|
||||
private boolean isViewInBounds(View view, int x, int y) {
|
||||
Rect outRect = new Rect();
|
||||
int[] location = new int[2];
|
||||
view.getDrawingRect(outRect);
|
||||
view.getLocationOnScreen(location);
|
||||
outRect.offset(location[0], location[1]);
|
||||
return outRect.contains(x, y);
|
||||
}
|
||||
|
||||
private void editTextReceiveFocus() {
|
||||
if (!wasInFocus) {
|
||||
mWindowsParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
|
||||
mWindowManager.updateViewLayout(mView, mWindowsParams);
|
||||
wasInFocus = true;
|
||||
}
|
||||
}
|
||||
|
||||
private void editTextDontReceiveFocus() {
|
||||
if (wasInFocus) {
|
||||
mWindowsParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
|
||||
mWindowManager.updateViewLayout(mView, mWindowsParams);
|
||||
wasInFocus = false;
|
||||
hideKeyboard(mContext, edt1);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean wasInFocus = true;
|
||||
private EditText edt1;
|
||||
private void allAboutLayout(Intent intent) {
|
||||
|
||||
LayoutInflater layoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
|
||||
mView = layoutInflater.inflate(R.layout.ovelay_window, null);
|
||||
|
||||
edt1 = (EditText) mView.findViewById(R.id.edt1);
|
||||
final TextView tvValue = (TextView) mView.findViewById(R.id.tvValue);
|
||||
Button btnClose = (Button) mView.findViewById(R.id.btnClose);
|
||||
|
||||
edt1.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
mWindowsParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
|
||||
// mWindowsParams.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE;
|
||||
mWindowManager.updateViewLayout(mView, mWindowsParams);
|
||||
wasInFocus = true;
|
||||
showSoftKeyboard(v);
|
||||
}
|
||||
});
|
||||
|
||||
edt1.addTextChangedListener(new TextWatcher() {
|
||||
@Override
|
||||
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
|
||||
tvValue.setText(edt1.getText());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterTextChanged(Editable editable) {
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
btnClose.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
stopSelf();
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
private void hideKeyboard(Context context, View view) {
|
||||
if (view != null) {
|
||||
InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
|
||||
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
|
||||
}
|
||||
}
|
||||
|
||||
public void showSoftKeyboard(View view) {
|
||||
if (view.requestFocus()) {
|
||||
InputMethodManager imm = (InputMethodManager)
|
||||
getSystemService(Context.INPUT_METHOD_SERVICE);
|
||||
imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,19 @@
|
||||
package com.xypower.mpapp;
|
||||
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.util.Log;
|
||||
|
||||
public class HeartBeatResponseReceiver extends BroadcastReceiver {
|
||||
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
String action = intent.getAction();
|
||||
if ("com.systemui.ACTION_HEARTBEAT_RESPONSE".equals(action)) {
|
||||
long timestamp = intent.getLongExtra("timestamp", 0);
|
||||
Log.d("MpApp","系统广播监听 timestamp:"+timestamp);
|
||||
MicroPhotoService.infoLog("收到heartbeat广播 timestamp:" + timestamp);
|
||||
}
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -1,76 +0,0 @@
|
||||
package com.xypower.mpapp;
|
||||
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.os.Build;
|
||||
import android.util.Log;
|
||||
import android.widget.Toast;
|
||||
|
||||
public class ScreenActionReceiver extends BroadcastReceiver {
|
||||
|
||||
private String TAG = "ScreenActionReceiver";
|
||||
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
|
||||
//LOG
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("Action: " + intent.getAction() + "\n");
|
||||
// sb.append("URI: " + intent.toUri(Intent.URI_INTENT_SCHEME).toString() + "\n");
|
||||
String log = sb.toString();
|
||||
Log.d(TAG, log);
|
||||
Toast.makeText(context, log, Toast.LENGTH_SHORT).show();
|
||||
|
||||
String action = intent.getAction();
|
||||
try {
|
||||
|
||||
if (Intent.ACTION_SCREEN_ON.equals(action)) {
|
||||
Log.d(TAG, "screen is on...");
|
||||
Toast.makeText(context, "screen ON", Toast.LENGTH_SHORT);
|
||||
|
||||
//Run the locker
|
||||
|
||||
context.startService(new Intent(context, FloatingWindow.class));
|
||||
} else if (Intent.ACTION_SCREEN_OFF.equals(action)) {
|
||||
Log.d(TAG, "screen is off...");
|
||||
Toast.makeText(context, "screen OFF", Toast.LENGTH_SHORT);
|
||||
|
||||
} else if (Intent.ACTION_USER_PRESENT.equals(action)) {
|
||||
Log.d(TAG, "screen is unlock...");
|
||||
Toast.makeText(context, "screen UNLOCK", Toast.LENGTH_SHORT);
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
context.startForegroundService(new Intent(context, FloatingWindow.class));
|
||||
} else {
|
||||
context.startService(new Intent(context, FloatingWindow.class));
|
||||
}
|
||||
|
||||
} else if (Intent.ACTION_BOOT_COMPLETED.equals(action)) {
|
||||
Log.d(TAG, "boot completed...");
|
||||
Toast.makeText(context, "BOOTED..", Toast.LENGTH_SHORT);
|
||||
//Run the locker
|
||||
/* Intent i = new Intent(context, FloatingWindow.class);
|
||||
context.startService(i);
|
||||
|
||||
*/
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
// context.startForegroundService(new Intent(context, FloatingWindow.class));
|
||||
} else {
|
||||
// context.startService(new Intent(context, FloatingWindow.class));
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public IntentFilter getFilter(){
|
||||
final IntentFilter filter = new IntentFilter();
|
||||
filter.addAction(Intent.ACTION_SCREEN_OFF);
|
||||
filter.addAction(Intent.ACTION_SCREEN_ON);
|
||||
return filter;
|
||||
}
|
||||
|
||||
}
|
@ -1,7 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string-array name="networkProtocols">
|
||||
<item>TCP</item>
|
||||
<item>UDP</item>
|
||||
<item>0-TCP</item>
|
||||
<item>1-UDP</item>
|
||||
<item>10-MQTT</item>
|
||||
</string-array>
|
||||
</resources>
|
@ -1,248 +0,0 @@
|
||||
package com.xypower.common;
|
||||
|
||||
import android.content.Context;
|
||||
import android.net.ConnectivityManager;
|
||||
import android.net.wifi.WifiConfiguration;
|
||||
import android.net.wifi.WifiManager;
|
||||
import android.os.Build;
|
||||
import android.os.Handler;
|
||||
import androidx.annotation.RequiresApi;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.RequiresApi;
|
||||
|
||||
import com.android.dx.stock.ProxyBuilder;
|
||||
|
||||
import java.io.File;
|
||||
import java.lang.reflect.InvocationHandler;
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
|
||||
public class HotspotManager {
|
||||
|
||||
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.O)
|
||||
public static class OreoWifiManager {
|
||||
private static final String TAG = OreoWifiManager.class.getSimpleName();
|
||||
|
||||
private Context mContext;
|
||||
private WifiManager mWifiManager;
|
||||
private ConnectivityManager mConnectivityManager;
|
||||
|
||||
public OreoWifiManager(Context c) {
|
||||
mContext = c;
|
||||
mWifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
|
||||
mConnectivityManager = (ConnectivityManager) mContext.getSystemService(ConnectivityManager.class);
|
||||
}
|
||||
|
||||
/**
|
||||
* This sets the Wifi SSID and password
|
||||
* Call this before {@code startTethering} if app is a system/privileged app
|
||||
* Requires: android.permission.TETHER_PRIVILEGED which is only granted to system apps
|
||||
*/
|
||||
public void configureHotspot(String name, String password) {
|
||||
WifiConfiguration apConfig = new WifiConfiguration();
|
||||
apConfig.SSID = name;
|
||||
apConfig.preSharedKey = password;
|
||||
apConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
|
||||
try {
|
||||
Method setConfigMethod = mWifiManager.getClass().getMethod("setWifiApConfiguration", WifiConfiguration.class);
|
||||
boolean status = (boolean) setConfigMethod.invoke(mWifiManager, apConfig);
|
||||
Log.d(TAG, "setWifiApConfiguration - success? " + status);
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error in configureHotspot");
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks where tethering is on.
|
||||
* This is determined by the getTetheredIfaces() method,
|
||||
* that will return an empty array if not devices are tethered
|
||||
*
|
||||
* @return true if a tethered device is found, false if not found
|
||||
*/
|
||||
/*public boolean isTetherActive() {
|
||||
try {
|
||||
Method method = mConnectivityManager.getClass().getDeclaredMethod("getTetheredIfaces");
|
||||
if (method == null) {
|
||||
Log.e(TAG, "getTetheredIfaces is null");
|
||||
} else {
|
||||
String res[] = (String[]) method.invoke(mConnectivityManager, null);
|
||||
Log.d(TAG, "getTetheredIfaces invoked");
|
||||
Log.d(TAG, Arrays.toString(res));
|
||||
if (res.length > 0) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error in getTetheredIfaces");
|
||||
e.printStackTrace();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
*/
|
||||
/**
|
||||
* This enables tethering using the ssid/password defined in Settings App>Hotspot & tethering
|
||||
* Does not require app to have system/privileged access
|
||||
* Credit: Vishal Sharma - https://stackoverflow.com/a/52219887
|
||||
*/
|
||||
public boolean startTethering(final OnStartTetheringCallback callback) {
|
||||
|
||||
// On Pie if we try to start tethering while it is already on, it will
|
||||
// be disabled. This is needed when startTethering() is called programmatically.
|
||||
/*if (isTetherActive()) {
|
||||
Log.d(TAG, "Tether already active, returning");
|
||||
return false;
|
||||
}*/
|
||||
|
||||
File outputDir = mContext.getCodeCacheDir();
|
||||
Object proxy;
|
||||
try {
|
||||
proxy = ProxyBuilder.forClass(OnStartTetheringCallbackClass())
|
||||
.dexCache(outputDir).handler(new InvocationHandler() {
|
||||
@Override
|
||||
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
|
||||
switch (method.getName()) {
|
||||
case "onTetheringStarted":
|
||||
callback.onTetheringStarted();
|
||||
break;
|
||||
case "onTetheringFailed":
|
||||
callback.onTetheringFailed();
|
||||
break;
|
||||
default:
|
||||
ProxyBuilder.callSuper(proxy, method, args);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}).build();
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error in enableTethering ProxyBuilder");
|
||||
e.printStackTrace();
|
||||
return false;
|
||||
}
|
||||
|
||||
Method method = null;
|
||||
try {
|
||||
method = mConnectivityManager.getClass().getDeclaredMethod("startTethering", int.class, boolean.class, OnStartTetheringCallbackClass(), Handler.class);
|
||||
if (method == null) {
|
||||
Log.e(TAG, "startTetheringMethod is null");
|
||||
} else {
|
||||
method.invoke(mConnectivityManager, ConnectivityManager.TYPE_MOBILE, false, proxy, null);
|
||||
Log.d(TAG, "startTethering invoked");
|
||||
}
|
||||
return true;
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Error in enableTethering");
|
||||
e.printStackTrace();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public void stopTethering() {
|
||||
try {
|
||||
Method method = mConnectivityManager.getClass().getDeclaredMethod("stopTethering", int.class);
|
||||
if (method == null) {
|
||||
Log.e(TAG, "stopTetheringMethod is null");
|
||||
} else {
|
||||
method.invoke(mConnectivityManager, ConnectivityManager.TYPE_MOBILE);
|
||||
Log.d(TAG, "stopTethering invoked");
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "stopTethering error: " + e.toString());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private Class OnStartTetheringCallbackClass() {
|
||||
try {
|
||||
return Class.forName("android.net.ConnectivityManager$OnStartTetheringCallback");
|
||||
} catch (ClassNotFoundException e) {
|
||||
Log.e(TAG, "OnStartTetheringCallbackClass error: " + e.toString());
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public static abstract class OnStartTetheringCallback {
|
||||
/**
|
||||
* Called when tethering has been successfully started.
|
||||
*/
|
||||
public abstract void onTetheringStarted();
|
||||
|
||||
/**
|
||||
* Called when starting tethering failed.
|
||||
*/
|
||||
public abstract void onTetheringFailed();
|
||||
|
||||
}
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.O)
|
||||
private static void setHotspotOnPhone(Context mContext, boolean isEnable) {
|
||||
|
||||
OreoWifiManager mTestOreoWifiManager = null;
|
||||
|
||||
if (mTestOreoWifiManager ==null) {
|
||||
mTestOreoWifiManager = new OreoWifiManager(mContext);
|
||||
}
|
||||
|
||||
|
||||
if (isEnable){
|
||||
OnStartTetheringCallback callback = new OnStartTetheringCallback() {
|
||||
@Override
|
||||
public void onTetheringStarted() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTetheringFailed() {
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
mTestOreoWifiManager.startTethering(callback);
|
||||
}else{
|
||||
mTestOreoWifiManager.stopTethering();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
public static void setWiFiApEnable(Context context, boolean isEnable) {
|
||||
ConnectivityManager mConnectivityManager= (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
|
||||
if (isEnable) {
|
||||
mConnectivityManager.startTethering(ConnectivityManager.TETHERING_WIFI, false, new ConnectivityManager.OnStartTetheringCallback() {
|
||||
@Override
|
||||
public void onTetheringStarted() {
|
||||
Log.d(TAG, "onTetheringStarted");
|
||||
// Don't fire a callback here, instead wait for the next update from wifi.
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTetheringFailed() {
|
||||
Log.d(TAG, "onTetheringFailed");
|
||||
// TODO: Show error.
|
||||
}
|
||||
});
|
||||
} else {
|
||||
mConnectivityManager.stopTethering(ConnectivityManager.TETHERING_WIFI);
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
public static void enableHotspot(Context context, boolean isEnable) {
|
||||
// R: Adnroid 11
|
||||
// O: Android 8
|
||||
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
// Android 11
|
||||
setHotspotOnPhone(context, isEnable);
|
||||
}/* else if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
// Android 8
|
||||
|
||||
}
|
||||
*/
|
||||
}
|
||||
}
|
@ -0,0 +1 @@
|
||||
{"absHeartbeats":[33420,85808],"heartbeat":10,"mntnMode":0,"mpappMonitorTimeout":1800000,"port":40101,"quickHbMode":0,"quickHeartbeat":60,"separateNetwork":1,"server":"61.169.135.150","timeForKeepingLogs":15,"usingAbsHbTime":1}
|
@ -0,0 +1 @@
|
||||
{"autoExposure":1,"autoFocus":1,"awbMode":1,"cameraType":0,"compensation":0,"customHdr":0,"exposureTime":0,"hdrStep":0,"ldrEnabled":0,"orientation":0,"osd":{"leftTop":"%%DATETIME%% CH:%%CH%%\r\n\u4fe1\u53f7:%%SL%% %%BV%%V"},"quality":80,"recognization":0,"requestTemplate":2,"resolutionCX":5376,"resolutionCY":3024,"sceneMode":0,"sensitivity":0,"usbCamera":0,"usingRawFormat":0,"usingSysCamera":0,"vendor":0,"videoCX":1280,"videoCY":720,"videoDuration":5,"wait3ALocked":0,"zoom":0,"zoomRatio":1}
|
@ -0,0 +1 @@
|
||||
{"autoExposure":1,"autoFocus":1,"awbMode":1,"burstCaptures":4,"cameraType":0,"compensation":0,"customHdr":0,"exposureTime":0,"hdrStep":0,"ldrEnabled":0,"orientation":3,"osd":{"leftTop":"%%DATETIME%% CH:%%CH%%\r\n\u4fe1\u53f7:%%SL%% %%BV%%V"},"quality":80,"recognization":0,"requestTemplate":2,"resolutionCX":1920,"resolutionCY":1080,"sceneMode":0,"sensitivity":0,"usbCamera":0,"usingRawFormat":2,"usingSysCamera":0,"vendor":0,"videoCX":1280,"videoCY":720,"videoDuration":5,"wait3ALocked":0,"zoom":0,"zoomRatio":1}
|
@ -0,0 +1 @@
|
||||
{"autoExposure":1,"autoFocus":1,"awbMode":1,"cameraType":0,"compensation":0,"customHdr":0,"hdrStep":0,"ldrEnabled":0,"orientation":4,"osd":{"leftTop":"%%DATETIME%% CH:%%CH%%\r\n\u4fe1\u53f7:%%SL%% %%BV%%V"},"recognization":0,"requestTemplate":1,"resolutionCX":3264,"resolutionCY":2448,"sceneMode":0,"usbCamera":0,"usingRawFormat":0,"usingSysCamera":0,"vendor":0,"videoCX":1280,"videoCY":720,"videoDuration":5,"wait3ALocked":0}
|
@ -1 +1 @@
|
||||
{"blobName16":"354","blobName32":"366","blobName8":"output","borderColor":16776960,"enabled":1,"items":[{"enabled":1,"iid":0,"name":"\u6316\u6398\u673a","prob":0.5,"subType":5,"type":1},{"enabled":1,"iid":1,"name":"\u540a\u5854","prob":0.5,"subType":2,"type":1},{"enabled":1,"iid":2,"name":"\u540a\u8f66","prob":0.5,"subType":1,"type":1},{"enabled":1,"iid":3,"name":"\u6c34\u6ce5\u6cf5\u8f66","prob":0.5,"subType":4,"type":1},{"enabled":1,"iid":4,"name":"\u5c71\u706b","prob":0.5,"subType":40,"type":4},{"enabled":1,"iid":5,"name":"\u70df\u96fe","prob":0.5,"subType":41,"type":4},{"enabled":1,"iid":6,"name":"\u63a8\u571f\u673a","prob":0.5,"subType":3,"type":1},{"enabled":1,"iid":7,"name":"\u7ffb\u6597\u8f66","prob":0.5,"subType":10,"type":1},{"enabled":1,"iid":8,"name":"\u5bfc\u7ebf\u5f02\u7269","prob":0.5,"subType":1,"type":3},{"enabled":1,"iid":9,"name":"\u9632\u5c18\u7f51","prob":1.0099999904632568,"subType":2,"type":3},{"enabled":1,"iid":10,"name":"\u538b\u8def\u673a","prob":1.0099999904632568,"subType":2,"type":3},{"enabled":1,"iid":11,"name":"\u6405\u62cc\u8f66","prob":1.0099999904632568,"subType":2,"type":3},{"enabled":1,"iid":12,"name":"\u6869\u673a","prob":1.0099999904632568,"subType":2,"type":3},{"enabled":1,"iid":13,"name":"\u56f4\u6321","prob":1.0099999904632568,"subType":2,"type":3},{"enabled":1,"iid":14,"name":"\u6c34\u9a6c","prob":1.0099999904632568,"subType":2,"type":3},{"enabled":1,"iid":15,"name":"\u5b89\u5168\u5e3d","prob":1.0099999904632568,"subType":2,"type":3},{"enabled":1,"iid":16,"name":"\u4e95\u76d6\u7f3a\u5931","prob":1.0099999904632568,"subType":2,"type":3}],"textColor":16776960,"thickness":4}
|
||||
{"blobName16":"354","blobName32":"366","blobName8":"output","borderColor":16776960,"enabled":0,"items":[{"enabled":1,"iid":0,"name":"\u6316\u6398\u673a","prob":0.5,"subType":5,"type":1},{"enabled":1,"iid":1,"name":"\u540a\u5854","prob":0.5,"subType":2,"type":1},{"enabled":1,"iid":2,"name":"\u540a\u8f66","prob":0.5,"subType":1,"type":1},{"enabled":1,"iid":3,"name":"\u6c34\u6ce5\u6cf5\u8f66","prob":0.5,"subType":4,"type":1},{"enabled":1,"iid":4,"name":"\u5c71\u706b","prob":0.5,"subType":40,"type":4},{"enabled":1,"iid":5,"name":"\u70df\u96fe","prob":0.5,"subType":41,"type":4},{"enabled":1,"iid":6,"name":"\u63a8\u571f\u673a","prob":0.5,"subType":3,"type":1},{"enabled":1,"iid":7,"name":"\u7ffb\u6597\u8f66","prob":0.5,"subType":10,"type":1},{"enabled":1,"iid":8,"name":"\u5bfc\u7ebf\u5f02\u7269","prob":0.5,"subType":1,"type":3},{"enabled":1,"iid":9,"name":"\u9632\u5c18\u7f51","prob":1.0099999904632568,"subType":2,"type":3},{"enabled":1,"iid":10,"name":"\u538b\u8def\u673a","prob":1.0099999904632568,"subType":2,"type":3},{"enabled":1,"iid":11,"name":"\u6405\u62cc\u8f66","prob":1.0099999904632568,"subType":2,"type":3},{"enabled":1,"iid":12,"name":"\u6869\u673a","prob":1.0099999904632568,"subType":2,"type":3},{"enabled":1,"iid":13,"name":"\u56f4\u6321","prob":1.0099999904632568,"subType":2,"type":3},{"enabled":1,"iid":14,"name":"\u6c34\u9a6c","prob":1.0099999904632568,"subType":2,"type":3},{"enabled":1,"iid":15,"name":"\u5b89\u5168\u5e3d","prob":1.0099999904632568,"subType":2,"type":3},{"enabled":1,"iid":16,"name":"\u4e95\u76d6\u7f3a\u5931","prob":1.0099999904632568,"subType":2,"type":3}],"textColor":16776960,"thickness":4,"version":"2024-12-30"}
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1 @@
|
||||
{"absHeartbeats":[33420,85808],"heartbeat":10,"mntnMode":0,"mpappMonitorTimeout":1800000,"port":40101,"quickHbMode":0,"quickHeartbeat":60,"separateNetwork":1,"server":"61.169.135.150","timeForKeepingLogs":15,"usingAbsHbTime":1}
|
@ -0,0 +1 @@
|
||||
{"bsManufacturer":"\u4e0a\u6d77\u6b23\u5f71\u7535\u529b\u79d1\u6280\u80a1\u4efd\u6709\u9650\u516c\u53f8","channels":3,"encryption":0,"equipName":"\u56fe\u50cf\u5728\u7ebf\u76d1\u6d4b","heartbeat":10,"imgQuality":80,"model":"MSRDT-1-WP","network":0,"networkProtocol":0,"outputDbgInfo":0,"packetBase":1,"packetSize":32768,"port":6891,"postDataPaused":0,"productionDate":1717200000,"protocol":65298,"quality":80,"reportFault":0,"server":"61.169.135.146","timeForKeepingLogs":1296000,"timeForKeepingPhotos":1296000,"upgradePacketBase":1,"workStatusTimes":3}
|
@ -0,0 +1 @@
|
||||
{"absHeartbeats":[33420,85808],"heartbeat":10,"mntnMode":0,"mpappMonitorTimeout":1800000,"port":40101,"quickHbMode":0,"quickHeartbeat":60,"separateNetwork":1,"server":"61.169.135.150","timeForKeepingLogs":15,"usingAbsHbTime":1}
|
@ -0,0 +1,100 @@
|
||||
[{"v":6015, "c":1},
|
||||
{"v":6283, "c":2},
|
||||
{"v":6442, "c":3},
|
||||
{"v":6553, "c":4},
|
||||
{"v":6641, "c":5},
|
||||
{"v":6708, "c":6},
|
||||
{"v":6735, "c":7},
|
||||
{"v":6742, "c":8},
|
||||
{"v":6746, "c":9},
|
||||
{"v":6751, "c":10},
|
||||
{"v":6757, "c":11},
|
||||
{"v":6765, "c":12},
|
||||
{"v":6774, "c":13},
|
||||
{"v":6785, "c":14},
|
||||
{"v":6797, "c":15},
|
||||
{"v":6811, "c":16},
|
||||
{"v":6822, "c":17},
|
||||
{"v":6833, "c":18},
|
||||
{"v":6844, "c":19},
|
||||
{"v":6853, "c":20},
|
||||
{"v":6863, "c":21},
|
||||
{"v":6871, "c":22},
|
||||
{"v":6878, "c":23},
|
||||
{"v":6883, "c":24},
|
||||
{"v":6891, "c":25},
|
||||
{"v":6896, "c":26},
|
||||
{"v":6897, "c":27},
|
||||
{"v":6901, "c":28},
|
||||
{"v":6903, "c":29},
|
||||
{"v":6904, "c":30},
|
||||
{"v":6906, "c":31},
|
||||
{"v":6907, "c":32},
|
||||
{"v":6908, "c":33},
|
||||
{"v":6910, "c":34},
|
||||
{"v":6911, "c":35},
|
||||
{"v":6911, "c":36},
|
||||
{"v":6913, "c":37},
|
||||
{"v":6914, "c":38},
|
||||
{"v":6914, "c":39},
|
||||
{"v":6915, "c":40},
|
||||
{"v":6917, "c":41},
|
||||
{"v":6918, "c":42},
|
||||
{"v":6918, "c":43},
|
||||
{"v":6921, "c":44},
|
||||
{"v":6922, "c":45},
|
||||
{"v":6924, "c":46},
|
||||
{"v":6926, "c":47},
|
||||
{"v":6927, "c":48},
|
||||
{"v":6929, "c":49},
|
||||
{"v":6931, "c":50},
|
||||
{"v":6934, "c":51},
|
||||
{"v":6938, "c":52},
|
||||
{"v":6941, "c":53},
|
||||
{"v":6946, "c":54},
|
||||
{"v":6948, "c":55},
|
||||
{"v":6952, "c":56},
|
||||
{"v":6954, "c":57},
|
||||
{"v":6957, "c":58},
|
||||
{"v":6959, "c":59},
|
||||
{"v":6961, "c":60},
|
||||
{"v":6963, "c":61},
|
||||
{"v":6965, "c":62},
|
||||
{"v":6967, "c":63},
|
||||
{"v":6971, "c":64},
|
||||
{"v":6973, "c":65},
|
||||
{"v":6976, "c":66},
|
||||
{"v":6978, "c":67},
|
||||
{"v":6980, "c":68},
|
||||
{"v":6982, "c":69},
|
||||
{"v":6984, "c":70},
|
||||
{"v":6986, "c":71},
|
||||
{"v":6988, "c":72},
|
||||
{"v":6989, "c":73},
|
||||
{"v":6991, "c":74},
|
||||
{"v":6992, "c":75},
|
||||
{"v":6993, "c":76},
|
||||
{"v":6995, "c":77},
|
||||
{"v":6997, "c":78},
|
||||
{"v":6998, "c":79},
|
||||
{"v":7000, "c":80},
|
||||
{"v":7003, "c":81},
|
||||
{"v":7004, "c":82},
|
||||
{"v":7006, "c":83},
|
||||
{"v":7008, "c":84},
|
||||
{"v":7011, "c":85},
|
||||
{"v":7014, "c":86},
|
||||
{"v":7018, "c":87},
|
||||
{"v":7021, "c":88},
|
||||
{"v":7024, "c":89},
|
||||
{"v":7029, "c":90},
|
||||
{"v":7033, "c":91},
|
||||
{"v":7039, "c":92},
|
||||
{"v":7044, "c":93},
|
||||
{"v":7052, "c":94},
|
||||
{"v":7062, "c":95},
|
||||
{"v":7073, "c":96},
|
||||
{"v":7087, "c":97},
|
||||
{"v":7104, "c":98},
|
||||
{"v":7122, "c":99},
|
||||
{"v":7142, "c":100}]
|
@ -0,0 +1 @@
|
||||
{"autoExposure":1,"autoFocus":1,"awbMode":1,"cameraType":0,"compensation":0,"customHdr":0,"exposureTime":0,"hdrStep":0,"ldrEnabled":0,"orientation":0,"osd":{"leftTop":"%%DATETIME%% CH:%%CH%%\r\n\u4fe1\u53f7:%%SL%% %%BV%%V"},"quality":80,"recognization":0,"requestTemplate":2,"resolutionCX":5376,"resolutionCY":3024,"sceneMode":0,"sensitivity":0,"usbCamera":0,"usingRawFormat":0,"usingSysCamera":0,"vendor":0,"videoCX":1280,"videoCY":720,"videoDuration":5,"wait3ALocked":0,"zoom":0,"zoomRatio":1}
|
@ -0,0 +1 @@
|
||||
{"autoExposure":1,"autoFocus":1,"awbMode":1,"burstCaptures":4,"cameraType":0,"compensation":0,"customHdr":0,"exposureTime":0,"hdrStep":0,"ldrEnabled":0,"orientation":3,"osd":{"leftTop":"%%DATETIME%% CH:%%CH%%\r\n\u4fe1\u53f7:%%SL%% %%BV%%V"},"quality":80,"recognization":0,"requestTemplate":2,"resolutionCX":1920,"resolutionCY":1080,"sceneMode":0,"sensitivity":0,"usbCamera":0,"usingRawFormat":2,"usingSysCamera":0,"vendor":0,"videoCX":1280,"videoCY":720,"videoDuration":5,"wait3ALocked":0,"zoom":0,"zoomRatio":1}
|
@ -0,0 +1 @@
|
||||
{"autoExposure":1,"autoFocus":1,"awbMode":1,"cameraType":0,"compensation":0,"customHdr":0,"hdrStep":0,"ldrEnabled":0,"orientation":4,"osd":{"leftTop":"%%DATETIME%% CH:%%CH%%\r\n\u4fe1\u53f7:%%SL%% %%BV%%V"},"recognization":0,"requestTemplate":1,"resolutionCX":3264,"resolutionCY":2448,"sceneMode":0,"usbCamera":0,"usingRawFormat":0,"usingSysCamera":0,"vendor":0,"videoCX":1280,"videoCY":720,"videoDuration":5,"wait3ALocked":0}
|
@ -0,0 +1 @@
|
||||
{"blobName16":"354","blobName32":"366","blobName8":"output","borderColor":16776960,"enabled":0,"items":[{"enabled":1,"iid":0,"name":"\u6316\u6398\u673a","prob":0.5,"subType":5,"type":1},{"enabled":1,"iid":1,"name":"\u540a\u5854","prob":0.5,"subType":2,"type":1},{"enabled":1,"iid":2,"name":"\u540a\u8f66","prob":0.5,"subType":1,"type":1},{"enabled":1,"iid":3,"name":"\u6c34\u6ce5\u6cf5\u8f66","prob":0.5,"subType":4,"type":1},{"enabled":1,"iid":4,"name":"\u5c71\u706b","prob":0.5,"subType":40,"type":4},{"enabled":1,"iid":5,"name":"\u70df\u96fe","prob":0.5,"subType":41,"type":4},{"enabled":1,"iid":6,"name":"\u63a8\u571f\u673a","prob":0.5,"subType":3,"type":1},{"enabled":1,"iid":7,"name":"\u7ffb\u6597\u8f66","prob":0.5,"subType":10,"type":1},{"enabled":1,"iid":8,"name":"\u5bfc\u7ebf\u5f02\u7269","prob":0.5,"subType":1,"type":3},{"enabled":1,"iid":9,"name":"\u9632\u5c18\u7f51","prob":1.0099999904632568,"subType":2,"type":3},{"enabled":1,"iid":10,"name":"\u538b\u8def\u673a","prob":1.0099999904632568,"subType":2,"type":3},{"enabled":1,"iid":11,"name":"\u6405\u62cc\u8f66","prob":1.0099999904632568,"subType":2,"type":3},{"enabled":1,"iid":12,"name":"\u6869\u673a","prob":1.0099999904632568,"subType":2,"type":3},{"enabled":1,"iid":13,"name":"\u56f4\u6321","prob":1.0099999904632568,"subType":2,"type":3},{"enabled":1,"iid":14,"name":"\u6c34\u9a6c","prob":1.0099999904632568,"subType":2,"type":3},{"enabled":1,"iid":15,"name":"\u5b89\u5168\u5e3d","prob":1.0099999904632568,"subType":2,"type":3},{"enabled":1,"iid":16,"name":"\u4e95\u76d6\u7f3a\u5931","prob":1.0099999904632568,"subType":2,"type":3}],"textColor":16776960,"thickness":4,"version":"2024-12-30"}
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1 @@
|
||||
{"absHeartbeats":[33420,85808],"heartbeat":10,"mntnMode":0,"mpappMonitorTimeout":1800000,"port":40101,"quickHbMode":0,"quickHeartbeat":60,"separateNetwork":1,"server":"61.169.135.150","timeForKeepingLogs":15,"usingAbsHbTime":1}
|
@ -1 +0,0 @@
|
||||
{"autoExposure":1,"autoFocus":1,"awbMode":1,"compensation":0,"exposureTime":0,"ldrEnabled":0,"orientation":0,"osd":{"leftTop":"%%DATETIME%% CH:%%CH%% \u7248\u672c:%%V%%\r\n\u4fe1\u53f7:%%SL%% \u7535\u6c60\u7535\u538b:%%BV%% \u7535\u6c60\u7535\u91cf:%%BP%% \u5145\u7535\u7535\u538b:%%CV%%"},"quality":80,"recognization":2,"requestTemplate":2,"resolutionCX":5376,"resolutionCY":3024,"sceneMode":0,"sensitivity":0,"usbCamera":0,"usingRawFormat":0,"usingSysCamera":0,"videoCX":1280,"videoCY":720,"videoDuration":5,"wait3ALocked":0,"zoom":0,"zoomRatio":1}
|
@ -1 +0,0 @@
|
||||
{"autoExposure":1,"autoFocus":1,"awbMode":1,"burstCaptures":4,"compensation":0,"exposureTime":0,"ldrEnabled":0,"orientation":3,"osd":{"leftTop":"%%DATETIME%% CH:%%CH%% \u7248\u672c:%%V%%\r\n\u4fe1\u53f7:%%SL%% \u7535\u6c60\u7535\u538b:%%BV%% \u7535\u6c60\u7535\u91cf:%%BP%% \u5145\u7535\u7535\u538b:%%CV%%"},"quality":80,"recognization":2,"requestTemplate":2,"resolutionCX":1920,"resolutionCY":1080,"sceneMode":0,"sensitivity":0,"usbCamera":0,"usingRawFormat":2,"usingSysCamera":0,"videoCX":1280,"videoCY":720,"videoDuration":5,"wait3ALocked":0,"zoom":0,"zoomRatio":1}
|
@ -1 +0,0 @@
|
||||
{"autoExposure":1,"autoFocus":1,"awbMode":1,"compensation":0,"ldrEnabled":0,"orientation":4,"osd":{"leftTop":"%%DATETIME%% CH:%%CH%% \u7248\u672c:%%V%%\r\n\u4fe1\u53f7:%%SL%% \u7535\u6c60\u7535\u538b:%%BV%% \u7535\u6c60\u7535\u91cf:%%BP%% \u5145\u7535\u7535\u538b:%%CV%%"},"recognization":2,"requestTemplate":1,"resolutionCX":3264,"resolutionCY":2448,"sceneMode":0,"usbCamera":0,"usingRawFormat":0,"usingSysCamera":0,"videoCX":1280,"videoCY":720,"videoDuration":5,"wait3ALocked":0}
|
Binary file not shown.
@ -1,175 +0,0 @@
|
||||
7767517
|
||||
173 197
|
||||
Input images 0 1 images
|
||||
Convolution /model.0/conv/Conv 1 1 images /model.0/conv/Conv_output_0 0=32 1=6 11=6 2=1 12=1 3=2 13=2 4=2 14=2 15=2 16=2 5=1 6=3456
|
||||
Swish /model.0/act/Mul 1 1 /model.0/conv/Conv_output_0 /model.0/act/Mul_output_0
|
||||
Convolution /model.1/conv/Conv 1 1 /model.0/act/Mul_output_0 /model.1/conv/Conv_output_0 0=64 1=3 11=3 2=1 12=1 3=2 13=2 4=1 14=1 15=1 16=1 5=1 6=18432
|
||||
Swish /model.1/act/Mul 1 1 /model.1/conv/Conv_output_0 /model.1/act/Mul_output_0
|
||||
Split splitncnn_0 1 2 /model.1/act/Mul_output_0 /model.1/act/Mul_output_0_splitncnn_0 /model.1/act/Mul_output_0_splitncnn_1
|
||||
Convolution /model.2/cv1/conv/Conv 1 1 /model.1/act/Mul_output_0_splitncnn_1 /model.2/cv1/conv/Conv_output_0 0=32 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=2048
|
||||
Swish /model.2/cv1/act/Mul 1 1 /model.2/cv1/conv/Conv_output_0 /model.2/cv1/act/Mul_output_0
|
||||
Split splitncnn_1 1 2 /model.2/cv1/act/Mul_output_0 /model.2/cv1/act/Mul_output_0_splitncnn_0 /model.2/cv1/act/Mul_output_0_splitncnn_1
|
||||
Convolution /model.2/m/m.0/cv1/conv/Conv 1 1 /model.2/cv1/act/Mul_output_0_splitncnn_1 /model.2/m/m.0/cv1/conv/Conv_output_0 0=32 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=1024
|
||||
Swish /model.2/m/m.0/cv1/act/Mul 1 1 /model.2/m/m.0/cv1/conv/Conv_output_0 /model.2/m/m.0/cv1/act/Mul_output_0
|
||||
Convolution /model.2/m/m.0/cv2/conv/Conv 1 1 /model.2/m/m.0/cv1/act/Mul_output_0 /model.2/m/m.0/cv2/conv/Conv_output_0 0=32 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=9216
|
||||
Swish /model.2/m/m.0/cv2/act/Mul 1 1 /model.2/m/m.0/cv2/conv/Conv_output_0 /model.2/m/m.0/cv2/act/Mul_output_0
|
||||
BinaryOp /model.2/m/m.0/Add 2 1 /model.2/cv1/act/Mul_output_0_splitncnn_0 /model.2/m/m.0/cv2/act/Mul_output_0 /model.2/m/m.0/Add_output_0 0=0
|
||||
Convolution /model.2/cv2/conv/Conv 1 1 /model.1/act/Mul_output_0_splitncnn_0 /model.2/cv2/conv/Conv_output_0 0=32 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=2048
|
||||
Swish /model.2/cv2/act/Mul 1 1 /model.2/cv2/conv/Conv_output_0 /model.2/cv2/act/Mul_output_0
|
||||
Concat /model.2/Concat 2 1 /model.2/m/m.0/Add_output_0 /model.2/cv2/act/Mul_output_0 /model.2/Concat_output_0 0=0
|
||||
Convolution /model.2/cv3/conv/Conv 1 1 /model.2/Concat_output_0 /model.2/cv3/conv/Conv_output_0 0=64 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=4096
|
||||
Swish /model.2/cv3/act/Mul 1 1 /model.2/cv3/conv/Conv_output_0 /model.2/cv3/act/Mul_output_0
|
||||
Convolution /model.3/conv/Conv 1 1 /model.2/cv3/act/Mul_output_0 /model.3/conv/Conv_output_0 0=128 1=3 11=3 2=1 12=1 3=2 13=2 4=1 14=1 15=1 16=1 5=1 6=73728
|
||||
Swish /model.3/act/Mul 1 1 /model.3/conv/Conv_output_0 /model.3/act/Mul_output_0
|
||||
Split splitncnn_2 1 2 /model.3/act/Mul_output_0 /model.3/act/Mul_output_0_splitncnn_0 /model.3/act/Mul_output_0_splitncnn_1
|
||||
Convolution /model.4/cv1/conv/Conv 1 1 /model.3/act/Mul_output_0_splitncnn_1 /model.4/cv1/conv/Conv_output_0 0=64 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=8192
|
||||
Swish /model.4/cv1/act/Mul 1 1 /model.4/cv1/conv/Conv_output_0 /model.4/cv1/act/Mul_output_0
|
||||
Split splitncnn_3 1 2 /model.4/cv1/act/Mul_output_0 /model.4/cv1/act/Mul_output_0_splitncnn_0 /model.4/cv1/act/Mul_output_0_splitncnn_1
|
||||
Convolution /model.4/m/m.0/cv1/conv/Conv 1 1 /model.4/cv1/act/Mul_output_0_splitncnn_1 /model.4/m/m.0/cv1/conv/Conv_output_0 0=64 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=4096
|
||||
Swish /model.4/m/m.0/cv1/act/Mul 1 1 /model.4/m/m.0/cv1/conv/Conv_output_0 /model.4/m/m.0/cv1/act/Mul_output_0
|
||||
Convolution /model.4/m/m.0/cv2/conv/Conv 1 1 /model.4/m/m.0/cv1/act/Mul_output_0 /model.4/m/m.0/cv2/conv/Conv_output_0 0=64 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=36864
|
||||
Swish /model.4/m/m.0/cv2/act/Mul 1 1 /model.4/m/m.0/cv2/conv/Conv_output_0 /model.4/m/m.0/cv2/act/Mul_output_0
|
||||
BinaryOp /model.4/m/m.0/Add 2 1 /model.4/cv1/act/Mul_output_0_splitncnn_0 /model.4/m/m.0/cv2/act/Mul_output_0 /model.4/m/m.0/Add_output_0 0=0
|
||||
Split splitncnn_4 1 2 /model.4/m/m.0/Add_output_0 /model.4/m/m.0/Add_output_0_splitncnn_0 /model.4/m/m.0/Add_output_0_splitncnn_1
|
||||
Convolution /model.4/m/m.1/cv1/conv/Conv 1 1 /model.4/m/m.0/Add_output_0_splitncnn_1 /model.4/m/m.1/cv1/conv/Conv_output_0 0=64 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=4096
|
||||
Swish /model.4/m/m.1/cv1/act/Mul 1 1 /model.4/m/m.1/cv1/conv/Conv_output_0 /model.4/m/m.1/cv1/act/Mul_output_0
|
||||
Convolution /model.4/m/m.1/cv2/conv/Conv 1 1 /model.4/m/m.1/cv1/act/Mul_output_0 /model.4/m/m.1/cv2/conv/Conv_output_0 0=64 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=36864
|
||||
Swish /model.4/m/m.1/cv2/act/Mul 1 1 /model.4/m/m.1/cv2/conv/Conv_output_0 /model.4/m/m.1/cv2/act/Mul_output_0
|
||||
BinaryOp /model.4/m/m.1/Add 2 1 /model.4/m/m.0/Add_output_0_splitncnn_0 /model.4/m/m.1/cv2/act/Mul_output_0 /model.4/m/m.1/Add_output_0 0=0
|
||||
Convolution /model.4/cv2/conv/Conv 1 1 /model.3/act/Mul_output_0_splitncnn_0 /model.4/cv2/conv/Conv_output_0 0=64 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=8192
|
||||
Swish /model.4/cv2/act/Mul 1 1 /model.4/cv2/conv/Conv_output_0 /model.4/cv2/act/Mul_output_0
|
||||
Concat /model.4/Concat 2 1 /model.4/m/m.1/Add_output_0 /model.4/cv2/act/Mul_output_0 /model.4/Concat_output_0 0=0
|
||||
Convolution /model.4/cv3/conv/Conv 1 1 /model.4/Concat_output_0 /model.4/cv3/conv/Conv_output_0 0=128 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=16384
|
||||
Swish /model.4/cv3/act/Mul 1 1 /model.4/cv3/conv/Conv_output_0 /model.4/cv3/act/Mul_output_0
|
||||
Split splitncnn_5 1 2 /model.4/cv3/act/Mul_output_0 /model.4/cv3/act/Mul_output_0_splitncnn_0 /model.4/cv3/act/Mul_output_0_splitncnn_1
|
||||
Convolution /model.5/conv/Conv 1 1 /model.4/cv3/act/Mul_output_0_splitncnn_1 /model.5/conv/Conv_output_0 0=256 1=3 11=3 2=1 12=1 3=2 13=2 4=1 14=1 15=1 16=1 5=1 6=294912
|
||||
Swish /model.5/act/Mul 1 1 /model.5/conv/Conv_output_0 /model.5/act/Mul_output_0
|
||||
Split splitncnn_6 1 2 /model.5/act/Mul_output_0 /model.5/act/Mul_output_0_splitncnn_0 /model.5/act/Mul_output_0_splitncnn_1
|
||||
Convolution /model.6/cv1/conv/Conv 1 1 /model.5/act/Mul_output_0_splitncnn_1 /model.6/cv1/conv/Conv_output_0 0=128 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=32768
|
||||
Swish /model.6/cv1/act/Mul 1 1 /model.6/cv1/conv/Conv_output_0 /model.6/cv1/act/Mul_output_0
|
||||
Split splitncnn_7 1 2 /model.6/cv1/act/Mul_output_0 /model.6/cv1/act/Mul_output_0_splitncnn_0 /model.6/cv1/act/Mul_output_0_splitncnn_1
|
||||
Convolution /model.6/m/m.0/cv1/conv/Conv 1 1 /model.6/cv1/act/Mul_output_0_splitncnn_1 /model.6/m/m.0/cv1/conv/Conv_output_0 0=128 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=16384
|
||||
Swish /model.6/m/m.0/cv1/act/Mul 1 1 /model.6/m/m.0/cv1/conv/Conv_output_0 /model.6/m/m.0/cv1/act/Mul_output_0
|
||||
Convolution /model.6/m/m.0/cv2/conv/Conv 1 1 /model.6/m/m.0/cv1/act/Mul_output_0 /model.6/m/m.0/cv2/conv/Conv_output_0 0=128 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=147456
|
||||
Swish /model.6/m/m.0/cv2/act/Mul 1 1 /model.6/m/m.0/cv2/conv/Conv_output_0 /model.6/m/m.0/cv2/act/Mul_output_0
|
||||
BinaryOp /model.6/m/m.0/Add 2 1 /model.6/cv1/act/Mul_output_0_splitncnn_0 /model.6/m/m.0/cv2/act/Mul_output_0 /model.6/m/m.0/Add_output_0 0=0
|
||||
Split splitncnn_8 1 2 /model.6/m/m.0/Add_output_0 /model.6/m/m.0/Add_output_0_splitncnn_0 /model.6/m/m.0/Add_output_0_splitncnn_1
|
||||
Convolution /model.6/m/m.1/cv1/conv/Conv 1 1 /model.6/m/m.0/Add_output_0_splitncnn_1 /model.6/m/m.1/cv1/conv/Conv_output_0 0=128 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=16384
|
||||
Swish /model.6/m/m.1/cv1/act/Mul 1 1 /model.6/m/m.1/cv1/conv/Conv_output_0 /model.6/m/m.1/cv1/act/Mul_output_0
|
||||
Convolution /model.6/m/m.1/cv2/conv/Conv 1 1 /model.6/m/m.1/cv1/act/Mul_output_0 /model.6/m/m.1/cv2/conv/Conv_output_0 0=128 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=147456
|
||||
Swish /model.6/m/m.1/cv2/act/Mul 1 1 /model.6/m/m.1/cv2/conv/Conv_output_0 /model.6/m/m.1/cv2/act/Mul_output_0
|
||||
BinaryOp /model.6/m/m.1/Add 2 1 /model.6/m/m.0/Add_output_0_splitncnn_0 /model.6/m/m.1/cv2/act/Mul_output_0 /model.6/m/m.1/Add_output_0 0=0
|
||||
Split splitncnn_9 1 2 /model.6/m/m.1/Add_output_0 /model.6/m/m.1/Add_output_0_splitncnn_0 /model.6/m/m.1/Add_output_0_splitncnn_1
|
||||
Convolution /model.6/m/m.2/cv1/conv/Conv 1 1 /model.6/m/m.1/Add_output_0_splitncnn_1 /model.6/m/m.2/cv1/conv/Conv_output_0 0=128 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=16384
|
||||
Swish /model.6/m/m.2/cv1/act/Mul 1 1 /model.6/m/m.2/cv1/conv/Conv_output_0 /model.6/m/m.2/cv1/act/Mul_output_0
|
||||
Convolution /model.6/m/m.2/cv2/conv/Conv 1 1 /model.6/m/m.2/cv1/act/Mul_output_0 /model.6/m/m.2/cv2/conv/Conv_output_0 0=128 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=147456
|
||||
Swish /model.6/m/m.2/cv2/act/Mul 1 1 /model.6/m/m.2/cv2/conv/Conv_output_0 /model.6/m/m.2/cv2/act/Mul_output_0
|
||||
BinaryOp /model.6/m/m.2/Add 2 1 /model.6/m/m.1/Add_output_0_splitncnn_0 /model.6/m/m.2/cv2/act/Mul_output_0 /model.6/m/m.2/Add_output_0 0=0
|
||||
Convolution /model.6/cv2/conv/Conv 1 1 /model.5/act/Mul_output_0_splitncnn_0 /model.6/cv2/conv/Conv_output_0 0=128 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=32768
|
||||
Swish /model.6/cv2/act/Mul 1 1 /model.6/cv2/conv/Conv_output_0 /model.6/cv2/act/Mul_output_0
|
||||
Concat /model.6/Concat 2 1 /model.6/m/m.2/Add_output_0 /model.6/cv2/act/Mul_output_0 /model.6/Concat_output_0 0=0
|
||||
Convolution /model.6/cv3/conv/Conv 1 1 /model.6/Concat_output_0 /model.6/cv3/conv/Conv_output_0 0=256 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=65536
|
||||
Swish /model.6/cv3/act/Mul 1 1 /model.6/cv3/conv/Conv_output_0 /model.6/cv3/act/Mul_output_0
|
||||
Split splitncnn_10 1 2 /model.6/cv3/act/Mul_output_0 /model.6/cv3/act/Mul_output_0_splitncnn_0 /model.6/cv3/act/Mul_output_0_splitncnn_1
|
||||
Convolution /model.7/conv/Conv 1 1 /model.6/cv3/act/Mul_output_0_splitncnn_1 /model.7/conv/Conv_output_0 0=512 1=3 11=3 2=1 12=1 3=2 13=2 4=1 14=1 15=1 16=1 5=1 6=1179648
|
||||
Swish /model.7/act/Mul 1 1 /model.7/conv/Conv_output_0 /model.7/act/Mul_output_0
|
||||
Split splitncnn_11 1 2 /model.7/act/Mul_output_0 /model.7/act/Mul_output_0_splitncnn_0 /model.7/act/Mul_output_0_splitncnn_1
|
||||
Convolution /model.8/cv1/conv/Conv 1 1 /model.7/act/Mul_output_0_splitncnn_1 /model.8/cv1/conv/Conv_output_0 0=256 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=131072
|
||||
Swish /model.8/cv1/act/Mul 1 1 /model.8/cv1/conv/Conv_output_0 /model.8/cv1/act/Mul_output_0
|
||||
Split splitncnn_12 1 2 /model.8/cv1/act/Mul_output_0 /model.8/cv1/act/Mul_output_0_splitncnn_0 /model.8/cv1/act/Mul_output_0_splitncnn_1
|
||||
Convolution /model.8/m/m.0/cv1/conv/Conv 1 1 /model.8/cv1/act/Mul_output_0_splitncnn_1 /model.8/m/m.0/cv1/conv/Conv_output_0 0=256 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=65536
|
||||
Swish /model.8/m/m.0/cv1/act/Mul 1 1 /model.8/m/m.0/cv1/conv/Conv_output_0 /model.8/m/m.0/cv1/act/Mul_output_0
|
||||
Convolution /model.8/m/m.0/cv2/conv/Conv 1 1 /model.8/m/m.0/cv1/act/Mul_output_0 /model.8/m/m.0/cv2/conv/Conv_output_0 0=256 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=589824
|
||||
Swish /model.8/m/m.0/cv2/act/Mul 1 1 /model.8/m/m.0/cv2/conv/Conv_output_0 /model.8/m/m.0/cv2/act/Mul_output_0
|
||||
BinaryOp /model.8/m/m.0/Add 2 1 /model.8/cv1/act/Mul_output_0_splitncnn_0 /model.8/m/m.0/cv2/act/Mul_output_0 /model.8/m/m.0/Add_output_0 0=0
|
||||
Convolution /model.8/cv2/conv/Conv 1 1 /model.7/act/Mul_output_0_splitncnn_0 /model.8/cv2/conv/Conv_output_0 0=256 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=131072
|
||||
Swish /model.8/cv2/act/Mul 1 1 /model.8/cv2/conv/Conv_output_0 /model.8/cv2/act/Mul_output_0
|
||||
Concat /model.8/Concat 2 1 /model.8/m/m.0/Add_output_0 /model.8/cv2/act/Mul_output_0 /model.8/Concat_output_0 0=0
|
||||
Convolution /model.8/cv3/conv/Conv 1 1 /model.8/Concat_output_0 /model.8/cv3/conv/Conv_output_0 0=512 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=262144
|
||||
Swish /model.8/cv3/act/Mul 1 1 /model.8/cv3/conv/Conv_output_0 /model.8/cv3/act/Mul_output_0
|
||||
Convolution /model.9/cv1/conv/Conv 1 1 /model.8/cv3/act/Mul_output_0 /model.9/cv1/conv/Conv_output_0 0=256 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=131072
|
||||
Swish /model.9/cv1/act/Mul 1 1 /model.9/cv1/conv/Conv_output_0 /model.9/cv1/act/Mul_output_0
|
||||
Split splitncnn_13 1 2 /model.9/cv1/act/Mul_output_0 /model.9/cv1/act/Mul_output_0_splitncnn_0 /model.9/cv1/act/Mul_output_0_splitncnn_1
|
||||
Pooling /model.9/m/MaxPool 1 1 /model.9/cv1/act/Mul_output_0_splitncnn_1 /model.9/m/MaxPool_output_0 0=0 1=5 11=5 2=1 12=1 3=2 13=2 14=2 15=2 5=1
|
||||
Split splitncnn_14 1 2 /model.9/m/MaxPool_output_0 /model.9/m/MaxPool_output_0_splitncnn_0 /model.9/m/MaxPool_output_0_splitncnn_1
|
||||
Pooling /model.9/m_1/MaxPool 1 1 /model.9/m/MaxPool_output_0_splitncnn_1 /model.9/m_1/MaxPool_output_0 0=0 1=5 11=5 2=1 12=1 3=2 13=2 14=2 15=2 5=1
|
||||
Split splitncnn_15 1 2 /model.9/m_1/MaxPool_output_0 /model.9/m_1/MaxPool_output_0_splitncnn_0 /model.9/m_1/MaxPool_output_0_splitncnn_1
|
||||
Pooling /model.9/m_2/MaxPool 1 1 /model.9/m_1/MaxPool_output_0_splitncnn_1 /model.9/m_2/MaxPool_output_0 0=0 1=5 11=5 2=1 12=1 3=2 13=2 14=2 15=2 5=1
|
||||
Concat /model.9/Concat 4 1 /model.9/cv1/act/Mul_output_0_splitncnn_0 /model.9/m/MaxPool_output_0_splitncnn_0 /model.9/m_1/MaxPool_output_0_splitncnn_0 /model.9/m_2/MaxPool_output_0 /model.9/Concat_output_0 0=0
|
||||
Convolution /model.9/cv2/conv/Conv 1 1 /model.9/Concat_output_0 /model.9/cv2/conv/Conv_output_0 0=512 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=524288
|
||||
Swish /model.9/cv2/act/Mul 1 1 /model.9/cv2/conv/Conv_output_0 /model.9/cv2/act/Mul_output_0
|
||||
Convolution /model.10/conv/Conv 1 1 /model.9/cv2/act/Mul_output_0 /model.10/conv/Conv_output_0 0=256 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=131072
|
||||
Swish /model.10/act/Mul 1 1 /model.10/conv/Conv_output_0 /model.10/act/Mul_output_0
|
||||
Split splitncnn_16 1 2 /model.10/act/Mul_output_0 /model.10/act/Mul_output_0_splitncnn_0 /model.10/act/Mul_output_0_splitncnn_1
|
||||
Interp /model.11/Resize 1 1 /model.10/act/Mul_output_0_splitncnn_1 /model.11/Resize_output_0 0=1 1=2.000000e+00 2=2.000000e+00 3=0 4=0 6=0
|
||||
Concat /model.12/Concat 2 1 /model.11/Resize_output_0 /model.6/cv3/act/Mul_output_0_splitncnn_0 /model.12/Concat_output_0 0=0
|
||||
Split splitncnn_17 1 2 /model.12/Concat_output_0 /model.12/Concat_output_0_splitncnn_0 /model.12/Concat_output_0_splitncnn_1
|
||||
Convolution /model.13/cv1/conv/Conv 1 1 /model.12/Concat_output_0_splitncnn_1 /model.13/cv1/conv/Conv_output_0 0=128 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=65536
|
||||
Swish /model.13/cv1/act/Mul 1 1 /model.13/cv1/conv/Conv_output_0 /model.13/cv1/act/Mul_output_0
|
||||
Convolution /model.13/m/m.0/cv1/conv/Conv 1 1 /model.13/cv1/act/Mul_output_0 /model.13/m/m.0/cv1/conv/Conv_output_0 0=128 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=16384
|
||||
Swish /model.13/m/m.0/cv1/act/Mul 1 1 /model.13/m/m.0/cv1/conv/Conv_output_0 /model.13/m/m.0/cv1/act/Mul_output_0
|
||||
Convolution /model.13/m/m.0/cv2/conv/Conv 1 1 /model.13/m/m.0/cv1/act/Mul_output_0 /model.13/m/m.0/cv2/conv/Conv_output_0 0=128 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=147456
|
||||
Swish /model.13/m/m.0/cv2/act/Mul 1 1 /model.13/m/m.0/cv2/conv/Conv_output_0 /model.13/m/m.0/cv2/act/Mul_output_0
|
||||
Convolution /model.13/cv2/conv/Conv 1 1 /model.12/Concat_output_0_splitncnn_0 /model.13/cv2/conv/Conv_output_0 0=128 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=65536
|
||||
Swish /model.13/cv2/act/Mul 1 1 /model.13/cv2/conv/Conv_output_0 /model.13/cv2/act/Mul_output_0
|
||||
Concat /model.13/Concat 2 1 /model.13/m/m.0/cv2/act/Mul_output_0 /model.13/cv2/act/Mul_output_0 /model.13/Concat_output_0 0=0
|
||||
Convolution /model.13/cv3/conv/Conv 1 1 /model.13/Concat_output_0 /model.13/cv3/conv/Conv_output_0 0=256 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=65536
|
||||
Swish /model.13/cv3/act/Mul 1 1 /model.13/cv3/conv/Conv_output_0 /model.13/cv3/act/Mul_output_0
|
||||
Convolution /model.14/conv/Conv 1 1 /model.13/cv3/act/Mul_output_0 /model.14/conv/Conv_output_0 0=128 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=32768
|
||||
Swish /model.14/act/Mul 1 1 /model.14/conv/Conv_output_0 /model.14/act/Mul_output_0
|
||||
Split splitncnn_18 1 2 /model.14/act/Mul_output_0 /model.14/act/Mul_output_0_splitncnn_0 /model.14/act/Mul_output_0_splitncnn_1
|
||||
Interp /model.15/Resize 1 1 /model.14/act/Mul_output_0_splitncnn_1 /model.15/Resize_output_0 0=1 1=2.000000e+00 2=2.000000e+00 3=0 4=0 6=0
|
||||
Concat /model.16/Concat 2 1 /model.15/Resize_output_0 /model.4/cv3/act/Mul_output_0_splitncnn_0 /model.16/Concat_output_0 0=0
|
||||
Split splitncnn_19 1 2 /model.16/Concat_output_0 /model.16/Concat_output_0_splitncnn_0 /model.16/Concat_output_0_splitncnn_1
|
||||
Convolution /model.17/cv1/conv/Conv 1 1 /model.16/Concat_output_0_splitncnn_1 /model.17/cv1/conv/Conv_output_0 0=64 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=16384
|
||||
Swish /model.17/cv1/act/Mul 1 1 /model.17/cv1/conv/Conv_output_0 /model.17/cv1/act/Mul_output_0
|
||||
Convolution /model.17/m/m.0/cv1/conv/Conv 1 1 /model.17/cv1/act/Mul_output_0 /model.17/m/m.0/cv1/conv/Conv_output_0 0=64 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=4096
|
||||
Swish /model.17/m/m.0/cv1/act/Mul 1 1 /model.17/m/m.0/cv1/conv/Conv_output_0 /model.17/m/m.0/cv1/act/Mul_output_0
|
||||
Convolution /model.17/m/m.0/cv2/conv/Conv 1 1 /model.17/m/m.0/cv1/act/Mul_output_0 /model.17/m/m.0/cv2/conv/Conv_output_0 0=64 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=36864
|
||||
Swish /model.17/m/m.0/cv2/act/Mul 1 1 /model.17/m/m.0/cv2/conv/Conv_output_0 /model.17/m/m.0/cv2/act/Mul_output_0
|
||||
Convolution /model.17/cv2/conv/Conv 1 1 /model.16/Concat_output_0_splitncnn_0 /model.17/cv2/conv/Conv_output_0 0=64 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=16384
|
||||
Swish /model.17/cv2/act/Mul 1 1 /model.17/cv2/conv/Conv_output_0 /model.17/cv2/act/Mul_output_0
|
||||
Concat /model.17/Concat 2 1 /model.17/m/m.0/cv2/act/Mul_output_0 /model.17/cv2/act/Mul_output_0 /model.17/Concat_output_0 0=0
|
||||
Convolution /model.17/cv3/conv/Conv 1 1 /model.17/Concat_output_0 /model.17/cv3/conv/Conv_output_0 0=128 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=16384
|
||||
Swish /model.17/cv3/act/Mul 1 1 /model.17/cv3/conv/Conv_output_0 /model.17/cv3/act/Mul_output_0
|
||||
Split splitncnn_20 1 2 /model.17/cv3/act/Mul_output_0 /model.17/cv3/act/Mul_output_0_splitncnn_0 /model.17/cv3/act/Mul_output_0_splitncnn_1
|
||||
Convolution /model.18/conv/Conv 1 1 /model.17/cv3/act/Mul_output_0_splitncnn_1 /model.18/conv/Conv_output_0 0=128 1=3 11=3 2=1 12=1 3=2 13=2 4=1 14=1 15=1 16=1 5=1 6=147456
|
||||
Swish /model.18/act/Mul 1 1 /model.18/conv/Conv_output_0 /model.18/act/Mul_output_0
|
||||
Concat /model.19/Concat 2 1 /model.18/act/Mul_output_0 /model.14/act/Mul_output_0_splitncnn_0 /model.19/Concat_output_0 0=0
|
||||
Split splitncnn_21 1 2 /model.19/Concat_output_0 /model.19/Concat_output_0_splitncnn_0 /model.19/Concat_output_0_splitncnn_1
|
||||
Convolution /model.20/cv1/conv/Conv 1 1 /model.19/Concat_output_0_splitncnn_1 /model.20/cv1/conv/Conv_output_0 0=128 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=32768
|
||||
Swish /model.20/cv1/act/Mul 1 1 /model.20/cv1/conv/Conv_output_0 /model.20/cv1/act/Mul_output_0
|
||||
Convolution /model.20/m/m.0/cv1/conv/Conv 1 1 /model.20/cv1/act/Mul_output_0 /model.20/m/m.0/cv1/conv/Conv_output_0 0=128 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=16384
|
||||
Swish /model.20/m/m.0/cv1/act/Mul 1 1 /model.20/m/m.0/cv1/conv/Conv_output_0 /model.20/m/m.0/cv1/act/Mul_output_0
|
||||
Convolution /model.20/m/m.0/cv2/conv/Conv 1 1 /model.20/m/m.0/cv1/act/Mul_output_0 /model.20/m/m.0/cv2/conv/Conv_output_0 0=128 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=147456
|
||||
Swish /model.20/m/m.0/cv2/act/Mul 1 1 /model.20/m/m.0/cv2/conv/Conv_output_0 /model.20/m/m.0/cv2/act/Mul_output_0
|
||||
Convolution /model.20/cv2/conv/Conv 1 1 /model.19/Concat_output_0_splitncnn_0 /model.20/cv2/conv/Conv_output_0 0=128 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=32768
|
||||
Swish /model.20/cv2/act/Mul 1 1 /model.20/cv2/conv/Conv_output_0 /model.20/cv2/act/Mul_output_0
|
||||
Concat /model.20/Concat 2 1 /model.20/m/m.0/cv2/act/Mul_output_0 /model.20/cv2/act/Mul_output_0 /model.20/Concat_output_0 0=0
|
||||
Convolution /model.20/cv3/conv/Conv 1 1 /model.20/Concat_output_0 /model.20/cv3/conv/Conv_output_0 0=256 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=65536
|
||||
Swish /model.20/cv3/act/Mul 1 1 /model.20/cv3/conv/Conv_output_0 /model.20/cv3/act/Mul_output_0
|
||||
Split splitncnn_22 1 2 /model.20/cv3/act/Mul_output_0 /model.20/cv3/act/Mul_output_0_splitncnn_0 /model.20/cv3/act/Mul_output_0_splitncnn_1
|
||||
Convolution /model.21/conv/Conv 1 1 /model.20/cv3/act/Mul_output_0_splitncnn_1 /model.21/conv/Conv_output_0 0=256 1=3 11=3 2=1 12=1 3=2 13=2 4=1 14=1 15=1 16=1 5=1 6=589824
|
||||
Swish /model.21/act/Mul 1 1 /model.21/conv/Conv_output_0 /model.21/act/Mul_output_0
|
||||
Concat /model.22/Concat 2 1 /model.21/act/Mul_output_0 /model.10/act/Mul_output_0_splitncnn_0 /model.22/Concat_output_0 0=0
|
||||
Split splitncnn_23 1 2 /model.22/Concat_output_0 /model.22/Concat_output_0_splitncnn_0 /model.22/Concat_output_0_splitncnn_1
|
||||
Convolution /model.23/cv1/conv/Conv 1 1 /model.22/Concat_output_0_splitncnn_1 /model.23/cv1/conv/Conv_output_0 0=256 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=131072
|
||||
Swish /model.23/cv1/act/Mul 1 1 /model.23/cv1/conv/Conv_output_0 /model.23/cv1/act/Mul_output_0
|
||||
Convolution /model.23/m/m.0/cv1/conv/Conv 1 1 /model.23/cv1/act/Mul_output_0 /model.23/m/m.0/cv1/conv/Conv_output_0 0=256 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=65536
|
||||
Swish /model.23/m/m.0/cv1/act/Mul 1 1 /model.23/m/m.0/cv1/conv/Conv_output_0 /model.23/m/m.0/cv1/act/Mul_output_0
|
||||
Convolution /model.23/m/m.0/cv2/conv/Conv 1 1 /model.23/m/m.0/cv1/act/Mul_output_0 /model.23/m/m.0/cv2/conv/Conv_output_0 0=256 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=589824
|
||||
Swish /model.23/m/m.0/cv2/act/Mul 1 1 /model.23/m/m.0/cv2/conv/Conv_output_0 /model.23/m/m.0/cv2/act/Mul_output_0
|
||||
Convolution /model.23/cv2/conv/Conv 1 1 /model.22/Concat_output_0_splitncnn_0 /model.23/cv2/conv/Conv_output_0 0=256 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=131072
|
||||
Swish /model.23/cv2/act/Mul 1 1 /model.23/cv2/conv/Conv_output_0 /model.23/cv2/act/Mul_output_0
|
||||
Concat /model.23/Concat 2 1 /model.23/m/m.0/cv2/act/Mul_output_0 /model.23/cv2/act/Mul_output_0 /model.23/Concat_output_0 0=0
|
||||
Convolution /model.23/cv3/conv/Conv 1 1 /model.23/Concat_output_0 /model.23/cv3/conv/Conv_output_0 0=512 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=262144
|
||||
Swish /model.23/cv3/act/Mul 1 1 /model.23/cv3/conv/Conv_output_0 /model.23/cv3/act/Mul_output_0
|
||||
Convolution /model.24/m.0/Conv 1 1 /model.17/cv3/act/Mul_output_0_splitncnn_0 /model.24/m.0/Conv_output_0 0=66 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=8448
|
||||
Reshape /model.24/Reshape 1 1 /model.24/m.0/Conv_output_0 /model.24/Reshape_output_0 0=-1 1=22 2=3
|
||||
Permute /model.24/Transpose 1 1 /model.24/Reshape_output_0 output 0=1
|
||||
Convolution /model.24/m.1/Conv 1 1 /model.20/cv3/act/Mul_output_0_splitncnn_0 /model.24/m.1/Conv_output_0 0=66 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=16896
|
||||
Reshape /model.24/Reshape_1 1 1 /model.24/m.1/Conv_output_0 /model.24/Reshape_1_output_0 0=-1 1=22 2=3
|
||||
Permute /model.24/Transpose_1 1 1 /model.24/Reshape_1_output_0 354 0=1
|
||||
Convolution /model.24/m.2/Conv 1 1 /model.23/cv3/act/Mul_output_0 /model.24/m.2/Conv_output_0 0=66 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=33792
|
||||
Reshape /model.24/Reshape_2 1 1 /model.24/m.2/Conv_output_0 /model.24/Reshape_2_output_0 0=-1 1=22 2=3
|
||||
Permute /model.24/Transpose_2 1 1 /model.24/Reshape_2_output_0 366 0=1
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1 +1 @@
|
||||
{"absHeartbeats":[33420,85808],"heartbeat":10,"mntnMode":1,"mpappMonitorTimeout":1800000,"port":40101,"quickHbMode":0,"quickHeartbeat":60,"separateNetwork":1,"server":"61.169.135.150","timeForKeepingLogs":15,"usingAbsHbTime":1}
|
||||
{"absHeartbeats":[33449,85836],"heartbeat":10,"mntnMode":0,"mpappMonitorTimeout":1800000,"port":40101,"quickHbMode":0,"quickHeartbeat":60,"separateNetwork":1,"server":"61.169.135.150","syncTime":0,"timeForKeepingLogs":15,"usingAbsHbTime":1}
|
@ -0,0 +1,443 @@
|
||||
/*-
|
||||
* Copyright 2003-2005 Colin Percival
|
||||
* Copyright 2012 Matthew Endsley
|
||||
* All rights reserved
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted providing that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include "bsdiff.h"
|
||||
|
||||
#include <limits.h>
|
||||
#include <string.h>
|
||||
|
||||
#define MIN(x,y) (((x)<(y)) ? (x) : (y))
|
||||
|
||||
static void split(int64_t *I,int64_t *V,int64_t start,int64_t len,int64_t h)
|
||||
{
|
||||
int64_t i,j,k,x,tmp,jj,kk;
|
||||
|
||||
if(len<16) {
|
||||
for(k=start;k<start+len;k+=j) {
|
||||
j=1;x=V[I[k]+h];
|
||||
for(i=1;k+i<start+len;i++) {
|
||||
if(V[I[k+i]+h]<x) {
|
||||
x=V[I[k+i]+h];
|
||||
j=0;
|
||||
};
|
||||
if(V[I[k+i]+h]==x) {
|
||||
tmp=I[k+j];I[k+j]=I[k+i];I[k+i]=tmp;
|
||||
j++;
|
||||
};
|
||||
};
|
||||
for(i=0;i<j;i++) V[I[k+i]]=k+j-1;
|
||||
if(j==1) I[k]=-1;
|
||||
};
|
||||
return;
|
||||
};
|
||||
|
||||
x=V[I[start+len/2]+h];
|
||||
jj=0;kk=0;
|
||||
for(i=start;i<start+len;i++) {
|
||||
if(V[I[i]+h]<x) jj++;
|
||||
if(V[I[i]+h]==x) kk++;
|
||||
};
|
||||
jj+=start;kk+=jj;
|
||||
|
||||
i=start;j=0;k=0;
|
||||
while(i<jj) {
|
||||
if(V[I[i]+h]<x) {
|
||||
i++;
|
||||
} else if(V[I[i]+h]==x) {
|
||||
tmp=I[i];I[i]=I[jj+j];I[jj+j]=tmp;
|
||||
j++;
|
||||
} else {
|
||||
tmp=I[i];I[i]=I[kk+k];I[kk+k]=tmp;
|
||||
k++;
|
||||
};
|
||||
};
|
||||
|
||||
while(jj+j<kk) {
|
||||
if(V[I[jj+j]+h]==x) {
|
||||
j++;
|
||||
} else {
|
||||
tmp=I[jj+j];I[jj+j]=I[kk+k];I[kk+k]=tmp;
|
||||
k++;
|
||||
};
|
||||
};
|
||||
|
||||
if(jj>start) split(I,V,start,jj-start,h);
|
||||
|
||||
for(i=0;i<kk-jj;i++) V[I[jj+i]]=kk-1;
|
||||
if(jj==kk-1) I[jj]=-1;
|
||||
|
||||
if(start+len>kk) split(I,V,kk,start+len-kk,h);
|
||||
}
|
||||
|
||||
static void qsufsort(int64_t *I,int64_t *V,const uint8_t *old,int64_t oldsize)
|
||||
{
|
||||
int64_t buckets[256];
|
||||
int64_t i,h,len;
|
||||
|
||||
for(i=0;i<256;i++) buckets[i]=0;
|
||||
for(i=0;i<oldsize;i++) buckets[old[i]]++;
|
||||
for(i=1;i<256;i++) buckets[i]+=buckets[i-1];
|
||||
for(i=255;i>0;i--) buckets[i]=buckets[i-1];
|
||||
buckets[0]=0;
|
||||
|
||||
for(i=0;i<oldsize;i++) I[++buckets[old[i]]]=i;
|
||||
I[0]=oldsize;
|
||||
for(i=0;i<oldsize;i++) V[i]=buckets[old[i]];
|
||||
V[oldsize]=0;
|
||||
for(i=1;i<256;i++) if(buckets[i]==buckets[i-1]+1) I[buckets[i]]=-1;
|
||||
I[0]=-1;
|
||||
|
||||
for(h=1;I[0]!=-(oldsize+1);h+=h) {
|
||||
len=0;
|
||||
for(i=0;i<oldsize+1;) {
|
||||
if(I[i]<0) {
|
||||
len-=I[i];
|
||||
i-=I[i];
|
||||
} else {
|
||||
if(len) I[i-len]=-len;
|
||||
len=V[I[i]]+1-i;
|
||||
split(I,V,i,len,h);
|
||||
i+=len;
|
||||
len=0;
|
||||
};
|
||||
};
|
||||
if(len) I[i-len]=-len;
|
||||
};
|
||||
|
||||
for(i=0;i<oldsize+1;i++) I[V[i]]=i;
|
||||
}
|
||||
|
||||
static int64_t matchlen(const uint8_t *old,int64_t oldsize,const uint8_t *new,int64_t newsize)
|
||||
{
|
||||
int64_t i;
|
||||
|
||||
for(i=0;(i<oldsize)&&(i<newsize);i++)
|
||||
if(old[i]!=new[i]) break;
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
static int64_t search(const int64_t *I,const uint8_t *old,int64_t oldsize,
|
||||
const uint8_t *new,int64_t newsize,int64_t st,int64_t en,int64_t *pos)
|
||||
{
|
||||
int64_t x,y;
|
||||
|
||||
if(en-st<2) {
|
||||
x=matchlen(old+I[st],oldsize-I[st],new,newsize);
|
||||
y=matchlen(old+I[en],oldsize-I[en],new,newsize);
|
||||
|
||||
if(x>y) {
|
||||
*pos=I[st];
|
||||
return x;
|
||||
} else {
|
||||
*pos=I[en];
|
||||
return y;
|
||||
}
|
||||
};
|
||||
|
||||
x=st+(en-st)/2;
|
||||
if(memcmp(old+I[x],new,MIN(oldsize-I[x],newsize))<0) {
|
||||
return search(I,old,oldsize,new,newsize,x,en,pos);
|
||||
} else {
|
||||
return search(I,old,oldsize,new,newsize,st,x,pos);
|
||||
};
|
||||
}
|
||||
|
||||
static void offtout(int64_t x,uint8_t *buf)
|
||||
{
|
||||
int64_t y;
|
||||
|
||||
if(x<0) y=-x; else y=x;
|
||||
|
||||
buf[0]=y%256;y-=buf[0];
|
||||
y=y/256;buf[1]=y%256;y-=buf[1];
|
||||
y=y/256;buf[2]=y%256;y-=buf[2];
|
||||
y=y/256;buf[3]=y%256;y-=buf[3];
|
||||
y=y/256;buf[4]=y%256;y-=buf[4];
|
||||
y=y/256;buf[5]=y%256;y-=buf[5];
|
||||
y=y/256;buf[6]=y%256;y-=buf[6];
|
||||
y=y/256;buf[7]=y%256;
|
||||
|
||||
if(x<0) buf[7]|=0x80;
|
||||
}
|
||||
|
||||
static int64_t writedata(struct bsdiff_stream* stream, const void* buffer, int64_t length)
|
||||
{
|
||||
int64_t result = 0;
|
||||
|
||||
while (length > 0)
|
||||
{
|
||||
const int smallsize = (int)MIN(length, INT_MAX);
|
||||
const int writeresult = stream->write(stream, buffer, smallsize);
|
||||
if (writeresult == -1)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
result += writeresult;
|
||||
length -= smallsize;
|
||||
buffer = (uint8_t*)buffer + smallsize;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
struct bsdiff_request
|
||||
{
|
||||
const uint8_t* old;
|
||||
int64_t oldsize;
|
||||
const uint8_t* new;
|
||||
int64_t newsize;
|
||||
struct bsdiff_stream* stream;
|
||||
int64_t *I;
|
||||
uint8_t *buffer;
|
||||
};
|
||||
|
||||
static int bsdiff_internal(const struct bsdiff_request req)
|
||||
{
|
||||
int64_t *I,*V;
|
||||
int64_t scan,pos,len;
|
||||
int64_t lastscan,lastpos,lastoffset;
|
||||
int64_t oldscore,scsc;
|
||||
int64_t s,Sf,lenf,Sb,lenb;
|
||||
int64_t overlap,Ss,lens;
|
||||
int64_t i;
|
||||
uint8_t *buffer;
|
||||
uint8_t buf[8 * 3];
|
||||
|
||||
if((V=req.stream->malloc((req.oldsize+1)*sizeof(int64_t)))==NULL) return -1;
|
||||
I = req.I;
|
||||
|
||||
qsufsort(I,V,req.old,req.oldsize);
|
||||
req.stream->free(V);
|
||||
|
||||
buffer = req.buffer;
|
||||
|
||||
/* Compute the differences, writing ctrl as we go */
|
||||
scan=0;len=0;pos=0;
|
||||
lastscan=0;lastpos=0;lastoffset=0;
|
||||
while(scan<req.newsize) {
|
||||
oldscore=0;
|
||||
|
||||
for(scsc=scan+=len;scan<req.newsize;scan++) {
|
||||
len=search(I,req.old,req.oldsize,req.new+scan,req.newsize-scan,
|
||||
0,req.oldsize,&pos);
|
||||
|
||||
for(;scsc<scan+len;scsc++)
|
||||
if((scsc+lastoffset<req.oldsize) &&
|
||||
(req.old[scsc+lastoffset] == req.new[scsc]))
|
||||
oldscore++;
|
||||
|
||||
if(((len==oldscore) && (len!=0)) ||
|
||||
(len>oldscore+8)) break;
|
||||
|
||||
if((scan+lastoffset<req.oldsize) &&
|
||||
(req.old[scan+lastoffset] == req.new[scan]))
|
||||
oldscore--;
|
||||
};
|
||||
|
||||
if((len!=oldscore) || (scan==req.newsize)) {
|
||||
s=0;Sf=0;lenf=0;
|
||||
for(i=0;(lastscan+i<scan)&&(lastpos+i<req.oldsize);) {
|
||||
if(req.old[lastpos+i]==req.new[lastscan+i]) s++;
|
||||
i++;
|
||||
if(s*2-i>Sf*2-lenf) { Sf=s; lenf=i; };
|
||||
};
|
||||
|
||||
lenb=0;
|
||||
if(scan<req.newsize) {
|
||||
s=0;Sb=0;
|
||||
for(i=1;(scan>=lastscan+i)&&(pos>=i);i++) {
|
||||
if(req.old[pos-i]==req.new[scan-i]) s++;
|
||||
if(s*2-i>Sb*2-lenb) { Sb=s; lenb=i; };
|
||||
};
|
||||
};
|
||||
|
||||
if(lastscan+lenf>scan-lenb) {
|
||||
overlap=(lastscan+lenf)-(scan-lenb);
|
||||
s=0;Ss=0;lens=0;
|
||||
for(i=0;i<overlap;i++) {
|
||||
if(req.new[lastscan+lenf-overlap+i]==
|
||||
req.old[lastpos+lenf-overlap+i]) s++;
|
||||
if(req.new[scan-lenb+i]==
|
||||
req.old[pos-lenb+i]) s--;
|
||||
if(s>Ss) { Ss=s; lens=i+1; };
|
||||
};
|
||||
|
||||
lenf+=lens-overlap;
|
||||
lenb-=lens;
|
||||
};
|
||||
|
||||
offtout(lenf,buf);
|
||||
offtout((scan-lenb)-(lastscan+lenf),buf+8);
|
||||
offtout((pos-lenb)-(lastpos+lenf),buf+16);
|
||||
|
||||
/* Write control data */
|
||||
if (writedata(req.stream, buf, sizeof(buf)))
|
||||
return -1;
|
||||
|
||||
/* Write diff data */
|
||||
for(i=0;i<lenf;i++)
|
||||
buffer[i]=req.new[lastscan+i]-req.old[lastpos+i];
|
||||
if (writedata(req.stream, buffer, lenf))
|
||||
return -1;
|
||||
|
||||
/* Write extra data */
|
||||
for(i=0;i<(scan-lenb)-(lastscan+lenf);i++)
|
||||
buffer[i]=req.new[lastscan+lenf+i];
|
||||
if (writedata(req.stream, buffer, (scan-lenb)-(lastscan+lenf)))
|
||||
return -1;
|
||||
|
||||
lastscan=scan-lenb;
|
||||
lastpos=pos-lenb;
|
||||
lastoffset=pos-scan;
|
||||
};
|
||||
};
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int bsdiff(const uint8_t* old, int64_t oldsize, const uint8_t* new, int64_t newsize, struct bsdiff_stream* stream)
|
||||
{
|
||||
int result;
|
||||
struct bsdiff_request req;
|
||||
|
||||
if((req.I=stream->malloc((oldsize+1)*sizeof(int64_t)))==NULL)
|
||||
return -1;
|
||||
|
||||
if((req.buffer=stream->malloc(newsize+1))==NULL)
|
||||
{
|
||||
stream->free(req.I);
|
||||
return -1;
|
||||
}
|
||||
|
||||
req.old = old;
|
||||
req.oldsize = oldsize;
|
||||
req.new = new;
|
||||
req.newsize = newsize;
|
||||
req.stream = stream;
|
||||
|
||||
result = bsdiff_internal(req);
|
||||
|
||||
stream->free(req.buffer);
|
||||
stream->free(req.I);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <bzlib.h>
|
||||
#include <err.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
static int bz2_write(struct bsdiff_stream* stream, const void* buffer, int size)
|
||||
{
|
||||
int bz2err;
|
||||
BZFILE* bz2;
|
||||
|
||||
bz2 = (BZFILE*)stream->opaque;
|
||||
BZ2_bzWrite(&bz2err, bz2, (void*)buffer, size);
|
||||
if (bz2err != BZ_STREAM_END && bz2err != BZ_OK)
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int bsdiff_main(int argc, const char **argv)
|
||||
{
|
||||
int fd;
|
||||
int bz2err;
|
||||
uint8_t *old,*new;
|
||||
off_t oldsize,newsize;
|
||||
uint8_t buf[8];
|
||||
FILE * pf;
|
||||
struct bsdiff_stream stream;
|
||||
BZFILE* bz2;
|
||||
|
||||
memset(&bz2, 0, sizeof(bz2));
|
||||
stream.malloc = malloc;
|
||||
stream.free = free;
|
||||
stream.write = bz2_write;
|
||||
|
||||
if(argc!=4) errx(1,"usage: %s oldfile newfile patchfile\n",argv[0]);
|
||||
|
||||
/* Allocate oldsize+1 bytes instead of oldsize bytes to ensure
|
||||
that we never try to malloc(0) and get a NULL pointer */
|
||||
if(((fd=open(argv[1],O_RDONLY,0))<0) ||
|
||||
((oldsize=lseek(fd,0,SEEK_END))==-1) ||
|
||||
((old=malloc(oldsize+1))==NULL) ||
|
||||
(lseek(fd,0,SEEK_SET)!=0) ||
|
||||
(read(fd,old,oldsize)!=oldsize) ||
|
||||
(close(fd)==-1)) err(1,"%s",argv[1]);
|
||||
|
||||
|
||||
/* Allocate newsize+1 bytes instead of newsize bytes to ensure
|
||||
that we never try to malloc(0) and get a NULL pointer */
|
||||
if(((fd=open(argv[2],O_RDONLY,0))<0) ||
|
||||
((newsize=lseek(fd,0,SEEK_END))==-1) ||
|
||||
((new=malloc(newsize+1))==NULL) ||
|
||||
(lseek(fd,0,SEEK_SET)!=0) ||
|
||||
(read(fd,new,newsize)!=newsize) ||
|
||||
(close(fd)==-1)) err(1,"%s",argv[2]);
|
||||
|
||||
/* Create the patch file */
|
||||
if ((pf = fopen(argv[3], "w")) == NULL)
|
||||
err(1, "%s", argv[3]);
|
||||
|
||||
/* Write header (signature+newsize)*/
|
||||
offtout(newsize, buf);
|
||||
if (fwrite("ENDSLEY/BSDIFF43", 16, 1, pf) != 1 ||
|
||||
fwrite(buf, sizeof(buf), 1, pf) != 1)
|
||||
err(1, "Failed to write header");
|
||||
|
||||
|
||||
if (NULL == (bz2 = BZ2_bzWriteOpen(&bz2err, pf, 9, 0, 0)))
|
||||
errx(1, "BZ2_bzWriteOpen, bz2err=%d", bz2err);
|
||||
|
||||
stream.opaque = bz2;
|
||||
if (bsdiff(old, oldsize, new, newsize, &stream))
|
||||
err(1, "bsdiff");
|
||||
|
||||
BZ2_bzWriteClose(&bz2err, bz2, 0, NULL, NULL);
|
||||
if (bz2err != BZ_OK)
|
||||
err(1, "BZ2_bzWriteClose, bz2err=%d", bz2err);
|
||||
|
||||
if (fclose(pf))
|
||||
err(1, "fclose");
|
||||
|
||||
/* Free the memory we used */
|
||||
free(old);
|
||||
free(new);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -0,0 +1,44 @@
|
||||
/*-
|
||||
* Copyright 2003-2005 Colin Percival
|
||||
* Copyright 2012 Matthew Endsley
|
||||
* All rights reserved
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted providing that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef BSDIFF_H
|
||||
# define BSDIFF_H
|
||||
|
||||
# include <stddef.h>
|
||||
# include <stdint.h>
|
||||
|
||||
struct bsdiff_stream
|
||||
{
|
||||
void* opaque;
|
||||
|
||||
void* (*malloc)(size_t size);
|
||||
void (*free)(void* ptr);
|
||||
int (*write)(struct bsdiff_stream* stream, const void* buffer, int size);
|
||||
};
|
||||
|
||||
int bsdiff(const uint8_t* old, int64_t oldsize, const uint8_t* new, int64_t newsize, struct bsdiff_stream* stream);
|
||||
#endif
|
@ -0,0 +1,41 @@
|
||||
/*-
|
||||
* Copyright 2003-2005 Colin Percival
|
||||
* Copyright 2012 Matthew Endsley
|
||||
* All rights reserved
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted providing that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef BSPATCH_H
|
||||
# define BSPATCH_H
|
||||
|
||||
# include <stdint.h>
|
||||
|
||||
struct bspatch_stream
|
||||
{
|
||||
void* opaque;
|
||||
int (*read)(const struct bspatch_stream* stream, void* buffer, int length);
|
||||
};
|
||||
|
||||
int bspatch(const uint8_t* old, int64_t oldsize, uint8_t* new, int64_t newsize, struct bspatch_stream* stream);
|
||||
#endif
|
||||
|
@ -0,0 +1,97 @@
|
||||
/* config.h. Generated from config.h.in by configure. */
|
||||
/* config.h.in. Generated from configure.ac by autoheader. */
|
||||
|
||||
/* Define to 1 if you have the <fcntl.h> header file. */
|
||||
#define HAVE_FCNTL_H 1
|
||||
|
||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
||||
#define HAVE_INTTYPES_H 1
|
||||
|
||||
/* Define to 1 if you have the `bz2' library (-lbz2). */
|
||||
#define HAVE_LIBBZ2 1
|
||||
|
||||
/* Define to 1 if you have the <limits.h> header file. */
|
||||
#define HAVE_LIMITS_H 1
|
||||
|
||||
/* Define to 1 if your system has a GNU libc compatible `malloc' function, and
|
||||
to 0 otherwise. */
|
||||
#define HAVE_MALLOC 1
|
||||
|
||||
/* Define to 1 if you have the <memory.h> header file. */
|
||||
#define HAVE_MEMORY_H 1
|
||||
|
||||
/* Define to 1 if you have the `memset' function. */
|
||||
#define HAVE_MEMSET 1
|
||||
|
||||
/* Define to 1 if you have the <stddef.h> header file. */
|
||||
#define HAVE_STDDEF_H 1
|
||||
|
||||
/* Define to 1 if you have the <stdint.h> header file. */
|
||||
#define HAVE_STDINT_H 1
|
||||
|
||||
/* Define to 1 if you have the <stdlib.h> header file. */
|
||||
#define HAVE_STDLIB_H 1
|
||||
|
||||
/* Define to 1 if you have the <strings.h> header file. */
|
||||
#define HAVE_STRINGS_H 1
|
||||
|
||||
/* Define to 1 if you have the <string.h> header file. */
|
||||
#define HAVE_STRING_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
||||
#define HAVE_SYS_STAT_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/types.h> header file. */
|
||||
#define HAVE_SYS_TYPES_H 1
|
||||
|
||||
/* Define to 1 if you have the <unistd.h> header file. */
|
||||
#define HAVE_UNISTD_H 1
|
||||
|
||||
/* Name of package */
|
||||
#define PACKAGE "bsdiff"
|
||||
|
||||
/* Define to the address where bug reports for this package should be sent. */
|
||||
#define PACKAGE_BUGREPORT ""
|
||||
|
||||
/* Define to the full name of this package. */
|
||||
#define PACKAGE_NAME "bsdiff"
|
||||
|
||||
/* Define to the full name and version of this package. */
|
||||
#define PACKAGE_STRING "bsdiff 0.1"
|
||||
|
||||
/* Define to the one symbol short name of this package. */
|
||||
#define PACKAGE_TARNAME "bsdiff"
|
||||
|
||||
/* Define to the home page for this package. */
|
||||
#define PACKAGE_URL ""
|
||||
|
||||
/* Define to the version of this package. */
|
||||
#define PACKAGE_VERSION "0.1"
|
||||
|
||||
/* Define to 1 if you have the ANSI C header files. */
|
||||
#define STDC_HEADERS 1
|
||||
|
||||
/* Version number of package */
|
||||
#define VERSION "0.1"
|
||||
|
||||
/* Define for Solaris 2.5.1 so the uint8_t typedef from <sys/synch.h>,
|
||||
<pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the
|
||||
#define below would cause a syntax error. */
|
||||
/* #undef _UINT8_T */
|
||||
|
||||
/* Define to the type of a signed integer type of width exactly 64 bits if
|
||||
such a type exists and the standard includes do not define it. */
|
||||
/* #undef int64_t */
|
||||
|
||||
/* Define to rpl_malloc if the replacement function should be used. */
|
||||
/* #undef malloc */
|
||||
|
||||
/* Define to `long int' if <sys/types.h> does not define. */
|
||||
/* #undef off_t */
|
||||
|
||||
/* Define to `unsigned int' if <sys/types.h> does not define. */
|
||||
/* #undef size_t */
|
||||
|
||||
/* Define to the type of an unsigned integer type of width exactly 8 bits if
|
||||
such a type exists and the standard includes do not define it. */
|
||||
/* #undef uint8_t */
|
@ -0,0 +1,42 @@
|
||||
|
||||
--------------------------------------------------------------------------
|
||||
|
||||
This program, "bzip2", the associated library "libbzip2", and all
|
||||
documentation, are copyright (C) 1996-2019 Julian R Seward. All
|
||||
rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
2. The origin of this software must not be misrepresented; you must
|
||||
not claim that you wrote the original software. If you use this
|
||||
software in a product, an acknowledgment in the product
|
||||
documentation would be appreciated but is not required.
|
||||
|
||||
3. Altered source versions must be plainly marked as such, and must
|
||||
not be misrepresented as being the original software.
|
||||
|
||||
4. The name of the author may not be used to endorse or promote
|
||||
products derived from this software without specific prior written
|
||||
permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
|
||||
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
Julian Seward, jseward@acm.org
|
||||
bzip2/libbzip2 version 1.0.8 of 13 July 2019
|
||||
|
||||
--------------------------------------------------------------------------
|
@ -0,0 +1,217 @@
|
||||
# ------------------------------------------------------------------
|
||||
# This file is part of bzip2/libbzip2, a program and library for
|
||||
# lossless, block-sorting data compression.
|
||||
#
|
||||
# bzip2/libbzip2 version 1.0.8 of 13 July 2019
|
||||
# Copyright (C) 1996-2019 Julian Seward <jseward@acm.org>
|
||||
#
|
||||
# Please read the WARNING, DISCLAIMER and PATENTS sections in the
|
||||
# README file.
|
||||
#
|
||||
# This program is released under the terms of the license contained
|
||||
# in the file LICENSE.
|
||||
# ------------------------------------------------------------------
|
||||
|
||||
SHELL=/bin/sh
|
||||
|
||||
# To assist in cross-compiling
|
||||
CC=gcc
|
||||
AR=ar
|
||||
RANLIB=ranlib
|
||||
LDFLAGS=
|
||||
|
||||
BIGFILES=-D_FILE_OFFSET_BITS=64
|
||||
CFLAGS=-Wall -Winline -O2 -g $(BIGFILES)
|
||||
|
||||
# Where you want it installed when you do 'make install'
|
||||
PREFIX=/usr/local
|
||||
|
||||
|
||||
OBJS= blocksort.o \
|
||||
huffman.o \
|
||||
crctable.o \
|
||||
randtable.o \
|
||||
compress.o \
|
||||
decompress.o \
|
||||
bzlib.o
|
||||
|
||||
all: libbz2.a bzip2 bzip2recover test
|
||||
|
||||
bzip2: libbz2.a bzip2.o
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) -o bzip2 bzip2.o -L. -lbz2
|
||||
|
||||
bzip2recover: bzip2recover.o
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) -o bzip2recover bzip2recover.o
|
||||
|
||||
libbz2.a: $(OBJS)
|
||||
rm -f libbz2.a
|
||||
$(AR) cq libbz2.a $(OBJS)
|
||||
@if ( test -f $(RANLIB) -o -f /usr/bin/ranlib -o \
|
||||
-f /bin/ranlib -o -f /usr/ccs/bin/ranlib ) ; then \
|
||||
echo $(RANLIB) libbz2.a ; \
|
||||
$(RANLIB) libbz2.a ; \
|
||||
fi
|
||||
|
||||
check: test
|
||||
test: bzip2
|
||||
@cat words1
|
||||
./bzip2 -1 < sample1.ref > sample1.rb2
|
||||
./bzip2 -2 < sample2.ref > sample2.rb2
|
||||
./bzip2 -3 < sample3.ref > sample3.rb2
|
||||
./bzip2 -d < sample1.bz2 > sample1.tst
|
||||
./bzip2 -d < sample2.bz2 > sample2.tst
|
||||
./bzip2 -ds < sample3.bz2 > sample3.tst
|
||||
cmp sample1.bz2 sample1.rb2
|
||||
cmp sample2.bz2 sample2.rb2
|
||||
cmp sample3.bz2 sample3.rb2
|
||||
cmp sample1.tst sample1.ref
|
||||
cmp sample2.tst sample2.ref
|
||||
cmp sample3.tst sample3.ref
|
||||
@cat words3
|
||||
|
||||
install: bzip2 bzip2recover
|
||||
if ( test ! -d $(PREFIX)/bin ) ; then mkdir -p $(PREFIX)/bin ; fi
|
||||
if ( test ! -d $(PREFIX)/lib ) ; then mkdir -p $(PREFIX)/lib ; fi
|
||||
if ( test ! -d $(PREFIX)/man ) ; then mkdir -p $(PREFIX)/man ; fi
|
||||
if ( test ! -d $(PREFIX)/man/man1 ) ; then mkdir -p $(PREFIX)/man/man1 ; fi
|
||||
if ( test ! -d $(PREFIX)/include ) ; then mkdir -p $(PREFIX)/include ; fi
|
||||
cp -f bzip2 $(PREFIX)/bin/bzip2
|
||||
cp -f bzip2 $(PREFIX)/bin/bunzip2
|
||||
cp -f bzip2 $(PREFIX)/bin/bzcat
|
||||
cp -f bzip2recover $(PREFIX)/bin/bzip2recover
|
||||
chmod a+x $(PREFIX)/bin/bzip2
|
||||
chmod a+x $(PREFIX)/bin/bunzip2
|
||||
chmod a+x $(PREFIX)/bin/bzcat
|
||||
chmod a+x $(PREFIX)/bin/bzip2recover
|
||||
cp -f bzip2.1 $(PREFIX)/man/man1
|
||||
chmod a+r $(PREFIX)/man/man1/bzip2.1
|
||||
cp -f bzlib.h $(PREFIX)/include
|
||||
chmod a+r $(PREFIX)/include/bzlib.h
|
||||
cp -f libbz2.a $(PREFIX)/lib
|
||||
chmod a+r $(PREFIX)/lib/libbz2.a
|
||||
cp -f bzgrep $(PREFIX)/bin/bzgrep
|
||||
ln -s -f $(PREFIX)/bin/bzgrep $(PREFIX)/bin/bzegrep
|
||||
ln -s -f $(PREFIX)/bin/bzgrep $(PREFIX)/bin/bzfgrep
|
||||
chmod a+x $(PREFIX)/bin/bzgrep
|
||||
cp -f bzmore $(PREFIX)/bin/bzmore
|
||||
ln -s -f $(PREFIX)/bin/bzmore $(PREFIX)/bin/bzless
|
||||
chmod a+x $(PREFIX)/bin/bzmore
|
||||
cp -f bzdiff $(PREFIX)/bin/bzdiff
|
||||
ln -s -f $(PREFIX)/bin/bzdiff $(PREFIX)/bin/bzcmp
|
||||
chmod a+x $(PREFIX)/bin/bzdiff
|
||||
cp -f bzgrep.1 bzmore.1 bzdiff.1 $(PREFIX)/man/man1
|
||||
chmod a+r $(PREFIX)/man/man1/bzgrep.1
|
||||
chmod a+r $(PREFIX)/man/man1/bzmore.1
|
||||
chmod a+r $(PREFIX)/man/man1/bzdiff.1
|
||||
echo ".so man1/bzgrep.1" > $(PREFIX)/man/man1/bzegrep.1
|
||||
echo ".so man1/bzgrep.1" > $(PREFIX)/man/man1/bzfgrep.1
|
||||
echo ".so man1/bzmore.1" > $(PREFIX)/man/man1/bzless.1
|
||||
echo ".so man1/bzdiff.1" > $(PREFIX)/man/man1/bzcmp.1
|
||||
|
||||
clean:
|
||||
rm -f *.o libbz2.a bzip2 bzip2recover \
|
||||
sample1.rb2 sample2.rb2 sample3.rb2 \
|
||||
sample1.tst sample2.tst sample3.tst
|
||||
|
||||
blocksort.o: blocksort.c
|
||||
@cat words0
|
||||
$(CC) $(CFLAGS) -c blocksort.c
|
||||
huffman.o: huffman.c
|
||||
$(CC) $(CFLAGS) -c huffman.c
|
||||
crctable.o: crctable.c
|
||||
$(CC) $(CFLAGS) -c crctable.c
|
||||
randtable.o: randtable.c
|
||||
$(CC) $(CFLAGS) -c randtable.c
|
||||
compress.o: compress.c
|
||||
$(CC) $(CFLAGS) -c compress.c
|
||||
decompress.o: decompress.c
|
||||
$(CC) $(CFLAGS) -c decompress.c
|
||||
bzlib.o: bzlib.c
|
||||
$(CC) $(CFLAGS) -c bzlib.c
|
||||
bzip2.o: bzip2.c
|
||||
$(CC) $(CFLAGS) -c bzip2.c
|
||||
bzip2recover.o: bzip2recover.c
|
||||
$(CC) $(CFLAGS) -c bzip2recover.c
|
||||
|
||||
|
||||
distclean: clean
|
||||
rm -f manual.ps manual.html manual.pdf
|
||||
|
||||
DISTNAME=bzip2-1.0.8
|
||||
dist: check manual
|
||||
rm -f $(DISTNAME)
|
||||
ln -s -f . $(DISTNAME)
|
||||
tar cvf $(DISTNAME).tar \
|
||||
$(DISTNAME)/blocksort.c \
|
||||
$(DISTNAME)/huffman.c \
|
||||
$(DISTNAME)/crctable.c \
|
||||
$(DISTNAME)/randtable.c \
|
||||
$(DISTNAME)/compress.c \
|
||||
$(DISTNAME)/decompress.c \
|
||||
$(DISTNAME)/bzlib.c \
|
||||
$(DISTNAME)/bzip2.c \
|
||||
$(DISTNAME)/bzip2recover.c \
|
||||
$(DISTNAME)/bzlib.h \
|
||||
$(DISTNAME)/bzlib_private.h \
|
||||
$(DISTNAME)/Makefile \
|
||||
$(DISTNAME)/LICENSE \
|
||||
$(DISTNAME)/bzip2.1 \
|
||||
$(DISTNAME)/bzip2.1.preformatted \
|
||||
$(DISTNAME)/bzip2.txt \
|
||||
$(DISTNAME)/words0 \
|
||||
$(DISTNAME)/words1 \
|
||||
$(DISTNAME)/words2 \
|
||||
$(DISTNAME)/words3 \
|
||||
$(DISTNAME)/sample1.ref \
|
||||
$(DISTNAME)/sample2.ref \
|
||||
$(DISTNAME)/sample3.ref \
|
||||
$(DISTNAME)/sample1.bz2 \
|
||||
$(DISTNAME)/sample2.bz2 \
|
||||
$(DISTNAME)/sample3.bz2 \
|
||||
$(DISTNAME)/dlltest.c \
|
||||
$(DISTNAME)/manual.html \
|
||||
$(DISTNAME)/manual.pdf \
|
||||
$(DISTNAME)/manual.ps \
|
||||
$(DISTNAME)/README \
|
||||
$(DISTNAME)/README.COMPILATION.PROBLEMS \
|
||||
$(DISTNAME)/README.XML.STUFF \
|
||||
$(DISTNAME)/CHANGES \
|
||||
$(DISTNAME)/libbz2.def \
|
||||
$(DISTNAME)/libbz2.dsp \
|
||||
$(DISTNAME)/dlltest.dsp \
|
||||
$(DISTNAME)/makefile.msc \
|
||||
$(DISTNAME)/unzcrash.c \
|
||||
$(DISTNAME)/spewG.c \
|
||||
$(DISTNAME)/mk251.c \
|
||||
$(DISTNAME)/bzdiff \
|
||||
$(DISTNAME)/bzdiff.1 \
|
||||
$(DISTNAME)/bzmore \
|
||||
$(DISTNAME)/bzmore.1 \
|
||||
$(DISTNAME)/bzgrep \
|
||||
$(DISTNAME)/bzgrep.1 \
|
||||
$(DISTNAME)/Makefile-libbz2_so \
|
||||
$(DISTNAME)/bz-common.xsl \
|
||||
$(DISTNAME)/bz-fo.xsl \
|
||||
$(DISTNAME)/bz-html.xsl \
|
||||
$(DISTNAME)/bzip.css \
|
||||
$(DISTNAME)/entities.xml \
|
||||
$(DISTNAME)/manual.xml \
|
||||
$(DISTNAME)/format.pl \
|
||||
$(DISTNAME)/xmlproc.sh
|
||||
gzip -v $(DISTNAME).tar
|
||||
|
||||
# For rebuilding the manual from sources on my SuSE 9.1 box
|
||||
|
||||
MANUAL_SRCS= bz-common.xsl bz-fo.xsl bz-html.xsl bzip.css \
|
||||
entities.xml manual.xml
|
||||
|
||||
manual: manual.html manual.ps manual.pdf
|
||||
|
||||
manual.ps: $(MANUAL_SRCS)
|
||||
./xmlproc.sh -ps manual.xml
|
||||
|
||||
manual.pdf: $(MANUAL_SRCS)
|
||||
./xmlproc.sh -pdf manual.xml
|
||||
|
||||
manual.html: $(MANUAL_SRCS)
|
||||
./xmlproc.sh -html manual.xml
|
@ -0,0 +1,59 @@
|
||||
|
||||
# This Makefile builds a shared version of the library,
|
||||
# libbz2.so.1.0.8, with soname libbz2.so.1.0,
|
||||
# at least on x86-Linux (RedHat 7.2),
|
||||
# with gcc-2.96 20000731 (Red Hat Linux 7.1 2.96-98).
|
||||
# Please see the README file for some important info
|
||||
# about building the library like this.
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
# This file is part of bzip2/libbzip2, a program and library for
|
||||
# lossless, block-sorting data compression.
|
||||
#
|
||||
# bzip2/libbzip2 version 1.0.8 of 13 July 2019
|
||||
# Copyright (C) 1996-2019 Julian Seward <jseward@acm.org>
|
||||
#
|
||||
# Please read the WARNING, DISCLAIMER and PATENTS sections in the
|
||||
# README file.
|
||||
#
|
||||
# This program is released under the terms of the license contained
|
||||
# in the file LICENSE.
|
||||
# ------------------------------------------------------------------
|
||||
|
||||
|
||||
SHELL=/bin/sh
|
||||
CC=gcc
|
||||
BIGFILES=-D_FILE_OFFSET_BITS=64
|
||||
CFLAGS=-fpic -fPIC -Wall -Winline -O2 -g $(BIGFILES)
|
||||
|
||||
OBJS= blocksort.o \
|
||||
huffman.o \
|
||||
crctable.o \
|
||||
randtable.o \
|
||||
compress.o \
|
||||
decompress.o \
|
||||
bzlib.o
|
||||
|
||||
all: $(OBJS)
|
||||
$(CC) -shared -Wl,-soname -Wl,libbz2.so.1.0 -o libbz2.so.1.0.8 $(OBJS)
|
||||
$(CC) $(CFLAGS) -o bzip2-shared bzip2.c libbz2.so.1.0.8
|
||||
rm -f libbz2.so.1.0
|
||||
ln -s libbz2.so.1.0.8 libbz2.so.1.0
|
||||
|
||||
clean:
|
||||
rm -f $(OBJS) bzip2.o libbz2.so.1.0.8 libbz2.so.1.0 bzip2-shared
|
||||
|
||||
blocksort.o: blocksort.c
|
||||
$(CC) $(CFLAGS) -c blocksort.c
|
||||
huffman.o: huffman.c
|
||||
$(CC) $(CFLAGS) -c huffman.c
|
||||
crctable.o: crctable.c
|
||||
$(CC) $(CFLAGS) -c crctable.c
|
||||
randtable.o: randtable.c
|
||||
$(CC) $(CFLAGS) -c randtable.c
|
||||
compress.o: compress.c
|
||||
$(CC) $(CFLAGS) -c compress.c
|
||||
decompress.o: decompress.c
|
||||
$(CC) $(CFLAGS) -c decompress.c
|
||||
bzlib.o: bzlib.c
|
||||
$(CC) $(CFLAGS) -c bzlib.c
|
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
Loading…
Reference in New Issue