Compare commits
1667 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
d61454e7c1 | ||
![]() |
b02e4faa3e | ||
![]() |
09256527be | ||
![]() |
84d26ab6eb | ||
![]() |
1d99adc953 | ||
![]() |
67991f3a3e | ||
![]() |
32e8922faf | ||
![]() |
32dbd1f342 | ||
![]() |
eefc3ca7be | ||
![]() |
a16558e122 | ||
![]() |
506368f563 | ||
![]() |
c0c24bc9b3 | ||
![]() |
b89f279cd6 | ||
![]() |
7f90eef87a | ||
![]() |
71f0a3c4ad | ||
![]() |
d9bef14e41 | ||
![]() |
4b4ed88e89 | ||
![]() |
f6476944e1 | ||
![]() |
03d30d4c2c | ||
![]() |
853a27e345 | ||
![]() |
f7c0f8355e | ||
![]() |
6f5c505109 | ||
![]() |
b29f9897e3 | ||
![]() |
1d987a34d8 | ||
![]() |
6099d1ca0e | ||
![]() |
a9b9751bc8 | ||
![]() |
da5e52010c | ||
![]() |
e1fd837888 | ||
![]() |
1d10997488 | ||
![]() |
76a5cf1f80 | ||
![]() |
16c3d6d392 | ||
![]() |
9d79848f84 | ||
![]() |
b8d34604ff | ||
![]() |
7a02b9cb2d | ||
![]() |
ff6d440d10 | ||
![]() |
a88a57cd24 | ||
![]() |
0cda7baa8b | ||
![]() |
31baa6f199 | ||
![]() |
3b364ac18a | ||
![]() |
63660277fd | ||
![]() |
6101187c55 | ||
![]() |
91ff803a74 | ||
![]() |
4f4f78ea48 | ||
![]() |
ff24824a72 | ||
![]() |
570cefb02b | ||
![]() |
ce0972ecdd | ||
![]() |
09c848855a | ||
![]() |
e1ce4f805f | ||
![]() |
bb5c0ac922 | ||
![]() |
d389438296 | ||
![]() |
3b57d7769a | ||
![]() |
b7f2719951 | ||
![]() |
dc4e34a2f0 | ||
![]() |
d694ab846c | ||
![]() |
ab02548c8a | ||
![]() |
9eb442cca2 | ||
![]() |
b45ab61b24 | ||
![]() |
cc73b4f574 | ||
![]() |
8ac3b2cdb7 | ||
![]() |
ace90ee265 | ||
![]() |
703bd31647 | ||
![]() |
c16e80ee3d | ||
![]() |
66ac5b96e8 | ||
![]() |
547cad8c81 | ||
![]() |
55b1a1e9c1 | ||
![]() |
5eef7042d8 | ||
![]() |
fa1b563196 | ||
![]() |
b97e27082b | ||
![]() |
365b9cf624 | ||
![]() |
2638af2fc5 | ||
![]() |
4c8be331bc | ||
![]() |
8f537420ae | ||
![]() |
5312fb13b4 | ||
![]() |
c2a7607a1c | ||
![]() |
36ea35bbc0 | ||
![]() |
89d42da5c6 | ||
![]() |
52c85b194b | ||
![]() |
8407cbbfc9 | ||
![]() |
296cd9c432 | ||
![]() |
b96d864fd6 | ||
![]() |
f851477889 | ||
![]() |
ceb2fe027f | ||
![]() |
3c6d824b80 | ||
![]() |
b11d1889ef | ||
![]() |
d86cf4a91d | ||
![]() |
8572dbc5db | ||
![]() |
bcac0f4010 | ||
![]() |
d5e802609a | ||
![]() |
cdb3eee7c4 | ||
![]() |
b3fd2b175c | ||
![]() |
917d14e6a2 | ||
![]() |
321c3cd1a9 | ||
![]() |
e3fb2b0eb7 | ||
![]() |
453944cc77 | ||
![]() |
8e8db16a2c | ||
![]() |
4a203b7737 | ||
![]() |
a6153bde3d | ||
![]() |
de4a4ca1a0 | ||
![]() |
8b4714614f | ||
![]() |
646d663f71 | ||
![]() |
5303a644f5 | ||
![]() |
ea7ebadeb7 | ||
![]() |
16de4d927e | ||
![]() |
5e3da25618 | ||
![]() |
3e56ae67d3 | ||
![]() |
7258b5eb65 | ||
![]() |
4f2d4b98fc | ||
![]() |
743d489c9a | ||
![]() |
6f48c60956 | ||
![]() |
775a0b04f0 | ||
![]() |
c4a0c64f14 | ||
![]() |
7fe59eeaaf | ||
![]() |
8b7a39d7ea | ||
![]() |
3294fc8c47 | ||
![]() |
1b5ccae0f2 | ||
![]() |
649b7a9946 | ||
![]() |
c7d8dbad14 | ||
![]() |
35a9959aca | ||
![]() |
96b069450c | ||
![]() |
5309e7e6aa | ||
![]() |
d2f1f2c74f | ||
![]() |
87120217b5 | ||
![]() |
e3fd6a3a4e | ||
![]() |
ee0ebd3c14 | ||
![]() |
881f96c4c2 | ||
![]() |
b63052839a | ||
![]() |
f629705b02 | ||
![]() |
ec217218c2 | ||
![]() |
176a0fca3f | ||
![]() |
9752d07d33 | ||
![]() |
7d8ebb8774 | ||
![]() |
f7bbe0f414 | ||
![]() |
69c34a6ac9 | ||
![]() |
5a8e51f661 | ||
![]() |
02946120fc | ||
![]() |
5109ce2017 | ||
![]() |
6daff3bd8f | ||
![]() |
1ec335513f | ||
![]() |
1360db7e88 | ||
![]() |
a67b6c9541 | ||
![]() |
baee313aa9 | ||
![]() |
552ce6874c | ||
![]() |
42b4da75b7 | ||
![]() |
2b1f6a3516 | ||
![]() |
5a6dd925cb | ||
![]() |
951f6fa3f3 | ||
![]() |
24db666d15 | ||
![]() |
f51de9cac2 | ||
![]() |
e9c08e32d6 | ||
![]() |
f044fc0372 | ||
![]() |
1a59a28838 | ||
![]() |
aecd064744 | ||
![]() |
5e7524195c | ||
![]() |
1274ea8dba | ||
![]() |
fcf597625c | ||
![]() |
803e82276b | ||
![]() |
a5b20bf4b2 | ||
![]() |
7c1835c52a | ||
![]() |
cfce6f7efd | ||
![]() |
0d0f7f0ba4 | ||
![]() |
2762323c37 | ||
![]() |
94c61cd9ae | ||
![]() |
de1f0c94cd | ||
![]() |
4f5493fe23 | ||
![]() |
2c5c37ade1 | ||
![]() |
284123d7fd | ||
![]() |
2231d5b671 | ||
![]() |
ab84effded | ||
![]() |
033a5334ba | ||
![]() |
c2430304df | ||
![]() |
1b2390e2bc | ||
![]() |
cbb277988a | ||
![]() |
d8f08047dc | ||
![]() |
3dbf569032 | ||
![]() |
092d1977cc | ||
![]() |
0f1281b2b8 | ||
![]() |
87c7fb2b21 | ||
![]() |
684d0a0b23 | ||
![]() |
5732b21884 | ||
![]() |
f9bc65e399 | ||
![]() |
b76d6eb3bd | ||
![]() |
041caf1a63 | ||
![]() |
b2c0b80f62 | ||
![]() |
1654ca7d4e | ||
![]() |
c701178900 | ||
![]() |
d7e088849e | ||
![]() |
c368538667 | ||
![]() |
b7f641dc9b | ||
![]() |
231a514dd3 | ||
![]() |
d658ef18e3 | ||
![]() |
3e8426170c | ||
![]() |
dcb29d37d4 | ||
![]() |
4dee4a4470 | ||
![]() |
0b890425e3 | ||
![]() |
0a7239ae25 | ||
![]() |
7bd0079e9e | ||
![]() |
422619646e | ||
![]() |
1e4e760f76 | ||
![]() |
73aeb27cfe | ||
![]() |
8c6cfffa01 | ||
![]() |
7865cafec2 | ||
![]() |
55cf7d9713 | ||
![]() |
3da359c140 | ||
![]() |
39750b7364 | ||
![]() |
d247a40aad | ||
![]() |
428aa14a48 | ||
![]() |
2143948381 | ||
![]() |
213e606752 | ||
![]() |
096a1d5b46 | ||
![]() |
b574e1e97e | ||
![]() |
4f10495055 | ||
![]() |
db8970d7b6 | ||
![]() |
161fc0f463 | ||
![]() |
0940066b80 | ||
![]() |
ef16d12606 | ||
![]() |
6f0fc1a96b | ||
![]() |
39b517fac0 | ||
![]() |
b21e989a3c | ||
![]() |
2178abd3b5 | ||
![]() |
52ec81c67d | ||
![]() |
720c21d11f | ||
![]() |
a4dbabc8b3 | ||
![]() |
c3d2426cca | ||
![]() |
467a55a4ee | ||
![]() |
46ef45ab59 | ||
![]() |
07b0ccf511 | ||
![]() |
d7913bf59c | ||
![]() |
406a9ccffe | ||
![]() |
53b0892005 | ||
![]() |
69a68d3013 | ||
![]() |
ddc6adaa28 | ||
![]() |
5a20f1885d | ||
![]() |
91a8b933fb | ||
![]() |
a52e74db17 | ||
![]() |
9d3e69ae30 | ||
![]() |
d9792b7735 | ||
![]() |
12f0388f9c | ||
![]() |
4d55e9de27 | ||
![]() |
c4abee734d | ||
![]() |
03efd73082 | ||
![]() |
f20518568a | ||
![]() |
803f8992f1 | ||
![]() |
fe8f4c71e3 | ||
![]() |
4f63d6d3b5 | ||
![]() |
bb8b752553 | ||
![]() |
17ad5fbb8a | ||
![]() |
75a9859ac6 | ||
![]() |
235d401bfa | ||
![]() |
fcfc90ed65 | ||
![]() |
6724254118 | ||
![]() |
efaa4a8dbf | ||
![]() |
02a2e171ad | ||
![]() |
d9a416fa1a | ||
![]() |
4bc4f6f170 | ||
![]() |
dc81c0a0dc | ||
![]() |
7509a95656 | ||
![]() |
33bf66af02 | ||
![]() |
34e80af860 | ||
![]() |
e489e83466 | ||
![]() |
ee83f667af | ||
![]() |
4d13d440ee | ||
![]() |
2b8b0da09c | ||
![]() |
eacf42dd50 | ||
![]() |
d2a4e4b9cc | ||
![]() |
c487972ed0 | ||
![]() |
928cb84b32 | ||
![]() |
50841da143 | ||
![]() |
feac9cbed0 | ||
![]() |
5b58d79a99 | ||
![]() |
5db23c07a3 | ||
![]() |
95e177eeb2 | ||
![]() |
ebef9f5a56 | ||
![]() |
65e78a2e4b | ||
![]() |
bb3ead7e54 | ||
![]() |
c19a49e565 | ||
![]() |
7968059e5c | ||
![]() |
94f084324e | ||
![]() |
4912b634b5 | ||
![]() |
eda7571ea1 | ||
![]() |
7a1d6ddd2c | ||
![]() |
95c0cec03a | ||
![]() |
9e59a7be1c | ||
![]() |
c8be5258de | ||
![]() |
4c73123333 | ||
![]() |
50c6bffb67 | ||
![]() |
098af26067 | ||
![]() |
4ea8406e38 | ||
![]() |
3980ab12b7 | ||
![]() |
e48cd2de98 | ||
![]() |
2ca78936c7 | ||
![]() |
2c43cfe2d4 | ||
![]() |
1c55d0ff32 | ||
![]() |
1587989518 | ||
![]() |
91d305790e | ||
![]() |
ff4d1aa8bc | ||
![]() |
f61e47dd68 | ||
![]() |
74512f7e36 | ||
![]() |
502fc3b3d4 | ||
![]() |
413fa76f61 | ||
![]() |
0ffe32cf8f | ||
![]() |
3668168afa | ||
![]() |
58e0402e02 | ||
![]() |
35469835bb | ||
![]() |
e48d1ea541 | ||
![]() |
4cabee50f6 | ||
![]() |
e6b125e3be | ||
![]() |
6abeaf2781 | ||
![]() |
7cf1f0f4af | ||
![]() |
1b3a98f137 | ||
![]() |
f8164f6728 | ||
![]() |
f9aadf1fc4 | ||
![]() |
f626eaa58e | ||
![]() |
38c4316fff | ||
![]() |
052cd1ce72 | ||
![]() |
b01d2a5533 | ||
![]() |
a2dbf379f0 | ||
![]() |
e8d0b84e8a | ||
![]() |
36c0043344 | ||
![]() |
2a00812d82 | ||
![]() |
8d6ec61186 | ||
![]() |
e205fe6831 | ||
![]() |
63f800ca5f | ||
![]() |
b8962d64cc | ||
![]() |
4600a85eaa | ||
![]() |
343f07e15c | ||
![]() |
d4ec07dfe7 | ||
![]() |
36952786a5 | ||
![]() |
97b88096dc | ||
![]() |
4250753497 | ||
![]() |
37c46743ee | ||
![]() |
480633c6c2 | ||
![]() |
b627385b4b | ||
![]() |
935453102b | ||
![]() |
c0d32686dd | ||
![]() |
da0a670b3c | ||
![]() |
3efc174fd6 | ||
![]() |
1a558cec64 | ||
![]() |
f0d4f00f24 | ||
![]() |
63a52ca134 | ||
![]() |
6d7aa437e1 | ||
![]() |
2ca7edda89 | ||
![]() |
03bf457241 | ||
![]() |
4fe448738e | ||
![]() |
3bc5d2a064 | ||
![]() |
c9a4ec7969 | ||
![]() |
18464d7270 | ||
![]() |
2bb66cc8be | ||
![]() |
1654514ab0 | ||
![]() |
e0237208b4 | ||
![]() |
8c63a0d171 | ||
![]() |
b5d4f49e3c | ||
![]() |
bd6f145820 | ||
![]() |
b173f5c155 | ||
![]() |
e2cd28c926 | ||
![]() |
ce36d80881 | ||
![]() |
a808733675 | ||
![]() |
1402873601 | ||
![]() |
f22c24bd7a | ||
![]() |
494cbc4238 | ||
![]() |
e16b7338d8 | ||
![]() |
97cebf3139 | ||
![]() |
19bf1ed1f4 | ||
![]() |
0daff3ce76 | ||
![]() |
596636a474 | ||
![]() |
d9e2aceb7f | ||
![]() |
be4aac302b | ||
![]() |
9b8eedd736 | ||
![]() |
72732f2ddd | ||
![]() |
5ce98e774e | ||
![]() |
be3d8073ed | ||
![]() |
4c9204783a | ||
![]() |
22652dc2b8 | ||
![]() |
37520a91ac | ||
![]() |
7771daaea7 | ||
![]() |
39cd9fdbf8 | ||
![]() |
fcc3909908 | ||
![]() |
31f9c228c0 | ||
![]() |
f30a8154ab | ||
![]() |
56cc754c76 | ||
![]() |
c6a3b00924 | ||
![]() |
1fc3963188 | ||
![]() |
65c9e2d003 | ||
![]() |
5393c9dadd | ||
![]() |
4cde8bae49 | ||
![]() |
9e8bbe7d4d | ||
![]() |
5b740d1eaa | ||
![]() |
152e09fde7 | ||
![]() |
110841c3ab | ||
![]() |
5694831e06 | ||
![]() |
1f52f82a55 | ||
![]() |
4d686fb721 | ||
![]() |
d4ae8ac92f | ||
![]() |
9301486408 | ||
![]() |
f2583bc86e | ||
![]() |
0ddb0516f1 | ||
![]() |
ef768ab976 | ||
![]() |
87961a8a50 | ||
![]() |
58396e806c | ||
![]() |
7bb505a33c | ||
![]() |
b543a29020 | ||
![]() |
20e82b41fc | ||
![]() |
f07a4290a0 | ||
![]() |
d6bd29492c | ||
![]() |
fa39f8c0e2 | ||
![]() |
e62f08ca8d | ||
![]() |
b6a0b8bcf4 | ||
![]() |
8c1b942ad7 | ||
![]() |
e6516944a3 | ||
![]() |
35debfc366 | ||
![]() |
7a2c380e93 | ||
![]() |
5403a288a7 | ||
![]() |
b3b05a11d3 | ||
![]() |
3ff5ca89fc | ||
![]() |
42196083fe | ||
![]() |
a59d922d24 | ||
![]() |
7997d78643 | ||
![]() |
7c51f5bd39 | ||
![]() |
25cb697d0c | ||
![]() |
d3e9bee6f7 | ||
![]() |
8d27bf1cff | ||
![]() |
12df9b9a15 | ||
![]() |
7a67ab5cba | ||
![]() |
dcb7c868ec | ||
![]() |
1f156af427 | ||
![]() |
2082c00ea2 | ||
![]() |
ad207f1119 | ||
![]() |
ee099059e7 | ||
![]() |
404731bd20 | ||
![]() |
ff771f79b5 | ||
![]() |
127aee4ccb | ||
![]() |
e2a89f7f0f | ||
![]() |
7c46855074 | ||
![]() |
c2d6cc2971 | ||
![]() |
f5245a9c62 | ||
![]() |
1688eef253 | ||
![]() |
75bbaf2493 | ||
![]() |
9e8ab36f54 | ||
![]() |
570397c731 | ||
![]() |
9c41b59423 | ||
![]() |
ffa90d99fd | ||
![]() |
7206221d56 | ||
![]() |
e15824e75b | ||
![]() |
604c4eab2b | ||
![]() |
e87f5e4e5f | ||
![]() |
0a02426826 | ||
![]() |
56a721f020 | ||
![]() |
4c8bd8ddb0 | ||
![]() |
46ad2c4aed | ||
![]() |
bf16872fec | ||
![]() |
85f0bde4f0 | ||
![]() |
8c91414803 | ||
![]() |
cf0e8e7ad4 | ||
![]() |
ba650ea118 | ||
![]() |
d5ee74e57d | ||
![]() |
c2c56d54ee | ||
![]() |
4e9e6fa99f | ||
![]() |
a4d3c20035 | ||
![]() |
96b2ba68c4 | ||
![]() |
0263750a0d | ||
![]() |
ab56fabe62 | ||
![]() |
1f7e6c0713 | ||
![]() |
e96109f93c | ||
![]() |
db85d11d9d | ||
![]() |
f75baa6c9b | ||
![]() |
6ee7681723 | ||
![]() |
2a85826e57 | ||
![]() |
080acf7771 | ||
![]() |
bb29896793 | ||
![]() |
52fca28c3b | ||
![]() |
beaf86bd02 | ||
![]() |
d647ef0c80 | ||
![]() |
08a110ca87 | ||
![]() |
215db2935b | ||
![]() |
f1b04f803e | ||
![]() |
6ee1cb5740 | ||
![]() |
b263f8ffe7 | ||
![]() |
6ca11f7157 | ||
![]() |
a2841d92c3 | ||
![]() |
30f680ee0a | ||
![]() |
07bc24973b | ||
![]() |
d67d407239 | ||
![]() |
3fe9e7be4c | ||
![]() |
63795fe5b9 | ||
![]() |
d2bad216f7 | ||
![]() |
d04fb11868 | ||
![]() |
e8f2823f06 | ||
![]() |
511398031c | ||
![]() |
c2c4cee866 | ||
![]() |
cc0acdbd68 | ||
![]() |
f155e01ab0 | ||
![]() |
f888331769 | ||
![]() |
424b929b5c | ||
![]() |
6dfa70f272 | ||
![]() |
b73b36bfa5 | ||
![]() |
3e892b2bcd | ||
![]() |
38e2aa3759 | ||
![]() |
1506ea947d | ||
![]() |
2f0f937577 | ||
![]() |
1aa153d644 | ||
![]() |
50a4d5cfc6 | ||
![]() |
7c0c97cc05 | ||
![]() |
6f78c70324 | ||
![]() |
0744daa887 | ||
![]() |
ab1e431288 | ||
![]() |
b140b51ebb | ||
![]() |
2e3c1699ae | ||
![]() |
e3601ceeb8 | ||
![]() |
9bff8cfc91 | ||
![]() |
554d819062 | ||
![]() |
749b1f1359 | ||
![]() |
5caf039ba2 | ||
![]() |
f4dec0dba0 | ||
![]() |
8fc9bd0d32 | ||
![]() |
45c7f3997e | ||
![]() |
c82a288f87 | ||
![]() |
1fa35e4352 | ||
![]() |
949057c958 | ||
![]() |
f9f34cb998 | ||
![]() |
7444cf9a9c | ||
![]() |
585047bb7d | ||
![]() |
aaaf7261b7 | ||
![]() |
8495c6086d | ||
![]() |
6e51e746c4 | ||
![]() |
d2a0624296 | ||
![]() |
8f3caf52fc | ||
![]() |
300d489ac9 | ||
![]() |
3e07a056a8 | ||
![]() |
ce1059d5c9 | ||
![]() |
4adad5a19a | ||
![]() |
a59f85d106 | ||
![]() |
350dd85345 | ||
![]() |
e356f6c55d | ||
![]() |
de9e0386b2 | ||
![]() |
3526ab891c | ||
![]() |
1019b7c4ed | ||
![]() |
2346f2b5db | ||
![]() |
dad7f15567 | ||
![]() |
d4f44b66d3 | ||
![]() |
b9f3912a65 | ||
![]() |
7dfccac20c | ||
![]() |
051aadeed1 | ||
![]() |
04361427e6 | ||
![]() |
fb1a98ec5b | ||
![]() |
cb7b1a2dfb | ||
![]() |
7b6aae23e1 | ||
![]() |
4d6c515284 | ||
![]() |
dc4b2e7d33 | ||
![]() |
e32eddaa51 | ||
![]() |
ddad093972 | ||
![]() |
1b5ec6a0c3 | ||
![]() |
fccd85b9f3 | ||
![]() |
b3d6543caf | ||
![]() |
0625a38066 | ||
![]() |
fca76dc61e | ||
![]() |
2bfd4ff16d | ||
![]() |
4f49c39a2f | ||
![]() |
f6ff1cb1ba | ||
![]() |
24e81a0a8d | ||
![]() |
54ca4dd43b | ||
![]() |
4a5cc34b46 | ||
![]() |
b0bfd09f88 | ||
![]() |
a9f3bb14ba | ||
![]() |
7e4a4bda0e | ||
![]() |
aade9884e9 | ||
![]() |
4728cdd880 | ||
![]() |
b09ea25fec | ||
![]() |
13c90bc9a3 | ||
![]() |
593aaee953 | ||
![]() |
8fc6a70c21 | ||
![]() |
7cb66ebc0b | ||
![]() |
11cd727fbd | ||
![]() |
f5ddce0753 | ||
![]() |
980a5b01fd | ||
![]() |
32cb6c1fe2 | ||
![]() |
2450ca0f33 | ||
![]() |
c1b663bc92 | ||
![]() |
50a35f0d2e | ||
![]() |
331b1f7d81 | ||
![]() |
e298b2f5d6 | ||
![]() |
5abcc8e1a0 | ||
![]() |
e35fb5add4 | ||
![]() |
ba29746feb | ||
![]() |
f2f6d45dbd | ||
![]() |
76a99d467f | ||
![]() |
d2163f5e28 | ||
![]() |
a5cbff22b2 | ||
![]() |
2076095549 | ||
![]() |
05dd5368a9 | ||
![]() |
7caacc50ae | ||
![]() |
cb0524f7a0 | ||
![]() |
9f498f4e6f | ||
![]() |
a6af4bf64d | ||
![]() |
5a22877e9d | ||
![]() |
201a511bb9 | ||
![]() |
b4231b4fed | ||
![]() |
18e70006e7 | ||
![]() |
f0c0ae37c6 | ||
![]() |
6ea69a8ffa | ||
![]() |
66d02d3ca6 | ||
![]() |
b1cf83b3d4 | ||
![]() |
746095bc29 | ||
![]() |
4042c8eee1 | ||
![]() |
67a7695c14 | ||
![]() |
580e81fca5 | ||
![]() |
c18a3b3e8e | ||
![]() |
b07dc81a9e | ||
![]() |
2ba58bec20 | ||
![]() |
11a39bdf53 | ||
![]() |
ea97859c8c | ||
![]() |
9a07c15f48 | ||
![]() |
02dc75f218 | ||
![]() |
b977b287f6 | ||
![]() |
6af2930222 | ||
![]() |
14d2006ca6 | ||
![]() |
d456baafb6 | ||
![]() |
8bc52dbd9d | ||
![]() |
86dfcfd0e3 | ||
![]() |
f0e51be8d0 | ||
![]() |
76a8cb9d7b | ||
![]() |
1467780772 | ||
![]() |
6380f2e367 | ||
![]() |
c9a5497a0b | ||
![]() |
3c19744218 | ||
![]() |
96602f4e34 | ||
![]() |
30cac8313a | ||
![]() |
cdd0ad7be1 | ||
![]() |
e348a81a66 | ||
![]() |
e8a2f8cc12 | ||
![]() |
43b769b0c4 | ||
![]() |
3f0c76e262 | ||
![]() |
f47751a56c | ||
![]() |
79593096c4 | ||
![]() |
41e1354c10 | ||
![]() |
45ce880a9b | ||
![]() |
58b68e4fde | ||
![]() |
b16699f2da | ||
![]() |
b6543421f5 | ||
![]() |
12640e4cbb | ||
![]() |
b0352b1997 | ||
![]() |
c5f43c8888 | ||
![]() |
3dca5a5c41 | ||
![]() |
dd35d451fb | ||
![]() |
90b2f31367 | ||
![]() |
ca2160b5b3 | ||
![]() |
4ddb3a6df0 | ||
![]() |
853c1fb668 | ||
![]() |
44e95a017c | ||
![]() |
fb2de3c4d1 | ||
![]() |
1013d8dd69 | ||
![]() |
4260490229 | ||
![]() |
96d2178325 | ||
![]() |
c0d18cc085 | ||
![]() |
882fb53cb7 | ||
![]() |
00aa2ebb1c | ||
![]() |
887d85fdcc | ||
![]() |
ecb7f1dd52 | ||
![]() |
c939eea107 | ||
![]() |
eb706575ba | ||
![]() |
3d40ba3d81 | ||
![]() |
4bebce0617 | ||
![]() |
481cbc5ad5 | ||
![]() |
a3329a09f9 | ||
![]() |
369380e1c4 | ||
![]() |
747cd9560c | ||
![]() |
304089aca7 | ||
![]() |
11db644a8e | ||
![]() |
94f60b6544 | ||
![]() |
b6c9266722 | ||
![]() |
afe23e430e | ||
![]() |
cabcd8ff66 | ||
![]() |
4f3e2f107b | ||
![]() |
32c712f143 | ||
![]() |
427bcdf035 | ||
![]() |
b7d5e016a3 | ||
![]() |
3574d34aca | ||
![]() |
6928ea7eb0 | ||
![]() |
e7f3b507a3 | ||
![]() |
97bb456b6b | ||
![]() |
74c81106d2 | ||
![]() |
7916053ced | ||
![]() |
0014541e9a | ||
![]() |
2d7cec14be | ||
![]() |
bddc592001 | ||
![]() |
a0941c8a2b | ||
![]() |
c2829dc925 | ||
![]() |
51748b6377 | ||
![]() |
82e0cb360a | ||
![]() |
65f05eff0a | ||
![]() |
96ce6d6f11 | ||
![]() |
11aab8d6cb | ||
![]() |
81a663f49e | ||
![]() |
60dbed6067 | ||
![]() |
fb33bff990 | ||
![]() |
3bb2297351 | ||
![]() |
c1df467d73 | ||
![]() |
9c712d0b16 | ||
![]() |
609d5db803 | ||
![]() |
4b1f5e5090 | ||
![]() |
3eba0a9190 | ||
![]() |
edd0dc854d | ||
![]() |
6afd726b7b | ||
![]() |
f929ab0569 | ||
![]() |
1e81b185ae | ||
![]() |
efd26bedec | ||
![]() |
835f798c7d | ||
![]() |
a6a27fede9 | ||
![]() |
7c371754fb | ||
![]() |
6baeadd110 | ||
![]() |
7ccb847f0f | ||
![]() |
d3a22491c7 | ||
![]() |
33fefdb449 | ||
![]() |
6c1ee1a114 | ||
![]() |
595c63357c | ||
![]() |
012062cfd5 | ||
![]() |
2fd87a3d78 | ||
![]() |
8b6cbc3c33 | ||
![]() |
fce8817a01 | ||
![]() |
7ce6c021dc | ||
![]() |
c6c345ea92 | ||
![]() |
37bfeca78c | ||
![]() |
10d96d8d66 | ||
![]() |
552bc42df4 | ||
![]() |
b869eea7ea | ||
![]() |
998c9f15d1 | ||
![]() |
5c7899a483 | ||
![]() |
58d380f9a7 | ||
![]() |
6c36b3afe7 | ||
![]() |
638eec2ac3 | ||
![]() |
7c10e32ae5 | ||
![]() |
ec33df6045 | ||
![]() |
117bc8e6ff | ||
![]() |
d4de6d4fad | ||
![]() |
65b284a4ae | ||
![]() |
a3aaaec891 | ||
![]() |
4ba45c189c | ||
![]() |
b634c12cb9 | ||
![]() |
8d403d9c89 | ||
![]() |
de7b08cbc1 | ||
![]() |
87988d6569 | ||
![]() |
93f29948e4 | ||
![]() |
0528226a05 | ||
![]() |
e070d0a5ca | ||
![]() |
ab059f0aa8 | ||
![]() |
dffbac0956 | ||
![]() |
7cdef77b50 | ||
![]() |
69849a2d6e | ||
![]() |
d92550d191 | ||
![]() |
7b59217b60 | ||
![]() |
ed488d1535 | ||
![]() |
986ec3417a | ||
![]() |
1d7544b752 | ||
![]() |
af5ec18225 | ||
![]() |
0de0c75ebb | ||
![]() |
082d52354f | ||
![]() |
b8e4c11d93 | ||
![]() |
c8571c61ec | ||
![]() |
097bf149c9 | ||
![]() |
ad1b571b26 | ||
![]() |
e260c8180e | ||
![]() |
a8db787932 | ||
![]() |
a90364d001 | ||
![]() |
1110a030c7 | ||
![]() |
314c198413 | ||
![]() |
9f97f7c546 | ||
![]() |
f01a1281ee | ||
![]() |
313d75cd43 | ||
![]() |
69a5cd9fea | ||
![]() |
2ba4577809 | ||
![]() |
ed8e6d535c | ||
![]() |
e8049af132 | ||
![]() |
353240541d | ||
![]() |
ec14f53dbd | ||
![]() |
14e3025518 | ||
![]() |
8fcd9386ec | ||
![]() |
30e50c5027 | ||
![]() |
c85e0ca68a | ||
![]() |
481a366749 | ||
![]() |
8ddc32629a | ||
![]() |
aa51b0492b | ||
![]() |
159a06dfc8 | ||
![]() |
4e629ef80e | ||
![]() |
cf24e10a09 | ||
![]() |
a0f3db8f60 | ||
![]() |
9f7a2ecb29 | ||
![]() |
db68ef898a | ||
![]() |
cc3e88a2b9 | ||
![]() |
fa3a5dd4de | ||
![]() |
0f789322ef | ||
![]() |
a539f1cbbd | ||
![]() |
93c04e095d | ||
![]() |
019d3fccc4 | ||
![]() |
7e38903b5c | ||
![]() |
7601f9412a | ||
![]() |
a8c104a511 | ||
![]() |
afbd4b7e09 | ||
![]() |
e3212bfd14 | ||
![]() |
1e519b9d40 | ||
![]() |
72199e1041 | ||
![]() |
428b0578c6 | ||
![]() |
8bf3bf69ad | ||
![]() |
9f61d6d8fb | ||
![]() |
0a52bbdc31 | ||
![]() |
54a51d3840 | ||
![]() |
a8592db9bb | ||
![]() |
0081a14e7d | ||
![]() |
7cafdfe9c7 | ||
![]() |
298b3b6c1f | ||
![]() |
9ffac3d00d | ||
![]() |
113229922a | ||
![]() |
b097d1765b | ||
![]() |
980aa2ae35 | ||
![]() |
17cbc6457b | ||
![]() |
5195512add | ||
![]() |
cde2de4a05 | ||
![]() |
e6ffe7bcfc | ||
![]() |
2278146a0c | ||
![]() |
b703322059 | ||
![]() |
45bed0ab30 | ||
![]() |
c97870d1a1 | ||
![]() |
e20ff251a6 | ||
![]() |
da7d839a0d | ||
![]() |
3187fa14a3 | ||
![]() |
14ca0aa69b | ||
![]() |
cf6090dc62 | ||
![]() |
ed53cc217f | ||
![]() |
3505b19652 | ||
![]() |
09182b3224 | ||
![]() |
d1b1c3bb5e | ||
![]() |
223c374a9d | ||
![]() |
99867fc0c4 | ||
![]() |
fddea3f074 | ||
![]() |
d6711ee648 | ||
![]() |
744f15b6b3 | ||
![]() |
9f617a14a0 | ||
![]() |
52b81ff463 | ||
![]() |
bf10f09bcc | ||
![]() |
2c0454cd20 | ||
![]() |
9a162146ca | ||
![]() |
ba47d519e5 | ||
![]() |
11512d70fa | ||
![]() |
7b3de03c8f | ||
![]() |
31b7ab9f06 | ||
![]() |
59ecd4882d | ||
![]() |
8f2634f970 | ||
![]() |
9eda4e8bd7 | ||
![]() |
5ec85c9750 | ||
![]() |
bfffce4d08 | ||
![]() |
6801eb0a09 | ||
![]() |
f4e814f787 | ||
![]() |
c4ac48c5a1 | ||
![]() |
49456a95eb | ||
![]() |
7727345613 | ||
![]() |
d177f27517 | ||
![]() |
788cf6f0c6 | ||
![]() |
3539d6c63a | ||
![]() |
9bcdb98839 | ||
![]() |
cab39afb1a | ||
![]() |
bd87965247 | ||
![]() |
d123d9abef | ||
![]() |
c24be3c4a2 | ||
![]() |
3787495e1f | ||
![]() |
08b94f160a | ||
![]() |
cc1d8c54c1 | ||
![]() |
7e4e45d227 | ||
![]() |
f51c3e3a84 | ||
![]() |
d6efed84b1 | ||
![]() |
61b9ce00a3 | ||
![]() |
78eaaa857e | ||
![]() |
273fc0139e | ||
![]() |
0d0d24af01 | ||
![]() |
d63443b968 | ||
![]() |
07262c7199 | ||
![]() |
84bc45880a | ||
![]() |
43654a22c0 | ||
![]() |
8dca0877e3 | ||
![]() |
59cc081220 | ||
![]() |
ab0742d2f3 | ||
![]() |
9f8cf50e3b | ||
![]() |
f4312352fc | ||
![]() |
2597a842a0 | ||
![]() |
fb1ddcdc8f | ||
![]() |
7117547298 | ||
![]() |
6985ef7813 | ||
![]() |
ddce2b2654 | ||
![]() |
e18d9d90f1 | ||
![]() |
a71fcfad89 | ||
![]() |
329832d779 | ||
![]() |
a973e01501 | ||
![]() |
c218d8218d | ||
![]() |
0f7ca2d778 | ||
![]() |
287602f9d8 | ||
![]() |
97f8c7a03e | ||
![]() |
74be0f82a7 | ||
![]() |
36bce999f5 | ||
![]() |
ce1bb4b75d | ||
![]() |
ced765ceb3 | ||
![]() |
d9e7dc3e16 | ||
![]() |
65cb02e87a | ||
![]() |
a57ece0cb4 | ||
![]() |
80c1cb522c | ||
![]() |
6fac482624 | ||
![]() |
70b8668fb5 | ||
![]() |
5e1832c29c | ||
![]() |
c89afc9acf | ||
![]() |
889cb3ae23 | ||
![]() |
3e41d2e612 | ||
![]() |
499ff6a052 | ||
![]() |
8c6f430291 | ||
![]() |
5a3a83f01d | ||
![]() |
8d7c4cc082 | ||
![]() |
3f2495d98c | ||
![]() |
73e9d4cd6f | ||
![]() |
ca80c65726 | ||
![]() |
adba796eb4 | ||
![]() |
d7594beede | ||
![]() |
9325d88eba | ||
![]() |
24c788f487 | ||
![]() |
24e87f7f42 | ||
![]() |
472f9ed312 | ||
![]() |
1985c2e75c | ||
![]() |
f4c444e17d | ||
![]() |
7acdd3a127 | ||
![]() |
52a2c17ec0 | ||
![]() |
a7a17e3f19 | ||
![]() |
70211539a3 | ||
![]() |
5501971578 | ||
![]() |
65b8b6c476 | ||
![]() |
4d1ff2a489 | ||
![]() |
f87db44685 | ||
![]() |
f75786f3bc | ||
![]() |
25eeff9600 | ||
![]() |
3841f2ae66 | ||
![]() |
64d029de41 | ||
![]() |
d6af706eee | ||
![]() |
4b63bcef90 | ||
![]() |
0dcebb9f63 | ||
![]() |
5ff2b33401 | ||
![]() |
eb2def0ff2 | ||
![]() |
0472c5f8a1 | ||
![]() |
a698efbc9d | ||
![]() |
fd1e4d66f1 | ||
![]() |
87dc8b3af9 | ||
![]() |
d35b94fbab | ||
![]() |
84d173d3de | ||
![]() |
6f1960ab71 | ||
![]() |
1ba7c6ead2 | ||
![]() |
eb16a6d229 | ||
![]() |
aaf82dc0fa | ||
![]() |
94494dab91 | ||
![]() |
d1e750cd51 | ||
![]() |
f73d75384f | ||
![]() |
e4d983e2db | ||
![]() |
444c73583d | ||
![]() |
0026e356d0 | ||
![]() |
e4c9e59a45 | ||
![]() |
454697603e | ||
![]() |
d34ec64a22 | ||
![]() |
5c3c67126f | ||
![]() |
f1e626a357 | ||
![]() |
92a28e9f56 | ||
![]() |
31eaecfee9 | ||
![]() |
12b59e57f3 | ||
![]() |
5f8300afc6 | ||
![]() |
92deb28945 | ||
![]() |
efcf1fcad3 | ||
![]() |
3224a319c0 | ||
![]() |
066d776501 | ||
![]() |
cec59eb63f | ||
![]() |
ec0b08d20b | ||
![]() |
c6a596f626 | ||
![]() |
4917fecf4a | ||
![]() |
a561662fb7 | ||
![]() |
2bf87dcc2d | ||
![]() |
4e70104aba | ||
![]() |
054c506e3d | ||
![]() |
06362ab750 | ||
![]() |
5b220e1e19 | ||
![]() |
f8ab9f2fe3 | ||
![]() |
6d6bd3a3db | ||
![]() |
b7b1bf9166 | ||
![]() |
75bd83d448 | ||
![]() |
8fa695a9e3 | ||
![]() |
350f4be12d | ||
![]() |
dd2b0c1cde | ||
![]() |
7d585bc94c | ||
![]() |
1fd880cef3 | ||
![]() |
bb789016d4 | ||
![]() |
ad1ee5fa75 | ||
![]() |
0ab00a75e4 | ||
![]() |
a7e541c992 | ||
![]() |
4c404611da | ||
![]() |
7c73d21523 | ||
![]() |
ef17a0c7ba | ||
![]() |
5b12b4fc4b | ||
![]() |
1c59419419 | ||
![]() |
403367d5a9 | ||
![]() |
71f33051e5 | ||
![]() |
4213fc5b9e | ||
![]() |
e55e09949e | ||
![]() |
c628627995 | ||
![]() |
91b4ed0918 | ||
![]() |
8dfb8190d7 | ||
![]() |
6a44699746 | ||
![]() |
7a34b7d80f | ||
![]() |
b50173a4dd | ||
![]() |
da9cc22d5b | ||
![]() |
d9432789bd | ||
![]() |
7b588bb691 | ||
![]() |
40a820d6d8 | ||
![]() |
c7d9b473e2 | ||
![]() |
a1599f3f7e | ||
![]() |
5836fe20c6 | ||
![]() |
75837e9add | ||
![]() |
51dd80e751 | ||
![]() |
6622a6cff3 | ||
![]() |
71db2d08b1 | ||
![]() |
4e128ab0b1 | ||
![]() |
ed6d9ce914 | ||
![]() |
305f72aee7 | ||
![]() |
6b1df5544e | ||
![]() |
fe0157a19a | ||
![]() |
efc4fe9d74 | ||
![]() |
cbc808d726 | ||
![]() |
6786848585 | ||
![]() |
9f02a2b224 | ||
![]() |
a32e306be3 | ||
![]() |
9101ef6757 | ||
![]() |
a8689ba872 | ||
![]() |
6552b0558a | ||
![]() |
84ac2f93ca | ||
![]() |
1b168e3bcf | ||
![]() |
296b01d7f9 | ||
![]() |
3ce55d2e32 | ||
![]() |
a7153444df | ||
![]() |
70cd3b8e65 | ||
![]() |
97478ef5fe | ||
![]() |
eaeb61c3a6 | ||
![]() |
164b7ccf21 | ||
![]() |
def03d3439 | ||
![]() |
f50ec59751 | ||
![]() |
28a2107a8d | ||
![]() |
6931d12745 | ||
![]() |
00d2346885 | ||
![]() |
0160fe454c | ||
![]() |
592a854f8c | ||
![]() |
2569227689 | ||
![]() |
849b9d34c7 | ||
![]() |
6f3e15af84 | ||
![]() |
a53a107a2f | ||
![]() |
2e2e6b1be5 | ||
![]() |
94d4f9d405 | ||
![]() |
9988899993 | ||
![]() |
15201e2560 | ||
![]() |
bf7ed956ff | ||
![]() |
77aafadc56 | ||
![]() |
d395895cdb | ||
![]() |
0897d2fdc7 | ||
![]() |
2601a9447e | ||
![]() |
de417982e8 | ||
![]() |
bf6c84d7eb | ||
![]() |
aee99a5d44 | ||
![]() |
86b7821e29 | ||
![]() |
76bf39ab4b | ||
![]() |
debb88776c | ||
![]() |
6b646fb9e2 | ||
![]() |
700bf1fa4e | ||
![]() |
8f83fb9991 | ||
![]() |
47080b6d17 | ||
![]() |
59412e3a07 | ||
![]() |
e1795bc380 | ||
![]() |
2f5bf2f7f2 | ||
![]() |
89616408e3 | ||
![]() |
701e8b42e1 | ||
![]() |
adf8227cf4 | ||
![]() |
db7f1c7c5a | ||
![]() |
6017c98036 | ||
![]() |
4c8bc6fdee | ||
![]() |
0b25261d29 | ||
![]() |
073c074447 | ||
![]() |
8862c49661 | ||
![]() |
eee813eec7 | ||
![]() |
990e2f3555 | ||
![]() |
4e855c11b5 | ||
![]() |
e8c003edd2 | ||
![]() |
b7863c972c | ||
![]() |
b1a44e6bf5 | ||
![]() |
fac292b8cd | ||
![]() |
491c52d3b0 | ||
![]() |
086a541857 | ||
![]() |
60cbd6ad84 | ||
![]() |
bcc5f69b33 | ||
![]() |
e64f0bf2d2 | ||
![]() |
2257165bff | ||
![]() |
f84a1b597c | ||
![]() |
e9abafca27 | ||
![]() |
e96c3b81ca | ||
![]() |
e0d73fda36 | ||
![]() |
d2962e9f89 | ||
![]() |
5420099cab | ||
![]() |
e3dc2c86fc | ||
![]() |
7d03732f7e | ||
![]() |
22a0249deb | ||
![]() |
23dfa00b88 | ||
![]() |
eb9244f202 | ||
![]() |
bb41115d56 | ||
![]() |
71d008ebe4 | ||
![]() |
2a3c36e920 | ||
![]() |
2793b218bd | ||
![]() |
d5fde13bd2 | ||
![]() |
2b9044a6f0 | ||
![]() |
e9cd8f4d20 | ||
![]() |
c1e7fb60d1 | ||
![]() |
2aeeb3ba1f | ||
![]() |
66eacd5580 | ||
![]() |
7fd60d1e7a | ||
![]() |
7fd7aa6b2b | ||
![]() |
01fc6533aa | ||
![]() |
b4d4f8f826 | ||
![]() |
c2a170ac0d | ||
![]() |
05ff1a2c05 | ||
![]() |
c62fea7574 | ||
![]() |
8f6d36b3cb | ||
![]() |
1ef9e83764 | ||
![]() |
d0393d79bc | ||
![]() |
6234058148 | ||
![]() |
3160bdc7f7 | ||
![]() |
b7616f5716 | ||
![]() |
c065f4a0c6 | ||
![]() |
f89d76c103 | ||
![]() |
a238b83b13 | ||
![]() |
ac6b95dbc0 | ||
![]() |
caf5ef852b | ||
![]() |
07d8fa5812 | ||
![]() |
a7e87fef21 | ||
![]() |
e680c731a2 | ||
![]() |
6a463e7fb4 | ||
![]() |
fbc0b86599 | ||
![]() |
9400603140 | ||
![]() |
76aec9e6b4 | ||
![]() |
85aaa4e6d5 | ||
![]() |
f1d6fc7794 | ||
![]() |
e896a5bdd6 | ||
![]() |
2212bff9a2 | ||
![]() |
149c1a26c4 | ||
![]() |
b7f8d3de2c | ||
![]() |
6cdf409884 | ||
![]() |
fee982048e | ||
![]() |
b4d525eb63 | ||
![]() |
9f17685dfb | ||
![]() |
bad81800bb | ||
![]() |
072916d903 | ||
![]() |
4fed019821 | ||
![]() |
7dbc27dc1d | ||
![]() |
ac1e3882cc | ||
![]() |
6a928293dd | ||
![]() |
c6a1ac2dd9 | ||
![]() |
c697c590fb | ||
![]() |
d0f56ca071 | ||
![]() |
2e6fdcb7f3 | ||
![]() |
ee7ee9b1b4 | ||
![]() |
17c6565186 | ||
![]() |
c103c48525 | ||
![]() |
459996325d | ||
![]() |
df507d5aa0 | ||
![]() |
7835c24e19 | ||
![]() |
d73371b58c | ||
![]() |
08b6591cf6 | ||
![]() |
17fef17f67 | ||
![]() |
146e498c9e | ||
![]() |
1d8d21b90a | ||
![]() |
e706fe7640 | ||
![]() |
2b501b553f | ||
![]() |
e6fabd6e9b | ||
![]() |
dd551dc7ff | ||
![]() |
ffa4d4ef0b | ||
![]() |
66627075d9 | ||
![]() |
3fa9692ae2 | ||
![]() |
92be540636 | ||
![]() |
e85bc9df87 | ||
![]() |
dcd984e24d | ||
![]() |
98e42a249e | ||
![]() |
26ffa8eaee | ||
![]() |
956f4087c6 | ||
![]() |
bcc898dd26 | ||
![]() |
81c1657a59 | ||
![]() |
f0e9594819 | ||
![]() |
87efaa97ce | ||
![]() |
cfdb30d2f1 | ||
![]() |
afd62b3f18 | ||
![]() |
f95298c913 | ||
![]() |
7f852962dc | ||
![]() |
f9bd6d61bc | ||
![]() |
293124cae8 | ||
![]() |
229a1e8694 | ||
![]() |
5727d387fb | ||
![]() |
c87f645a75 | ||
![]() |
79d0e164cf | ||
![]() |
96cea6269a | ||
![]() |
f54e01c24e | ||
![]() |
ad99837b63 | ||
![]() |
fa14804c83 | ||
![]() |
713dbe0655 | ||
![]() |
9e052df86d | ||
![]() |
7ab551f9fd | ||
![]() |
b2e059a1ff | ||
![]() |
92a36a6b33 | ||
![]() |
52269f48e8 | ||
![]() |
4da8cdbb91 | ||
![]() |
5735552f1f | ||
![]() |
a80191379b | ||
![]() |
970c7d9b69 | ||
![]() |
42f25fe009 | ||
![]() |
66af2a01d2 | ||
![]() |
a786c8259d | ||
![]() |
03c9f357a4 | ||
![]() |
706208ef47 | ||
![]() |
7db3a46a3d | ||
![]() |
d98e6c5d5d | ||
![]() |
d76675d9c0 | ||
![]() |
62baf5b853 | ||
![]() |
39133efc1b | ||
![]() |
fc19edd8f5 | ||
![]() |
a75a60f686 | ||
![]() |
5bedbc3da2 | ||
![]() |
590c2996ee | ||
![]() |
1af563b5df | ||
![]() |
f0de01856f | ||
![]() |
fcb11ec291 | ||
![]() |
0782fb6bcb | ||
![]() |
bf428bb314 | ||
![]() |
dd200c56c0 | ||
![]() |
ceff29b9ad | ||
![]() |
72555f4a38 | ||
![]() |
37ec7d291e | ||
![]() |
dc315cdb4e | ||
![]() |
467e9d6186 | ||
![]() |
706fcffce1 | ||
![]() |
53f10e0368 | ||
![]() |
a99de9ca2c | ||
![]() |
a0ce85ac7d | ||
![]() |
1c84aad718 | ||
![]() |
04aec74f45 | ||
![]() |
547d64a49a | ||
![]() |
ba3e3311ef | ||
![]() |
6f622e5fcb | ||
![]() |
bcbfb95b0e | ||
![]() |
887d8d293f | ||
![]() |
7994c1cd76 | ||
![]() |
91244073fd | ||
![]() |
ff9a154157 | ||
![]() |
355121bcb5 | ||
![]() |
f2855eb4d7 | ||
![]() |
a507623bad | ||
![]() |
d38edeee9b | ||
![]() |
4182728c78 | ||
![]() |
6d69503883 | ||
![]() |
58eaa95116 | ||
![]() |
92de445034 | ||
![]() |
8cad746093 | ||
![]() |
9694695a21 | ||
![]() |
80a3a6611f | ||
![]() |
31e0b5d3cb | ||
![]() |
e066f01539 | ||
![]() |
a8d803a320 | ||
![]() |
ccbf370f20 | ||
![]() |
fa38573cd9 | ||
![]() |
02cf0c9e42 | ||
![]() |
3a19405d57 | ||
![]() |
69e7336b8e | ||
![]() |
0c889da8cb | ||
![]() |
e253a9e2b3 | ||
![]() |
73c4f63ba5 | ||
![]() |
88ba821f23 | ||
![]() |
c74b08c5c6 | ||
![]() |
65746bfbae | ||
![]() |
4f91bb0ff0 | ||
![]() |
983109bbd9 | ||
![]() |
d55d8229fb | ||
![]() |
60831f441d | ||
![]() |
a91c5ed008 | ||
![]() |
621d4089a4 | ||
![]() |
8b1e920676 | ||
![]() |
4a4d0258ee | ||
![]() |
25a2060890 | ||
![]() |
63c0b41904 | ||
![]() |
942269fd00 | ||
![]() |
019a28cd63 | ||
![]() |
59ca29a560 | ||
![]() |
4f8cf0dc4e | ||
![]() |
e4a462e3ea | ||
![]() |
259fe7280d | ||
![]() |
c9d982aa11 | ||
![]() |
dc71f19588 | ||
![]() |
664e9e4331 | ||
![]() |
f137876182 | ||
![]() |
1e51af13c7 | ||
![]() |
d554d004a6 | ||
![]() |
f3158c3f29 | ||
![]() |
243236a6f5 | ||
![]() |
772dfd5f6e | ||
![]() |
42ffa226f9 | ||
![]() |
a5c621aa85 | ||
![]() |
e0492311c8 | ||
![]() |
4a73fa19ca | ||
![]() |
0a1ffc5788 | ||
![]() |
2fb8aa9b10 | ||
![]() |
453224f10b | ||
![]() |
c11255ae8b | ||
![]() |
2e5c8b0649 | ||
![]() |
e76f2d1197 | ||
![]() |
4aa80808bc | ||
![]() |
0daa255463 | ||
![]() |
53a11135f2 | ||
![]() |
e36a2f4c52 | ||
![]() |
4b169321b8 | ||
![]() |
c5fca0174d | ||
![]() |
5003b8b9c3 | ||
![]() |
a06c14a48e | ||
![]() |
cab8fc624b | ||
![]() |
2f717be22a | ||
![]() |
a7762384cf | ||
![]() |
77ef9fd1e9 | ||
![]() |
772f7f4edd | ||
![]() |
3b777db132 | ||
![]() |
db0578a0e7 | ||
![]() |
bcb7220d1c | ||
![]() |
54326e0c50 | ||
![]() |
6898c14959 | ||
![]() |
449e3c8515 | ||
![]() |
7f53f11363 | ||
![]() |
3d93ba5622 | ||
![]() |
f285056810 | ||
![]() |
81943a10b5 | ||
![]() |
36284ae981 | ||
![]() |
e3fac20824 | ||
![]() |
932ff70956 | ||
![]() |
42eb9154a8 | ||
![]() |
fbeb634e4d | ||
![]() |
b051a1bbb9 | ||
![]() |
c2ef844aa7 | ||
![]() |
c437765be7 | ||
![]() |
541427ab4d | ||
![]() |
ad91bf854b | ||
![]() |
e97f5bef95 | ||
![]() |
7bb3e70c06 | ||
![]() |
29228dbd24 | ||
![]() |
57e7d9d929 | ||
![]() |
6542e5575f | ||
![]() |
0a7f3af27f | ||
![]() |
d1ce43a3e8 | ||
![]() |
fbd46e2f1c | ||
![]() |
22e9fe06eb | ||
![]() |
a98cadef7f | ||
![]() |
8b1d54ba40 | ||
![]() |
bfb3b2b7a6 | ||
![]() |
d4a9e89b27 | ||
![]() |
706f81a2c2 | ||
![]() |
226b290f9f | ||
![]() |
7215fcf840 | ||
![]() |
ec4f04da1a | ||
![]() |
53abe32409 | ||
![]() |
371cb96414 | ||
![]() |
7cf0865551 | ||
![]() |
5d2cf1ae86 | ||
![]() |
ead22f42f4 | ||
![]() |
9ccb9c8df2 | ||
![]() |
1c0c19f8bd | ||
![]() |
1ace9573dc | ||
![]() |
1a880b2fb8 | ||
![]() |
73bb8f61d4 | ||
![]() |
56f98e340f | ||
![]() |
884f7c975f | ||
![]() |
23480da0aa | ||
![]() |
c0a586d9d5 | ||
![]() |
9a6ca20ef6 | ||
![]() |
036f11bdb5 | ||
![]() |
7295ee7f51 | ||
![]() |
8b395315a5 | ||
![]() |
0a9bab5be6 | ||
![]() |
f6e218a02d | ||
![]() |
bd0f2d316f | ||
![]() |
7df98d8c4d | ||
![]() |
7bdcf5c934 | ||
![]() |
a06fac353c | ||
![]() |
24327706e1 | ||
![]() |
d8520d3ee0 | ||
![]() |
4fbb62a21b | ||
![]() |
ff85334375 | ||
![]() |
aadf5222da | ||
![]() |
165e9df195 | ||
![]() |
065fa66872 | ||
![]() |
859413b66d | ||
![]() |
2904d052b7 | ||
![]() |
937eaba2a1 | ||
![]() |
58e65e44f4 | ||
![]() |
7fb993d338 | ||
![]() |
060e4a9e06 | ||
![]() |
04bc370072 | ||
![]() |
66ae994c54 | ||
![]() |
351b22caae | ||
![]() |
383a04a127 | ||
![]() |
d44b8f0a47 | ||
![]() |
ce8e27e0ed | ||
![]() |
7923aa0fba | ||
![]() |
3c6e220a8c | ||
![]() |
436ced244f | ||
![]() |
183bbc2af1 | ||
![]() |
c508adb223 | ||
![]() |
ef21b3d38e | ||
![]() |
badcd3da81 | ||
![]() |
f753956252 | ||
![]() |
9739255365 | ||
![]() |
8b59ab1af0 | ||
![]() |
ab0f78ea77 | ||
![]() |
02ea384abd | ||
![]() |
629e5e28f7 | ||
![]() |
074bb7515e | ||
![]() |
ce2e858f5b | ||
![]() |
670b7f203a | ||
![]() |
d0de7330b9 | ||
![]() |
6133d65861 | ||
![]() |
373677f958 | ||
![]() |
ca081217cd | ||
![]() |
088875b6b8 | ||
![]() |
09f5b3750f | ||
![]() |
97d2b8d6f5 | ||
![]() |
b6a6459a24 | ||
![]() |
8a4c0866dc | ||
![]() |
01b236b704 | ||
![]() |
601c238854 | ||
![]() |
1bf371b24e | ||
![]() |
c3c96deb5f | ||
![]() |
7288b34585 | ||
![]() |
d445c865f8 | ||
![]() |
54256482cb | ||
![]() |
d0cb6caf69 | ||
![]() |
eac77fcd56 | ||
![]() |
20ec0daaa1 | ||
![]() |
2b6ab3a2bd | ||
![]() |
c75fdee747 | ||
![]() |
bbc5adfb94 | ||
![]() |
a61325798a | ||
![]() |
7e5d75d53f | ||
![]() |
9515d7c629 | ||
![]() |
9eeedf8769 | ||
![]() |
77304cf352 | ||
![]() |
005e81d6cf | ||
![]() |
06a1d1323b | ||
![]() |
1df2f7b6a8 | ||
![]() |
013172ae9f | ||
![]() |
016cca4504 | ||
![]() |
5be7d8597d | ||
![]() |
57f1b1dcc7 | ||
![]() |
11c7155cce | ||
![]() |
eba2233b58 | ||
![]() |
67bc1ba5d7 | ||
![]() |
bc15b5238f | ||
![]() |
ed248e7f70 | ||
![]() |
050d79b6dd | ||
![]() |
c68098ba4a | ||
![]() |
539e72727f | ||
![]() |
4852a88dfb | ||
![]() |
7bdd2ff682 | ||
![]() |
ca6b33b8bd | ||
![]() |
d7e162d46b | ||
![]() |
ae2f048fd7 | ||
![]() |
b435043abb | ||
![]() |
e8581b17a8 | ||
![]() |
dc69247de4 | ||
![]() |
500a0394d5 | ||
![]() |
7a4cf67117 | ||
![]() |
5f08b417b4 | ||
![]() |
cd714afe81 | ||
![]() |
3ad0460831 | ||
![]() |
c4d63cd230 | ||
![]() |
e9bb45ba79 | ||
![]() |
560b0253ff | ||
![]() |
062b9f2cdb | ||
![]() |
37822a566f | ||
![]() |
44071b0d25 | ||
![]() |
713157484a | ||
![]() |
627c044f50 | ||
![]() |
fa0506e413 | ||
![]() |
4ec1cb2497 | ||
![]() |
7cdb3b2b79 | ||
![]() |
135ea609ce | ||
![]() |
c933f2c4cc | ||
![]() |
135b1a3f2c | ||
![]() |
ab7c67905d | ||
![]() |
e621e6cac6 | ||
![]() |
dac096cf39 | ||
![]() |
7f1543d46c | ||
![]() |
c7168d1a22 | ||
![]() |
70f7006eb3 | ||
![]() |
42f3bc4072 | ||
![]() |
78670fbf07 | ||
![]() |
6869612f5c | ||
![]() |
16e6652286 | ||
![]() |
d45ebd4876 | ||
![]() |
c75c594e5a | ||
![]() |
16c66f3151 | ||
![]() |
389380c279 | ||
![]() |
28df1d2411 | ||
![]() |
bb0babd705 | ||
![]() |
b396bbad10 | ||
![]() |
9a436ae30f | ||
![]() |
fc27e7272e | ||
![]() |
79df91bfc4 | ||
![]() |
94c4ad27dc | ||
![]() |
4d2d0595cf | ||
![]() |
265dadbe7d | ||
![]() |
88efc013b1 | ||
![]() |
2c5c7f1089 | ||
![]() |
4927c0a988 | ||
![]() |
2ce53880bf | ||
![]() |
16b7328058 | ||
![]() |
bd499d9af6 | ||
![]() |
4054171666 | ||
![]() |
c05dbb8744 | ||
![]() |
d986c414de | ||
![]() |
5b998dae59 | ||
![]() |
c3ec963d0d | ||
![]() |
81b9bf3192 | ||
![]() |
a9f3f5fadb | ||
![]() |
ce385c869c | ||
![]() |
71e515c180 | ||
![]() |
437da3e349 | ||
![]() |
ec59f027ac | ||
![]() |
dc021a0218 | ||
![]() |
08b597b1f8 | ||
![]() |
110420aac0 | ||
![]() |
819bb3e81c | ||
![]() |
c39059bea3 | ||
![]() |
b31d76e45f | ||
![]() |
e59ce54412 | ||
![]() |
4de8b60684 | ||
![]() |
9a8a18a2e9 | ||
![]() |
02e3e3ea51 | ||
![]() |
e2842cfe76 | ||
![]() |
9f99a5f1d0 | ||
![]() |
73b7a360d8 | ||
![]() |
729479a199 | ||
![]() |
950a4f8326 | ||
![]() |
28f31e78eb | ||
![]() |
9ce64ba111 | ||
![]() |
b53bdae11f | ||
![]() |
d84abf35c0 | ||
![]() |
cb169126c5 | ||
![]() |
a7bb22c5aa | ||
![]() |
d9ddbaa924 | ||
![]() |
d13a731fc1 | ||
![]() |
ba80b8d29b | ||
![]() |
7a4a5515b0 | ||
![]() |
8da1defe69 | ||
![]() |
5e55c7e1bc | ||
![]() |
7bdbd2653f | ||
![]() |
776647360d | ||
![]() |
6da96a9fc9 | ||
![]() |
80acedae3e | ||
![]() |
54cba3f53e | ||
![]() |
1a583c0c60 | ||
![]() |
5dcc201505 | ||
![]() |
85cabb8d00 | ||
![]() |
d5ee3580d8 | ||
![]() |
6532a1a828 | ||
![]() |
e9f7c7aef9 | ||
![]() |
76899be113 | ||
![]() |
a86d527c8b | ||
![]() |
69c7aad494 | ||
![]() |
e1e3ec9b02 | ||
![]() |
d6e1d37100 | ||
![]() |
fdb20db642 | ||
![]() |
ee88a2080e | ||
![]() |
0e70266bbf | ||
![]() |
ffa0b510cd | ||
![]() |
d249e6828e | ||
![]() |
2897447ddf | ||
![]() |
097bf834ba | ||
![]() |
4b0fa45b84 | ||
![]() |
521f569734 | ||
![]() |
e0a2e60c0a | ||
![]() |
42d326353c | ||
![]() |
f6ed5df9c0 | ||
![]() |
cff61d595e | ||
![]() |
29119aff6c | ||
![]() |
2dbda9378c | ||
![]() |
0f70131089 | ||
![]() |
5dcd43cd86 | ||
![]() |
913fa85a2c | ||
![]() |
9e0b29911f | ||
![]() |
b4edbe9a0e | ||
![]() |
8b0dd4942a | ||
![]() |
b4987f7219 | ||
![]() |
c0de9159a7 | ||
![]() |
24af1aa0f7 | ||
![]() |
746ad4e0df | ||
![]() |
cb44b21da1 | ||
![]() |
cb8cb85da7 | ||
![]() |
0035783488 | ||
![]() |
d13effb0b4 | ||
![]() |
cd4497d8c5 | ||
![]() |
7e18a727d2 | ||
![]() |
fe67f3fbb5 | ||
![]() |
277e5ca617 | ||
![]() |
95a2d705cd | ||
![]() |
d5ba19e611 | ||
![]() |
cd3c85ac5c | ||
![]() |
b64808e9dd | ||
![]() |
c67cf84628 | ||
![]() |
7809c26006 | ||
![]() |
c27adb37ef | ||
![]() |
4c735ee0e3 | ||
![]() |
c527c14d63 | ||
![]() |
5a272190a0 | ||
![]() |
5edad2c4a1 | ||
![]() |
87552d54d3 | ||
![]() |
5c22e8e4ad | ||
![]() |
162cffca80 | ||
![]() |
3a2d1465c8 | ||
![]() |
6be71e9955 | ||
![]() |
d6676a1605 | ||
![]() |
8e2976860f | ||
![]() |
099aff5c42 | ||
![]() |
1d12df1ad7 | ||
![]() |
16c6795465 | ||
![]() |
36fbe3c789 | ||
![]() |
a65c0a3fe8 | ||
![]() |
2d60444331 | ||
![]() |
dca22ab055 | ||
![]() |
ad516dd271 | ||
![]() |
f46e876027 | ||
![]() |
526bd7bdfa | ||
![]() |
3d38c99041 | ||
![]() |
b6a8c5245f | ||
![]() |
5acad50056 | ||
![]() |
a578b0407d | ||
![]() |
88f038ac97 | ||
![]() |
e5cb7795fc | ||
![]() |
5fce29ef29 | ||
![]() |
b884599f6a | ||
![]() |
3babbf3bf4 | ||
![]() |
e9ff5df0b5 | ||
![]() |
c23ce454b3 | ||
![]() |
324ff59444 | ||
![]() |
2db953f846 | ||
![]() |
dec87454de | ||
![]() |
f3e886c7df | ||
![]() |
7cd6d61da5 | ||
![]() |
fa6716c66d | ||
![]() |
37a0ac1d82 | ||
![]() |
7da2592f56 | ||
![]() |
57641410d1 | ||
![]() |
649c666137 | ||
![]() |
a11ef610ee | ||
![]() |
a3f752bcee | ||
![]() |
1b03448385 | ||
![]() |
21dfabfa64 | ||
![]() |
adff0a8166 | ||
![]() |
9bc0410e4f | ||
![]() |
ea6178fff8 | ||
![]() |
aa1d096d02 | ||
![]() |
8156e036e5 | ||
![]() |
b67a0e99ee | ||
![]() |
f00bb086cb | ||
![]() |
faafd1e4f1 | ||
![]() |
14b4e64eab | ||
![]() |
13a72d9b08 |
2
.gitignore
vendored
2
.gitignore
vendored
@@ -39,6 +39,7 @@
|
||||
/doc/examples/avio_reading
|
||||
/doc/examples/decoding_encoding
|
||||
/doc/examples/demuxing_decoding
|
||||
/doc/examples/extract_mvs
|
||||
/doc/examples/filter_audio
|
||||
/doc/examples/filtering_audio
|
||||
/doc/examples/filtering_video
|
||||
@@ -61,6 +62,7 @@
|
||||
/tests/audiogen
|
||||
/tests/base64
|
||||
/tests/data/
|
||||
/tests/pixfmts.mak
|
||||
/tests/rotozoom
|
||||
/tests/tiny_psnr
|
||||
/tests/tiny_ssim
|
||||
|
66
Changelog
66
Changelog
@@ -2,6 +2,69 @@ Entries are sorted chronologically from oldest to youngest within each release,
|
||||
releases are sorted from youngest to oldest.
|
||||
|
||||
version <next>:
|
||||
|
||||
version 2.4.2:
|
||||
- avcodec/on2avc: Check number of channels
|
||||
- avcodec/hevc: fix chroma transform_add size
|
||||
- avcodec/h264: Check mode before considering mixed mode intra prediction
|
||||
- avformat/mpegts: use a padded buffer in read_sl_header()
|
||||
- avformat/mpegts: Check desc_len / get8() return code
|
||||
- avcodec/vorbisdec: Fix off by 1 error in ptns_to_read
|
||||
- sdp: add support for H.261
|
||||
- avcodec/svq3: Do not memcpy AVFrame
|
||||
- avcodec/smc: fix off by 1 error
|
||||
- avcodec/qpeg: fix off by 1 error in MV bounds check
|
||||
- avcodec/gifdec: factorize interleave end handling out
|
||||
- avcodec/cinepak: fix integer underflow
|
||||
- avcodec/pngdec: Check bits per pixel before setting monoblack pixel format
|
||||
- avcodec/pngdec: Calculate MPNG bytewidth more defensively
|
||||
- avcodec/tiff: more completely check bpp/bppcount
|
||||
- avcodec/mmvideo: Bounds check 2nd line of HHV Intra blocks
|
||||
- avcodec/h263dec: Fix decoding messenger.h263
|
||||
- avcodec/utils: Add case for jv to avcodec_align_dimensions2()
|
||||
- avcodec/mjpegdec: check bits per pixel for changes similar to dimensions
|
||||
- avcodec/jpeglsdec: Check run value more completely in ls_decode_line()
|
||||
- avformat/hlsenc: export inner muxer timebase
|
||||
- configure: add noexecstack to linker options if supported.
|
||||
- avcodec/ac3enc_template: fix out of array read
|
||||
- avutil/x86/cpu: fix cpuid sub-leaf selection
|
||||
- avformat/img2dec: enable generic seeking for image pipes
|
||||
- avformat/img2dec: initialize pkt->pos for image pipes
|
||||
- avformat/img2dec: pass error code and signal EOF
|
||||
- avformat/img2dec: fix error code at EOF for pipes
|
||||
- libavutil/opt: fix av_opt_set_channel_layout() to access correct memory address
|
||||
- tests/fate-run.sh: Cat .err file in case of error with V>0
|
||||
- avformat/riffenc: Filter out "BottomUp" in ff_put_bmp_header()
|
||||
- avcodec/webp: fix default palette color 0xff000000 -> 0x00000000
|
||||
- avcodec/asvenc: fix AAN scaling
|
||||
- Fix compile error on arm4/arm5 platform
|
||||
|
||||
|
||||
version 2.4.1:
|
||||
- swscale: Allow chroma samples to be above and to the left of luma samples
|
||||
- avcodec/libilbc: support for latest git of libilbc
|
||||
- avcodec/webp: treat out-of-bound palette index as translucent black
|
||||
- vf_deshake: rename Transform.vector to Transform.vec to avoid compiler confusion
|
||||
- apetag: Fix APE tag size check
|
||||
- tools/crypto_bench: fix build when AV_READ_TIME is unavailable
|
||||
|
||||
|
||||
version 2.4:
|
||||
- Icecast protocol
|
||||
- ported lenscorrection filter from frei0r filter
|
||||
- large optimizations in dctdnoiz to make it usable
|
||||
- ICY metadata are now requested by default with the HTTP protocol
|
||||
- support for using metadata in stream specifiers in fftools
|
||||
- LZMA compression support in TIFF decoder
|
||||
- support for H.261 RTP payload format (RFC 4587)
|
||||
- HEVC/H.265 RTP payload format (draft v6) depacketizer
|
||||
- added codecview filter to visualize information exported by some codecs
|
||||
- Matroska 3D support thorugh side data
|
||||
- HTML generation using texi2html is deprecated in favor of makeinfo/texi2any
|
||||
- silenceremove filter
|
||||
|
||||
|
||||
version 2.3:
|
||||
- AC3 fixed-point decoding
|
||||
- shuffleplanes filter
|
||||
- subfile protocol
|
||||
@@ -24,7 +87,7 @@ version <next>:
|
||||
- libbs2b-based stereo-to-binaural audio filter
|
||||
- libx264 reference frames count limiting depending on level
|
||||
- native Opus decoder
|
||||
- display matrix export and rotation api
|
||||
- display matrix export and rotation API
|
||||
- WebVTT encoder
|
||||
- showcqt multimedia filter
|
||||
- zoompan filter
|
||||
@@ -66,6 +129,7 @@ version 2.2:
|
||||
- libx265 encoder
|
||||
- dejudder filter
|
||||
- Autodetect VDA like all other hardware accelerations
|
||||
- aliases and defaults for Ogg subtypes (opus, spx)
|
||||
|
||||
|
||||
version 2.1:
|
||||
|
@@ -15,6 +15,7 @@ Specifically, the GPL parts of FFmpeg are:
|
||||
- libpostproc
|
||||
- libmpcodecs
|
||||
- optional x86 optimizations in the files
|
||||
libavcodec/x86/flac_dsp_gpl.asm
|
||||
libavcodec/x86/idct_mmx.c
|
||||
- libutvideo encoding/decoding wrappers in
|
||||
libavcodec/libutvideo*.cpp
|
||||
@@ -33,6 +34,7 @@ Specifically, the GPL parts of FFmpeg are:
|
||||
- vf_geq.c
|
||||
- vf_histeq.c
|
||||
- vf_hqdn3d.c
|
||||
- vf_interlace.c
|
||||
- vf_kerndeint.c
|
||||
- vf_mcdeint.c
|
||||
- vf_mp.c
|
||||
|
12
MAINTAINERS
12
MAINTAINERS
@@ -54,7 +54,7 @@ release management Michael Niedermayer
|
||||
Communication
|
||||
=============
|
||||
|
||||
website Robert Swain
|
||||
website Deby Barbara Lepage
|
||||
fate.ffmpeg.org Timothy Gu
|
||||
Trac bug tracker Alexander Strasser, Michael Niedermayer, Carl Eugen Hoyos, Lou Logan
|
||||
mailing lists Michael Niedermayer, Baptiste Coudurier, Lou Logan
|
||||
@@ -319,7 +319,7 @@ libavdevice
|
||||
pulse_audio_enc.c Lukasz Marek
|
||||
qtkit.m Thilo Borgmann
|
||||
sdl Stefano Sabatini
|
||||
v4l2.c Luca Abeni
|
||||
v4l2.c Giorgio Vazzana
|
||||
vfwcap.c Ramiro Polla
|
||||
xv.c Lukasz Marek
|
||||
|
||||
@@ -343,6 +343,7 @@ Filters:
|
||||
af_compand.c Paul B Mahol
|
||||
af_ladspa.c Paul B Mahol
|
||||
af_pan.c Nicolas George
|
||||
af_silenceremove.c Paul B Mahol
|
||||
avf_avectorscope.c Paul B Mahol
|
||||
avf_showcqt.c Muhammad Faiz
|
||||
vf_blend.c Paul B Mahol
|
||||
@@ -353,7 +354,9 @@ Filters:
|
||||
vf_extractplanes.c Paul B Mahol
|
||||
vf_histogram.c Paul B Mahol
|
||||
vf_hqx.c Clément Bœsch
|
||||
vf_idet.c Pascal Massimino
|
||||
vf_il.c Paul B Mahol
|
||||
vf_lenscorrection.c Daniel Oberhoff
|
||||
vf_mergeplanes.c Paul B Mahol
|
||||
vf_psnr.c Paul B Mahol
|
||||
vf_scale.c Michael Niedermayer
|
||||
@@ -458,12 +461,15 @@ Muxers/Demuxers:
|
||||
rmdec.c, rmenc.c Ronald S. Bultje, Kostya Shishkov
|
||||
rtmp* Kostya Shishkov
|
||||
rtp.c, rtpenc.c Martin Storsjo
|
||||
rtpdec_h261.*, rtpenc_h261.* Thomas Volkert
|
||||
rtpdec_hevc.* Thomas Volkert
|
||||
rtpdec_asf.* Ronald S. Bultje
|
||||
rtpenc_mpv.*, rtpenc_aac.* Martin Storsjo
|
||||
rtsp.c Luca Barbato
|
||||
sbgdec.c Nicolas George
|
||||
sdp.c Martin Storsjo
|
||||
segafilm.c Mike Melanson
|
||||
segment.c Stefano Sabatini
|
||||
siff.c Kostya Shishkov
|
||||
smacker.c Kostya Shishkov
|
||||
smjpeg* Paul B Mahol
|
||||
@@ -528,8 +534,8 @@ x86 Michael Niedermayer
|
||||
Releases
|
||||
========
|
||||
|
||||
2.4 Michael Niedermayer
|
||||
2.2 Michael Niedermayer
|
||||
2.1 Michael Niedermayer
|
||||
1.2 Michael Niedermayer
|
||||
|
||||
If you want to maintain an older release, please contact us
|
||||
|
5
Makefile
5
Makefile
@@ -63,7 +63,7 @@ FF_DEP_LIBS := $(DEP_LIBS)
|
||||
all: $(AVPROGS)
|
||||
|
||||
$(TOOLS): %$(EXESUF): %.o $(EXEOBJS)
|
||||
$(LD) $(LDFLAGS) $(LD_O) $^ $(ELIBS)
|
||||
$(LD) $(LDFLAGS) $(LDEXEFLAGS) $(LD_O) $^ $(ELIBS)
|
||||
|
||||
tools/cws2fws$(EXESUF): ELIBS = $(ZLIB)
|
||||
tools/uncoded_frame$(EXESUF): $(FF_DEP_LIBS)
|
||||
@@ -92,6 +92,7 @@ $(foreach V,$(SUBDIR_VARS),$(eval $(call RESET,$(V))))
|
||||
SUBDIR := $(1)/
|
||||
include $(SRC_PATH)/$(1)/Makefile
|
||||
-include $(SRC_PATH)/$(1)/$(ARCH)/Makefile
|
||||
-include $(SRC_PATH)/$(1)/$(INTRINSICS)/Makefile
|
||||
include $(SRC_PATH)/library.mak
|
||||
endef
|
||||
|
||||
@@ -117,7 +118,7 @@ $(PROGS): %$(PROGSSUF)$(EXESUF): %$(PROGSSUF)_g$(EXESUF)
|
||||
$(STRIP) $@
|
||||
|
||||
%$(PROGSSUF)_g$(EXESUF): %.o $(FF_DEP_LIBS)
|
||||
$(LD) $(LDFLAGS) $(LD_O) $(OBJS-$*) $(FF_EXTRALIBS)
|
||||
$(LD) $(LDFLAGS) $(LDEXEFLAGS) $(LD_O) $(OBJS-$*) $(FF_EXTRALIBS)
|
||||
|
||||
OBJDIRS += tools
|
||||
|
||||
|
41
README.md
41
README.md
@@ -1,19 +1,40 @@
|
||||
FFmpeg README
|
||||
=============
|
||||
|
||||
1) Documentation
|
||||
----------------
|
||||
FFmpeg is a collection of libraries and tools to process multimedia content
|
||||
such as audio, video, subtitles and related metadata.
|
||||
|
||||
* Read the documentation in the doc/ directory in git.
|
||||
## Libraries
|
||||
|
||||
You can also view it online at http://ffmpeg.org/documentation.html
|
||||
* `libavcodec` provides implementation of a wider range of codecs.
|
||||
* `libavformat` implements streaming protocols, container formats and basic I/O access.
|
||||
* `libavutil` includes hashers, decompressors and miscellaneous utility functions.
|
||||
* `libavfilter` provides a mean to alter decoded Audio and Video through chain of filters.
|
||||
* `libavdevice` provides an abstraction to access capture and playback devices.
|
||||
* `libswresample` implements audio mixing and resampling routines.
|
||||
* `libswscale` implements color conversion and scaling routines.
|
||||
|
||||
2) Licensing
|
||||
------------
|
||||
## Tools
|
||||
|
||||
* See the LICENSE file.
|
||||
* [ffmpeg](http://ffmpeg.org/ffmpeg.html) is a command line toolbox to
|
||||
manipulate, convert and stream multimedia content.
|
||||
* [ffplay](http://ffmpeg.org/ffplay.html) is a minimalistic multimedia player.
|
||||
* [ffprobe](http://ffmpeg.org/ffprobe.html) is a simple analisys tool to inspect
|
||||
multimedia content.
|
||||
* Additional small tools such as `aviocat`, `ismindex` and `qt-faststart`.
|
||||
|
||||
3) Build and Install
|
||||
--------------------
|
||||
## Documentation
|
||||
|
||||
* See the INSTALL file.
|
||||
The offline documentation is available in the **doc/** directory.
|
||||
|
||||
The online documentation is available in the main [website](http://ffmpeg.org)
|
||||
and in the [wiki](http://trac.ffmpeg.org).
|
||||
|
||||
### Examples
|
||||
|
||||
Conding examples are available in the **doc/example** directory.
|
||||
|
||||
## License
|
||||
|
||||
FFmpeg codebase is mainly LGPL-licensed with optional components licensed under
|
||||
GPL. Please refer to the LICENSE file for detailed information.
|
||||
|
198
RELEASE_NOTES
198
RELEASE_NOTES
@@ -1,175 +1,83 @@
|
||||
┌───────────────────────────────────────────┐
|
||||
│ RELEASE NOTES for FFmpeg 2.3 "Mandelbrot" │
|
||||
└───────────────────────────────────────────┘
|
||||
┌────────────────────────────────────────┐
|
||||
│ RELEASE NOTES for FFmpeg 2.4 "Fresnel" │
|
||||
└────────────────────────────────────────┘
|
||||
|
||||
The FFmpeg Project proudly presents FFmpeg 2.3 "Mandelbrot", a major
|
||||
release with all the great features committed during the three-month period
|
||||
since the release of FFmpeg 2.2.
|
||||
The FFmpeg Project proudly presents FFmpeg 2.4 "Fresnel", just 2 months
|
||||
after the release of 2.3. Since this wasn't a long time ago, the Changelog
|
||||
is a bit short this time.
|
||||
|
||||
In this release, there are lots of internal overhauls that make FFmpeg a
|
||||
more accessible project for new developers. Many important new features
|
||||
like QTKit and AVFoundation input devices are committed. Contributions done
|
||||
by Libav such as a new native Opus decoder are also merged.
|
||||
The most important thing in this release is the major version bump of the
|
||||
libraries. This means that this release is neither ABI-compatible nor
|
||||
fully API-compatible. But on the other hand it is aligned with the Libav
|
||||
11 release series, and will as a result probably end up being maintained for
|
||||
a long time.
|
||||
|
||||
Because of the increasing difficulty to maintain and lack of maintainers,
|
||||
we are very sorry to say that we have removed all Blackfin and SPARC
|
||||
architecture assembly optimizations with the cleanups done. If you are
|
||||
interested in maintaining optimization for these two architecture, feel
|
||||
free to contact us and we will restore the code!
|
||||
|
||||
Since this release, the traditional Changelog file is upgraded to this
|
||||
modern-looking release note. Old changelogs are moved to doc/Changelog.old.
|
||||
|
||||
Enjoy!
|
||||
As usual, if you have any question on this release or any FFmpeg related
|
||||
topic, feel free to join us on the #ffmpeg IRC channel (on
|
||||
irc.freenode.net).
|
||||
|
||||
┌────────────────────────────┐
|
||||
│ * API Information │
|
||||
│ 🔨 API Information │
|
||||
└────────────────────────────┘
|
||||
|
||||
FFmpeg 2.3 is completely source-compatible to the FFmpeg 2.2 series. There
|
||||
are however some API deprecations that you need to take care of. Use `git
|
||||
diff n2.2 n2.3 doc/APIchanges` to show the list of added and deprecated
|
||||
APIs. FFmpeg 2.3 includes the following library versions:
|
||||
FFmpeg 2.4 includes the following library versions:
|
||||
|
||||
• libavutil 52.92.100
|
||||
• libavcodec 55.69.100
|
||||
• libavformat 55.47.100
|
||||
• libavdevice 55.13.102
|
||||
• libavfilter 4.10.100
|
||||
• libswscale 2. 6.100
|
||||
• libswresample 0.19.100
|
||||
• libpostproc 52. 3.100
|
||||
• libavutil 54.7.100
|
||||
• libavcodec 56.1.100
|
||||
• libavformat 56.4.101
|
||||
• libavdevice 56.0.100
|
||||
• libavfilter 5.1.100
|
||||
• libswscale 3.0.100
|
||||
• libswresample 1.1.100
|
||||
• libpostproc 53.0.100
|
||||
|
||||
Please refer to the doc/APIChanges file for more information.
|
||||
Important API changes since 2.3:
|
||||
|
||||
┌────────────────────────────┐
|
||||
│ New Optimization │
|
||||
└────────────────────────────┘
|
||||
• The new field mime_type was added to AVProbeData, which can
|
||||
cause crashes, if it is not initialized.
|
||||
• Some deprecated functions were removed.
|
||||
• The avfilter_graph_parse function was made compatible with Libav.
|
||||
• The Matroska demuxer now outputs verbatim ASS packets.
|
||||
|
||||
We are excited to announce that we have committed new x86 assembly
|
||||
optimization for HEVC, and FFmpeg's audio resampler libswresample. ARM
|
||||
users will get a boost in MLP/TrueHD decoding thanks to new optimization.
|
||||
Decoding Huffyuv also got a major boost from optimization on the C code.
|
||||
|
||||
Of special interest for Microsoft Visual Studio users, we have also
|
||||
converted some preexisting x86 assembly to NASM/Yasm format compatible
|
||||
with MSVC setup, especially in the area of audio resampling.
|
||||
|
||||
Another major feature in this release is the introduction of AArch64
|
||||
(ARMv8) assembly optimization. AArch64 is another name for the first
|
||||
64-bit ARM architecture, used by Apple A7 SoC inside iPhone 5S. Some
|
||||
32-bit ARM assembly has already been ported to AArch64, but more work is
|
||||
underway.
|
||||
|
||||
┌────────────────────────────┐
|
||||
│ Native Opus decoder │
|
||||
└────────────────────────────┘
|
||||
|
||||
Opus is an open audio format jointly developed by Xiph.Org, Mozilla,
|
||||
Skype/Microsoft, and Broadcom. It combines the features of the Skype Cilk
|
||||
speech codec and the Xiph.Org CELT music codec into one low-latency
|
||||
codec. Decoding Opus is already possible since FFmpeg 1.0 using the
|
||||
libopus library, but the new Opus native decoder brings a higher level of
|
||||
stability and speed.
|
||||
|
||||
┌────────────────────────────┐
|
||||
│ QTKit and AVFoundation │
|
||||
└────────────────────────────┘
|
||||
|
||||
For OS X users, the new QTKit and AVFoundation devices allow you to use
|
||||
the integrated camera on Macs. AVFoundation is a newer API only available
|
||||
on OS X 10.7 "Lion" or newer. For users with older OS X systems, the
|
||||
QTKit device using the older OS X API is for you.
|
||||
|
||||
┌────────────────────────────┐
|
||||
│ API Additions │
|
||||
└────────────────────────────┘
|
||||
|
||||
In this release, stream side data are introduced as AVStream.side_data as
|
||||
a way to store miscellaneous stream-wide information. The format is
|
||||
similar to the previously anonymous structure AVPacket.side_data (now
|
||||
named as AVPacketSideData). With this change, audio ReplayGain
|
||||
information and video rotation matrix are now exported through this API,
|
||||
if available in the demuxer.
|
||||
|
||||
We also have improved libswresample's Doxygen API documentation, so new
|
||||
developers wishing to use FFmpeg's excellent libraries can get started
|
||||
more easily and faster.
|
||||
|
||||
┌────────────────────────────┐
|
||||
│ Last But Not Least │
|
||||
└────────────────────────────┘
|
||||
|
||||
Other interesting new features including hqx video filter, a pixel art
|
||||
scaling filter; a fixed-point AC-3 decoder contributed by Imagination
|
||||
Technologies; an On2 TrueMotion VP7 video decoder; an HTML5 WebVTT
|
||||
subtitle decoder that allows creation of WebVTT from any text-based
|
||||
subtitles; and an 1-bit Direct Stream Digital audio decoder.
|
||||
Please refer to the doc/APIchanges file for more information.
|
||||
|
||||
┌────────────────────────────┐
|
||||
│ ★ List of New Features │
|
||||
└────────────────────────────┘
|
||||
|
||||
┌────────────────────────────┐
|
||||
│ Command line tools │
|
||||
└────────────────────────────┘
|
||||
|
||||
• Support for decoding through DXVA2 in ffmpeg
|
||||
|
||||
┌────────────────────────────┐
|
||||
│ libavcodec │
|
||||
└────────────────────────────┘
|
||||
|
||||
• AC3 fixed-point decoding
|
||||
• VP7 video decoder
|
||||
• Alias PIX image encoder and decoder
|
||||
• Improvements to the BRender PIX image decoder
|
||||
• Improvements to the XBM decoder
|
||||
• Improvements to OpenEXR image decoder
|
||||
• Support decoding 16-bit RLE SGI images
|
||||
• Direct Stream Digital (DSD) decoder
|
||||
• On2 AVC (Audio for Video) decoder
|
||||
• Native Opus decoder
|
||||
• WebVTT encoder
|
||||
|
||||
┌────────────────────────────┐
|
||||
│ libavdevice │
|
||||
└────────────────────────────┘
|
||||
|
||||
• QTKit input device
|
||||
• GDI screen grabbing for Windows
|
||||
• AVFoundation input device
|
||||
|
||||
┌────────────────────────────┐
|
||||
│ libavformat │
|
||||
└────────────────────────────┘
|
||||
|
||||
• subfile protocol
|
||||
• Phantom Cine demuxer
|
||||
• Alternative rendition support for HTTP Live Streaming
|
||||
• Magic Lantern Video (MLV) demuxer
|
||||
• Image format auto-detection
|
||||
• LRC lyric file demuxer and muxer
|
||||
• Samba protocol (via libsmbclient)
|
||||
• WebM DASH Manifest muxer
|
||||
• Icecast protocol.
|
||||
• API for live metadata updates through event flags.
|
||||
• UTF-16 support in text subtitles formats.
|
||||
• The ASS muxer now reorders the Dialogue events properly.
|
||||
• support for H.261 RTP payload format (RFC 4587)
|
||||
• HEVC/H.265 RTP payload format (draft v6) depacketizer
|
||||
|
||||
┌────────────────────────────┐
|
||||
│ libavfilter │
|
||||
└────────────────────────────┘
|
||||
|
||||
• shuffleplanes filter
|
||||
• libbs2b-based stereo-to-binaural audio filter
|
||||
• showcqt multimedia filter
|
||||
• zoompan filter
|
||||
• signalstats filter
|
||||
• hqx filter (hq2x, hq3x, hq4x)
|
||||
• flanger filter
|
||||
• libfribidi support in drawtext
|
||||
• Ported lenscorrection filter from frei0r filter.
|
||||
• Large optimizations in dctdnoiz to make it usable.
|
||||
• Added codecview filter to visualize information exported by some codecs.
|
||||
• Added silenceremove filter.
|
||||
|
||||
┌────────────────────────────┐
|
||||
│ libavutil │
|
||||
└────────────────────────────┘
|
||||
|
||||
• Added clip() function in eval.
|
||||
|
||||
┌────────────────────────────┐
|
||||
│ ⚠ Behaviour changes │
|
||||
└────────────────────────────┘
|
||||
|
||||
• libx264 reference frames count is now limited depending on level chosen
|
||||
• Because of the new image format auto-detection feature, you don't need to
|
||||
specify image format when decoding an image with no extension.
|
||||
• dctdnoiz filter now uses a block size of 8x8 instead of 16x16 by default
|
||||
• -vismv option is deprecated in favor of the codecview filter
|
||||
• libmodplug is now detected through pkg-config
|
||||
• HTML documentation generation through texi2html is deprecated in
|
||||
favor of makeinfo/texi2any
|
||||
• ICY metadata are now requested by default with the HTTP protocol
|
||||
|
20
cmdutils.c
20
cmdutils.c
@@ -166,7 +166,7 @@ void show_help_options(const OptionDef *options, const char *msg, int req_flags,
|
||||
int first;
|
||||
|
||||
first = 1;
|
||||
for (po = options; po->name != NULL; po++) {
|
||||
for (po = options; po->name; po++) {
|
||||
char buf[64];
|
||||
|
||||
if (((po->flags & req_flags) != req_flags) ||
|
||||
@@ -205,7 +205,7 @@ static const OptionDef *find_option(const OptionDef *po, const char *name)
|
||||
const char *p = strchr(name, ':');
|
||||
int len = p ? p - name : strlen(name);
|
||||
|
||||
while (po->name != NULL) {
|
||||
while (po->name) {
|
||||
if (!strncmp(name, po->name, len) && strlen(po->name) == len)
|
||||
break;
|
||||
po++;
|
||||
@@ -254,7 +254,7 @@ static void prepare_app_arguments(int *argc_ptr, char ***argv_ptr)
|
||||
|
||||
win32_argv_utf8 = av_mallocz(sizeof(char *) * (win32_argc + 1) + buffsize);
|
||||
argstr_flat = (char *)win32_argv_utf8 + sizeof(char *) * (win32_argc + 1);
|
||||
if (win32_argv_utf8 == NULL) {
|
||||
if (!win32_argv_utf8) {
|
||||
LocalFree(argv_w);
|
||||
return;
|
||||
}
|
||||
@@ -1242,7 +1242,7 @@ static int show_formats_devices(void *optctx, const char *opt, const char *arg,
|
||||
is_dev = is_device(ofmt->priv_class);
|
||||
if (!is_dev && device_only)
|
||||
continue;
|
||||
if ((name == NULL || strcmp(ofmt->name, name) < 0) &&
|
||||
if ((!name || strcmp(ofmt->name, name) < 0) &&
|
||||
strcmp(ofmt->name, last_name) > 0) {
|
||||
name = ofmt->name;
|
||||
long_name = ofmt->long_name;
|
||||
@@ -1253,7 +1253,7 @@ static int show_formats_devices(void *optctx, const char *opt, const char *arg,
|
||||
is_dev = is_device(ifmt->priv_class);
|
||||
if (!is_dev && device_only)
|
||||
continue;
|
||||
if ((name == NULL || strcmp(ifmt->name, name) < 0) &&
|
||||
if ((!name || strcmp(ifmt->name, name) < 0) &&
|
||||
strcmp(ifmt->name, last_name) > 0) {
|
||||
name = ifmt->name;
|
||||
long_name = ifmt->long_name;
|
||||
@@ -1262,7 +1262,7 @@ static int show_formats_devices(void *optctx, const char *opt, const char *arg,
|
||||
if (name && strcmp(ifmt->name, name) == 0)
|
||||
decode = 1;
|
||||
}
|
||||
if (name == NULL)
|
||||
if (!name)
|
||||
break;
|
||||
last_name = name;
|
||||
|
||||
@@ -1639,19 +1639,19 @@ int show_layouts(void *optctx, const char *opt, const char *arg)
|
||||
const char *name, *descr;
|
||||
|
||||
printf("Individual channels:\n"
|
||||
"NAME DESCRIPTION\n");
|
||||
"NAME DESCRIPTION\n");
|
||||
for (i = 0; i < 63; i++) {
|
||||
name = av_get_channel_name((uint64_t)1 << i);
|
||||
if (!name)
|
||||
continue;
|
||||
descr = av_get_channel_description((uint64_t)1 << i);
|
||||
printf("%-12s%s\n", name, descr);
|
||||
printf("%-14s %s\n", name, descr);
|
||||
}
|
||||
printf("\nStandard channel layouts:\n"
|
||||
"NAME DECOMPOSITION\n");
|
||||
"NAME DECOMPOSITION\n");
|
||||
for (i = 0; !av_get_standard_channel_layout(i, &layout, &name); i++) {
|
||||
if (name) {
|
||||
printf("%-12s", name);
|
||||
printf("%-14s ", name);
|
||||
for (j = 1; j; j <<= 1)
|
||||
if ((layout & j))
|
||||
printf("%s%s", (layout & (j - 1)) ? "+" : "", av_get_channel_name(j));
|
||||
|
@@ -805,7 +805,7 @@ struct AVS_Library {
|
||||
|
||||
AVSC_INLINE AVS_Library * avs_load_library() {
|
||||
AVS_Library *library = (AVS_Library *)malloc(sizeof(AVS_Library));
|
||||
if (library == NULL)
|
||||
if (!library)
|
||||
return NULL;
|
||||
library->handle = LoadLibrary("avisynth");
|
||||
if (library->handle == NULL)
|
||||
@@ -870,7 +870,7 @@ fail:
|
||||
}
|
||||
|
||||
AVSC_INLINE void avs_free_library(AVS_Library *library) {
|
||||
if (library == NULL)
|
||||
if (!library)
|
||||
return;
|
||||
FreeLibrary(library->handle);
|
||||
free(library);
|
||||
|
@@ -54,7 +54,7 @@ static int getopt(int argc, char *argv[], char *opts)
|
||||
}
|
||||
}
|
||||
optopt = c = argv[optind][sp];
|
||||
if (c == ':' || (cp = strchr(opts, c)) == NULL) {
|
||||
if (c == ':' || !(cp = strchr(opts, c))) {
|
||||
fprintf(stderr, ": illegal option -- %c\n", c);
|
||||
if (argv[optind][++sp] == '\0') {
|
||||
optind++;
|
||||
|
@@ -39,6 +39,7 @@
|
||||
#include <windows.h>
|
||||
#include <process.h>
|
||||
|
||||
#include "libavutil/attributes.h"
|
||||
#include "libavutil/common.h"
|
||||
#include "libavutil/internal.h"
|
||||
#include "libavutil/mem.h"
|
||||
@@ -73,17 +74,29 @@ static BOOL (WINAPI *cond_wait)(pthread_cond_t *cond, pthread_mutex_t *mutex,
|
||||
#define cond_broadcast WakeAllConditionVariable
|
||||
#define cond_signal WakeConditionVariable
|
||||
#define cond_wait SleepConditionVariableCS
|
||||
|
||||
#define CreateEvent(a, reset, init, name) \
|
||||
CreateEventEx(a, name, \
|
||||
(reset ? CREATE_EVENT_MANUAL_RESET : 0) | \
|
||||
(init ? CREATE_EVENT_INITIAL_SET : 0), \
|
||||
EVENT_ALL_ACCESS)
|
||||
// CreateSemaphoreExA seems to be desktop-only, but as long as we don't
|
||||
// use named semaphores, it doesn't matter if we use the W version.
|
||||
#define CreateSemaphore(a, b, c, d) \
|
||||
CreateSemaphoreExW(a, b, c, d, 0, SEMAPHORE_ALL_ACCESS)
|
||||
#define InitializeCriticalSection(x) InitializeCriticalSectionEx(x, 0, 0)
|
||||
#define WaitForSingleObject(a, b) WaitForSingleObjectEx(a, b, FALSE)
|
||||
#endif
|
||||
|
||||
static unsigned __stdcall attribute_align_arg win32thread_worker(void *arg)
|
||||
static av_unused unsigned __stdcall attribute_align_arg win32thread_worker(void *arg)
|
||||
{
|
||||
pthread_t *h = arg;
|
||||
h->ret = h->func(h->arg);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pthread_create(pthread_t *thread, const void *unused_attr,
|
||||
void *(*start_routine)(void*), void *arg)
|
||||
static av_unused int pthread_create(pthread_t *thread, const void *unused_attr,
|
||||
void *(*start_routine)(void*), void *arg)
|
||||
{
|
||||
thread->func = start_routine;
|
||||
thread->arg = arg;
|
||||
@@ -92,7 +105,7 @@ static int pthread_create(pthread_t *thread, const void *unused_attr,
|
||||
return !thread->handle;
|
||||
}
|
||||
|
||||
static void pthread_join(pthread_t thread, void **value_ptr)
|
||||
static av_unused void pthread_join(pthread_t thread, void **value_ptr)
|
||||
{
|
||||
DWORD ret = WaitForSingleObject(thread.handle, INFINITE);
|
||||
if (ret != WAIT_OBJECT_0)
|
||||
@@ -134,7 +147,7 @@ typedef struct win32_cond_t {
|
||||
volatile int is_broadcast;
|
||||
} win32_cond_t;
|
||||
|
||||
static int pthread_cond_init(pthread_cond_t *cond, const void *unused_attr)
|
||||
static av_unused int pthread_cond_init(pthread_cond_t *cond, const void *unused_attr)
|
||||
{
|
||||
win32_cond_t *win32_cond = NULL;
|
||||
if (cond_init) {
|
||||
@@ -159,7 +172,7 @@ static int pthread_cond_init(pthread_cond_t *cond, const void *unused_attr)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void pthread_cond_destroy(pthread_cond_t *cond)
|
||||
static av_unused void pthread_cond_destroy(pthread_cond_t *cond)
|
||||
{
|
||||
win32_cond_t *win32_cond = cond->ptr;
|
||||
/* native condition variables do not destroy */
|
||||
@@ -175,7 +188,7 @@ static void pthread_cond_destroy(pthread_cond_t *cond)
|
||||
cond->ptr = NULL;
|
||||
}
|
||||
|
||||
static void pthread_cond_broadcast(pthread_cond_t *cond)
|
||||
static av_unused void pthread_cond_broadcast(pthread_cond_t *cond)
|
||||
{
|
||||
win32_cond_t *win32_cond = cond->ptr;
|
||||
int have_waiter;
|
||||
@@ -206,7 +219,7 @@ static void pthread_cond_broadcast(pthread_cond_t *cond)
|
||||
pthread_mutex_unlock(&win32_cond->mtx_broadcast);
|
||||
}
|
||||
|
||||
static int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
|
||||
static av_unused int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
|
||||
{
|
||||
win32_cond_t *win32_cond = cond->ptr;
|
||||
int last_waiter;
|
||||
@@ -238,7 +251,7 @@ static int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
|
||||
return pthread_mutex_lock(mutex);
|
||||
}
|
||||
|
||||
static void pthread_cond_signal(pthread_cond_t *cond)
|
||||
static av_unused void pthread_cond_signal(pthread_cond_t *cond)
|
||||
{
|
||||
win32_cond_t *win32_cond = cond->ptr;
|
||||
int have_waiter;
|
||||
@@ -263,7 +276,7 @@ static void pthread_cond_signal(pthread_cond_t *cond)
|
||||
pthread_mutex_unlock(&win32_cond->mtx_broadcast);
|
||||
}
|
||||
|
||||
static void w32thread_init(void)
|
||||
static av_unused void w32thread_init(void)
|
||||
{
|
||||
#if _WIN32_WINNT < 0x0600
|
||||
HANDLE kernel_dll = GetModuleHandle(TEXT("kernel32.dll"));
|
||||
|
230
configure
vendored
230
configure
vendored
@@ -89,6 +89,7 @@ Standard options:
|
||||
--mandir=DIR install man page in DIR [PREFIX/share/man]
|
||||
--enable-rpath use rpath to allow installing libraries in paths
|
||||
not part of the dynamic linker search path
|
||||
use rpath when linking programs [USE WITH CARE]
|
||||
|
||||
Licensing options:
|
||||
--enable-gpl allow use of GPL code, the resulting libs
|
||||
@@ -144,6 +145,8 @@ Component options:
|
||||
--disable-mdct disable MDCT code
|
||||
--disable-rdft disable RDFT code
|
||||
--disable-fft disable FFT code
|
||||
--disable-faan disable floating point AAN (I)DCT code
|
||||
--disable-pixelutils disable pixel utils in libavutil
|
||||
|
||||
Hardware accelerators:
|
||||
--disable-dxva2 disable DXVA2 code [autodetect]
|
||||
@@ -252,6 +255,7 @@ External library support:
|
||||
native MPEG-4/Xvid encoder exists [no]
|
||||
--enable-libzmq enable message passing via libzmq [no]
|
||||
--enable-libzvbi enable teletext support via libzvbi [no]
|
||||
--disable-lzma disable lzma [autodetect]
|
||||
--enable-decklink enable Blackmagick DeckLink output [no]
|
||||
--enable-openal enable OpenAL 1.1 capture support [no]
|
||||
--enable-opencl enable OpenCL code
|
||||
@@ -299,6 +303,7 @@ Toolchain options:
|
||||
--extra-cflags=ECFLAGS add ECFLAGS to CFLAGS [$CFLAGS]
|
||||
--extra-cxxflags=ECFLAGS add ECFLAGS to CXXFLAGS [$CXXFLAGS]
|
||||
--extra-ldflags=ELDFLAGS add ELDFLAGS to LDFLAGS [$LDFLAGS]
|
||||
--extra-ldexeflags=ELDFLAGS add ELDFLAGS to LDEXEFLAGS [$LDEXEFLAGS]
|
||||
--extra-libs=ELIBS add ELIBS [$ELIBS]
|
||||
--extra-version=STRING version string suffix []
|
||||
--optflags=OPTFLAGS override optimization-related compiler flags
|
||||
@@ -315,7 +320,6 @@ Advanced options (experts only):
|
||||
disable buffer boundary checking in bitreaders
|
||||
(faster, but may crash)
|
||||
--enable-memalign-hack emulate memalign, interferes with memory debuggers
|
||||
--enable-sram allow use of on-chip SRAM
|
||||
--sws-max-filter-size=N the max filter size swscale uses [$sws_max_filter_size_default]
|
||||
|
||||
Optimization options (experts only):
|
||||
@@ -758,6 +762,10 @@ add_ldflags(){
|
||||
append LDFLAGS $($ldflags_filter "$@")
|
||||
}
|
||||
|
||||
add_ldexeflags(){
|
||||
append LDEXEFLAGS $($ldflags_filter "$@")
|
||||
}
|
||||
|
||||
add_stripflags(){
|
||||
append ASMSTRIPFLAGS "$@"
|
||||
}
|
||||
@@ -1236,7 +1244,7 @@ check_host_cpp(){
|
||||
log check_host_cpp "$@"
|
||||
cat > $TMPC
|
||||
log_file $TMPC
|
||||
check_cmd $host_cc $HOSTCPPFLAGS $HOSTCFLAGS "$@" $(hostcc_e $TMPO) $TMPC
|
||||
check_cmd $host_cc $host_cppflags $host_cflags "$@" $(hostcc_e $TMPO) $TMPC
|
||||
}
|
||||
|
||||
check_host_cppflags(){
|
||||
@@ -1300,6 +1308,7 @@ EXAMPLE_LIST="
|
||||
avio_reading_example
|
||||
decoding_encoding_example
|
||||
demuxing_decoding_example
|
||||
extract_mvs_example
|
||||
filter_audio_example
|
||||
filtering_audio_example
|
||||
filtering_video_example
|
||||
@@ -1374,6 +1383,7 @@ EXTERNAL_LIBRARY_LIST="
|
||||
libxvid
|
||||
libzmq
|
||||
libzvbi
|
||||
lzma
|
||||
openal
|
||||
opencl
|
||||
opengl
|
||||
@@ -1399,7 +1409,6 @@ FEATURE_LIST="
|
||||
safe_bitstream_reader
|
||||
shared
|
||||
small
|
||||
sram
|
||||
static
|
||||
swscale_alpha
|
||||
"
|
||||
@@ -1441,11 +1450,13 @@ SUBSYSTEM_LIST="
|
||||
dct
|
||||
dwt
|
||||
error_resilience
|
||||
faan
|
||||
fast_unaligned
|
||||
fft
|
||||
lsp
|
||||
lzo
|
||||
mdct
|
||||
pixelutils
|
||||
network
|
||||
rdft
|
||||
"
|
||||
@@ -1520,6 +1531,7 @@ ARCH_EXT_LIST_ARM="
|
||||
neon
|
||||
vfp
|
||||
vfpv3
|
||||
setend
|
||||
"
|
||||
|
||||
ARCH_EXT_LIST_MIPS="
|
||||
@@ -1577,6 +1589,7 @@ ARCH_FEATURES="
|
||||
local_aligned_8
|
||||
local_aligned_16
|
||||
local_aligned_32
|
||||
simd_align_16
|
||||
"
|
||||
|
||||
BUILTIN_LIST="
|
||||
@@ -1642,6 +1655,10 @@ HEADERS_LIST="
|
||||
winsock2_h
|
||||
"
|
||||
|
||||
INTRINSICS_LIST="
|
||||
intrinsics_neon
|
||||
"
|
||||
|
||||
MATH_FUNCS="
|
||||
atanf
|
||||
atan2f
|
||||
@@ -1773,6 +1790,7 @@ HAVE_LIST="
|
||||
$HAVE_LIST_CMDLINE
|
||||
$HAVE_LIST_PUB
|
||||
$HEADERS_LIST
|
||||
$INTRINSICS_LIST
|
||||
$MATH_FUNCS
|
||||
$SYSTEM_FUNCS
|
||||
$THREADS_LIST
|
||||
@@ -1786,6 +1804,7 @@ HAVE_LIST="
|
||||
libdc1394_1
|
||||
libdc1394_2
|
||||
makeinfo
|
||||
makeinfo_html
|
||||
perl
|
||||
pod2man
|
||||
sdl
|
||||
@@ -1804,9 +1823,10 @@ CONFIG_EXTRA="
|
||||
blockdsp
|
||||
bswapdsp
|
||||
cabac
|
||||
dsputil
|
||||
dvprofile
|
||||
exif
|
||||
faandct
|
||||
faanidct
|
||||
fdctdsp
|
||||
frame_thread_encoder
|
||||
gcrypt
|
||||
@@ -1822,11 +1842,13 @@ CONFIG_EXTRA="
|
||||
huffyuvdsp
|
||||
huffyuvencdsp
|
||||
idctdsp
|
||||
iirfilter
|
||||
intrax8
|
||||
lgplv3
|
||||
llauddsp
|
||||
llviddsp
|
||||
lpc
|
||||
me_cmp
|
||||
mpeg_er
|
||||
mpegaudio
|
||||
mpegaudiodsp
|
||||
@@ -1841,9 +1863,11 @@ CONFIG_EXTRA="
|
||||
rtpdec
|
||||
rtpenc_chain
|
||||
sinewin
|
||||
startcode
|
||||
tpeldsp
|
||||
videodsp
|
||||
vp3dsp
|
||||
wma_freqs
|
||||
"
|
||||
|
||||
CMDLINE_SELECT="
|
||||
@@ -1935,8 +1959,10 @@ armv6_deps="arm"
|
||||
armv6t2_deps="arm"
|
||||
armv8_deps="aarch64"
|
||||
neon_deps_any="aarch64 arm"
|
||||
intrinsics_neon_deps="neon"
|
||||
vfp_deps_any="aarch64 arm"
|
||||
vfpv3_deps="vfp"
|
||||
setend_deps="arm"
|
||||
|
||||
map 'eval ${v}_inline_deps=inline_asm' $ARCH_EXT_LIST_ARM
|
||||
|
||||
@@ -1985,8 +2011,7 @@ aligned_stack_if_any="aarch64 ppc x86"
|
||||
fast_64bit_if_any="aarch64 alpha ia64 mips64 parisc64 ppc64 sparc64 x86_64"
|
||||
fast_clz_if_any="aarch64 alpha avr32 mips ppc x86"
|
||||
fast_unaligned_if_any="aarch64 ppc x86"
|
||||
|
||||
need_memalign="altivec neon sse"
|
||||
simd_align_16_if_any="altivec neon sse"
|
||||
|
||||
# system capabilities
|
||||
|
||||
@@ -2002,26 +2027,28 @@ threads_if_any="$THREADS_LIST"
|
||||
|
||||
# subsystems
|
||||
dct_select="rdft"
|
||||
dsputil_select="fdctdsp idctdsp pixblockdsp"
|
||||
error_resilience_select="dsputil"
|
||||
error_resilience_select="me_cmp"
|
||||
faandct_deps="faan fdctdsp"
|
||||
faanidct_deps="faan idctdsp"
|
||||
frame_thread_encoder_deps="encoders threads"
|
||||
intrax8_select="error_resilience"
|
||||
mdct_select="fft"
|
||||
rdft_select="fft"
|
||||
me_cmp_select="fdctdsp idctdsp pixblockdsp"
|
||||
mpeg_er_select="error_resilience"
|
||||
mpegaudio_select="mpegaudiodsp"
|
||||
mpegaudiodsp_select="dct"
|
||||
mpegvideo_select="blockdsp dsputil h264chroma hpeldsp idctdsp videodsp"
|
||||
mpegvideoenc_select="dsputil mpegvideo pixblockdsp qpeldsp"
|
||||
mpegvideo_select="blockdsp h264chroma hpeldsp idctdsp me_cmp videodsp"
|
||||
mpegvideoenc_select="me_cmp mpegvideo pixblockdsp qpeldsp"
|
||||
|
||||
# decoders / encoders
|
||||
aac_decoder_select="mdct sinewin"
|
||||
aac_encoder_select="audio_frame_queue mdct sinewin"
|
||||
aac_encoder_select="audio_frame_queue iirfilter mdct sinewin"
|
||||
aac_latm_decoder_select="aac_decoder aac_latm_parser"
|
||||
ac3_decoder_select="ac3_parser ac3dsp bswapdsp mdct"
|
||||
ac3_fixed_decoder_select="ac3_parser ac3dsp bswapdsp mdct"
|
||||
ac3_encoder_select="ac3dsp audiodsp dsputil mdct"
|
||||
ac3_fixed_encoder_select="ac3dsp audiodsp dsputil mdct"
|
||||
ac3_encoder_select="ac3dsp audiodsp mdct me_cmp"
|
||||
ac3_fixed_encoder_select="ac3dsp audiodsp mdct me_cmp"
|
||||
aic_decoder_select="golomb idctdsp"
|
||||
alac_encoder_select="lpc"
|
||||
als_decoder_select="bswapdsp"
|
||||
@@ -2039,8 +2066,8 @@ atrac3_decoder_select="mdct"
|
||||
atrac3p_decoder_select="mdct sinewin"
|
||||
avrn_decoder_select="exif"
|
||||
bink_decoder_select="blockdsp hpeldsp"
|
||||
binkaudio_dct_decoder_select="mdct rdft dct sinewin"
|
||||
binkaudio_rdft_decoder_select="mdct rdft sinewin"
|
||||
binkaudio_dct_decoder_select="mdct rdft dct sinewin wma_freqs"
|
||||
binkaudio_rdft_decoder_select="mdct rdft sinewin wma_freqs"
|
||||
cavs_decoder_select="blockdsp golomb h264chroma idctdsp qpeldsp videodsp"
|
||||
cllc_decoder_select="bswapdsp"
|
||||
comfortnoise_encoder_select="lpc"
|
||||
@@ -2048,11 +2075,11 @@ cook_decoder_select="audiodsp mdct sinewin"
|
||||
cscd_decoder_select="lzo"
|
||||
cscd_decoder_suggest="zlib"
|
||||
dca_decoder_select="mdct"
|
||||
dirac_decoder_select="dsputil dwt golomb videodsp mpegvideoenc"
|
||||
dirac_decoder_select="dwt golomb videodsp mpegvideoenc"
|
||||
dnxhd_decoder_select="blockdsp idctdsp"
|
||||
dnxhd_encoder_select="aandcttables blockdsp fdctdsp idctdsp mpegvideoenc pixblockdsp"
|
||||
dvvideo_decoder_select="dvprofile idctdsp"
|
||||
dvvideo_encoder_select="dsputil dvprofile fdctdsp pixblockdsp"
|
||||
dvvideo_encoder_select="dvprofile fdctdsp me_cmp pixblockdsp"
|
||||
dxa_decoder_select="zlib"
|
||||
eac3_decoder_select="ac3_decoder"
|
||||
eac3_encoder_select="ac3_encoder"
|
||||
@@ -2083,7 +2110,7 @@ h263_decoder_select="error_resilience h263_parser h263dsp mpeg_er mpegvideo qpel
|
||||
h263_encoder_select="aandcttables h263dsp mpegvideoenc"
|
||||
h263i_decoder_select="h263_decoder"
|
||||
h263p_encoder_select="h263_encoder"
|
||||
h264_decoder_select="cabac golomb h264chroma h264dsp h264pred h264qpel videodsp"
|
||||
h264_decoder_select="cabac golomb h264chroma h264dsp h264pred h264qpel startcode videodsp"
|
||||
h264_decoder_suggest="error_resilience"
|
||||
hevc_decoder_select="bswapdsp cabac golomb videodsp"
|
||||
huffyuv_decoder_select="bswapdsp huffyuvdsp llviddsp"
|
||||
@@ -2120,6 +2147,7 @@ mpc7_decoder_select="bswapdsp mpegaudiodsp"
|
||||
mpc8_decoder_select="mpegaudiodsp"
|
||||
mpeg_xvmc_decoder_deps="X11_extensions_XvMClib_h"
|
||||
mpeg_xvmc_decoder_select="mpeg2video_decoder"
|
||||
mpegvideo_decoder_select="error_resilience mpeg_er mpegvideo"
|
||||
mpeg1video_decoder_select="error_resilience mpeg_er mpegvideo"
|
||||
mpeg1video_encoder_select="aandcttables mpegvideoenc h263dsp"
|
||||
mpeg2video_decoder_select="error_resilience mpeg_er mpegvideo"
|
||||
@@ -2147,8 +2175,8 @@ qdm2_decoder_select="mdct rdft mpegaudiodsp"
|
||||
ra_144_encoder_select="audio_frame_queue lpc audiodsp"
|
||||
ra_144_decoder_select="audiodsp"
|
||||
ralf_decoder_select="golomb"
|
||||
rawvideo_decoder_select="dsputil bswapdsp"
|
||||
rtjpeg_decoder_select="dsputil"
|
||||
rawvideo_decoder_select="bswapdsp"
|
||||
rtjpeg_decoder_select="me_cmp"
|
||||
rv10_decoder_select="error_resilience h263_decoder h263dsp mpeg_er"
|
||||
rv10_encoder_select="h263_encoder"
|
||||
rv20_decoder_select="error_resilience h263_decoder h263dsp mpeg_er"
|
||||
@@ -2157,20 +2185,20 @@ rv30_decoder_select="error_resilience golomb h264chroma h264pred h264qpel mpeg_e
|
||||
rv40_decoder_select="error_resilience golomb h264chroma h264pred h264qpel mpeg_er mpegvideo videodsp"
|
||||
shorten_decoder_select="golomb"
|
||||
sipr_decoder_select="lsp"
|
||||
snow_decoder_select="dsputil dwt h264qpel hpeldsp rangecoder mpegvideoenc"
|
||||
snow_encoder_select="aandcttables dsputil dwt h264qpel hpeldsp mpegvideoenc rangecoder"
|
||||
snow_decoder_select="dwt h264qpel hpeldsp me_cmp rangecoder videodsp"
|
||||
snow_encoder_select="aandcttables dwt h264qpel hpeldsp me_cmp mpegvideoenc rangecoder"
|
||||
sonic_decoder_select="golomb rangecoder"
|
||||
sonic_encoder_select="golomb rangecoder"
|
||||
sonic_ls_encoder_select="golomb rangecoder"
|
||||
sp5x_decoder_select="mjpeg_decoder"
|
||||
svq1_decoder_select="hpeldsp"
|
||||
svq1_encoder_select="aandcttables dsputil hpeldsp mpegvideoenc"
|
||||
svq1_encoder_select="aandcttables hpeldsp me_cmp mpegvideoenc"
|
||||
svq3_decoder_select="h264_decoder hpeldsp tpeldsp"
|
||||
svq3_decoder_suggest="zlib"
|
||||
tak_decoder_select="audiodsp"
|
||||
theora_decoder_select="vp3_decoder"
|
||||
thp_decoder_select="mjpeg_decoder"
|
||||
tiff_decoder_suggest="zlib"
|
||||
tiff_decoder_suggest="zlib lzma"
|
||||
tiff_encoder_suggest="zlib"
|
||||
truehd_decoder_select="mlp_parser"
|
||||
truemotion2_decoder_select="bswapdsp"
|
||||
@@ -2180,7 +2208,7 @@ twinvq_decoder_select="mdct lsp sinewin"
|
||||
utvideo_decoder_select="bswapdsp"
|
||||
utvideo_encoder_select="bswapdsp huffman huffyuvencdsp"
|
||||
vble_decoder_select="huffyuvdsp"
|
||||
vc1_decoder_select="blockdsp error_resilience h263_decoder h264chroma h264qpel intrax8 mpeg_er qpeldsp"
|
||||
vc1_decoder_select="blockdsp error_resilience h263_decoder h264chroma h264qpel intrax8 mpeg_er qpeldsp startcode"
|
||||
vc1image_decoder_select="vc1_decoder"
|
||||
vorbis_decoder_select="mdct"
|
||||
vorbis_encoder_select="mdct"
|
||||
@@ -2194,11 +2222,11 @@ vp8_decoder_select="h264pred videodsp"
|
||||
vp9_decoder_select="videodsp vp9_parser"
|
||||
webp_decoder_select="vp8_decoder"
|
||||
wmalossless_decoder_select="llauddsp"
|
||||
wmapro_decoder_select="mdct sinewin"
|
||||
wmav1_decoder_select="mdct sinewin"
|
||||
wmav1_encoder_select="mdct sinewin"
|
||||
wmav2_decoder_select="mdct sinewin"
|
||||
wmav2_encoder_select="mdct sinewin"
|
||||
wmapro_decoder_select="mdct sinewin wma_freqs"
|
||||
wmav1_decoder_select="mdct sinewin wma_freqs"
|
||||
wmav1_encoder_select="mdct sinewin wma_freqs"
|
||||
wmav2_decoder_select="mdct sinewin wma_freqs"
|
||||
wmav2_encoder_select="mdct sinewin wma_freqs"
|
||||
wmavoice_decoder_select="lsp rdft dct mdct sinewin"
|
||||
wmv1_decoder_select="h263_decoder"
|
||||
wmv1_encoder_select="h263_encoder"
|
||||
@@ -2287,7 +2315,7 @@ h264_parser_select="h264_decoder"
|
||||
hevc_parser_select="hevc_decoder"
|
||||
mpegvideo_parser_select="mpegvideo"
|
||||
mpeg4video_parser_select="error_resilience h263dsp mpeg_er mpegvideo qpeldsp"
|
||||
vc1_parser_select="mpegvideo vc1_decoder"
|
||||
vc1_parser_select="mpegvideo startcode vc1_decoder"
|
||||
|
||||
# external libraries
|
||||
libaacplus_encoder_deps="libaacplus"
|
||||
@@ -2390,7 +2418,9 @@ mpegtsraw_demuxer_select="mpegts_demuxer"
|
||||
mxf_d10_muxer_select="mxf_muxer"
|
||||
nut_muxer_select="riffenc"
|
||||
nuv_demuxer_select="riffdec"
|
||||
oga_muxer_select="ogg_muxer"
|
||||
ogg_demuxer_select="golomb"
|
||||
opus_muxer_select="ogg_muxer"
|
||||
psp_muxer_select="mov_muxer"
|
||||
rtp_demuxer_select="sdp_demuxer"
|
||||
rtpdec_select="asf_demuxer rm_demuxer rtp_protocol mpegts_demuxer mov_demuxer"
|
||||
@@ -2401,6 +2431,7 @@ sap_muxer_select="rtp_muxer rtp_protocol rtpenc_chain"
|
||||
sdp_demuxer_select="rtpdec"
|
||||
smoothstreaming_muxer_select="ismv_muxer"
|
||||
spdif_muxer_select="aac_parser"
|
||||
spx_muxer_select="ogg_muxer"
|
||||
tak_demuxer_select="tak_parser"
|
||||
tg2_muxer_select="mov_muxer"
|
||||
tgp_muxer_select="mov_muxer"
|
||||
@@ -2471,6 +2502,7 @@ gopher_protocol_select="network"
|
||||
http_protocol_select="tcp_protocol"
|
||||
httpproxy_protocol_select="tcp_protocol"
|
||||
https_protocol_select="tls_protocol"
|
||||
icecast_protocol_select="http_protocol"
|
||||
librtmp_protocol_deps="librtmp"
|
||||
librtmpe_protocol_deps="librtmp"
|
||||
librtmps_protocol_deps="librtmp"
|
||||
@@ -2513,11 +2545,8 @@ boxblur_filter_deps="gpl"
|
||||
bs2b_filter_deps="libbs2b"
|
||||
colormatrix_filter_deps="gpl"
|
||||
cropdetect_filter_deps="gpl"
|
||||
dctdnoiz_filter_deps="avcodec"
|
||||
dctdnoiz_filter_select="dct"
|
||||
delogo_filter_deps="gpl"
|
||||
deshake_filter_deps="avcodec"
|
||||
deshake_filter_select="dsputil"
|
||||
deshake_filter_select="pixelutils"
|
||||
drawtext_filter_deps="libfreetype"
|
||||
ebur128_filter_deps="gpl"
|
||||
flite_filter_deps="libflite"
|
||||
@@ -2535,8 +2564,8 @@ ladspa_filter_extralibs='$ldl'
|
||||
mcdeint_filter_deps="avcodec gpl"
|
||||
movie_filter_deps="avcodec avformat"
|
||||
mp_filter_deps="gpl avcodec swscale inline_asm"
|
||||
mpdecimate_filter_deps="gpl avcodec"
|
||||
mpdecimate_filter_select="dsputil pixblockdsp"
|
||||
mpdecimate_filter_deps="gpl"
|
||||
mpdecimate_filter_select="pixelutils"
|
||||
mptestsrc_filter_deps="gpl"
|
||||
negate_filter_deps="lut_filter"
|
||||
perspective_filter_deps="gpl"
|
||||
@@ -2550,11 +2579,12 @@ removelogo_filter_deps="avcodec avformat swscale"
|
||||
resample_filter_deps="avresample"
|
||||
sab_filter_deps="gpl swscale"
|
||||
scale_filter_deps="swscale"
|
||||
select_filter_select="pixelutils"
|
||||
smartblur_filter_deps="gpl swscale"
|
||||
showspectrum_filter_deps="avcodec"
|
||||
showspectrum_filter_select="rdft"
|
||||
spp_filter_deps="gpl avcodec"
|
||||
spp_filter_select="dsputil fft idctdsp fdctdsp pixblockdsp"
|
||||
spp_filter_select="fft idctdsp fdctdsp me_cmp pixblockdsp"
|
||||
stereo3d_filter_deps="gpl"
|
||||
subtitles_filter_deps="avformat avcodec libass"
|
||||
super2xsai_filter_deps="gpl"
|
||||
@@ -2570,7 +2600,9 @@ zoompan_filter_deps="swscale"
|
||||
# examples
|
||||
avio_reading="avformat avcodec avutil"
|
||||
avcodec_example_deps="avcodec avutil"
|
||||
decoding_encoding_example_deps="avcodec avformat avutil"
|
||||
demuxing_decoding_example_deps="avcodec avformat avutil"
|
||||
extract_mvs_example_deps="avcodec avformat avutil"
|
||||
filter_audio_example_deps="avfilter avutil"
|
||||
filtering_audio_example_deps="avfilter avcodec avformat avutil"
|
||||
filtering_video_example_deps="avfilter avcodec avformat avutil"
|
||||
@@ -2607,7 +2639,8 @@ ffserver_select="ffm_muxer rtp_protocol rtsp_demuxer"
|
||||
# documentation
|
||||
podpages_deps="perl"
|
||||
manpages_deps="perl pod2man"
|
||||
htmlpages_deps="perl texi2html"
|
||||
htmlpages_deps="perl"
|
||||
htmlpages_deps_any="makeinfo_html texi2html"
|
||||
txtpages_deps="perl makeinfo"
|
||||
doc_deps_any="manpages htmlpages podpages txtpages"
|
||||
|
||||
@@ -2642,8 +2675,6 @@ strip_default="strip"
|
||||
yasmexe_default="yasm"
|
||||
windres_default="windres"
|
||||
|
||||
nogas=":"
|
||||
|
||||
# OS
|
||||
target_os_default=$(tolower $(uname -s))
|
||||
host_os=$target_os_default
|
||||
@@ -2656,6 +2687,7 @@ else
|
||||
arch_default=$(uname -m)
|
||||
fi
|
||||
cpu="generic"
|
||||
intrinsics="none"
|
||||
|
||||
# configurable options
|
||||
enable $PROGRAM_LIST
|
||||
@@ -2667,6 +2699,7 @@ enable stripping
|
||||
enable asm
|
||||
enable debug
|
||||
enable doc
|
||||
enable faan faandct faanidct
|
||||
enable optimizations
|
||||
enable runtime_cpudetect
|
||||
enable safe_bitstream_reader
|
||||
@@ -2828,6 +2861,9 @@ for opt do
|
||||
--extra-ldflags=*)
|
||||
add_ldflags $optval
|
||||
;;
|
||||
--extra-ldexeflags=*)
|
||||
add_ldexeflags $optval
|
||||
;;
|
||||
--extra-libs=*)
|
||||
add_extralibs $optval
|
||||
;;
|
||||
@@ -3087,6 +3123,17 @@ EOF
|
||||
die "Sanity test failed."
|
||||
fi
|
||||
|
||||
armasm_flags(){
|
||||
for flag; do
|
||||
case $flag in
|
||||
# Filter out MSVC cl.exe options from cflags that shouldn't
|
||||
# be passed to gas-preprocessor
|
||||
-M[TD]*) ;;
|
||||
*) echo $flag ;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
ccc_flags(){
|
||||
for flag; do
|
||||
case $flag in
|
||||
@@ -3151,7 +3198,7 @@ msvc_flags(){
|
||||
-wd4146 -wd4057 -wd4204 -wd4706 -wd4305 \
|
||||
-wd4152 -wd4324 -we4013 -wd4100 -wd4214 \
|
||||
-wd4554 \
|
||||
-wd4273 ;;
|
||||
-wd4273 -wd4701 ;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
@@ -3315,7 +3362,7 @@ probe_cc(){
|
||||
elif $_cc --vsn 2>/dev/null | grep -Eq "ARM (C/C\+\+ )?Compiler"; then
|
||||
test -d "$sysroot" || die "No valid sysroot specified."
|
||||
_type=armcc
|
||||
_ident=$($_cc --vsn | head -n1 | sed 's/.*: //')
|
||||
_ident=$($_cc --vsn | grep -i build | head -n1 | sed 's/.*: //')
|
||||
armcc_conf="$PWD/armcc.conf"
|
||||
$_cc --arm_linux_configure \
|
||||
--arm_linux_config_file="$armcc_conf" \
|
||||
@@ -3375,6 +3422,12 @@ probe_cc(){
|
||||
_cflags_size="-O2 -Munroll=c:1 $opt_common"
|
||||
_cflags_noopt="-O"
|
||||
_flags_filter=pgi_flags
|
||||
elif $_cc 2>&1 | grep -q 'Microsoft.*ARM.*Assembler'; then
|
||||
_type=armasm
|
||||
_ident=$($_cc | head -n1)
|
||||
# 4509: "This form of conditional instruction is deprecated"
|
||||
_flags="-nologo -ignore 4509"
|
||||
_flags_filter=armasm_flags
|
||||
elif $_cc 2>&1 | grep -q Microsoft; then
|
||||
_type=msvc
|
||||
_ident=$($cc 2>&1 | head -n1)
|
||||
@@ -3789,6 +3842,7 @@ elif enabled x86; then
|
||||
case $cpu in
|
||||
i[345]86|pentium)
|
||||
cpuflags="-march=$cpu"
|
||||
disable i686
|
||||
disable mmx
|
||||
;;
|
||||
# targets that do NOT support nopl and conditional mov (cmov)
|
||||
@@ -3951,7 +4005,6 @@ case $target_os in
|
||||
strip="strip -d"
|
||||
;;
|
||||
darwin)
|
||||
test "${as#*gas-preprocessor.pl}" != "$as" || gas="${gas:=gas-preprocessor.pl} ${as:=$cc}"
|
||||
enabled ppc && add_asflags -force_cpusubtype_ALL
|
||||
SHFLAGS='-dynamiclib -Wl,-single_module -Wl,-install_name,$(SHLIBDIR)/$(SLIBNAME_WITH_MAJOR),-current_version,$(LIBVERSION),-compatibility_version,$(LIBMAJOR)'
|
||||
enabled x86_32 && append SHFLAGS -Wl,-read_only_relocs,suppress
|
||||
@@ -4326,22 +4379,46 @@ if [ "$cpu" = "power7" ] || [ "$cpu" = "power8" ] ;then
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
if enabled asm; then
|
||||
enabled arm && nogas=die
|
||||
enabled_all ppc altivec && [ $target_os_default != aix ] && nogas=warn
|
||||
as=${gas:=$as}
|
||||
check_as <<EOF && enable gnu_as || \
|
||||
$nogas "GNU assembler not found, install gas-preprocessor"
|
||||
.macro m n
|
||||
\n: .int 0
|
||||
check_gas() {
|
||||
log "check_gas using '$as' as AS"
|
||||
# :vararg is used on aarch64, arm and ppc altivec
|
||||
check_as <<EOF || return 1
|
||||
.macro m n, y:vararg=0
|
||||
\n: .int \y
|
||||
.endm
|
||||
m x
|
||||
EOF
|
||||
|
||||
check_as <<EOF || $nogas "GNU assembler not found, install gas-preprocessor"
|
||||
# .altmacro is only used in arm asm
|
||||
! enabled arm || check_as <<EOF || return 1
|
||||
.altmacro
|
||||
EOF
|
||||
enable gnu_as
|
||||
return 0
|
||||
}
|
||||
|
||||
if enabled_any arm aarch64 || enabled_all ppc altivec && enabled asm; then
|
||||
nogas=:
|
||||
enabled_any arm aarch64 && nogas=die
|
||||
enabled_all ppc altivec && [ $target_os_default != aix ] && nogas=warn
|
||||
as_noop=-v
|
||||
|
||||
case $as_type in
|
||||
arm*) gaspp_as_type=armasm; as_noop=-h ;;
|
||||
gcc) gaspp_as_type=gas ;;
|
||||
*) gaspp_as_type=$as_type ;;
|
||||
esac
|
||||
|
||||
[ $target_os = "darwin" ] && gaspp_as_type="apple-$gaspp_as_type"
|
||||
|
||||
test "${as#*gas-preprocessor.pl}" != "$as" ||
|
||||
check_cmd gas-preprocessor.pl -arch $arch -as-type $gaspp_as_type -- ${as:=$cc} $as_noop &&
|
||||
gas="${gas:=gas-preprocessor.pl} -arch $arch -as-type $gaspp_as_type -- ${as:=$cc}"
|
||||
|
||||
if ! check_gas ; then
|
||||
as=${gas:=$as}
|
||||
check_gas || \
|
||||
$nogas "GNU assembler not found, install/update gas-preprocessor"
|
||||
fi
|
||||
|
||||
check_as <<EOF && enable as_func
|
||||
.func test
|
||||
@@ -4392,8 +4469,9 @@ EOF
|
||||
enabled neon && check_insn neon 'vadd.i16 q0, q0, q0'
|
||||
enabled vfp && check_insn vfp 'fadds s0, s0, s0'
|
||||
enabled vfpv3 && check_insn vfpv3 'vmov.f32 s0, #1.0'
|
||||
enabled setend && check_insn setend 'setend be'
|
||||
|
||||
[ $target_os = linux ] ||
|
||||
[ $target_os = linux ] || [ $target_os = android ] ||
|
||||
map 'enabled_any ${v}_external ${v}_inline || disable $v' \
|
||||
$ARCH_EXT_LIST_ARM
|
||||
|
||||
@@ -4527,7 +4605,10 @@ EOF
|
||||
|
||||
fi
|
||||
|
||||
check_code cc arm_neon.h "int16x8_t test = vdupq_n_s16(0)" && enable intrinsics_neon
|
||||
|
||||
check_ldflags -Wl,--as-needed
|
||||
check_ldflags -Wl,-z,noexecstack
|
||||
|
||||
if check_func dlopen; then
|
||||
ldl=
|
||||
@@ -4586,7 +4667,7 @@ check_func ${malloc_prefix}memalign && enable memalign
|
||||
check_func ${malloc_prefix}posix_memalign && enable posix_memalign
|
||||
|
||||
check_func access
|
||||
check_func clock_gettime || { check_func clock_gettime -lrt && add_extralibs -lrt; }
|
||||
check_func_headers time.h clock_gettime || { check_func_headers time.h clock_gettime -lrt && add_extralibs -lrt; }
|
||||
check_func fcntl
|
||||
check_func fork
|
||||
check_func gethrtime
|
||||
@@ -4600,7 +4681,7 @@ check_func mkstemp
|
||||
check_func mmap
|
||||
check_func mprotect
|
||||
# Solaris has nanosleep in -lrt, OpenSolaris no longer needs that
|
||||
check_func nanosleep || { check_func nanosleep -lrt && add_extralibs -lrt; }
|
||||
check_func_headers time.h nanosleep || { check_func_headers time.h nanosleep -lrt && add_extralibs -lrt; }
|
||||
check_func sched_getaffinity
|
||||
check_func setrlimit
|
||||
check_struct "sys/stat.h" "struct stat" st_mtim.tv_nsec -D_BSD_SOURCE
|
||||
@@ -4693,6 +4774,7 @@ fi
|
||||
|
||||
disabled zlib || check_lib zlib.h zlibVersion -lz || disable zlib
|
||||
disabled bzlib || check_lib2 bzlib.h BZ2_bzlibVersion -lbz2 || disable bzlib
|
||||
disabled lzma || check_lib2 lzma.h lzma_version_number -llzma || disable lzma
|
||||
|
||||
check_lib math.h sin -lm && LIBM="-lm"
|
||||
disabled crystalhd || check_lib libcrystalhd/libcrystalhd_if.h DtsCrystalHDVersion -lcrystalhd || disable crystalhd
|
||||
@@ -4737,7 +4819,7 @@ enabled libgsm && { for gsm_hdr in "gsm.h" "gsm/gsm.h"; do
|
||||
check_lib "${gsm_hdr}" gsm_create -lgsm && break;
|
||||
done || die "ERROR: libgsm not found"; }
|
||||
enabled libilbc && require libilbc ilbc.h WebRtcIlbcfix_InitDecode -lilbc
|
||||
enabled libmodplug && require libmodplug libmodplug/modplug.h ModPlug_Load -lmodplug
|
||||
enabled libmodplug && require_pkg_config libmodplug libmodplug/modplug.h ModPlug_Load
|
||||
enabled libmp3lame && require "libmp3lame >= 3.98.3" lame/lame.h lame_set_VBR_quality -lmp3lame
|
||||
enabled libnut && require libnut libnut.h nut_demuxer_init -lnut
|
||||
enabled libopencore_amrnb && require libopencore_amrnb opencore-amrnb/interf_dec.h Decoder_Interface_init -lopencore-amrnb
|
||||
@@ -4747,7 +4829,7 @@ enabled libopenjpeg && { check_lib openjpeg-1.5/openjpeg.h opj_version -lo
|
||||
check_lib openjpeg.h opj_version -lopenjpeg -DOPJ_STATIC ||
|
||||
die "ERROR: libopenjpeg not found"; }
|
||||
enabled libopus && require_pkg_config opus opus_multistream.h opus_multistream_decoder_create
|
||||
enabled libpulse && require_pkg_config libpulse-simple pulse/simple.h pa_simple_new
|
||||
enabled libpulse && require_pkg_config libpulse pulse/pulseaudio.h pa_context_new
|
||||
enabled libquvi && require_pkg_config libquvi quvi/quvi.h quvi_init
|
||||
enabled librtmp && require_pkg_config librtmp librtmp/rtmp.h RTMP_Socket
|
||||
enabled libschroedinger && require_pkg_config schroedinger-1.0 schroedinger/schro.h schro_init
|
||||
@@ -4757,7 +4839,7 @@ enabled libsmbclient && { { check_pkg_config smbclient libsmbclient.h smbc_
|
||||
require smbclient libsmbclient.h smbc_init -lsmbclient; }
|
||||
enabled libsoxr && require libsoxr soxr.h soxr_create -lsoxr
|
||||
enabled libssh && require_pkg_config libssh libssh/sftp.h sftp_init
|
||||
enabled libspeex && require libspeex speex/speex.h speex_decoder_init -lspeex
|
||||
enabled libspeex && require_pkg_config speex speex/speex.h speex_decoder_init -lspeex
|
||||
enabled libstagefright_h264 && require_cpp libstagefright_h264 "binder/ProcessState.h media/stagefright/MetaData.h
|
||||
media/stagefright/MediaBufferGroup.h media/stagefright/MediaDebug.h media/stagefright/MediaDefs.h
|
||||
media/stagefright/OMXClient.h media/stagefright/OMXCodec.h" android::OMXClient -lstagefright -lmedia -lutils -lbinder -lgnustl_static
|
||||
@@ -4777,9 +4859,11 @@ enabled libvpx && {
|
||||
enabled libvpx_vp8_encoder && { check_lib2 "vpx/vpx_encoder.h vpx/vp8cx.h" "vpx_codec_enc_init_ver VP8E_SET_MAX_INTRA_BITRATE_PCT" -lvpx ||
|
||||
die "ERROR: libvpx encoder version must be >=0.9.7"; }
|
||||
enabled libvpx_vp9_decoder && { check_lib2 "vpx/vpx_decoder.h vpx/vp8dx.h" "vpx_codec_vp9_dx" -lvpx || disable libvpx_vp9_decoder; }
|
||||
enabled libvpx_vp9_encoder && { check_lib2 "vpx/vpx_encoder.h vpx/vp8cx.h" "vpx_codec_vp9_cx VP9E_SET_SVC" -lvpx || disable libvpx_vp9_encoder; } }
|
||||
enabled libvpx_vp9_encoder && { check_lib2 "vpx/vpx_encoder.h vpx/vp8cx.h" "vpx_codec_vp9_cx VP9E_SET_AQ_MODE" -lvpx || disable libvpx_vp9_encoder; } }
|
||||
enabled libwavpack && require libwavpack wavpack/wavpack.h WavpackOpenFileOutput -lwavpack
|
||||
enabled libwebp && require_pkg_config libwebp webp/encode.h WebPGetEncoderVersion
|
||||
enabled libwebp && require_pkg_config libwebp webp/encode.h WebPGetEncoderVersion &&
|
||||
{ check_code cc webp/encode.h "WebPPicture wp; wp.use_argb++" ||
|
||||
die "ERROR: libwebp too old."; }
|
||||
enabled libx264 && require libx264 x264.h x264_encoder_encode -lx264 &&
|
||||
{ check_cpp_condition x264.h "X264_BUILD >= 118" ||
|
||||
die "ERROR: libx264 must be installed and version must be >= 0.118."; }
|
||||
@@ -4844,8 +4928,11 @@ else
|
||||
fi
|
||||
enabled sdl && add_cflags $sdl_cflags && add_extralibs $sdl_libs
|
||||
|
||||
texi2html --help 2> /dev/null | grep -q 'init-file' && enable texi2html || disable texi2html
|
||||
makeinfo --version > /dev/null 2>&1 && enable makeinfo || disable makeinfo
|
||||
enabled makeinfo && (makeinfo --version | \
|
||||
grep -q 'makeinfo (GNU texinfo) 5' > /dev/null 2>&1) \
|
||||
&& enable makeinfo_html || disable makeinfo_html
|
||||
disabled makeinfo_html && texi2html --help 2> /dev/null | grep -q 'init-file' && enable texi2html || disable texi2html
|
||||
perl -v > /dev/null 2>&1 && enable perl || disable perl
|
||||
pod2man --help > /dev/null 2>&1 && enable pod2man || disable pod2man
|
||||
rsync --help 2> /dev/null | grep -q 'contimeout' && enable rsync_contimeout || disable rsync_contimeout
|
||||
@@ -4964,7 +5051,7 @@ check_disable_warning -Wno-pointer-sign
|
||||
# add some linker flags
|
||||
check_ldflags -Wl,--warn-common
|
||||
check_ldflags -Wl,-rpath-link=libpostproc:libswresample:libswscale:libavfilter:libavdevice:libavformat:libavcodec:libavutil:libavresample
|
||||
enabled rpath && add_ldflags -Wl,-rpath,$libdir
|
||||
enabled rpath && add_ldexeflags -Wl,-rpath,$libdir
|
||||
test_ldflags -Wl,-Bsymbolic && append SHFLAGS -Wl,-Bsymbolic
|
||||
|
||||
# add some strip flags
|
||||
@@ -5173,7 +5260,7 @@ enabled_all dxva2 dxva2api_cobj CoTaskMemFree &&
|
||||
enable dxva2_lib
|
||||
|
||||
! enabled_any memalign posix_memalign aligned_malloc &&
|
||||
enabled_any $need_memalign && enable memalign_hack
|
||||
enabled simd_align_16 && enable memalign_hack
|
||||
|
||||
# add_dep lib dep
|
||||
# -> enable ${lib}_deps_${dep}
|
||||
@@ -5202,6 +5289,8 @@ merge_deps() {
|
||||
|
||||
merge_deps libavfilter $FILTER_LIST
|
||||
|
||||
map 'enabled $v && intrinsics=${v#intrinsics_}' $INTRINSICS_LIST
|
||||
|
||||
for thread in $THREADS_LIST; do
|
||||
if enabled $thread; then
|
||||
test -n "$thread_type" &&
|
||||
@@ -5210,14 +5299,14 @@ for thread in $THREADS_LIST; do
|
||||
fi
|
||||
done
|
||||
|
||||
enabled zlib && add_cppflags -DZLIB_CONST
|
||||
|
||||
# conditional library dependencies, in linking order
|
||||
enabled aconvert_filter && prepend avfilter_deps "swresample"
|
||||
enabled amovie_filter && prepend avfilter_deps "avformat avcodec"
|
||||
enabled aresample_filter && prepend avfilter_deps "swresample"
|
||||
enabled asyncts_filter && prepend avfilter_deps "avresample"
|
||||
enabled atempo_filter && prepend avfilter_deps "avcodec"
|
||||
enabled decimate_filter && prepend avfilter_deps "avcodec"
|
||||
enabled deshake_filter && prepend avfilter_deps "avcodec"
|
||||
enabled ebur128_filter && enabled swresample && prepend avfilter_deps "swresample"
|
||||
enabled elbg_filter && prepend avfilter_deps "avcodec"
|
||||
enabled mcdeint_filter && prepend avfilter_deps "avcodec"
|
||||
@@ -5327,6 +5416,7 @@ echo "texi2html enabled ${texi2html-no}"
|
||||
echo "perl enabled ${perl-no}"
|
||||
echo "pod2man enabled ${pod2man-no}"
|
||||
echo "makeinfo enabled ${makeinfo-no}"
|
||||
echo "makeinfo supports HTML ${makeinfo_html-no}"
|
||||
test -n "$random_seed" &&
|
||||
echo "random seed ${random_seed}"
|
||||
echo
|
||||
@@ -5382,6 +5472,7 @@ SRC_PATH:=\$(SRC_PATH:.%=..%)
|
||||
endif
|
||||
CC_IDENT=$cc_ident
|
||||
ARCH=$arch
|
||||
INTRINSICS=$intrinsics
|
||||
CC=$cc
|
||||
CXX=$cxx
|
||||
AS=$as
|
||||
@@ -5418,6 +5509,7 @@ WINDRES=$windres
|
||||
DEPWINDRES=$dep_cc
|
||||
DOXYGEN=$doxygen
|
||||
LDFLAGS=$LDFLAGS
|
||||
LDEXEFLAGS=$LDEXEFLAGS
|
||||
SHFLAGS=$(echo $($ldflags_filter $SHFLAGS))
|
||||
ASMSTRIPFLAGS=$ASMSTRIPFLAGS
|
||||
YASMFLAGS=$YASMFLAGS
|
||||
@@ -5626,6 +5718,6 @@ pkgconfig_generate libavformat "FFmpeg container format library" "$LIBAVF
|
||||
pkgconfig_generate libavdevice "FFmpeg device handling library" "$LIBAVDEVICE_VERSION" "$extralibs"
|
||||
pkgconfig_generate libavfilter "FFmpeg audio/video filtering library" "$LIBAVFILTER_VERSION" "$extralibs"
|
||||
pkgconfig_generate libpostproc "FFmpeg postprocessing library" "$LIBPOSTPROC_VERSION" ""
|
||||
pkgconfig_generate libavresample "Libav audio resampling library" "$LIBAVRESAMPLE_VERSION" "$extralibs"
|
||||
pkgconfig_generate libavresample "Libav audio resampling library" "$LIBAVRESAMPLE_VERSION" "$LIBM"
|
||||
pkgconfig_generate libswscale "FFmpeg image rescaling library" "$LIBSWSCALE_VERSION" "$LIBM"
|
||||
pkgconfig_generate libswresample "FFmpeg audio resampling library" "$LIBSWRESAMPLE_VERSION" "$LIBM"
|
||||
|
184
doc/APIchanges
184
doc/APIchanges
@@ -2,26 +2,135 @@ Never assume the API of libav* to be stable unless at least 1 month has passed
|
||||
since the last major version increase or the API was added.
|
||||
|
||||
The last version increases were:
|
||||
libavcodec: 2013-03-xx
|
||||
libavdevice: 2013-03-xx
|
||||
libavfilter: 2013-12-xx
|
||||
libavformat: 2013-03-xx
|
||||
libavresample: 2012-10-05
|
||||
libpostproc: 2011-04-18
|
||||
libswresample: 2011-09-19
|
||||
libswscale: 2011-06-20
|
||||
libavutil: 2012-10-22
|
||||
libavcodec: 2014-08-09
|
||||
libavdevice: 2014-08-09
|
||||
libavfilter: 2014-08-09
|
||||
libavformat: 2014-08-09
|
||||
libavresample: 2014-08-09
|
||||
libpostproc: 2014-08-09
|
||||
libswresample: 2014-08-09
|
||||
libswscale: 2014-08-09
|
||||
libavutil: 2014-08-09
|
||||
|
||||
|
||||
API changes, most recent first:
|
||||
|
||||
2014-07-14 - xxxxxxx - lavf 55.47.100 - avformat.h
|
||||
|
||||
-------- 8< --------- FFmpeg 2.4 was cut here -------- 8< ---------
|
||||
|
||||
2014-08-28 - f30a815 / 9301486 - lavc 56.1.100 / 56.1.0 - avcodec.h
|
||||
Add AV_PKT_DATA_STEREO3D to export container-level stereo3d information.
|
||||
|
||||
2014-08-25 - 215db29 / b263f8f - lavf 56.3.100 / 56.3.0 - avformat.h
|
||||
Add AVFormatContext.max_ts_probe.
|
||||
|
||||
2014-08-23 - 8fc9bd0 - lavu 54.7.100 - dict.h
|
||||
AV_DICT_DONT_STRDUP_KEY and AV_DICT_DONT_STRDUP_VAL arguments are now
|
||||
freed even on error. This is consistent with the behaviour all users
|
||||
of it we could find expect.
|
||||
|
||||
2014-08-21 - 980a5b0 - lavu 54.6.100 - frame.h motion_vector.h
|
||||
Add AV_FRAME_DATA_MOTION_VECTORS side data and AVMotionVector structure
|
||||
|
||||
2014-08-16 - b7d5e01 - lswr 1.1.100 - swresample.h
|
||||
Add AVFrame based API
|
||||
|
||||
2014-08-16 - c2829dc - lavu 54.4.100 - dict.h
|
||||
Add av_dict_set_int helper function.
|
||||
|
||||
2014-08-13 - c8571c6 / 8ddc326 - lavu 54.3.100 / 54.3.0 - mem.h
|
||||
Add av_strndup().
|
||||
|
||||
2014-08-13 - 2ba4577 / a8c104a - lavu 54.2.100 / 54.2.0 - opt.h
|
||||
Add av_opt_get_dict_val/set_dict_val with AV_OPT_TYPE_DICT to support
|
||||
dictionary types being set as options.
|
||||
|
||||
2014-08-13 - afbd4b8 - lavf 56.01.0 - avformat.h
|
||||
Add AVFormatContext.event_flags and AVStream.event_flags for signaling to
|
||||
the user when events happen in the file/stream.
|
||||
|
||||
2014-08-10 - 78eaaa8 / fb1ddcd - lavr 2.1.0 - avresample.h
|
||||
Add avresample_convert_frame() and avresample_config().
|
||||
|
||||
2014-08-10 - 78eaaa8 / fb1ddcd - lavu 54.1.100 / 54.1.0 - error.h
|
||||
Add AVERROR_INPUT_CHANGED and AVERROR_OUTPUT_CHANGED.
|
||||
|
||||
2014-08-08 - 3841f2a / d35b94f - lavc 55.73.102 / 55.57.4 - avcodec.h
|
||||
Deprecate FF_IDCT_XVIDMMX define and xvidmmx idct option.
|
||||
Replaced by FF_IDCT_XVID and xvid respectively.
|
||||
|
||||
2014-08-08 - 5c3c671 - lavf 55.53.100 - avio.h
|
||||
Add avio_feof() and deprecate url_feof().
|
||||
|
||||
2014-08-07 - bb78903 - lsws 2.1.3 - swscale.h
|
||||
sws_getContext is not going to be removed in the future.
|
||||
|
||||
2014-08-07 - a561662 / ad1ee5f - lavc 55.73.101 / 55.57.3 - avcodec.h
|
||||
reordered_opaque is not going to be removed in the future.
|
||||
|
||||
2014-08-02 - 28a2107 - lavu 52.98.100 - pixelutils.h
|
||||
Add pixelutils API with SAD functions
|
||||
|
||||
2014-08-04 - 6017c98 / e9abafc - lavu 52.97.100 / 53.22.0 - pixfmt.h
|
||||
Add AV_PIX_FMT_YA16 pixel format for 16 bit packed gray with alpha.
|
||||
|
||||
2014-08-04 - 4c8bc6f / e96c3b8 - lavu 52.96.101 / 53.21.1 - avstring.h
|
||||
Rename AV_PIX_FMT_Y400A to AV_PIX_FMT_YA8 to better identify the format.
|
||||
An alias pixel format and color space name are provided for compatibility.
|
||||
|
||||
2014-08-04 - 073c074 / d2962e9 - lavu 52.96.100 / 53.21.0 - pixdesc.h
|
||||
Support name aliases for pixel formats.
|
||||
|
||||
2014-08-03 - 71d008e / 1ef9e83 - lavc 55.72.101 / 55.57.2 - avcodec.h
|
||||
2014-08-03 - 71d008e / 1ef9e83 - lavu 52.95.100 / 53.20.0 - frame.h
|
||||
Deprecate AVCodecContext.dtg_active_format and use side-data instead.
|
||||
|
||||
2014-08-03 - e680c73 - lavc 55.72.100 - avcodec.h
|
||||
Add get_pixels() to AVDCT
|
||||
|
||||
2014-08-03 - 9400603 / 9f17685 - lavc 55.71.101 / 55.57.1 - avcodec.h
|
||||
Deprecate unused FF_IDCT_IPP define and ipp avcodec option.
|
||||
Deprecate unused FF_DEBUG_PTS define and pts avcodec option.
|
||||
Deprecate unused FF_CODER_TYPE_DEFLATE define and deflate avcodec option.
|
||||
Deprecate unused FF_DCT_INT define and int avcodec option.
|
||||
Deprecate unused avcodec option scenechange_factor.
|
||||
|
||||
2014-07-30 - ba3e331 - lavu 52.94.100 - frame.h
|
||||
Add av_frame_side_data_name()
|
||||
|
||||
2014-07-29 - 80a3a66 / 3a19405 - lavf 56.01.100 / 56.01.0 - avformat.h
|
||||
Add mime_type field to AVProbeData, which now MUST be initialized in
|
||||
order to avoid uninitialized reads of the mime_type pointer, likely
|
||||
leading to crashes.
|
||||
Typically, this means you will do 'AVProbeData pd = { 0 };' instead of
|
||||
'AVProbeData pd;'.
|
||||
|
||||
2014-07-29 - 31e0b5d / 69e7336 - lavu 52.92.100 / 53.19.0 - avstring.h
|
||||
Make name matching function from lavf public as av_match_name().
|
||||
|
||||
2014-07-28 - 2e5c8b0 / c5fca01 - lavc 55.71.100 / 55.57.0 - avcodec.h
|
||||
Add AV_CODEC_PROP_REORDER to mark codecs supporting frame reordering.
|
||||
|
||||
2014-07-27 - ff9a154 - lavf 55.50.100 - avformat.h
|
||||
New field int64_t probesize2 instead of deprecated
|
||||
field int probesize.
|
||||
|
||||
2014-07-27 - 932ff70 - lavc 55.70.100 - avdct.h
|
||||
Add AVDCT / avcodec_dct_alloc() / avcodec_dct_init().
|
||||
|
||||
2014-07-23 - 8a4c086 - lavf 55.49.100 - avio.h
|
||||
Add avio_read_to_bprint()
|
||||
|
||||
|
||||
-------- 8< --------- FFmpeg 2.3 was cut here -------- 8< ---------
|
||||
|
||||
2014-07-14 - 62227a7 - lavf 55.47.100 - avformat.h
|
||||
Add av_stream_get_parser()
|
||||
|
||||
2014-07-xx - xxxxxxx - lavu 53.18.0 - display.h
|
||||
2014-07-09 - c67690f / a54f03b - lavu 52.92.100 / 53.18.0 - display.h
|
||||
Add av_display_matrix_flip() to flip the transformation matrix.
|
||||
|
||||
2014-07-xx - xxxxxxx - lavc 55.56.0 - dv_profile.h
|
||||
2014-07-09 - 1b58f13 / f6ee61f - lavc 55.69.100 / 55.56.0 - dv_profile.h
|
||||
Add a public API for DV profile handling.
|
||||
|
||||
2014-06-20 - 0dceefc / 9e500ef - lavu 52.90.100 / 53.17.0 - imgutils.h
|
||||
@@ -35,6 +144,10 @@ API changes, most recent first:
|
||||
is now setting AVStream.time_base, instead of AVStream.codec.time_base as was
|
||||
done previously. The old method is now deprecated.
|
||||
|
||||
2014-06-11 - 67d29da - lavc 55.66.101 - avcodec.h
|
||||
Increase FF_INPUT_BUFFER_PADDING_SIZE to 32 due to some corner cases needing
|
||||
it
|
||||
|
||||
2014-06-10 - xxxxxxx - lavf 55.43.100 - avformat.h
|
||||
New field int64_t max_analyze_duration2 instead of deprecated
|
||||
int max_analyze_duration.
|
||||
@@ -42,7 +155,7 @@ API changes, most recent first:
|
||||
2014-05-30 - 00759d7 - lavu 52.89.100 - opt.h
|
||||
Add av_opt_copy()
|
||||
|
||||
2014-04-xx - 03bb99a / 0957b27 - lavc 55.66.100 / 55.54.0 - avcodec.h
|
||||
2014-06-01 - 03bb99a / 0957b27 - lavc 55.66.100 / 55.54.0 - avcodec.h
|
||||
Add AVCodecContext.side_data_only_packets to allow encoders to output packets
|
||||
with only side data. This option may become mandatory in the future, so all
|
||||
users are recommended to update their code and enable this option.
|
||||
@@ -52,10 +165,10 @@ API changes, most recent first:
|
||||
AVColorTransferCharacteristic, and AVChromaLocation) inside lavu.
|
||||
And add AVFrame fields for them.
|
||||
|
||||
2014-04-xx - bdb2e80 / b2d4565 - lavr 1.3.0 - avresample.h
|
||||
2014-05-29 - bdb2e80 / b2d4565 - lavr 1.3.0 - avresample.h
|
||||
Add avresample_max_output_samples
|
||||
|
||||
2014-05-24 - d858ee7 / 6d21259 - lavf 55.42.100 / 55.19.0 - avformat.h
|
||||
2014-05-28 - d858ee7 / 6d21259 - lavf 55.42.100 / 55.19.0 - avformat.h
|
||||
Add strict_std_compliance and related AVOptions to support experimental
|
||||
muxing.
|
||||
|
||||
@@ -65,7 +178,7 @@ API changes, most recent first:
|
||||
2014-05-26 - c37d179 - lavf 55.41.100 - avformat.h
|
||||
Add format_probesize to AVFormatContext.
|
||||
|
||||
2014-05-19 - 7d25af1 / c23c96b - lavf 55.39.100 / 55.18.0 - avformat.h
|
||||
2014-05-20 - 7d25af1 / c23c96b - lavf 55.39.100 / 55.18.0 - avformat.h
|
||||
Add av_stream_get_side_data() to access stream-level side data
|
||||
in the same way as av_packet_get_side_data().
|
||||
|
||||
@@ -76,7 +189,7 @@ API changes, most recent first:
|
||||
Add AV_FRAME_DATA_DISPLAYMATRIX for exporting frame-level
|
||||
spatial rendering on video frames for proper display.
|
||||
|
||||
2014-05-xx - xxxxxxx - lavc 55.64.100 / 55.53.0 - avcodec.h
|
||||
2014-05-19 - ef1d4ee / bddd8cb - lavc 55.64.100 / 55.53.0 - avcodec.h
|
||||
Add AV_PKT_DATA_DISPLAYMATRIX for exporting packet-level
|
||||
spatial rendering on video frames for proper display.
|
||||
|
||||
@@ -92,7 +205,7 @@ API changes, most recent first:
|
||||
Add av_gettime_relative() av_gettime_relative_is_monotonic()
|
||||
|
||||
2014-05-15 - eacf7d6 / 0c1959b - lavf 55.38.100 / 55.17.0 - avformat.h
|
||||
Add AVMFT_FLAG_BITEXACT flag. Muxers now use it instead of checking
|
||||
Add AVFMT_FLAG_BITEXACT flag. Muxers now use it instead of checking
|
||||
CODEC_FLAG_BITEXACT on the first stream.
|
||||
|
||||
2014-05-15 - 96cb4c8 - lswr 0.19.100 - swresample.h
|
||||
@@ -184,6 +297,9 @@ API changes, most recent first:
|
||||
Give the name AVPacketSideData to the previously anonymous struct used for
|
||||
AVPacket.side_data.
|
||||
|
||||
|
||||
-------- 8< --------- FFmpeg 2.2 was cut here -------- 8< ---------
|
||||
|
||||
2014-03-18 - 37c07d4 - lsws 2.5.102
|
||||
Make gray16 full-scale.
|
||||
|
||||
@@ -326,6 +442,9 @@ API changes, most recent first:
|
||||
2013-10-31 - 78265fc / 28096e0 - lavu 52.49.100 / 52.17.0 - frame.h
|
||||
Add AVFrame.flags and AV_FRAME_FLAG_CORRUPT.
|
||||
|
||||
|
||||
-------- 8< --------- FFmpeg 2.1 was cut here -------- 8< ---------
|
||||
|
||||
2013-10-27 - dbe6f9f - lavc 55.39.100 - avcodec.h
|
||||
Add CODEC_CAP_DELAY support to avcodec_decode_subtitle2.
|
||||
|
||||
@@ -398,6 +517,9 @@ API changes, most recent first:
|
||||
Add avcodec_chroma_pos_to_enum()
|
||||
Add avcodec_enum_to_chroma_pos()
|
||||
|
||||
|
||||
-------- 8< --------- FFmpeg 2.0 was cut here -------- 8< ---------
|
||||
|
||||
2013-07-03 - 838bd73 - lavfi 3.78.100 - avfilter.h
|
||||
Deprecate avfilter_graph_parse() in favor of the equivalent
|
||||
avfilter_graph_parse_ptr().
|
||||
@@ -470,6 +592,9 @@ API changes, most recent first:
|
||||
2013-03-17 - 7aa9af5 - lavu 52.20.100 - opt.h
|
||||
Add AV_OPT_TYPE_VIDEO_RATE value to AVOptionType enum.
|
||||
|
||||
|
||||
-------- 8< --------- FFmpeg 1.2 was cut here -------- 8< ---------
|
||||
|
||||
2013-03-07 - 9767ec6 - lavu 52.18.100 - avstring.h,bprint.h
|
||||
Add av_escape() and av_bprint_escape() API.
|
||||
|
||||
@@ -482,6 +607,9 @@ API changes, most recent first:
|
||||
2013-01-01 - 2eb2e17 - lavfi 3.34.100
|
||||
Add avfilter_get_audio_buffer_ref_from_arrays_channels.
|
||||
|
||||
|
||||
-------- 8< --------- FFmpeg 1.1 was cut here -------- 8< ---------
|
||||
|
||||
2012-12-20 - 34de47aa - lavfi 3.29.100 - avfilter.h
|
||||
Add AVFilterLink.channels, avfilter_link_get_channels()
|
||||
and avfilter_ref_get_channels().
|
||||
@@ -527,6 +655,9 @@ API changes, most recent first:
|
||||
Add LIBSWRESAMPLE_VERSION, LIBSWRESAMPLE_BUILD
|
||||
and LIBSWRESAMPLE_IDENT symbols.
|
||||
|
||||
|
||||
-------- 8< --------- FFmpeg 1.0 was cut here -------- 8< ---------
|
||||
|
||||
2012-09-06 - 29e972f - lavu 51.72.100 - parseutils.h
|
||||
Add av_small_strptime() time parsing function.
|
||||
|
||||
@@ -945,6 +1076,9 @@ lavd 54.4.100 / 54.0.0, lavfi 3.5.0
|
||||
2012-01-12 - b18e17e / 3167dc9 - lavfi 2.59.100 / 2.15.0
|
||||
Add a new installed header -- libavfilter/version.h -- with version macros.
|
||||
|
||||
|
||||
-------- 8< --------- FFmpeg 0.9 was cut here -------- 8< ---------
|
||||
|
||||
2011-12-08 - a502939 - lavfi 2.52.0
|
||||
Add av_buffersink_poll_frame() to buffersink.h.
|
||||
|
||||
@@ -1154,6 +1288,13 @@ lavd 54.4.100 / 54.0.0, lavfi 3.5.0
|
||||
2011-06-28 - 5129336 - lavu 51.11.0 - avutil.h
|
||||
Define the AV_PICTURE_TYPE_NONE value in AVPictureType enum.
|
||||
|
||||
|
||||
-------- 8< --------- FFmpeg 0.7 was cut here -------- 8< ---------
|
||||
|
||||
|
||||
|
||||
-------- 8< --------- FFmpeg 0.8 was cut here -------- 8< ---------
|
||||
|
||||
2011-06-19 - fd2c0a5 - lavfi 2.23.0 - avfilter.h
|
||||
Add layout negotiation fields and helper functions.
|
||||
|
||||
@@ -1831,6 +1972,9 @@ lavd 54.4.100 / 54.0.0, lavfi 3.5.0
|
||||
2010-06-02 - 7e566bb - lavc 52.73.0 - av_get_codec_tag_string()
|
||||
Add av_get_codec_tag_string().
|
||||
|
||||
|
||||
-------- 8< --------- FFmpeg 0.6 was cut here -------- 8< ---------
|
||||
|
||||
2010-06-01 - 2b99142 - lsws 0.11.0 - convertPalette API
|
||||
Add sws_convertPalette8ToPacked32() and sws_convertPalette8ToPacked24().
|
||||
|
||||
@@ -1848,10 +1992,6 @@ lavd 54.4.100 / 54.0.0, lavfi 3.5.0
|
||||
2010-05-09 - b6bc205 - lavfi 1.20.0 - AVFilterPicRef
|
||||
Add interlaced and top_field_first fields to AVFilterPicRef.
|
||||
|
||||
------------------------------8<-------------------------------------
|
||||
0.6 branch was cut here
|
||||
----------------------------->8--------------------------------------
|
||||
|
||||
2010-05-01 - 8e2ee18 - lavf 52.62.0 - probe function
|
||||
Add av_probe_input_format2 to API, it allows ignoring probe
|
||||
results below given score and returns the actual probe score.
|
||||
|
@@ -31,7 +31,7 @@ PROJECT_NAME = FFmpeg
|
||||
# This could be handy for archiving the generated documentation or
|
||||
# if some version control system is used.
|
||||
|
||||
PROJECT_NUMBER =
|
||||
PROJECT_NUMBER = 2.4.2
|
||||
|
||||
# With the PROJECT_LOGO tag one can specify a logo or icon that is included
|
||||
# in the documentation. The maximum height of the logo should not exceed 55
|
||||
|
15
doc/Makefile
15
doc/Makefile
@@ -38,7 +38,9 @@ DOCS = $(DOCS-yes)
|
||||
|
||||
DOC_EXAMPLES-$(CONFIG_AVIO_READING_EXAMPLE) += avio_reading
|
||||
DOC_EXAMPLES-$(CONFIG_AVCODEC_EXAMPLE) += avcodec
|
||||
DOC_EXAMPLES-$(CONFIG_DECODING_ENCODING_EXAMPLE) += decoding_encoding
|
||||
DOC_EXAMPLES-$(CONFIG_DEMUXING_DECODING_EXAMPLE) += demuxing_decoding
|
||||
DOC_EXAMPLES-$(CONFIG_EXTRACT_MVS_EXAMPLE) += extract_mvs
|
||||
DOC_EXAMPLES-$(CONFIG_FILTER_AUDIO_EXAMPLE) += filter_audio
|
||||
DOC_EXAMPLES-$(CONFIG_FILTERING_AUDIO_EXAMPLE) += filtering_audio
|
||||
DOC_EXAMPLES-$(CONFIG_FILTERING_VIDEO_EXAMPLE) += filtering_video
|
||||
@@ -80,14 +82,25 @@ $(GENTEXI): doc/avoptions_%.texi: doc/print_options$(HOSTEXESUF)
|
||||
$(M)doc/print_options $* > $@
|
||||
|
||||
doc/%.html: TAG = HTML
|
||||
doc/%-all.html: TAG = HTML
|
||||
|
||||
ifdef HAVE_MAKEINFO_HTML
|
||||
doc/%.html: doc/%.texi $(SRC_PATH)/doc/t2h.pm $(GENTEXI)
|
||||
$(Q)$(TEXIDEP)
|
||||
$(M)makeinfo --html -I doc --no-split -D config-not-all --init-file=$(SRC_PATH)/doc/t2h.pm --output $@ $<
|
||||
|
||||
doc/%-all.html: doc/%.texi $(SRC_PATH)/doc/t2h.pm $(GENTEXI)
|
||||
$(Q)$(TEXIDEP)
|
||||
$(M)makeinfo --html -I doc --no-split -D config-all --init-file=$(SRC_PATH)/doc/t2h.pm --output $@ $<
|
||||
else
|
||||
doc/%.html: doc/%.texi $(SRC_PATH)/doc/t2h.init $(GENTEXI)
|
||||
$(Q)$(TEXIDEP)
|
||||
$(M)texi2html -I doc -monolithic --D=config-not-all --init-file $(SRC_PATH)/doc/t2h.init --output $@ $<
|
||||
|
||||
doc/%-all.html: TAG = HTML
|
||||
doc/%-all.html: doc/%.texi $(SRC_PATH)/doc/t2h.init $(GENTEXI)
|
||||
$(Q)$(TEXIDEP)
|
||||
$(M)texi2html -I doc -monolithic --D=config-all --init-file $(SRC_PATH)/doc/t2h.init --output $@ $<
|
||||
endif
|
||||
|
||||
doc/%.pod: TAG = POD
|
||||
doc/%.pod: doc/%.texi $(SRC_PATH)/doc/texi2pod.pl $(GENTEXI)
|
||||
|
5
doc/bootstrap.min.css
vendored
Normal file
5
doc/bootstrap.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
@@ -498,6 +498,8 @@ threading operations
|
||||
@item vismv @var{integer} (@emph{decoding,video})
|
||||
Visualize motion vectors (MVs).
|
||||
|
||||
This option is deprecated, see the codecview filter instead.
|
||||
|
||||
Possible values:
|
||||
@table @samp
|
||||
@item pf
|
||||
@@ -797,6 +799,9 @@ Frame data might be split into multiple chunks.
|
||||
Show all frames before the first keyframe.
|
||||
@item skiprd
|
||||
Deprecated, use mpegvideo private options instead.
|
||||
@item export_mvs
|
||||
Export motion vectors into frame side-data (see @code{AV_FRAME_DATA_MOTION_VECTORS})
|
||||
for codecs that support it. See also @file{doc/examples/export_mvs.c}.
|
||||
@end table
|
||||
|
||||
@item error @var{integer} (@emph{encoding,video})
|
||||
|
@@ -163,6 +163,9 @@ Requires the presence of the libopus headers and library during
|
||||
configuration. You need to explicitly configure the build with
|
||||
@code{--enable-libopus}.
|
||||
|
||||
An FFmpeg native decoder for Opus exists, so users can decode Opus
|
||||
without this library.
|
||||
|
||||
@c man end AUDIO DECODERS
|
||||
|
||||
@chapter Subtitles Decoders
|
||||
|
@@ -174,6 +174,40 @@ See @url{http://quvi.sourceforge.net/} for more information.
|
||||
FFmpeg needs to be built with @code{--enable-libquvi} for this demuxer to be
|
||||
enabled.
|
||||
|
||||
@section gif
|
||||
|
||||
Animated GIF demuxer.
|
||||
|
||||
It accepts the following options:
|
||||
|
||||
@table @option
|
||||
@item min_delay
|
||||
Set the minimum valid delay between frames in hundredths of seconds.
|
||||
Range is 0 to 6000. Default value is 2.
|
||||
|
||||
@item default_delay
|
||||
Set the default delay between frames in hundredths of seconds.
|
||||
Range is 0 to 6000. Default value is 10.
|
||||
|
||||
@item ignore_loop
|
||||
GIF files can contain information to loop a certain number of times (or
|
||||
infinitely). If @option{ignore_loop} is set to 1, then the loop setting
|
||||
from the input will be ignored and looping will not occur. If set to 0,
|
||||
then looping will occur and will cycle the number of times according to
|
||||
the GIF. Default value is 1.
|
||||
@end table
|
||||
|
||||
For example, with the overlay filter, place an infinitely looping GIF
|
||||
over another video:
|
||||
@example
|
||||
ffmpeg -i input.mp4 -ignore_loop 0 -i input.gif -filter_complex overlay=shortest=1 out.mkv
|
||||
@end example
|
||||
|
||||
Note that in the above example the shortest option for overlay filter is
|
||||
used to end the output video at the length of the shortest input file,
|
||||
which in this case is @file{input.mp4} as the GIF in this example loops
|
||||
infinitely.
|
||||
|
||||
@section image2
|
||||
|
||||
Image file demuxer.
|
||||
|
@@ -323,9 +323,12 @@ Always fill out the commit log message. Describe in a few lines what you
|
||||
changed and why. You can refer to mailing list postings if you fix a
|
||||
particular bug. Comments such as "fixed!" or "Changed it." are unacceptable.
|
||||
Recommended format:
|
||||
|
||||
@example
|
||||
area changed: Short 1 line description
|
||||
|
||||
details describing what and why and giving references.
|
||||
@end example
|
||||
|
||||
@item
|
||||
Make sure the author of the commit is set correctly. (see git commit --author)
|
||||
|
@@ -1032,7 +1032,7 @@ configuration. You need to explicitly configure the build with
|
||||
|
||||
@subsection Option Mapping
|
||||
|
||||
Most libopus options are modeled after the @command{opusenc} utility from
|
||||
Most libopus options are modelled after the @command{opusenc} utility from
|
||||
opus-tools. The following is an option mapping chart describing options
|
||||
supported by the libopus wrapper, and their @command{opusenc}-equivalent
|
||||
in parentheses.
|
||||
@@ -1330,7 +1330,7 @@ ffmpeg -i INPUT -codec:v libtheora -b:v 1000k OUTPUT.ogg
|
||||
|
||||
@section libvpx
|
||||
|
||||
VP8 format supported through libvpx.
|
||||
VP8/VP9 format supported through libvpx.
|
||||
|
||||
Requires the presence of the libvpx headers and library during configuration.
|
||||
You need to explicitly configure the build with @code{--enable-libvpx}.
|
||||
@@ -1442,6 +1442,9 @@ g_lag_in_frames
|
||||
@item vp8flags error_resilient
|
||||
g_error_resilient
|
||||
|
||||
@item aq_mode
|
||||
@code{VP9E_SET_AQ_MODE}
|
||||
|
||||
@end table
|
||||
|
||||
For more information about libvpx see:
|
||||
|
@@ -14,6 +14,7 @@ LDLIBS := $(shell pkg-config --libs $(FFMPEG_LIBS)) $(LDLIBS)
|
||||
EXAMPLES= avio_reading \
|
||||
decoding_encoding \
|
||||
demuxing_decoding \
|
||||
extract_mvs \
|
||||
filtering_video \
|
||||
filtering_audio \
|
||||
metadata \
|
||||
|
185
doc/examples/extract_mvs.c
Normal file
185
doc/examples/extract_mvs.c
Normal file
@@ -0,0 +1,185 @@
|
||||
/*
|
||||
* Copyright (c) 2012 Stefano Sabatini
|
||||
* Copyright (c) 2014 Clément Bœsch
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <libavutil/motion_vector.h>
|
||||
#include <libavformat/avformat.h>
|
||||
|
||||
static AVFormatContext *fmt_ctx = NULL;
|
||||
static AVCodecContext *video_dec_ctx = NULL;
|
||||
static AVStream *video_stream = NULL;
|
||||
static const char *src_filename = NULL;
|
||||
|
||||
static int video_stream_idx = -1;
|
||||
static AVFrame *frame = NULL;
|
||||
static AVPacket pkt;
|
||||
static int video_frame_count = 0;
|
||||
|
||||
static int decode_packet(int *got_frame, int cached)
|
||||
{
|
||||
int decoded = pkt.size;
|
||||
|
||||
*got_frame = 0;
|
||||
|
||||
if (pkt.stream_index == video_stream_idx) {
|
||||
int ret = avcodec_decode_video2(video_dec_ctx, frame, got_frame, &pkt);
|
||||
if (ret < 0) {
|
||||
fprintf(stderr, "Error decoding video frame (%s)\n", av_err2str(ret));
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (*got_frame) {
|
||||
int i;
|
||||
AVFrameSideData *sd;
|
||||
|
||||
video_frame_count++;
|
||||
sd = av_frame_get_side_data(frame, AV_FRAME_DATA_MOTION_VECTORS);
|
||||
if (sd) {
|
||||
const AVMotionVector *mvs = (const AVMotionVector *)sd->data;
|
||||
for (i = 0; i < sd->size / sizeof(*mvs); i++) {
|
||||
const AVMotionVector *mv = &mvs[i];
|
||||
printf("%d,%2d,%2d,%2d,%4d,%4d,%4d,%4d,0x%"PRIx64"\n",
|
||||
video_frame_count, mv->source,
|
||||
mv->w, mv->h, mv->src_x, mv->src_y,
|
||||
mv->dst_x, mv->dst_y, mv->flags);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return decoded;
|
||||
}
|
||||
|
||||
static int open_codec_context(int *stream_idx,
|
||||
AVFormatContext *fmt_ctx, enum AVMediaType type)
|
||||
{
|
||||
int ret;
|
||||
AVStream *st;
|
||||
AVCodecContext *dec_ctx = NULL;
|
||||
AVCodec *dec = NULL;
|
||||
AVDictionary *opts = NULL;
|
||||
|
||||
ret = av_find_best_stream(fmt_ctx, type, -1, -1, NULL, 0);
|
||||
if (ret < 0) {
|
||||
fprintf(stderr, "Could not find %s stream in input file '%s'\n",
|
||||
av_get_media_type_string(type), src_filename);
|
||||
return ret;
|
||||
} else {
|
||||
*stream_idx = ret;
|
||||
st = fmt_ctx->streams[*stream_idx];
|
||||
|
||||
/* find decoder for the stream */
|
||||
dec_ctx = st->codec;
|
||||
dec = avcodec_find_decoder(dec_ctx->codec_id);
|
||||
if (!dec) {
|
||||
fprintf(stderr, "Failed to find %s codec\n",
|
||||
av_get_media_type_string(type));
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
|
||||
/* Init the video decoder */
|
||||
av_dict_set(&opts, "flags2", "+export_mvs", 0);
|
||||
if ((ret = avcodec_open2(dec_ctx, dec, &opts)) < 0) {
|
||||
fprintf(stderr, "Failed to open %s codec\n",
|
||||
av_get_media_type_string(type));
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int ret = 0, got_frame;
|
||||
|
||||
if (argc != 2) {
|
||||
fprintf(stderr, "Usage: %s <video>\n", argv[0]);
|
||||
exit(1);
|
||||
}
|
||||
src_filename = argv[1];
|
||||
|
||||
av_register_all();
|
||||
|
||||
if (avformat_open_input(&fmt_ctx, src_filename, NULL, NULL) < 0) {
|
||||
fprintf(stderr, "Could not open source file %s\n", src_filename);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (avformat_find_stream_info(fmt_ctx, NULL) < 0) {
|
||||
fprintf(stderr, "Could not find stream information\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (open_codec_context(&video_stream_idx, fmt_ctx, AVMEDIA_TYPE_VIDEO) >= 0) {
|
||||
video_stream = fmt_ctx->streams[video_stream_idx];
|
||||
video_dec_ctx = video_stream->codec;
|
||||
}
|
||||
|
||||
av_dump_format(fmt_ctx, 0, src_filename, 0);
|
||||
|
||||
if (!video_stream) {
|
||||
fprintf(stderr, "Could not find video stream in the input, aborting\n");
|
||||
ret = 1;
|
||||
goto end;
|
||||
}
|
||||
|
||||
frame = av_frame_alloc();
|
||||
if (!frame) {
|
||||
fprintf(stderr, "Could not allocate frame\n");
|
||||
ret = AVERROR(ENOMEM);
|
||||
goto end;
|
||||
}
|
||||
|
||||
printf("framenum,source,blockw,blockh,srcx,srcy,dstx,dsty,flags\n");
|
||||
|
||||
/* initialize packet, set data to NULL, let the demuxer fill it */
|
||||
av_init_packet(&pkt);
|
||||
pkt.data = NULL;
|
||||
pkt.size = 0;
|
||||
|
||||
/* read frames from the file */
|
||||
while (av_read_frame(fmt_ctx, &pkt) >= 0) {
|
||||
AVPacket orig_pkt = pkt;
|
||||
do {
|
||||
ret = decode_packet(&got_frame, 0);
|
||||
if (ret < 0)
|
||||
break;
|
||||
pkt.data += ret;
|
||||
pkt.size -= ret;
|
||||
} while (pkt.size > 0);
|
||||
av_free_packet(&orig_pkt);
|
||||
}
|
||||
|
||||
/* flush cached frames */
|
||||
pkt.data = NULL;
|
||||
pkt.size = 0;
|
||||
do {
|
||||
decode_packet(&got_frame, 1);
|
||||
} while (got_frame);
|
||||
|
||||
end:
|
||||
avcodec_close(video_dec_ctx);
|
||||
avformat_close_input(&fmt_ctx);
|
||||
av_frame_free(&frame);
|
||||
return ret < 0;
|
||||
}
|
@@ -45,6 +45,7 @@
|
||||
|
||||
#include "libavutil/channel_layout.h"
|
||||
#include "libavutil/md5.h"
|
||||
#include "libavutil/mem.h"
|
||||
#include "libavutil/opt.h"
|
||||
#include "libavutil/samplefmt.h"
|
||||
|
||||
|
@@ -55,6 +55,7 @@ typedef struct OutputStream {
|
||||
|
||||
/* pts of the next frame that will be generated */
|
||||
int64_t next_pts;
|
||||
int samples_count;
|
||||
|
||||
AVFrame *frame;
|
||||
AVFrame *tmp_frame;
|
||||
@@ -62,6 +63,7 @@ typedef struct OutputStream {
|
||||
float t, tincr, tincr2;
|
||||
|
||||
struct SwsContext *sws_ctx;
|
||||
struct SwrContext *swr_ctx;
|
||||
} OutputStream;
|
||||
|
||||
static void log_packet(const AVFormatContext *fmt_ctx, const AVPacket *pkt)
|
||||
@@ -92,6 +94,7 @@ static void add_stream(OutputStream *ost, AVFormatContext *oc,
|
||||
enum AVCodecID codec_id)
|
||||
{
|
||||
AVCodecContext *c;
|
||||
int i;
|
||||
|
||||
/* find the encoder */
|
||||
*codec = avcodec_find_encoder(codec_id);
|
||||
@@ -115,8 +118,24 @@ static void add_stream(OutputStream *ost, AVFormatContext *oc,
|
||||
(*codec)->sample_fmts[0] : AV_SAMPLE_FMT_FLTP;
|
||||
c->bit_rate = 64000;
|
||||
c->sample_rate = 44100;
|
||||
c->channels = 2;
|
||||
if ((*codec)->supported_samplerates) {
|
||||
c->sample_rate = (*codec)->supported_samplerates[0];
|
||||
for (i = 0; (*codec)->supported_samplerates[i]; i++) {
|
||||
if ((*codec)->supported_samplerates[i] == 44100)
|
||||
c->sample_rate = 44100;
|
||||
}
|
||||
}
|
||||
c->channels = av_get_channel_layout_nb_channels(c->channel_layout);
|
||||
c->channel_layout = AV_CH_LAYOUT_STEREO;
|
||||
if ((*codec)->channel_layouts) {
|
||||
c->channel_layout = (*codec)->channel_layouts[0];
|
||||
for (i = 0; (*codec)->channel_layouts[i]; i++) {
|
||||
if ((*codec)->channel_layouts[i] == AV_CH_LAYOUT_STEREO)
|
||||
c->channel_layout = AV_CH_LAYOUT_STEREO;
|
||||
}
|
||||
}
|
||||
c->channels = av_get_channel_layout_nb_channels(c->channel_layout);
|
||||
ost->st->time_base = (AVRational){ 1, c->sample_rate };
|
||||
break;
|
||||
|
||||
case AVMEDIA_TYPE_VIDEO:
|
||||
@@ -130,8 +149,9 @@ static void add_stream(OutputStream *ost, AVFormatContext *oc,
|
||||
* of which frame timestamps are represented. For fixed-fps content,
|
||||
* timebase should be 1/framerate and timestamp increments should be
|
||||
* identical to 1. */
|
||||
c->time_base.den = STREAM_FRAME_RATE;
|
||||
c->time_base.num = 1;
|
||||
ost->st->time_base = (AVRational){ 1, STREAM_FRAME_RATE };
|
||||
c->time_base = ost->st->time_base;
|
||||
|
||||
c->gop_size = 12; /* emit one intra frame every twelve frames at most */
|
||||
c->pix_fmt = STREAM_PIX_FMT;
|
||||
if (c->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
|
||||
@@ -158,19 +178,47 @@ static void add_stream(OutputStream *ost, AVFormatContext *oc,
|
||||
/**************************************************************/
|
||||
/* audio output */
|
||||
|
||||
int samples_count;
|
||||
static AVFrame *alloc_audio_frame(enum AVSampleFormat sample_fmt,
|
||||
uint64_t channel_layout,
|
||||
int sample_rate, int nb_samples)
|
||||
{
|
||||
AVFrame *frame = av_frame_alloc();
|
||||
int ret;
|
||||
|
||||
struct SwrContext *swr_ctx = NULL;
|
||||
if (!frame) {
|
||||
fprintf(stderr, "Error allocating an audio frame\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
static void open_audio(AVFormatContext *oc, AVCodec *codec, OutputStream *ost)
|
||||
frame->format = sample_fmt;
|
||||
frame->channel_layout = channel_layout;
|
||||
frame->sample_rate = sample_rate;
|
||||
frame->nb_samples = nb_samples;
|
||||
|
||||
if (nb_samples) {
|
||||
ret = av_frame_get_buffer(frame, 0);
|
||||
if (ret < 0) {
|
||||
fprintf(stderr, "Error allocating an audio buffer\n");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
return frame;
|
||||
}
|
||||
|
||||
static void open_audio(AVFormatContext *oc, AVCodec *codec, OutputStream *ost, AVDictionary *opt_arg)
|
||||
{
|
||||
AVCodecContext *c;
|
||||
int nb_samples;
|
||||
int ret;
|
||||
AVDictionary *opt = NULL;
|
||||
|
||||
c = ost->st->codec;
|
||||
|
||||
/* open it */
|
||||
ret = avcodec_open2(c, codec, NULL);
|
||||
av_dict_copy(&opt, opt_arg, 0);
|
||||
ret = avcodec_open2(c, codec, &opt);
|
||||
av_dict_free(&opt);
|
||||
if (ret < 0) {
|
||||
fprintf(stderr, "Could not open audio codec: %s\n", av_err2str(ret));
|
||||
exit(1);
|
||||
@@ -182,84 +230,52 @@ static void open_audio(AVFormatContext *oc, AVCodec *codec, OutputStream *ost)
|
||||
/* increment frequency by 110 Hz per second */
|
||||
ost->tincr2 = 2 * M_PI * 110.0 / c->sample_rate / c->sample_rate;
|
||||
|
||||
ost->frame = av_frame_alloc();
|
||||
if (!ost->frame)
|
||||
exit(1);
|
||||
|
||||
ost->frame->sample_rate = c->sample_rate;
|
||||
ost->frame->format = AV_SAMPLE_FMT_S16;
|
||||
ost->frame->channel_layout = c->channel_layout;
|
||||
|
||||
if (c->codec->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE)
|
||||
ost->frame->nb_samples = 10000;
|
||||
nb_samples = 10000;
|
||||
else
|
||||
ost->frame->nb_samples = c->frame_size;
|
||||
nb_samples = c->frame_size;
|
||||
|
||||
ost->tmp_frame = av_frame_alloc();
|
||||
if (!ost->frame)
|
||||
exit(1);
|
||||
|
||||
ost->tmp_frame->sample_rate = c->sample_rate;
|
||||
ost->tmp_frame->format = c->sample_fmt;
|
||||
ost->tmp_frame->channel_layout = c->channel_layout;
|
||||
ost->tmp_frame->nb_samples = ost->frame->nb_samples;
|
||||
ost->frame = alloc_audio_frame(c->sample_fmt, c->channel_layout,
|
||||
c->sample_rate, nb_samples);
|
||||
ost->tmp_frame = alloc_audio_frame(AV_SAMPLE_FMT_S16, c->channel_layout,
|
||||
c->sample_rate, nb_samples);
|
||||
|
||||
/* create resampler context */
|
||||
if (c->sample_fmt != AV_SAMPLE_FMT_S16) {
|
||||
swr_ctx = swr_alloc();
|
||||
if (!swr_ctx) {
|
||||
ost->swr_ctx = swr_alloc();
|
||||
if (!ost->swr_ctx) {
|
||||
fprintf(stderr, "Could not allocate resampler context\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* set options */
|
||||
av_opt_set_int (swr_ctx, "in_channel_count", c->channels, 0);
|
||||
av_opt_set_int (swr_ctx, "in_sample_rate", c->sample_rate, 0);
|
||||
av_opt_set_sample_fmt(swr_ctx, "in_sample_fmt", AV_SAMPLE_FMT_S16, 0);
|
||||
av_opt_set_int (swr_ctx, "out_channel_count", c->channels, 0);
|
||||
av_opt_set_int (swr_ctx, "out_sample_rate", c->sample_rate, 0);
|
||||
av_opt_set_sample_fmt(swr_ctx, "out_sample_fmt", c->sample_fmt, 0);
|
||||
av_opt_set_int (ost->swr_ctx, "in_channel_count", c->channels, 0);
|
||||
av_opt_set_int (ost->swr_ctx, "in_sample_rate", c->sample_rate, 0);
|
||||
av_opt_set_sample_fmt(ost->swr_ctx, "in_sample_fmt", AV_SAMPLE_FMT_S16, 0);
|
||||
av_opt_set_int (ost->swr_ctx, "out_channel_count", c->channels, 0);
|
||||
av_opt_set_int (ost->swr_ctx, "out_sample_rate", c->sample_rate, 0);
|
||||
av_opt_set_sample_fmt(ost->swr_ctx, "out_sample_fmt", c->sample_fmt, 0);
|
||||
|
||||
/* initialize the resampling context */
|
||||
if ((ret = swr_init(swr_ctx)) < 0) {
|
||||
if ((ret = swr_init(ost->swr_ctx)) < 0) {
|
||||
fprintf(stderr, "Failed to initialize the resampling context\n");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
ret = av_frame_get_buffer(ost->frame, 0);
|
||||
if (ret < 0) {
|
||||
fprintf(stderr, "Could not allocate an audio frame.\n");
|
||||
exit(1);
|
||||
}
|
||||
ret = av_frame_get_buffer(ost->tmp_frame, 0);
|
||||
if (ret < 0) {
|
||||
fprintf(stderr, "Could not allocate an audio frame.\n");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
/* Prepare a 16 bit dummy audio frame of 'frame_size' samples and
|
||||
* 'nb_channels' channels. */
|
||||
static AVFrame *get_audio_frame(OutputStream *ost)
|
||||
{
|
||||
int j, i, v, ret;
|
||||
int16_t *q = (int16_t*)ost->frame->data[0];
|
||||
AVFrame *frame = ost->tmp_frame;
|
||||
int j, i, v;
|
||||
int16_t *q = (int16_t*)frame->data[0];
|
||||
|
||||
/* check if we want to generate more frames */
|
||||
if (av_compare_ts(ost->next_pts, ost->st->codec->time_base,
|
||||
STREAM_DURATION, (AVRational){ 1, 1 }) >= 0)
|
||||
return NULL;
|
||||
|
||||
/* when we pass a frame to the encoder, it may keep a reference to it
|
||||
* internally;
|
||||
* make sure we do not overwrite it here
|
||||
*/
|
||||
ret = av_frame_make_writable(ost->frame);
|
||||
if (ret < 0)
|
||||
exit(1);
|
||||
|
||||
for (j = 0; j < ost->frame->nb_samples; j++) {
|
||||
for (j = 0; j <frame->nb_samples; j++) {
|
||||
v = (int)(sin(ost->t) * 10000);
|
||||
for (i = 0; i < ost->st->codec->channels; i++)
|
||||
*q++ = v;
|
||||
@@ -267,10 +283,10 @@ static AVFrame *get_audio_frame(OutputStream *ost)
|
||||
ost->tincr += ost->tincr2;
|
||||
}
|
||||
|
||||
ost->frame->pts = ost->next_pts;
|
||||
ost->next_pts += ost->frame->nb_samples;
|
||||
frame->pts = ost->next_pts;
|
||||
ost->next_pts += frame->nb_samples;
|
||||
|
||||
return ost->frame;
|
||||
return frame;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -293,27 +309,31 @@ static int write_audio_frame(AVFormatContext *oc, OutputStream *ost)
|
||||
|
||||
if (frame) {
|
||||
/* convert samples from native format to destination codec format, using the resampler */
|
||||
if (swr_ctx) {
|
||||
/* compute destination number of samples */
|
||||
dst_nb_samples = av_rescale_rnd(swr_get_delay(swr_ctx, c->sample_rate) + frame->nb_samples,
|
||||
dst_nb_samples = av_rescale_rnd(swr_get_delay(ost->swr_ctx, c->sample_rate) + frame->nb_samples,
|
||||
c->sample_rate, c->sample_rate, AV_ROUND_UP);
|
||||
av_assert0(dst_nb_samples == frame->nb_samples);
|
||||
|
||||
/* when we pass a frame to the encoder, it may keep a reference to it
|
||||
* internally;
|
||||
* make sure we do not overwrite it here
|
||||
*/
|
||||
ret = av_frame_make_writable(ost->frame);
|
||||
if (ret < 0)
|
||||
exit(1);
|
||||
|
||||
/* convert to destination format */
|
||||
ret = swr_convert(swr_ctx,
|
||||
ost->tmp_frame->data, dst_nb_samples,
|
||||
ret = swr_convert(ost->swr_ctx,
|
||||
ost->frame->data, dst_nb_samples,
|
||||
(const uint8_t **)frame->data, frame->nb_samples);
|
||||
if (ret < 0) {
|
||||
fprintf(stderr, "Error while converting\n");
|
||||
exit(1);
|
||||
}
|
||||
frame = ost->tmp_frame;
|
||||
} else {
|
||||
dst_nb_samples = frame->nb_samples;
|
||||
}
|
||||
frame = ost->frame;
|
||||
|
||||
frame->pts = av_rescale_q(samples_count, (AVRational){1, c->sample_rate}, c->time_base);
|
||||
samples_count += dst_nb_samples;
|
||||
frame->pts = av_rescale_q(ost->samples_count, (AVRational){1, c->sample_rate}, c->time_base);
|
||||
ost->samples_count += dst_nb_samples;
|
||||
}
|
||||
|
||||
ret = avcodec_encode_audio2(c, &pkt, frame, &got_packet);
|
||||
@@ -360,13 +380,17 @@ static AVFrame *alloc_picture(enum AVPixelFormat pix_fmt, int width, int height)
|
||||
return picture;
|
||||
}
|
||||
|
||||
static void open_video(AVFormatContext *oc, AVCodec *codec, OutputStream *ost)
|
||||
static void open_video(AVFormatContext *oc, AVCodec *codec, OutputStream *ost, AVDictionary *opt_arg)
|
||||
{
|
||||
int ret;
|
||||
AVCodecContext *c = ost->st->codec;
|
||||
AVDictionary *opt = NULL;
|
||||
|
||||
av_dict_copy(&opt, opt_arg, 0);
|
||||
|
||||
/* open the codec */
|
||||
ret = avcodec_open2(c, codec, NULL);
|
||||
ret = avcodec_open2(c, codec, &opt);
|
||||
av_dict_free(&opt);
|
||||
if (ret < 0) {
|
||||
fprintf(stderr, "Could not open video codec: %s\n", av_err2str(ret));
|
||||
exit(1);
|
||||
@@ -523,6 +547,7 @@ static void close_stream(AVFormatContext *oc, OutputStream *ost)
|
||||
av_frame_free(&ost->frame);
|
||||
av_frame_free(&ost->tmp_frame);
|
||||
sws_freeContext(ost->sws_ctx);
|
||||
swr_free(&ost->swr_ctx);
|
||||
}
|
||||
|
||||
/**************************************************************/
|
||||
@@ -538,11 +563,12 @@ int main(int argc, char **argv)
|
||||
int ret;
|
||||
int have_video = 0, have_audio = 0;
|
||||
int encode_video = 0, encode_audio = 0;
|
||||
AVDictionary *opt = NULL;
|
||||
|
||||
/* Initialize libavcodec, and register all codecs and formats. */
|
||||
av_register_all();
|
||||
|
||||
if (argc != 2) {
|
||||
if (argc < 2) {
|
||||
printf("usage: %s output_file\n"
|
||||
"API example program to output a media file with libavformat.\n"
|
||||
"This program generates a synthetic audio and video stream, encodes and\n"
|
||||
@@ -554,6 +580,9 @@ int main(int argc, char **argv)
|
||||
}
|
||||
|
||||
filename = argv[1];
|
||||
if (argc > 3 && !strcmp(argv[2], "-flags")) {
|
||||
av_dict_set(&opt, argv[2]+1, argv[3], 0);
|
||||
}
|
||||
|
||||
/* allocate the output media context */
|
||||
avformat_alloc_output_context2(&oc, NULL, NULL, filename);
|
||||
@@ -582,10 +611,10 @@ int main(int argc, char **argv)
|
||||
/* Now that all the parameters are set, we can open the audio and
|
||||
* video codecs and allocate the necessary encode buffers. */
|
||||
if (have_video)
|
||||
open_video(oc, video_codec, &video_st);
|
||||
open_video(oc, video_codec, &video_st, opt);
|
||||
|
||||
if (have_audio)
|
||||
open_audio(oc, audio_codec, &audio_st);
|
||||
open_audio(oc, audio_codec, &audio_st, opt);
|
||||
|
||||
av_dump_format(oc, 0, filename, 1);
|
||||
|
||||
@@ -600,7 +629,7 @@ int main(int argc, char **argv)
|
||||
}
|
||||
|
||||
/* Write the stream header, if any. */
|
||||
ret = avformat_write_header(oc, NULL);
|
||||
ret = avformat_write_header(oc, &opt);
|
||||
if (ret < 0) {
|
||||
fprintf(stderr, "Error occurred when opening output file: %s\n",
|
||||
av_err2str(ret));
|
||||
|
@@ -199,8 +199,7 @@ int main(int argc, char **argv)
|
||||
fmt, dst_ch_layout, dst_nb_channels, dst_rate, dst_filename);
|
||||
|
||||
end:
|
||||
if (dst_file)
|
||||
fclose(dst_file);
|
||||
fclose(dst_file);
|
||||
|
||||
if (src_data)
|
||||
av_freep(&src_data[0]);
|
||||
|
@@ -132,8 +132,7 @@ int main(int argc, char **argv)
|
||||
av_get_pix_fmt_name(dst_pix_fmt), dst_w, dst_h, dst_filename);
|
||||
|
||||
end:
|
||||
if (dst_file)
|
||||
fclose(dst_file);
|
||||
fclose(dst_file);
|
||||
av_freep(&src_data[0]);
|
||||
av_freep(&dst_data[0]);
|
||||
sws_freeContext(sws_ctx);
|
||||
|
@@ -52,7 +52,7 @@
|
||||
* @param error Error code to be converted
|
||||
* @return Corresponding error text (not thread-safe)
|
||||
*/
|
||||
static char *const get_error_text(const int error)
|
||||
static const char *get_error_text(const int error)
|
||||
{
|
||||
static char error_buffer[255];
|
||||
av_strerror(error, error_buffer, sizeof(error_buffer));
|
||||
|
@@ -339,7 +339,7 @@ ffmpeg -i in.avi -metadata title="my title" out.flv
|
||||
|
||||
To set the language of the first audio stream:
|
||||
@example
|
||||
ffmpeg -i INPUT -metadata:s:a:1 language=eng OUTPUT
|
||||
ffmpeg -i INPUT -metadata:s:a:0 language=eng OUTPUT
|
||||
@end example
|
||||
|
||||
@item -target @var{type} (@emph{output})
|
||||
@@ -473,6 +473,9 @@ Set frame rate (Hz value, fraction or abbreviation).
|
||||
|
||||
As an input option, ignore any timestamps stored in the file and instead
|
||||
generate timestamps assuming constant frame rate @var{fps}.
|
||||
This is not the same as the @option{-framerate} option used for some input formats
|
||||
like image2 or v4l2 (it used to be the same in older versions of FFmpeg).
|
||||
If in doubt use @option{-framerate} instead of the input option @option{-r}.
|
||||
|
||||
As an output option, duplicate or drop input frames to achieve constant output
|
||||
frame rate @var{fps}.
|
||||
@@ -821,6 +824,11 @@ To map all the streams except the second audio, use negative mappings
|
||||
ffmpeg -i INPUT -map 0 -map -0:a:1 OUTPUT
|
||||
@end example
|
||||
|
||||
To pick the English audio stream:
|
||||
@example
|
||||
ffmpeg -i INPUT -map 0:m:language:eng OUTPUT
|
||||
@end example
|
||||
|
||||
Note that using this option disables the default mappings for this output file.
|
||||
|
||||
@item -map_channel [@var{input_file_id}.@var{stream_specifier}.@var{channel_id}|-1][:@var{output_file_id}.@var{stream_specifier}]
|
||||
@@ -1450,11 +1458,11 @@ ffmpeg -f image2 -pattern_type glob -i 'foo-*.jpeg' -r 12 -s WxH foo.avi
|
||||
You can put many streams of the same type in the output:
|
||||
|
||||
@example
|
||||
ffmpeg -i test1.avi -i test2.avi -map 0:3 -map 0:2 -map 0:1 -map 0:0 -c copy test12.nut
|
||||
ffmpeg -i test1.avi -i test2.avi -map 1:1 -map 1:0 -map 0:1 -map 0:0 -c copy -y test12.nut
|
||||
@end example
|
||||
|
||||
The resulting output file @file{test12.avi} will contain first four streams from
|
||||
the input file in reverse order.
|
||||
The resulting output file @file{test12.nut} will contain the first four streams
|
||||
from the input files in reverse order.
|
||||
|
||||
@item
|
||||
To force CBR video output:
|
||||
|
@@ -119,6 +119,10 @@ Show payload data, as a hexadecimal and ASCII dump. Coupled with
|
||||
|
||||
The dump is printed as the "data" field. It may contain newlines.
|
||||
|
||||
@item -show_data_hash @var{algorithm}
|
||||
Show a hash of payload data, for packets with @option{-show_packets} and for
|
||||
codec extradata with @option{-show_streams}.
|
||||
|
||||
@item -show_error
|
||||
Show information about the error found when trying to probe the input.
|
||||
|
||||
@@ -180,7 +184,7 @@ format : stream=codec_type
|
||||
|
||||
To show all the tags in the stream and format sections:
|
||||
@example
|
||||
format_tags : format_tags
|
||||
stream_tags : format_tags
|
||||
@end example
|
||||
|
||||
To show only the @code{title} tag (if available) in the stream
|
||||
|
@@ -50,11 +50,13 @@
|
||||
<xsd:attribute name="pos" type="xsd:long" />
|
||||
<xsd:attribute name="flags" type="xsd:string" use="required" />
|
||||
<xsd:attribute name="data" type="xsd:string" />
|
||||
<xsd:attribute name="data_hash" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="frameType">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="tag" type="ffprobe:tagType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xsd:element name="side_data_list" type="ffprobe:frameSideDataListType" minOccurs="0" maxOccurs="1" />
|
||||
</xsd:sequence>
|
||||
|
||||
<xsd:attribute name="media_type" type="xsd:string" use="required"/>
|
||||
@@ -91,6 +93,16 @@
|
||||
<xsd:attribute name="repeat_pict" type="xsd:int" />
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="frameSideDataListType">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="side_data" type="ffprobe:frameSideDataType" minOccurs="1" maxOccurs="unbounded"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
<xsd:complexType name="frameSideDataType">
|
||||
<xsd:attribute name="side_data_type" type="xsd:string"/>
|
||||
<xsd:attribute name="side_data_size" type="xsd:int" />
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="subtitleType">
|
||||
<xsd:attribute name="media_type" type="xsd:string" fixed="subtitle" use="required"/>
|
||||
<xsd:attribute name="pts" type="xsd:long" />
|
||||
@@ -142,6 +154,7 @@
|
||||
<xsd:attribute name="codec_tag" type="xsd:string" use="required"/>
|
||||
<xsd:attribute name="codec_tag_string" type="xsd:string" use="required"/>
|
||||
<xsd:attribute name="extradata" type="xsd:string" />
|
||||
<xsd:attribute name="extradata_hash" type="xsd:string" />
|
||||
|
||||
<!-- video attributes -->
|
||||
<xsd:attribute name="width" type="xsd:int"/>
|
||||
@@ -172,6 +185,7 @@
|
||||
<xsd:attribute name="duration" type="xsd:float"/>
|
||||
<xsd:attribute name="bit_rate" type="xsd:int"/>
|
||||
<xsd:attribute name="max_bit_rate" type="xsd:int"/>
|
||||
<xsd:attribute name="bits_per_raw_sample" type="xsd:int"/>
|
||||
<xsd:attribute name="nb_frames" type="xsd:int"/>
|
||||
<xsd:attribute name="nb_read_frames" type="xsd:int"/>
|
||||
<xsd:attribute name="nb_read_packets" type="xsd:int"/>
|
||||
|
@@ -1,11 +1,11 @@
|
||||
# Port on which the server is listening. You must select a different
|
||||
# port from your standard HTTP web server if it is running on the same
|
||||
# computer.
|
||||
Port 8090
|
||||
HTTPPort 8090
|
||||
|
||||
# Address on which the server is bound. Only useful if you have
|
||||
# several network interfaces.
|
||||
BindAddress 0.0.0.0
|
||||
HTTPBindAddress 0.0.0.0
|
||||
|
||||
# Number of simultaneous HTTP connections that can be handled. It has
|
||||
# to be defined *before* the MaxClients parameter, since it defines the
|
||||
|
@@ -66,7 +66,7 @@ http://@var{ffserver_ip_address}:@var{http_port}/@var{feed_name}
|
||||
|
||||
where @var{ffserver_ip_address} is the IP address of the machine where
|
||||
@command{ffserver} is installed, @var{http_port} is the port number of
|
||||
the HTTP server (configured through the @option{Port} option), and
|
||||
the HTTP server (configured through the @option{HTTPPort} option), and
|
||||
@var{feed_name} is the name of the corresponding feed defined in the
|
||||
configuration file.
|
||||
|
||||
@@ -101,7 +101,7 @@ http://@var{ffserver_ip_address}:@var{rtsp_port}/@var{stream_name}[@var{options}
|
||||
the configuration file. @var{options} is a list of options specified
|
||||
after the URL which affects how the stream is served by
|
||||
@command{ffserver}. @var{http_port} and @var{rtsp_port} are the HTTP
|
||||
and RTSP ports configured with the options @var{Port} and
|
||||
and RTSP ports configured with the options @var{HTTPPort} and
|
||||
@var{RTSPPort} respectively.
|
||||
|
||||
In case the stream is associated to a feed, the encoding parameters
|
||||
@@ -203,11 +203,9 @@ WARNING: trying to stream test1.mpg doesn't work with WMP as it tries to
|
||||
transfer the entire file before starting to play.
|
||||
The same is true of AVI files.
|
||||
|
||||
@section What happens next?
|
||||
|
||||
You should edit the ffserver.conf file to suit your needs (in terms of
|
||||
frame rates etc). Then install ffserver and ffmpeg, write a script to start
|
||||
them up, and off you go.
|
||||
You should edit the @file{ffserver.conf} file to suit your needs (in
|
||||
terms of frame rates etc). Then install @command{ffserver} and
|
||||
@command{ffmpeg}, write a script to start them up, and off you go.
|
||||
|
||||
@section What else can it do?
|
||||
|
||||
@@ -354,20 +352,29 @@ allow everybody else.
|
||||
|
||||
@section Global options
|
||||
@table @option
|
||||
@item HTTPPort @var{port_number}
|
||||
@item Port @var{port_number}
|
||||
@item RTSPPort @var{port_number}
|
||||
|
||||
Set TCP port number on which the HTTP/RTSP server is listening. You
|
||||
must select a different port from your standard HTTP web server if it
|
||||
is running on the same computer.
|
||||
@var{HTTPPort} sets the HTTP server listening TCP port number,
|
||||
@var{RTSPPort} sets the RTSP server listening TCP port number.
|
||||
|
||||
@var{Port} is the equivalent of @var{HTTPPort} and is deprecated.
|
||||
|
||||
You must select a different port from your standard HTTP web server if
|
||||
it is running on the same computer.
|
||||
|
||||
If not specified, no corresponding server will be created.
|
||||
|
||||
@item HTTPBindAddress @var{ip_address}
|
||||
@item BindAddress @var{ip_address}
|
||||
@item RTSPBindAddress @var{ip_address}
|
||||
Set address on which the HTTP/RTSP server is bound. Only useful if you
|
||||
have several network interfaces.
|
||||
|
||||
@var{BindAddress} is the equivalent of @var{HTTPBindAddress} and is
|
||||
deprecated.
|
||||
|
||||
@item MaxHTTPConnections @var{n}
|
||||
Set number of simultaneous HTTP connections that can be handled. It
|
||||
has to be defined @emph{before} the @option{MaxClients} parameter,
|
||||
|
@@ -3,7 +3,7 @@ representing a number as input, which may be followed by one of the SI
|
||||
unit prefixes, for example: 'K', 'M', or 'G'.
|
||||
|
||||
If 'i' is appended to the SI unit prefix, the complete prefix will be
|
||||
interpreted as a unit prefix for binary multiplies, which are based on
|
||||
interpreted as a unit prefix for binary multiples, which are based on
|
||||
powers of 1024 instead of powers of 1000. Appending 'B' to the SI unit
|
||||
prefix multiplies the value by 8. This allows using, for example:
|
||||
'KB', 'MiB', 'G' and 'B' as number suffixes.
|
||||
@@ -46,6 +46,13 @@ in the program with the id @var{program_id}. Otherwise, it matches all streams i
|
||||
program.
|
||||
@item #@var{stream_id} or i:@var{stream_id}
|
||||
Match the stream by stream id (e.g. PID in MPEG-TS container).
|
||||
@item m:@var{key}[:@var{value}]
|
||||
Matches streams with the metadata tag @var{key} having the specified value. If
|
||||
@var{value} is not given, matches streams that contain the given tag with any
|
||||
value.
|
||||
|
||||
Note that in @command{ffmpeg}, matching by metadata will only work properly for
|
||||
input files.
|
||||
@end table
|
||||
|
||||
@section Generic options
|
||||
|
429
doc/filters.texi
429
doc/filters.texi
@@ -491,7 +491,7 @@ aeval=val(ch)/2:c=same
|
||||
@item
|
||||
Invert phase of the second channel:
|
||||
@example
|
||||
eval=val(0)|-val(1)
|
||||
aeval=val(0)|-val(1)
|
||||
@end example
|
||||
@end itemize
|
||||
|
||||
@@ -517,27 +517,21 @@ volume as the input audio, at the end of the fade-out transition
|
||||
the output audio will be silence. Default is 44100.
|
||||
|
||||
@item start_time, st
|
||||
Specify time for starting to apply the fade effect. Default is 0.
|
||||
The accepted syntax is:
|
||||
@example
|
||||
[-]HH[:MM[:SS[.m...]]]
|
||||
[-]S+[.m...]
|
||||
@end example
|
||||
See also the function @code{av_parse_time()}.
|
||||
If set this option is used instead of @var{start_sample} one.
|
||||
Specify the start time of the fade effect. Default is 0.
|
||||
The value must be specified as a time duration; see
|
||||
@ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils}
|
||||
for the accepted syntax.
|
||||
If set this option is used instead of @var{start_sample}.
|
||||
|
||||
@item duration, d
|
||||
Specify the duration for which the fade effect has to last. Default is 0.
|
||||
The accepted syntax is:
|
||||
@example
|
||||
[-]HH[:MM[:SS[.m...]]]
|
||||
[-]S+[.m...]
|
||||
@end example
|
||||
See also the function @code{av_parse_time()}.
|
||||
Specify the duration of the fade effect. See
|
||||
@ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils}
|
||||
for the accepted syntax.
|
||||
At the end of the fade-in effect the output audio will have the same
|
||||
volume as the input audio, at the end of the fade-out transition
|
||||
the output audio will be silence.
|
||||
If set this option is used instead of @var{nb_samples} one.
|
||||
By default the duration is determined by @var{nb_samples}.
|
||||
If set this option is used instead of @var{nb_samples}.
|
||||
|
||||
@item curve
|
||||
Set curve for fade transition.
|
||||
@@ -742,8 +736,58 @@ Pass the audio source unchanged to the output.
|
||||
|
||||
@section apad
|
||||
|
||||
Pad the end of a audio stream with silence, this can be used together with
|
||||
-shortest to extend audio streams to the same length as the video stream.
|
||||
Pad the end of an audio stream with silence.
|
||||
|
||||
This can be used together with @command{ffmpeg} @option{-shortest} to
|
||||
extend audio streams to the same length as the video stream.
|
||||
|
||||
A description of the accepted options follows.
|
||||
|
||||
@table @option
|
||||
@item packet_size
|
||||
Set silence packet size. Default value is 4096.
|
||||
|
||||
@item pad_len
|
||||
Set the number of samples of silence to add to the end. After the
|
||||
value is reached, the stream is terminated. This option is mutually
|
||||
exclusive with @option{whole_len}.
|
||||
|
||||
@item whole_len
|
||||
Set the minimum total number of samples in the output audio stream. If
|
||||
the value is longer than the input audio length, silence is added to
|
||||
the end, until the value is reached. This option is mutually exclusive
|
||||
with @option{pad_len}.
|
||||
@end table
|
||||
|
||||
If neither the @option{pad_len} nor the @option{whole_len} option is
|
||||
set, the filter will add silence to the end of the input stream
|
||||
indefinitely.
|
||||
|
||||
@subsection Examples
|
||||
|
||||
@itemize
|
||||
@item
|
||||
Add 1024 samples of silence to the end of the input:
|
||||
@example
|
||||
apad=pad_len=1024
|
||||
@end example
|
||||
|
||||
@item
|
||||
Make sure the audio output will contain at least 10000 samples, pad
|
||||
the input with silence if required:
|
||||
@example
|
||||
apad=whole_len=10000
|
||||
@end example
|
||||
|
||||
@item
|
||||
Use @command{ffmpeg} to pad the audio input with silence, so that the
|
||||
video stream will always result the shortest and will be converted
|
||||
until the end in the output file when using the @option{shortest}
|
||||
option:
|
||||
@example
|
||||
ffmpeg -i VIDEO -i AUDIO -filter_complex "[1:0]apad" -shortest OUTPUT
|
||||
@end example
|
||||
@end itemize
|
||||
|
||||
@section aphaser
|
||||
Add a phasing effect to the input audio.
|
||||
@@ -862,7 +906,7 @@ The input audio is not modified.
|
||||
The shown line contains a sequence of key/value pairs of the form
|
||||
@var{key}:@var{value}.
|
||||
|
||||
It accepts the following parameters:
|
||||
The following values are shown in the output:
|
||||
|
||||
@table @option
|
||||
@item n
|
||||
@@ -1070,9 +1114,9 @@ The number of the first sample that should be output.
|
||||
The number of the first sample that should be dropped.
|
||||
@end table
|
||||
|
||||
@option{start}, @option{end}, @option{duration} are expressed as time
|
||||
duration specifications, check the "Time duration" section in the
|
||||
ffmpeg-utils manual.
|
||||
@option{start}, @option{end}, and @option{duration} are expressed as time
|
||||
duration specifications; see
|
||||
@ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils}.
|
||||
|
||||
Note that the first two sets of the start/end options and the @option{duration}
|
||||
option look at the frame timestamp, while the _sample options simply count the
|
||||
@@ -1587,9 +1631,9 @@ Set the number of samples per channel per each output frame, default
|
||||
is 1024. Only used if plugin have zero inputs.
|
||||
|
||||
@item duration, d
|
||||
Set the minimum duration of the sourced audio. See the function
|
||||
@code{av_parse_time()} for the accepted format, also check the "Time duration"
|
||||
section in the ffmpeg-utils manual.
|
||||
Set the minimum duration of the sourced audio. See
|
||||
@ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils}
|
||||
for the accepted syntax.
|
||||
Note that the resulting duration may be greater than the specified duration,
|
||||
as the generated audio is always cut at the end of a complete frame.
|
||||
If not specified, or the expressed duration is negative, the audio is
|
||||
@@ -1831,6 +1875,75 @@ ffmpeg -i silence.mp3 -af silencedetect=noise=0.0001 -f null -
|
||||
@end example
|
||||
@end itemize
|
||||
|
||||
@section silenceremove
|
||||
|
||||
Remove silence from the beginning, middle or end of the audio.
|
||||
|
||||
The filter accepts the following options:
|
||||
|
||||
@table @option
|
||||
@item start_periods
|
||||
This value is used to indicate if audio should be trimmed at beginning of
|
||||
the audio. A value of zero indicates no silence should be trimmed from the
|
||||
beginning. When specifying a non-zero value, it trims audio up until it
|
||||
finds non-silence. Normally, when trimming silence from beginning of audio
|
||||
the @var{start_periods} will be @code{1} but it can be increased to higher
|
||||
values to trim all audio up to specific count of non-silence periods.
|
||||
Default value is @code{0}.
|
||||
|
||||
@item start_duration
|
||||
Specify the amount of time that non-silence must be detected before it stops
|
||||
trimming audio. By increasing the duration, bursts of noises can be treated
|
||||
as silence and trimmed off. Default value is @code{0}.
|
||||
|
||||
@item start_threshold
|
||||
This indicates what sample value should be treated as silence. For digital
|
||||
audio, a value of @code{0} may be fine but for audio recorded from analog,
|
||||
you may wish to increase the value to account for background noise.
|
||||
Can be specified in dB (in case "dB" is appended to the specified value)
|
||||
or amplitude ratio. Default value is @code{0}.
|
||||
|
||||
@item stop_periods
|
||||
Set the count for trimming silence from the end of audio.
|
||||
To remove silence from the middle of a file, specify a @var{stop_periods}
|
||||
that is negative. This value is then threated as a positive value and is
|
||||
used to indicate the effect should restart processing as specified by
|
||||
@var{start_periods}, making it suitable for removing periods of silence
|
||||
in the middle of the audio.
|
||||
Default value is @code{0}.
|
||||
|
||||
@item stop_duration
|
||||
Specify a duration of silence that must exist before audio is not copied any
|
||||
more. By specifying a higher duration, silence that is wanted can be left in
|
||||
the audio.
|
||||
Default value is @code{0}.
|
||||
|
||||
@item stop_threshold
|
||||
This is the same as @option{start_threshold} but for trimming silence from
|
||||
the end of audio.
|
||||
Can be specified in dB (in case "dB" is appended to the specified value)
|
||||
or amplitude ratio. Default value is @code{0}.
|
||||
|
||||
@item leave_silence
|
||||
This indicate that @var{stop_duration} length of audio should be left intact
|
||||
at the beginning of each period of silence.
|
||||
For example, if you want to remove long pauses between words but do not want
|
||||
to remove the pauses completely. Default value is @code{0}.
|
||||
|
||||
@end table
|
||||
|
||||
@subsection Examples
|
||||
|
||||
@itemize
|
||||
@item
|
||||
The following example shows how this filter can be used to start a recording
|
||||
that does not contain the delay at the start which usually occurs between
|
||||
pressing the record button and the start of the performance:
|
||||
@example
|
||||
silenceremove=1:5:0.02
|
||||
@end example
|
||||
@end itemize
|
||||
|
||||
@section treble
|
||||
|
||||
Boost or cut treble (upper) frequencies of the audio using a two-pole
|
||||
@@ -2139,8 +2252,9 @@ Set the channel layout. The number of channels in the specified layout
|
||||
must be equal to the number of specified expressions.
|
||||
|
||||
@item duration, d
|
||||
Set the minimum duration of the sourced audio. See the function
|
||||
@code{av_parse_time()} for the accepted format.
|
||||
Set the minimum duration of the sourced audio. See
|
||||
@ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils}
|
||||
for the accepted syntax.
|
||||
Note that the resulting duration may be greater than the specified
|
||||
duration, as the generated audio is always cut at the end of a
|
||||
complete frame.
|
||||
@@ -2755,6 +2869,42 @@ boxblur=luma_radius=min(h\,w)/10:luma_power=1:chroma_radius=min(cw\,ch)/10:chrom
|
||||
@end example
|
||||
@end itemize
|
||||
|
||||
@section codecview
|
||||
|
||||
Visualize information exported by some codecs.
|
||||
|
||||
Some codecs can export information through frames using side-data or other
|
||||
means. For example, some MPEG based codecs export motion vectors through the
|
||||
@var{export_mvs} flag in the codec @option{flags2} option.
|
||||
|
||||
The filter accepts the following option:
|
||||
|
||||
@table @option
|
||||
@item mv
|
||||
Set motion vectors to visualize.
|
||||
|
||||
Available flags for @var{mv} are:
|
||||
|
||||
@table @samp
|
||||
@item pf
|
||||
forward predicted MVs of P-frames
|
||||
@item bf
|
||||
forward predicted MVs of B-frames
|
||||
@item bb
|
||||
backward predicted MVs of B-frames
|
||||
@end table
|
||||
@end table
|
||||
|
||||
@subsection Examples
|
||||
|
||||
@itemize
|
||||
@item
|
||||
Visualizes multi-directionals MVs from P and B-Frames using @command{ffplay}:
|
||||
@example
|
||||
ffplay -flags2 +export_mvs input.mpg -vf codecview=mv=pf+bf+bb
|
||||
@end example
|
||||
@end itemize
|
||||
|
||||
@section colorbalance
|
||||
Modify intensity of primary colors (red, green and blue) of input frames.
|
||||
|
||||
@@ -3219,7 +3369,7 @@ curves=psfile='MyCurvesPresets/purple.asv':green='0.45/0.53'
|
||||
|
||||
Denoise frames using 2D DCT (frequency domain filtering).
|
||||
|
||||
This filter is not designed for real time and can be extremely slow.
|
||||
This filter is not designed for real time.
|
||||
|
||||
The filter accepts the following options:
|
||||
|
||||
@@ -3235,14 +3385,14 @@ If you need a more advanced filtering, see @option{expr}.
|
||||
Default is @code{0}.
|
||||
|
||||
@item overlap
|
||||
Set number overlapping pixels for each block. Each block is of size
|
||||
@code{16x16}. Since the filter can be slow, you may want to reduce this value,
|
||||
at the cost of a less effective filter and the risk of various artefacts.
|
||||
Set number overlapping pixels for each block. Since the filter can be slow, you
|
||||
may want to reduce this value, at the cost of a less effective filter and the
|
||||
risk of various artefacts.
|
||||
|
||||
If the overlapping value doesn't allow to process the whole input width or
|
||||
height, a warning will be displayed and according borders won't be denoised.
|
||||
|
||||
Default value is @code{15}.
|
||||
Default value is @var{blocksize}-1, which is the best possible setting.
|
||||
|
||||
@item expr, e
|
||||
Set the coefficient factor expression.
|
||||
@@ -3254,6 +3404,15 @@ If this is option is set, the @option{sigma} option will be ignored.
|
||||
|
||||
The absolute value of the coefficient can be accessed through the @var{c}
|
||||
variable.
|
||||
|
||||
@item n
|
||||
Set the @var{blocksize} using the number of bits. @code{1<<@var{n}} defines the
|
||||
@var{blocksize}, which is the width and height of the processed blocks.
|
||||
|
||||
The default value is @var{3} (8x8) and can be raised to @var{4} for a
|
||||
@var{blocksize} of 16x16. Note that changing this setting has huge consequences
|
||||
on the speed processing. Also, a larger block size does not necessarily means a
|
||||
better de-noising.
|
||||
@end table
|
||||
|
||||
@subsection Examples
|
||||
@@ -3268,6 +3427,11 @@ The same operation can be achieved using the expression system:
|
||||
dctdnoiz=e='gte(c, 4.5*3)'
|
||||
@end example
|
||||
|
||||
Violent denoise using a block size of @code{16x16}:
|
||||
@example
|
||||
dctdnoiz=15:n=4
|
||||
@end example
|
||||
|
||||
@anchor{decimate}
|
||||
@section decimate
|
||||
|
||||
@@ -3698,6 +3862,11 @@ the "Color" section in the ffmpeg-utils manual.
|
||||
|
||||
The default value of @var{fontcolor} is "black".
|
||||
|
||||
@item fontcolor_expr
|
||||
String which is expanded the same way as @var{text} to obtain dynamic
|
||||
@var{fontcolor} value. By default this option has empty value and is not
|
||||
processed. When this option is set, it overrides @var{fontcolor} option.
|
||||
|
||||
@item font
|
||||
The font family to be used for drawing text. By default Sans.
|
||||
|
||||
@@ -3911,6 +4080,15 @@ example the text size is not known when evaluating the expression, so
|
||||
the constants @var{text_w} and @var{text_h} will have an undefined
|
||||
value.
|
||||
|
||||
@item expr_int_format, eif
|
||||
Evaluate the expression's value and output as formatted integer.
|
||||
|
||||
The first argument is the expression to be evaluated, just as for the @var{expr} function.
|
||||
The second argument specifies the output format. Allowed values are 'x', 'X', 'd' and
|
||||
'u'. They are treated exactly as in the printf function.
|
||||
The third parameter is optional and sets the number of positions taken by the output.
|
||||
It can be used to add padding with zeros from the left.
|
||||
|
||||
@item gmtime
|
||||
The time at which the filter is running, expressed in UTC.
|
||||
It can accept an argument: a strftime() format string.
|
||||
@@ -4010,6 +4188,17 @@ Print the date of a real-time encoding (see strftime(3)):
|
||||
drawtext='fontfile=FreeSans.ttf:text=%@{localtime:%a %b %d %Y@}'
|
||||
@end example
|
||||
|
||||
@item
|
||||
Show text fading in and out (appearing/disappearing):
|
||||
@example
|
||||
#!/bin/sh
|
||||
DS=1.0 # display start
|
||||
DE=10.0 # display end
|
||||
FID=1.5 # fade in duration
|
||||
FOD=5 # fade out duration
|
||||
ffplay -f lavfi "color,drawtext=text=TEST:fontsize=50:fontfile=FreeSerif.ttf:fontcolor_expr=ff0000%@{eif\\\\: clip(255*(1*between(t\\, $DS + $FID\\, $DE - $FOD) + ((t - $DS)/$FID)*between(t\\, $DS\\, $DS + $FID) + (-(t - $DE)/$FOD)*between(t\\, $DE - $FOD\\, $DE) )\\, 0\\, 255) \\\\: x\\\\: 2 @}"
|
||||
@end example
|
||||
|
||||
@end itemize
|
||||
|
||||
For more information about libfreetype, check:
|
||||
@@ -5429,8 +5618,7 @@ Swap luma/chroma/alpha fields. Exchange even & odd lines. Default value is @code
|
||||
|
||||
Simple interlacing filter from progressive contents. This interleaves upper (or
|
||||
lower) lines from odd frames with lower (or upper) lines from even frames,
|
||||
halving the frame rate and preserving image height. A vertical lowpass filter
|
||||
is always applied in order to avoid twitter effects and reduce moiré patterns.
|
||||
halving the frame rate and preserving image height.
|
||||
|
||||
@example
|
||||
Original Original New Frame
|
||||
@@ -5450,6 +5638,10 @@ It accepts the following optional parameters:
|
||||
@item scan
|
||||
This determines whether the interlaced frame is taken from the even
|
||||
(tff - default) or odd (bff) lines of the progressive frame.
|
||||
|
||||
@item lowpass
|
||||
Enable (default) or disable the vertical lowpass filter to avoid twitter
|
||||
interlacing and reduce moire patterns.
|
||||
@end table
|
||||
|
||||
@section kerndeint
|
||||
@@ -5504,6 +5696,51 @@ kerndeint=map=1
|
||||
@end example
|
||||
@end itemize
|
||||
|
||||
@section lenscorrection
|
||||
|
||||
Correct radial lens distortion
|
||||
|
||||
This filter can be used to correct for radial distortion as can result from the use
|
||||
of wide angle lenses, and thereby re-rectify the image. To find the right parameters
|
||||
one can use tools available for example as part of opencv or simply trial-and-error.
|
||||
To use opencv use the calibration sample (under samples/cpp) from the opencv sources
|
||||
and extract the k1 and k2 coefficients from the resulting matrix.
|
||||
|
||||
Note that effectively the same filter is available in the open-source tools Krita and
|
||||
Digikam from the KDE project.
|
||||
|
||||
In contrast to the @ref{vignette} filter, which can also be used to compensate lens errors,
|
||||
this filter corrects the distortion of the image, whereas @ref{vignette} corrects the
|
||||
brightness distribution, so you may want to use both filters together in certain
|
||||
cases, though you will have to take care of ordering, i.e. whether vignetting should
|
||||
be applied before or after lens correction.
|
||||
|
||||
@subsection Options
|
||||
|
||||
The filter accepts the following options:
|
||||
|
||||
@table @option
|
||||
@item cx
|
||||
Relative x-coordinate of the focal point of the image, and thereby the center of the
|
||||
distrortion. This value has a range [0,1] and is expressed as fractions of the image
|
||||
width.
|
||||
@item cy
|
||||
Relative y-coordinate of the focal point of the image, and thereby the center of the
|
||||
distrortion. This value has a range [0,1] and is expressed as fractions of the image
|
||||
height.
|
||||
@item k1
|
||||
Coefficient of the quadratic correction term. 0.5 means no correction.
|
||||
@item k2
|
||||
Coefficient of the double quadratic correction term. 0.5 means no correction.
|
||||
@end table
|
||||
|
||||
The formula that generates the correction is:
|
||||
|
||||
@var{r_src} = @var{r_tgt} * (1 + @var{k1} * (@var{r_tgt} / @var{r_0})^2 + @var{k2} * (@var{r_tgt} / @var{r_0})^4)
|
||||
|
||||
where @var{r_0} is halve of the image diagonal and @var{r_src} and @var{r_tgt} are the
|
||||
distances from the focal point in the source and target images, respectively.
|
||||
|
||||
@anchor{lut3d}
|
||||
@section lut3d
|
||||
|
||||
@@ -7513,7 +7750,7 @@ The input video is not modified.
|
||||
The shown line contains a sequence of key/value pairs of the form
|
||||
@var{key}:@var{value}.
|
||||
|
||||
It accepts the following parameters:
|
||||
The following values are shown in the output:
|
||||
|
||||
@table @option
|
||||
@item n
|
||||
@@ -8373,9 +8610,10 @@ The number of the first frame that should be passed to the output.
|
||||
The number of the first frame that should be dropped.
|
||||
@end table
|
||||
|
||||
@option{start}, @option{end}, @option{duration} are expressed as time
|
||||
duration specifications, check the "Time duration" section in the
|
||||
ffmpeg-utils manual.
|
||||
@option{start}, @option{end}, and @option{duration} are expressed as time
|
||||
duration specifications; see
|
||||
@ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils}
|
||||
for the accepted syntax.
|
||||
|
||||
Note that the first two sets of the start/end options and the @option{duration}
|
||||
option look at the frame timestamp, while the _frame variants simply count the
|
||||
@@ -8716,6 +8954,7 @@ For example, to vertically flip a video with @command{ffmpeg}:
|
||||
ffmpeg -i in.avi -vf "vflip" out.avi
|
||||
@end example
|
||||
|
||||
@anchor{vignette}
|
||||
@section vignette
|
||||
|
||||
Make or reverse a natural vignetting effect.
|
||||
@@ -9285,12 +9524,9 @@ number or a valid video frame rate abbreviation. The default value is
|
||||
"25".
|
||||
|
||||
@item duration, d
|
||||
Set the video duration of the sourced video. The accepted syntax is:
|
||||
@example
|
||||
[-]HH:MM:SS[.m...]
|
||||
[-]S+[.m...]
|
||||
@end example
|
||||
See also the function @code{av_parse_time()}.
|
||||
Set the duration of the sourced video. See
|
||||
@ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils}
|
||||
for the accepted syntax.
|
||||
|
||||
If not specified, or the expressed duration is negative, the video is
|
||||
supposed to be generated forever.
|
||||
@@ -9318,7 +9554,7 @@ Default value is "all", which will cycle through the list of all tests.
|
||||
|
||||
Some examples:
|
||||
@example
|
||||
testsrc=t=dc_luma
|
||||
mptestsrc=t=dc_luma
|
||||
@end example
|
||||
|
||||
will generate a "dc_luma" test pattern.
|
||||
@@ -9552,12 +9788,9 @@ number or a valid video frame rate abbreviation. The default value is
|
||||
Set the sample aspect ratio of the sourced video.
|
||||
|
||||
@item duration, d
|
||||
Set the video duration of the sourced video. The accepted syntax is:
|
||||
@example
|
||||
[-]HH[:MM[:SS[.m...]]]
|
||||
[-]S+[.m...]
|
||||
@end example
|
||||
Also see the the @code{av_parse_time()} function.
|
||||
Set the duration of the sourced video. See
|
||||
@ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils}
|
||||
for the accepted syntax.
|
||||
|
||||
If not specified, or the expressed duration is negative, the video is
|
||||
supposed to be generated forever.
|
||||
@@ -10473,8 +10706,34 @@ The filter accepts the following options:
|
||||
|
||||
@table @option
|
||||
@item volume
|
||||
Specify the transform volume (multiplier). Acceptable value is [1.0, 100.0].
|
||||
Default value is @code{16.0}.
|
||||
Specify transform volume (multiplier) expression. The expression can contain
|
||||
variables:
|
||||
@table @option
|
||||
@item frequency, freq, f
|
||||
the frequency where transform is evaluated
|
||||
@item timeclamp, tc
|
||||
value of timeclamp option
|
||||
@end table
|
||||
and functions:
|
||||
@table @option
|
||||
@item a_weighting(f)
|
||||
A-weighting of equal loudness
|
||||
@item b_weighting(f)
|
||||
B-weighting of equal loudness
|
||||
@item c_weighting(f)
|
||||
C-weighting of equal loudness
|
||||
@end table
|
||||
Default value is @code{16}.
|
||||
|
||||
@item tlength
|
||||
Specify transform length expression. The expression can contain variables:
|
||||
@table @option
|
||||
@item frequency, freq, f
|
||||
the frequency where transform is evaluated
|
||||
@item timeclamp, tc
|
||||
value of timeclamp option
|
||||
@end table
|
||||
Default value is @code{384/f*tc/(384/f+tc)}.
|
||||
|
||||
@item timeclamp
|
||||
Specify the transform timeclamp. At low frequency, there is trade-off between
|
||||
@@ -10496,6 +10755,26 @@ Default value is @code{3.0}.
|
||||
@item fontfile
|
||||
Specify font file for use with freetype. If not specified, use embedded font.
|
||||
|
||||
@item fontcolor
|
||||
Specify font color expression. This is arithmetic expression that should return
|
||||
integer value 0xRRGGBB. The expression can contain variables:
|
||||
@table @option
|
||||
@item frequency, freq, f
|
||||
the frequency where transform is evaluated
|
||||
@item timeclamp, tc
|
||||
value of timeclamp option
|
||||
@end table
|
||||
and functions:
|
||||
@table @option
|
||||
@item midi(f)
|
||||
midi number of frequency f, some midi numbers: E0(16), C1(24), C2(36), A4(69)
|
||||
@item r(x), g(x), b(x)
|
||||
red, green, and blue value of intensity x
|
||||
@end table
|
||||
Default value is @code{st(0, (midi(f)-59.5)/12);
|
||||
st(1, if(between(ld(0),0,1), 0.5-0.5*cos(2*PI*ld(0)), 0));
|
||||
r(1-ld(1)) + b(ld(1))}
|
||||
|
||||
@item fullhd
|
||||
If set to 1 (the default), the video size is 1920x1080 (full HD),
|
||||
if set to 0, the video size is 960x540. Use this option to make CPU usage lower.
|
||||
@@ -10545,6 +10824,24 @@ ffplay -f lavfi 'aevalsrc=0.1*sin(2*PI*55*t)+0.1*sin(4*PI*55*t)+0.1*sin(6*PI*55*
|
||||
asplit[a][out1]; [a] showcqt=timeclamp=0.5 [out0]'
|
||||
@end example
|
||||
|
||||
@item
|
||||
B-weighting of equal loudness
|
||||
@example
|
||||
volume=16*b_weighting(f)
|
||||
@end example
|
||||
|
||||
@item
|
||||
Lower Q factor
|
||||
@example
|
||||
tlength=100/f*tc/(100/f+tc)
|
||||
@end example
|
||||
|
||||
@item
|
||||
Custom fontcolor, C-note is colored green, others are colored blue
|
||||
@example
|
||||
fontcolor='if(mod(floor(midi(f)+0.5),12), 0x0000FF, g(1))'
|
||||
@end example
|
||||
|
||||
@end itemize
|
||||
|
||||
@section showspectrum
|
||||
@@ -10561,8 +10858,19 @@ the "Video size" section in the ffmpeg-utils manual. Default value is
|
||||
@code{640x512}.
|
||||
|
||||
@item slide
|
||||
Specify if the spectrum should slide along the window. Default value is
|
||||
@code{0}.
|
||||
Specify how the spectrum should slide along the window.
|
||||
|
||||
It accepts the following values:
|
||||
@table @samp
|
||||
@item replace
|
||||
the samples start again on the left when they reach the right
|
||||
@item scroll
|
||||
the samples scroll from right to left
|
||||
@item fullframe
|
||||
frames are only produced when the samples reach the right
|
||||
@end table
|
||||
|
||||
Default value is @code{replace}.
|
||||
|
||||
@item mode
|
||||
Specify display mode.
|
||||
@@ -10673,6 +10981,12 @@ Draw a point for each sample.
|
||||
|
||||
@item line
|
||||
Draw a vertical line for each sample.
|
||||
|
||||
@item p2p
|
||||
Draw a point for each sample and a line between them.
|
||||
|
||||
@item cline
|
||||
Draw a centered vertical line for each sample.
|
||||
@end table
|
||||
|
||||
Default value is @code{point}.
|
||||
@@ -10687,6 +11001,9 @@ is not explicitly specified.
|
||||
Set the (approximate) output frame rate. This is done by setting the
|
||||
option @var{n}. Default value is "25".
|
||||
|
||||
@item split_channels
|
||||
Set if channels should be drawn separately or overlap. Default value is 0.
|
||||
|
||||
@end table
|
||||
|
||||
@subsection Examples
|
||||
|
@@ -130,7 +130,7 @@ Go to @url{http://x265.org/developers.html} and follow the instructions
|
||||
for installing the library. Then pass @code{--enable-libx265} to configure
|
||||
to enable it.
|
||||
|
||||
@float note
|
||||
@float NOTE
|
||||
x265 is under the GNU Public License Version 2 or later
|
||||
(see @url{http://www.gnu.org/licenses/old-licenses/gpl-2.0.html} for
|
||||
details), you must upgrade FFmpeg's license to GPL in order to use it.
|
||||
@@ -1055,6 +1055,7 @@ performance on systems without hardware floating point support).
|
||||
@item HLS @tab X
|
||||
@item HTTP @tab X
|
||||
@item HTTPS @tab X
|
||||
@item Icecast @tab X
|
||||
@item MMSH @tab X
|
||||
@item MMST @tab X
|
||||
@item pipe @tab X
|
||||
|
@@ -483,10 +483,28 @@ ffplay -f lavfi "movie=test.avi[out0];amovie=test.wav[out1]"
|
||||
|
||||
@end itemize
|
||||
|
||||
@section libcdio
|
||||
|
||||
Audio-CD input device based on cdio.
|
||||
|
||||
To enable this input device during configuration you need libcdio
|
||||
installed on your system. Requires the configure option
|
||||
@code{--enable-libcdio}.
|
||||
|
||||
This device allows playing and grabbing from an Audio-CD.
|
||||
|
||||
For example to copy with @command{ffmpeg} the entire Audio-CD in /dev/sr0,
|
||||
you may run the command:
|
||||
@example
|
||||
ffmpeg -f libcdio -i /dev/sr0 cd.wav
|
||||
@end example
|
||||
|
||||
@section libdc1394
|
||||
|
||||
IIDC1394 input device, based on libdc1394 and libraw1394.
|
||||
|
||||
Requires the configure option @code{--enable-libdc1394}.
|
||||
|
||||
@section openal
|
||||
|
||||
The OpenAL input device provides audio capture on all systems with a
|
||||
@@ -815,6 +833,9 @@ other filename will be interpreted as device number 0.
|
||||
|
||||
X11 video input device.
|
||||
|
||||
Depends on X11, Xext, and Xfixes. Requires the configure option
|
||||
@code{--enable-x11grab}.
|
||||
|
||||
This device allows one to capture a region of an X11 display.
|
||||
|
||||
The filename passed as input has the syntax:
|
||||
@@ -895,6 +916,10 @@ ffmpeg -f x11grab -follow_mouse centered -show_region 1 -framerate 25 -video_siz
|
||||
|
||||
@item video_size
|
||||
Set the video frame size. Default value is @code{vga}.
|
||||
|
||||
@item use_shm
|
||||
Use the MIT-SHM extension for shared memory. Default value is @code{1}.
|
||||
It may be necessary to disable it for remote displays.
|
||||
@end table
|
||||
|
||||
@c man end INPUT DEVICES
|
||||
|
@@ -22,7 +22,7 @@ a mail for every change to every issue.
|
||||
(the above does all work already after light testing)
|
||||
|
||||
The subscription URL for the ffmpeg-trac list is:
|
||||
http(s)://ffmpeg.org/mailman/listinfo/ffmpeg-trac
|
||||
http(s)://lists.ffmpeg.org/mailman/listinfo/ffmpeg-trac
|
||||
The URL of the webinterface of the tracker is:
|
||||
http(s)://trac.ffmpeg.org
|
||||
|
||||
|
@@ -551,6 +551,12 @@ This operation can take a while, and will not work in various situations such
|
||||
as fragmented output, thus it is not enabled by default.
|
||||
@item -movflags rtphint
|
||||
Add RTP hinting tracks to the output file.
|
||||
@item -movflags disable_chpl
|
||||
Disable Nero chapter markers (chpl atom). Normally, both Nero chapters
|
||||
and a QuickTime chapter track are written to the file. With this option
|
||||
set, only the QuickTime chapter track will be written. Nero chapters can
|
||||
cause failures when the file is reprocessed with certain tagging programs, like
|
||||
mp3Tag 2.61a and iTunes 11.3, most likely other versions are affected as well.
|
||||
@end table
|
||||
|
||||
@subsection Example
|
||||
@@ -798,6 +804,11 @@ reference stream. The default value is @code{auto}.
|
||||
Override the inner container format, by default it is guessed by the filename
|
||||
extension.
|
||||
|
||||
@item segment_format_options @var{options_list}
|
||||
Set output format options using a :-separated list of key=value
|
||||
parameters. Values containing the @code{:} special character must be
|
||||
escaped.
|
||||
|
||||
@item segment_list @var{name}
|
||||
Generate also a listfile named @var{name}. If not specified no
|
||||
listfile is generated.
|
||||
@@ -822,7 +833,7 @@ Select the listing format.
|
||||
@end table
|
||||
|
||||
@item segment_list_size @var{size}
|
||||
Update the list file so that it contains at most the last @var{size}
|
||||
Update the list file so that it contains at most @var{size}
|
||||
segments. If 0 the list file will contain all the segments. Default
|
||||
value is 0.
|
||||
|
||||
@@ -945,7 +956,7 @@ argument must be a time duration specification, and defaults to 0.
|
||||
|
||||
@itemize
|
||||
@item
|
||||
To remux the content of file @file{in.mkv} to a list of segments
|
||||
Remux the content of file @file{in.mkv} to a list of segments
|
||||
@file{out-000.nut}, @file{out-001.nut}, etc., and write the list of
|
||||
generated segments to @file{out.list}:
|
||||
@example
|
||||
@@ -953,14 +964,20 @@ ffmpeg -i in.mkv -codec copy -map 0 -f segment -segment_list out.list out%03d.nu
|
||||
@end example
|
||||
|
||||
@item
|
||||
As the example above, but segment the input file according to the split
|
||||
points specified by the @var{segment_times} option:
|
||||
Segment input and set output format options for the output segments:
|
||||
@example
|
||||
ffmpeg -i in.mkv -f segment -segment_time 10 -segment_format_options movflags=+faststart out%03d.mp4
|
||||
@end example
|
||||
|
||||
@item
|
||||
Segment the input file according to the split points specified by the
|
||||
@var{segment_times} option:
|
||||
@example
|
||||
ffmpeg -i in.mkv -codec copy -map 0 -f segment -segment_list out.csv -segment_times 1,2,3,5,8,13,21 out%03d.nut
|
||||
@end example
|
||||
|
||||
@item
|
||||
As the example above, but use the @command{ffmpeg} @option{force_key_frames}
|
||||
Use the @command{ffmpeg} @option{force_key_frames}
|
||||
option to force key frames in the input at the specified location, together
|
||||
with the segment option @option{segment_time_delta} to account for
|
||||
possible roundings operated when setting key frame times.
|
||||
@@ -979,7 +996,7 @@ ffmpeg -i in.mkv -codec copy -map 0 -f segment -segment_list out.csv -segment_fr
|
||||
@end example
|
||||
|
||||
@item
|
||||
To convert the @file{in.mkv} to TS segments using the @code{libx264}
|
||||
Convert the @file{in.mkv} to TS segments using the @code{libx264}
|
||||
and @code{libfaac} encoders:
|
||||
@example
|
||||
ffmpeg -i in.mkv -map 0 -codec:v libx264 -codec:a libfaac -f ssegment -segment_list out.list out%03d.ts
|
||||
|
@@ -35,6 +35,9 @@ to your project LDFLAGS:
|
||||
-Wl,-Bsymbolic
|
||||
@end example
|
||||
|
||||
If your target platform requires position independent binaries, you should
|
||||
pass the correct linking flag (e.g. @code{-pie}) to @code{--extra-ldexeflags}.
|
||||
|
||||
@section BSD
|
||||
|
||||
BSD make will not build FFmpeg, you need to install and use GNU Make
|
||||
@@ -275,7 +278,7 @@ llrint() in its C library.
|
||||
Install your Cygwin with all the "Base" packages, plus the
|
||||
following "Devel" ones:
|
||||
@example
|
||||
binutils, gcc4-core, make, git, mingw-runtime, texi2html
|
||||
binutils, gcc4-core, make, git, mingw-runtime, texinfo
|
||||
@end example
|
||||
|
||||
In order to run FATE you will also need the following "Utils" packages:
|
||||
|
@@ -255,7 +255,7 @@ Export the MIME type.
|
||||
If set to 1 request ICY (SHOUTcast) metadata from the server. If the server
|
||||
supports this, the metadata has to be retrieved by the application by reading
|
||||
the @option{icy_metadata_headers} and @option{icy_metadata_packet} options.
|
||||
The default is 0.
|
||||
The default is 1.
|
||||
|
||||
@item icy_metadata_headers
|
||||
If the server supports ICY metadata, this contains the ICY-specific HTTP reply
|
||||
@@ -293,6 +293,50 @@ The required syntax to play a stream specifying a cookie is:
|
||||
ffplay -cookies "nlqptid=nltid=tsn; path=/; domain=somedomain.com;" http://somedomain.com/somestream.m3u8
|
||||
@end example
|
||||
|
||||
@section Icecast
|
||||
|
||||
Icecast protocol (stream to Icecast servers)
|
||||
|
||||
This protocol accepts the following options:
|
||||
|
||||
@table @option
|
||||
@item ice_genre
|
||||
Set the stream genre.
|
||||
|
||||
@item ice_name
|
||||
Set the stream name.
|
||||
|
||||
@item ice_description
|
||||
Set the stream description.
|
||||
|
||||
@item ice_url
|
||||
Set the stream website URL.
|
||||
|
||||
@item ice_public
|
||||
Set if the stream should be public.
|
||||
The default is 0 (not public).
|
||||
|
||||
@item user_agent
|
||||
Override the User-Agent header. If not specified a string of the form
|
||||
"Lavf/<version>" will be used.
|
||||
|
||||
@item password
|
||||
Set the Icecast mountpoint password.
|
||||
|
||||
@item content_type
|
||||
Set the stream content type. This must be set if it is different from
|
||||
audio/mpeg.
|
||||
|
||||
@item legacy_icecast
|
||||
This enables support for Icecast versions < 2.4.0, that do not support the
|
||||
HTTP PUT method but the SOURCE method.
|
||||
|
||||
@end table
|
||||
|
||||
@example
|
||||
icecast://[@var{username}[:@var{password}]@@]@var{server}:@var{port}/@var{mountpoint}
|
||||
@end example
|
||||
|
||||
@section mmst
|
||||
|
||||
MMS (Microsoft Media Server) protocol over TCP.
|
||||
@@ -539,7 +583,7 @@ firewalls.
|
||||
|
||||
@section libsmbclient
|
||||
|
||||
libsmbclient permits to manipulate CIFS/SMB network resources.
|
||||
libsmbclient permits one to manipulate CIFS/SMB network resources.
|
||||
|
||||
Following syntax is required.
|
||||
|
||||
|
@@ -618,7 +618,6 @@ flip wavelet?
|
||||
try to use the wavelet transformed predicted image (motion compensated image) as context for coding the residual coefficients
|
||||
try the MV length as context for coding the residual coefficients
|
||||
use extradata for stuff which is in the keyframes now?
|
||||
the MV median predictor is patented IIRC
|
||||
implement per picture halfpel interpolation
|
||||
try different range coder state transition tables for different contexts
|
||||
|
||||
|
23
doc/style.min.css
vendored
Normal file
23
doc/style.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
59
doc/t2h.init
59
doc/t2h.init
@@ -1,26 +1,35 @@
|
||||
# Init file for texi2html.
|
||||
|
||||
# This is deprecated, and the makeinfo/texi2any version is doc/t2h.pm
|
||||
|
||||
# no horiz rules between sections
|
||||
$end_section = \&FFmpeg_end_section;
|
||||
sub FFmpeg_end_section($$)
|
||||
{
|
||||
}
|
||||
|
||||
$EXTRA_HEAD =
|
||||
'<link rel="icon" href="favicon.png" type="image/png" />
|
||||
';
|
||||
|
||||
$CSS_LINES = $ENV{"FFMPEG_CSS"} || <<EOT;
|
||||
<link rel="stylesheet" type="text/css" href="default.css" />
|
||||
my $TEMPLATE_HEADER1 = $ENV{"FFMPEG_HEADER1"} || <<EOT;
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||
<title>FFmpeg documentation</title>
|
||||
<link rel="stylesheet" href="bootstrap.min.css" />
|
||||
<link rel="stylesheet" href="style.min.css" />
|
||||
EOT
|
||||
|
||||
my $TEMPLATE_HEADER = $ENV{"FFMPEG_HEADER"} || <<EOT;
|
||||
<link rel="icon" href="favicon.png" type="image/png" />
|
||||
</head>
|
||||
<body>
|
||||
<div id="container">
|
||||
<div id="body">
|
||||
my $TEMPLATE_HEADER2 = $ENV{"FFMPEG_HEADER2"} || <<EOT;
|
||||
</head>
|
||||
<body>
|
||||
<div style="width: 95%; margin: auto">
|
||||
EOT
|
||||
|
||||
$PRE_BODY_CLOSE = '</div></div>';
|
||||
my $TEMPLATE_FOOTER = $ENV{"FFMPEG_FOOTER"} || <<EOT;
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
EOT
|
||||
|
||||
$SMALL_RULE = '';
|
||||
$BODYTEXT = '';
|
||||
@@ -82,21 +91,25 @@ sub FFmpeg_print_page_head($$)
|
||||
$longtitle = "FFmpeg documentation : " . $longtitle;
|
||||
|
||||
print $fh <<EOT;
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
$TEMPLATE_HEADER1
|
||||
$description
|
||||
<meta name="keywords" content="$longtitle">
|
||||
<meta name="Generator" content="$Texi2HTML::THISDOC{program}">
|
||||
$Texi2HTML::THISDOC{'copying'}<!-- Created on $Texi2HTML::THISDOC{today} by $Texi2HTML::THISDOC{program} -->
|
||||
<!--
|
||||
$Texi2HTML::THISDOC{program_authors}
|
||||
-->
|
||||
<head>
|
||||
<title>$longtitle</title>
|
||||
|
||||
$description
|
||||
<meta name="keywords" content="$longtitle">
|
||||
<meta name="Generator" content="$Texi2HTML::THISDOC{program}">
|
||||
$encoding
|
||||
$CSS_LINES
|
||||
$TEMPLATE_HEADER
|
||||
$TEMPLATE_HEADER2
|
||||
EOT
|
||||
}
|
||||
|
||||
$print_page_foot = \&FFmpeg_print_page_foot;
|
||||
sub FFmpeg_print_page_foot($$)
|
||||
{
|
||||
my $fh = shift;
|
||||
print $fh <<EOT;
|
||||
$TEMPLATE_FOOTER
|
||||
EOT
|
||||
}
|
||||
|
||||
|
221
doc/t2h.pm
Normal file
221
doc/t2h.pm
Normal file
@@ -0,0 +1,221 @@
|
||||
# makeinfo HTML output init file
|
||||
#
|
||||
# Copyright (c) 2011, 2012 Free Software Foundation, Inc.
|
||||
# Copyright (c) 2014 Andreas Cadhalpun
|
||||
# Copyright (c) 2014 Tiancheng "Timothy" Gu
|
||||
#
|
||||
# This file is part of FFmpeg.
|
||||
#
|
||||
# FFmpeg is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# FFmpeg is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
# Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with FFmpeg; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
# no navigation elements
|
||||
set_from_init_file('HEADERS', 0);
|
||||
|
||||
# TOC and Chapter headings link
|
||||
set_from_init_file('TOC_LINKS', 1);
|
||||
|
||||
# print the TOC where @contents is used
|
||||
set_from_init_file('INLINE_CONTENTS', 1);
|
||||
|
||||
# make chapters <h2>
|
||||
set_from_init_file('CHAPTER_HEADER_LEVEL', 2);
|
||||
|
||||
# Do not add <hr>
|
||||
set_from_init_file('DEFAULT_RULE', '');
|
||||
set_from_init_file('BIG_RULE', '');
|
||||
|
||||
# Customized file beginning
|
||||
sub ffmpeg_begin_file($$$)
|
||||
{
|
||||
my $self = shift;
|
||||
my $filename = shift;
|
||||
my $element = shift;
|
||||
|
||||
my $command;
|
||||
if ($element and $self->get_conf('SPLIT')) {
|
||||
$command = $self->element_command($element);
|
||||
}
|
||||
|
||||
my ($title, $description, $encoding, $date, $css_lines,
|
||||
$doctype, $bodytext, $copying_comment, $after_body_open,
|
||||
$extra_head, $program_and_version, $program_homepage,
|
||||
$program, $generator) = $self->_file_header_informations($command);
|
||||
|
||||
my $links = $self->_get_links ($filename, $element);
|
||||
|
||||
my $head1 = $ENV{"FFMPEG_HEADER1"} || <<EOT;
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<html>
|
||||
<!-- Created by $program_and_version, $program_homepage -->
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>
|
||||
EOT
|
||||
my $head_title = <<EOT;
|
||||
$title
|
||||
EOT
|
||||
|
||||
my $head2 = $ENV{"FFMPEG_HEADER2"} || <<EOT;
|
||||
</title>
|
||||
<link rel="stylesheet" type="text/css" href="bootstrap.min.css">
|
||||
<link rel="stylesheet" type="text/css" href="style.min.css">
|
||||
</head>
|
||||
<body>
|
||||
<div style="width: 95%; margin: auto">
|
||||
<h1>
|
||||
EOT
|
||||
|
||||
my $head3 = $ENV{"FFMPEG_HEADER3"} || <<EOT;
|
||||
</h1>
|
||||
EOT
|
||||
|
||||
return $head1 . $head_title . $head2 . $head_title . $head3;
|
||||
}
|
||||
texinfo_register_formatting_function('begin_file', \&ffmpeg_begin_file);
|
||||
|
||||
# Customized file ending
|
||||
sub ffmpeg_end_file($)
|
||||
{
|
||||
my $self = shift;
|
||||
my $program_string = &{$self->{'format_program_string'}}($self);
|
||||
my $program_text = <<EOT;
|
||||
<p style="font-size: small;">
|
||||
$program_string
|
||||
</p>
|
||||
EOT
|
||||
my $footer = $ENV{FFMPEG_FOOTER} || <<EOT;
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
EOT
|
||||
return $program_text . $footer;
|
||||
}
|
||||
texinfo_register_formatting_function('end_file', \&ffmpeg_end_file);
|
||||
|
||||
# Dummy title command
|
||||
# Ignore title. Title is handled through ffmpeg_begin_file().
|
||||
set_from_init_file('USE_TITLEPAGE_FOR_TITLE', 1);
|
||||
sub ffmpeg_title($$$$)
|
||||
{
|
||||
return '';
|
||||
}
|
||||
|
||||
texinfo_register_command_formatting('titlefont',
|
||||
\&ffmpeg_title);
|
||||
|
||||
# Customized float command. Part of code borrowed from GNU Texinfo.
|
||||
sub ffmpeg_float($$$$$)
|
||||
{
|
||||
my $self = shift;
|
||||
my $cmdname = shift;
|
||||
my $command = shift;
|
||||
my $args = shift;
|
||||
my $content = shift;
|
||||
|
||||
my ($caption, $prepended) = Texinfo::Common::float_name_caption($self,
|
||||
$command);
|
||||
my $caption_text = '';
|
||||
my $prepended_text;
|
||||
my $prepended_save = '';
|
||||
|
||||
if ($self->in_string()) {
|
||||
if ($prepended) {
|
||||
$prepended_text = $self->convert_tree_new_formatting_context(
|
||||
$prepended, 'float prepended');
|
||||
} else {
|
||||
$prepended_text = '';
|
||||
}
|
||||
if ($caption) {
|
||||
$caption_text = $self->convert_tree_new_formatting_context(
|
||||
{'contents' => $caption->{'args'}->[0]->{'contents'}},
|
||||
'float caption');
|
||||
}
|
||||
return $prepended.$content.$caption_text;
|
||||
}
|
||||
|
||||
my $id = $self->command_id($command);
|
||||
my $label;
|
||||
if (defined($id) and $id ne '') {
|
||||
$label = "<a name=\"$id\"></a>";
|
||||
} else {
|
||||
$label = '';
|
||||
}
|
||||
|
||||
if ($prepended) {
|
||||
if ($caption) {
|
||||
# prepend the prepended tree to the first paragraph
|
||||
my @caption_original_contents = @{$caption->{'args'}->[0]->{'contents'}};
|
||||
my @caption_contents;
|
||||
my $new_paragraph;
|
||||
while (@caption_original_contents) {
|
||||
my $content = shift @caption_original_contents;
|
||||
if ($content->{'type'} and $content->{'type'} eq 'paragraph') {
|
||||
%{$new_paragraph} = %{$content};
|
||||
$new_paragraph->{'contents'} = [@{$content->{'contents'}}];
|
||||
unshift (@{$new_paragraph->{'contents'}}, {'cmdname' => 'strong',
|
||||
'args' => [{'type' => 'brace_command_arg',
|
||||
'contents' => [$prepended]}]});
|
||||
push @caption_contents, $new_paragraph;
|
||||
last;
|
||||
} else {
|
||||
push @caption_contents, $content;
|
||||
}
|
||||
}
|
||||
push @caption_contents, @caption_original_contents;
|
||||
if ($new_paragraph) {
|
||||
$caption_text = $self->convert_tree_new_formatting_context(
|
||||
{'contents' => \@caption_contents}, 'float caption');
|
||||
$prepended_text = '';
|
||||
}
|
||||
}
|
||||
if ($caption_text eq '') {
|
||||
$prepended_text = $self->convert_tree_new_formatting_context(
|
||||
$prepended, 'float prepended');
|
||||
if ($prepended_text ne '') {
|
||||
$prepended_save = $prepended_text;
|
||||
$prepended_text = '<p><strong>'.$prepended_text.'</strong></p>';
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$prepended_text = '';
|
||||
}
|
||||
|
||||
if ($caption and $caption_text eq '') {
|
||||
$caption_text = $self->convert_tree_new_formatting_context(
|
||||
$caption->{'args'}->[0], 'float caption');
|
||||
}
|
||||
if ($prepended_text.$caption_text ne '') {
|
||||
$prepended_text = $self->_attribute_class('div','float-caption'). '>'
|
||||
. $prepended_text;
|
||||
$caption_text .= '</div>';
|
||||
}
|
||||
my $html_class = '';
|
||||
if ($prepended_save =~ /NOTE/) {
|
||||
$html_class = 'info';
|
||||
$prepended_text = '';
|
||||
$caption_text = '';
|
||||
} elsif ($prepended_save =~ /IMPORTANT/) {
|
||||
$html_class = 'warning';
|
||||
$prepended_text = '';
|
||||
$caption_text = '';
|
||||
}
|
||||
return $self->_attribute_class('div', $html_class). '>' . "\n" .
|
||||
$prepended_text . $caption_text . $content . '</div>';
|
||||
}
|
||||
|
||||
texinfo_register_command_formatting('float',
|
||||
\&ffmpeg_float);
|
||||
|
||||
1;
|
@@ -332,12 +332,12 @@ $inf = pop @instack;
|
||||
|
||||
die "No filename or title\n" unless defined $fn && defined $tl;
|
||||
|
||||
$chapters{NAME} = "$fn \- $tl\n";
|
||||
$chapters{FOOTNOTES} .= "=back\n" if exists $chapters{FOOTNOTES};
|
||||
|
||||
# always use utf8
|
||||
print "=encoding utf8\n\n";
|
||||
|
||||
$chapters{NAME} = "$fn \- $tl\n";
|
||||
$chapters{FOOTNOTES} .= "=back\n" if exists $chapters{FOOTNOTES};
|
||||
|
||||
unshift @chapters_sequence, "NAME";
|
||||
for $chapter (@chapters_sequence) {
|
||||
if (exists $chapters{$chapter}) {
|
||||
|
@@ -782,6 +782,9 @@ large numbers (usually 2^53 and larger).
|
||||
Round the value of expression @var{expr} upwards to the nearest
|
||||
integer. For example, "ceil(1.5)" is "2.0".
|
||||
|
||||
@item clip(x, min, max)
|
||||
Return the value of @var{x} clipped between @var{min} and @var{max}.
|
||||
|
||||
@item cos(x)
|
||||
Compute cosine of @var{x}.
|
||||
|
||||
|
55
ffmpeg.c
55
ffmpeg.c
@@ -483,6 +483,9 @@ static void ffmpeg_cleanup(int ret)
|
||||
av_freep(&ost->avfilter);
|
||||
av_freep(&ost->logfile_prefix);
|
||||
|
||||
av_freep(&ost->audio_channels_map);
|
||||
ost->audio_channels_mapped = 0;
|
||||
|
||||
avcodec_free_context(&ost->enc_ctx);
|
||||
|
||||
av_freep(&output_streams[i]);
|
||||
@@ -532,6 +535,15 @@ static void ffmpeg_cleanup(int ret)
|
||||
term_exit();
|
||||
}
|
||||
|
||||
void remove_avoptions(AVDictionary **a, AVDictionary *b)
|
||||
{
|
||||
AVDictionaryEntry *t = NULL;
|
||||
|
||||
while ((t = av_dict_get(b, "", t, AV_DICT_IGNORE_SUFFIX))) {
|
||||
av_dict_set(a, t->key, NULL, AV_DICT_MATCH_CASE);
|
||||
}
|
||||
}
|
||||
|
||||
void assert_avoptions(AVDictionary *m)
|
||||
{
|
||||
AVDictionaryEntry *t;
|
||||
@@ -578,6 +590,14 @@ static void write_frame(AVFormatContext *s, AVPacket *pkt, OutputStream *ost)
|
||||
AVCodecContext *avctx = ost->st->codec;
|
||||
int ret;
|
||||
|
||||
if (!ost->st->codec->extradata_size && ost->enc_ctx->extradata_size) {
|
||||
ost->st->codec->extradata = av_mallocz(ost->enc_ctx->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
|
||||
if (ost->st->codec->extradata) {
|
||||
memcpy(ost->st->codec->extradata, ost->enc_ctx->extradata, ost->enc_ctx->extradata_size);
|
||||
ost->st->codec->extradata_size = ost->enc_ctx->extradata_size;
|
||||
}
|
||||
}
|
||||
|
||||
if ((avctx->codec_type == AVMEDIA_TYPE_VIDEO && video_sync_method == VSYNC_DROP) ||
|
||||
(avctx->codec_type == AVMEDIA_TYPE_AUDIO && audio_sync_method < 0))
|
||||
pkt->pts = pkt->dts = AV_NOPTS_VALUE;
|
||||
@@ -618,6 +638,8 @@ static void write_frame(AVFormatContext *s, AVPacket *pkt, OutputStream *ost)
|
||||
a = AVERROR(ENOMEM);
|
||||
}
|
||||
if (a > 0) {
|
||||
pkt->side_data = NULL;
|
||||
pkt->side_data_elems = 0;
|
||||
av_free_packet(pkt);
|
||||
new_pkt.buf = av_buffer_create(new_pkt.data, new_pkt.size,
|
||||
av_buffer_default_free, NULL, 0);
|
||||
@@ -1799,18 +1821,10 @@ static int decode_audio(InputStream *ist, AVPacket *pkt, int *got_output)
|
||||
for (i = 0; i < nb_filtergraphs; i++)
|
||||
if (ist_in_filtergraph(filtergraphs[i], ist)) {
|
||||
FilterGraph *fg = filtergraphs[i];
|
||||
int j;
|
||||
if (configure_filtergraph(fg) < 0) {
|
||||
av_log(NULL, AV_LOG_FATAL, "Error reinitializing filters!\n");
|
||||
exit_program(1);
|
||||
}
|
||||
for (j = 0; j < fg->nb_outputs; j++) {
|
||||
OutputStream *ost = fg->outputs[j]->ost;
|
||||
if (ost->enc->type == AVMEDIA_TYPE_AUDIO &&
|
||||
!(ost->enc->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE))
|
||||
av_buffersink_set_frame_size(ost->filter->filter,
|
||||
ost->enc_ctx->frame_size);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2048,7 +2062,7 @@ out:
|
||||
}
|
||||
|
||||
/* pkt = NULL means EOF (needed to flush decoder buffers) */
|
||||
static int output_packet(InputStream *ist, const AVPacket *pkt)
|
||||
static int process_input_packet(InputStream *ist, const AVPacket *pkt)
|
||||
{
|
||||
int ret = 0, i;
|
||||
int got_output = 0;
|
||||
@@ -2057,7 +2071,7 @@ static int output_packet(InputStream *ist, const AVPacket *pkt)
|
||||
if (!ist->saw_first_ts) {
|
||||
ist->dts = ist->st->avg_frame_rate.num ? - ist->dec_ctx->has_b_frames * AV_TIME_BASE / av_q2d(ist->st->avg_frame_rate) : 0;
|
||||
ist->pts = 0;
|
||||
if (pkt != NULL && pkt->pts != AV_NOPTS_VALUE && !ist->decoding_needed) {
|
||||
if (pkt && pkt->pts != AV_NOPTS_VALUE && !ist->decoding_needed) {
|
||||
ist->dts += av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
|
||||
ist->pts = ist->dts; //unused but better to set it to a value thats not totally wrong
|
||||
}
|
||||
@@ -2069,7 +2083,7 @@ static int output_packet(InputStream *ist, const AVPacket *pkt)
|
||||
if (ist->next_pts == AV_NOPTS_VALUE)
|
||||
ist->next_pts = ist->pts;
|
||||
|
||||
if (pkt == NULL) {
|
||||
if (!pkt) {
|
||||
/* EOF handling */
|
||||
av_init_packet(&avpkt);
|
||||
avpkt.data = NULL;
|
||||
@@ -2283,8 +2297,12 @@ static int init_input_stream(int ist_index, char *error, int error_len)
|
||||
ist->dec_ctx->thread_safe_callbacks = 1;
|
||||
|
||||
av_opt_set_int(ist->dec_ctx, "refcounted_frames", 1, 0);
|
||||
if(ist->dec_ctx->codec_id == AV_CODEC_ID_DVB_SUBTITLE)
|
||||
av_dict_set(&ist->decoder_opts, "compute_edt", "1", 0);
|
||||
if (ist->dec_ctx->codec_id == AV_CODEC_ID_DVB_SUBTITLE &&
|
||||
(ist->decoding_needed & DECODING_FOR_OST)) {
|
||||
av_dict_set(&ist->decoder_opts, "compute_edt", "1", AV_DICT_DONT_OVERWRITE);
|
||||
if (ist->decoding_needed & DECODING_FOR_FILTER)
|
||||
av_log(NULL, AV_LOG_WARNING, "Warning using DVB subtitles for filtering and output at the same time is not fully supported, also see -compute_edt [0|1]\n");
|
||||
}
|
||||
|
||||
if (!av_dict_get(ist->decoder_opts, "threads", NULL, 0))
|
||||
av_dict_set(&ist->decoder_opts, "threads", "auto", 0);
|
||||
@@ -2664,7 +2682,7 @@ static int transcode_init(void)
|
||||
}
|
||||
|
||||
if (ist)
|
||||
ist->decoding_needed++;
|
||||
ist->decoding_needed |= DECODING_FOR_OST;
|
||||
ost->encoding_needed = 1;
|
||||
|
||||
set_encoder_id(output_files[ost->file_index], ost);
|
||||
@@ -3331,7 +3349,7 @@ static int process_input(int file_index)
|
||||
for (i = 0; i < ifile->nb_streams; i++) {
|
||||
ist = input_streams[ifile->ist_index + i];
|
||||
if (ist->decoding_needed) {
|
||||
ret = output_packet(ist, NULL);
|
||||
ret = process_input_packet(ist, NULL);
|
||||
if (ret>0)
|
||||
return 0;
|
||||
}
|
||||
@@ -3419,7 +3437,7 @@ static int process_input(int file_index)
|
||||
}
|
||||
|
||||
/* add the stream-global side data to the first packet */
|
||||
if (ist->nb_packets == 1)
|
||||
if (ist->nb_packets == 1) {
|
||||
if (ist->st->nb_side_data)
|
||||
av_packet_split_side_data(&pkt);
|
||||
for (i = 0; i < ist->st->nb_side_data; i++) {
|
||||
@@ -3435,6 +3453,7 @@ static int process_input(int file_index)
|
||||
|
||||
memcpy(dst_data, src_sd->data, src_sd->size);
|
||||
}
|
||||
}
|
||||
|
||||
if (pkt.dts != AV_NOPTS_VALUE)
|
||||
pkt.dts += av_rescale_q(ifile->ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
|
||||
@@ -3512,7 +3531,7 @@ static int process_input(int file_index)
|
||||
|
||||
sub2video_heartbeat(ist, pkt.pts);
|
||||
|
||||
ret = output_packet(ist, &pkt);
|
||||
ret = process_input_packet(ist, &pkt);
|
||||
if (ret < 0) {
|
||||
av_log(NULL, AV_LOG_ERROR, "Error while decoding stream #%d:%d: %s\n",
|
||||
ist->file_index, ist->st->index, av_err2str(ret));
|
||||
@@ -3678,7 +3697,7 @@ static int transcode(void)
|
||||
for (i = 0; i < nb_input_streams; i++) {
|
||||
ist = input_streams[i];
|
||||
if (!input_files[ist->file_index]->eof_reached && ist->decoding_needed) {
|
||||
output_packet(ist, NULL);
|
||||
process_input_packet(ist, NULL);
|
||||
}
|
||||
}
|
||||
flush_encoders();
|
||||
|
8
ffmpeg.h
8
ffmpeg.h
@@ -243,7 +243,10 @@ typedef struct InputStream {
|
||||
AVStream *st;
|
||||
int discard; /* true if stream data should be discarded */
|
||||
int user_set_discard;
|
||||
int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
|
||||
int decoding_needed; /* non zero if the packets must be decoded in 'raw_fifo', see DECODING_FOR_* */
|
||||
#define DECODING_FOR_OST 1
|
||||
#define DECODING_FOR_FILTER 2
|
||||
|
||||
AVCodecContext *dec_ctx;
|
||||
AVCodec *dec;
|
||||
AVFrame *decoded_frame;
|
||||
@@ -402,7 +405,7 @@ typedef struct OutputStream {
|
||||
double forced_keyframes_expr_const_values[FKF_NB];
|
||||
|
||||
/* audio only */
|
||||
int audio_channels_map[SWR_CH_MAX]; /* list of the channels id to pick from the source stream */
|
||||
int *audio_channels_map; /* list of the channels id to pick from the source stream */
|
||||
int audio_channels_mapped; /* number of channels in audio_channels_map */
|
||||
|
||||
char *logfile_prefix;
|
||||
@@ -502,6 +505,7 @@ void show_usage(void);
|
||||
|
||||
void opt_output_file(void *optctx, const char *filename);
|
||||
|
||||
void remove_avoptions(AVDictionary **a, AVDictionary *b);
|
||||
void assert_avoptions(AVDictionary *m);
|
||||
|
||||
int guess_input_channel_layout(InputStream *ist);
|
||||
|
@@ -275,7 +275,7 @@ static void init_input_filter(FilterGraph *fg, AVFilterInOut *in)
|
||||
av_assert0(ist);
|
||||
|
||||
ist->discard = 0;
|
||||
ist->decoding_needed++;
|
||||
ist->decoding_needed |= DECODING_FOR_FILTER;
|
||||
ist->st->discard = AVDISCARD_NONE;
|
||||
|
||||
GROW_ARRAY(fg->inputs, fg->nb_inputs);
|
||||
@@ -830,6 +830,12 @@ static int configure_input_filter(FilterGraph *fg, InputFilter *ifilter,
|
||||
av_freep(&ifilter->name);
|
||||
DESCRIBE_FILTER_LINK(ifilter, in, 1);
|
||||
|
||||
if (!ifilter->ist->dec) {
|
||||
av_log(NULL, AV_LOG_ERROR,
|
||||
"No decoder for stream #%d:%d, filtering impossible\n",
|
||||
ifilter->ist->file_index, ifilter->ist->st->index);
|
||||
return AVERROR_DECODER_NOT_FOUND;
|
||||
}
|
||||
switch (avfilter_pad_get_type(in->filter_ctx->input_pads, in->pad_idx)) {
|
||||
case AVMEDIA_TYPE_VIDEO: return configure_input_video_filter(fg, ifilter, in);
|
||||
case AVMEDIA_TYPE_AUDIO: return configure_input_audio_filter(fg, ifilter, in);
|
||||
@@ -892,8 +898,11 @@ int configure_filtergraph(FilterGraph *fg)
|
||||
init_input_filter(fg, cur);
|
||||
|
||||
for (cur = inputs, i = 0; cur; cur = cur->next, i++)
|
||||
if ((ret = configure_input_filter(fg, fg->inputs[i], cur)) < 0)
|
||||
if ((ret = configure_input_filter(fg, fg->inputs[i], cur)) < 0) {
|
||||
avfilter_inout_free(&inputs);
|
||||
avfilter_inout_free(&outputs);
|
||||
return ret;
|
||||
}
|
||||
avfilter_inout_free(&inputs);
|
||||
|
||||
if (!init || simple) {
|
||||
@@ -919,6 +928,16 @@ int configure_filtergraph(FilterGraph *fg)
|
||||
}
|
||||
|
||||
fg->reconfiguration = 1;
|
||||
|
||||
for (i = 0; i < fg->nb_outputs; i++) {
|
||||
OutputStream *ost = fg->outputs[i]->ost;
|
||||
if (ost &&
|
||||
ost->enc->type == AVMEDIA_TYPE_AUDIO &&
|
||||
!(ost->enc->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE))
|
||||
av_buffersink_set_frame_size(ost->filter->filter,
|
||||
ost->enc_ctx->frame_size);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
114
ffmpeg_opt.c
114
ffmpeg_opt.c
@@ -785,7 +785,6 @@ static int open_input_file(OptionsContext *o, const char *filename)
|
||||
AVInputFormat *file_iformat = NULL;
|
||||
int err, i, ret;
|
||||
int64_t timestamp;
|
||||
uint8_t buf[128];
|
||||
AVDictionary **opts;
|
||||
AVDictionary *unused_opts = NULL;
|
||||
AVDictionaryEntry *e = NULL;
|
||||
@@ -814,8 +813,7 @@ static int open_input_file(OptionsContext *o, const char *filename)
|
||||
exit_program(1);
|
||||
}
|
||||
if (o->nb_audio_sample_rate) {
|
||||
snprintf(buf, sizeof(buf), "%d", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i);
|
||||
av_dict_set(&o->g->format_opts, "sample_rate", buf, 0);
|
||||
av_dict_set_int(&o->g->format_opts, "sample_rate", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i, 0);
|
||||
}
|
||||
if (o->nb_audio_channels) {
|
||||
/* because we set audio_channels based on both the "ac" and
|
||||
@@ -824,9 +822,7 @@ static int open_input_file(OptionsContext *o, const char *filename)
|
||||
if (file_iformat && file_iformat->priv_class &&
|
||||
av_opt_find(&file_iformat->priv_class, "channels", NULL, 0,
|
||||
AV_OPT_SEARCH_FAKE_OBJ)) {
|
||||
snprintf(buf, sizeof(buf), "%d",
|
||||
o->audio_channels[o->nb_audio_channels - 1].u.i);
|
||||
av_dict_set(&o->g->format_opts, "channels", buf, 0);
|
||||
av_dict_set_int(&o->g->format_opts, "channels", o->audio_channels[o->nb_audio_channels - 1].u.i, 0);
|
||||
}
|
||||
}
|
||||
if (o->nb_frame_rates) {
|
||||
@@ -872,6 +868,7 @@ static int open_input_file(OptionsContext *o, const char *filename)
|
||||
print_error(filename, err);
|
||||
exit_program(1);
|
||||
}
|
||||
remove_avoptions(&o->g->format_opts, o->g->codec_opts);
|
||||
assert_avoptions(o->g->format_opts);
|
||||
|
||||
/* apply forced codec ids */
|
||||
@@ -1477,11 +1474,13 @@ static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc, in
|
||||
}
|
||||
|
||||
if (!ist || (ist->file_index == map->file_idx && ist->st->index == map->stream_idx)) {
|
||||
if (ost->audio_channels_mapped < FF_ARRAY_ELEMS(ost->audio_channels_map))
|
||||
ost->audio_channels_map[ost->audio_channels_mapped++] = map->channel_idx;
|
||||
else
|
||||
av_log(NULL, AV_LOG_FATAL, "Max channel mapping for output %d.%d reached\n",
|
||||
ost->file_index, ost->st->index);
|
||||
if (av_reallocp_array(&ost->audio_channels_map,
|
||||
ost->audio_channels_mapped + 1,
|
||||
sizeof(*ost->audio_channels_map)
|
||||
) < 0 )
|
||||
exit_program(1);
|
||||
|
||||
ost->audio_channels_map[ost->audio_channels_mapped++] = map->channel_idx;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1828,7 +1827,7 @@ static int open_output_file(OptionsContext *o, const char *filename)
|
||||
/* pick the "best" stream of each type */
|
||||
|
||||
/* video: highest resolution */
|
||||
if (!o->video_disable && oc->oformat->video_codec != AV_CODEC_ID_NONE) {
|
||||
if (!o->video_disable && av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_VIDEO) != AV_CODEC_ID_NONE) {
|
||||
int area = 0, idx = -1;
|
||||
int qcr = avformat_query_codec(oc->oformat, oc->oformat->video_codec, 0);
|
||||
for (i = 0; i < nb_input_streams; i++) {
|
||||
@@ -1850,7 +1849,7 @@ static int open_output_file(OptionsContext *o, const char *filename)
|
||||
}
|
||||
|
||||
/* audio: most channels */
|
||||
if (!o->audio_disable && oc->oformat->audio_codec != AV_CODEC_ID_NONE) {
|
||||
if (!o->audio_disable && av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_AUDIO) != AV_CODEC_ID_NONE) {
|
||||
int channels = 0, idx = -1;
|
||||
for (i = 0; i < nb_input_streams; i++) {
|
||||
ist = input_streams[i];
|
||||
@@ -1869,8 +1868,27 @@ static int open_output_file(OptionsContext *o, const char *filename)
|
||||
if (!o->subtitle_disable && (avcodec_find_encoder(oc->oformat->subtitle_codec) || subtitle_codec_name)) {
|
||||
for (i = 0; i < nb_input_streams; i++)
|
||||
if (input_streams[i]->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
|
||||
new_subtitle_stream(o, oc, i);
|
||||
break;
|
||||
AVCodecDescriptor const *input_descriptor =
|
||||
avcodec_descriptor_get(input_streams[i]->st->codec->codec_id);
|
||||
AVCodecDescriptor const *output_descriptor = NULL;
|
||||
AVCodec const *output_codec =
|
||||
avcodec_find_encoder(oc->oformat->subtitle_codec);
|
||||
int input_props = 0, output_props = 0;
|
||||
if (output_codec)
|
||||
output_descriptor = avcodec_descriptor_get(output_codec->id);
|
||||
if (input_descriptor)
|
||||
input_props = input_descriptor->props & (AV_CODEC_PROP_TEXT_SUB | AV_CODEC_PROP_BITMAP_SUB);
|
||||
if (output_descriptor)
|
||||
output_props = output_descriptor->props & (AV_CODEC_PROP_TEXT_SUB | AV_CODEC_PROP_BITMAP_SUB);
|
||||
if (subtitle_codec_name ||
|
||||
input_props & output_props ||
|
||||
// Map dvb teletext which has neither property to any output subtitle encoder
|
||||
input_descriptor && output_descriptor &&
|
||||
(!input_descriptor->props ||
|
||||
!output_descriptor->props)) {
|
||||
new_subtitle_stream(o, oc, i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
/* do something with data? */
|
||||
@@ -1992,8 +2010,13 @@ loop_end:
|
||||
const AVClass *class = avcodec_get_class();
|
||||
const AVOption *option = av_opt_find(&class, e->key, NULL, 0,
|
||||
AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
|
||||
if (!option)
|
||||
const AVClass *fclass = avformat_get_class();
|
||||
const AVOption *foption = av_opt_find(&fclass, e->key, NULL, 0,
|
||||
AV_OPT_SEARCH_CHILDREN | AV_OPT_SEARCH_FAKE_OBJ);
|
||||
if (!option || foption)
|
||||
continue;
|
||||
|
||||
|
||||
if (!(option->flags & AV_OPT_FLAG_ENCODING_PARAM)) {
|
||||
av_log(NULL, AV_LOG_ERROR, "Codec AVOption %s (%s) specified for "
|
||||
"output file #%d (%s) is not an encoding option.\n", e->key,
|
||||
@@ -2038,9 +2061,7 @@ loop_end:
|
||||
assert_file_overwrite(filename);
|
||||
|
||||
if (o->mux_preload) {
|
||||
uint8_t buf[64];
|
||||
snprintf(buf, sizeof(buf), "%d", (int)(o->mux_preload*AV_TIME_BASE));
|
||||
av_dict_set(&of->opts, "preload", buf, 0);
|
||||
av_dict_set_int(&of->opts, "preload", o->mux_preload*AV_TIME_BASE, 0);
|
||||
}
|
||||
oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
|
||||
|
||||
@@ -2166,7 +2187,8 @@ static int opt_target(void *optctx, const char *opt, const char *arg)
|
||||
for (j = 0; j < nb_input_files; j++) {
|
||||
for (i = 0; i < input_files[j]->nb_streams; i++) {
|
||||
AVCodecContext *c = input_files[j]->ctx->streams[i]->codec;
|
||||
if (c->codec_type != AVMEDIA_TYPE_VIDEO)
|
||||
if (c->codec_type != AVMEDIA_TYPE_VIDEO ||
|
||||
!c->time_base.num)
|
||||
continue;
|
||||
fr = c->time_base.den * 1000 / c->time_base.num;
|
||||
if (fr == 25000) {
|
||||
@@ -2199,19 +2221,19 @@ static int opt_target(void *optctx, const char *opt, const char *arg)
|
||||
|
||||
parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
|
||||
parse_option(o, "r", frame_rates[norm], options);
|
||||
av_dict_set(&o->g->codec_opts, "g", norm == PAL ? "15" : "18", AV_DICT_DONT_OVERWRITE);
|
||||
opt_default(NULL, "g", norm == PAL ? "15" : "18");
|
||||
|
||||
av_dict_set(&o->g->codec_opts, "b:v", "1150000", AV_DICT_DONT_OVERWRITE);
|
||||
av_dict_set(&o->g->codec_opts, "maxrate", "1150000", AV_DICT_DONT_OVERWRITE);
|
||||
av_dict_set(&o->g->codec_opts, "minrate", "1150000", AV_DICT_DONT_OVERWRITE);
|
||||
av_dict_set(&o->g->codec_opts, "bufsize", "327680", AV_DICT_DONT_OVERWRITE); // 40*1024*8;
|
||||
opt_default(NULL, "b:v", "1150000");
|
||||
opt_default(NULL, "maxrate", "1150000");
|
||||
opt_default(NULL, "minrate", "1150000");
|
||||
opt_default(NULL, "bufsize", "327680"); // 40*1024*8;
|
||||
|
||||
av_dict_set(&o->g->codec_opts, "b:a", "224000", AV_DICT_DONT_OVERWRITE);
|
||||
opt_default(NULL, "b:a", "224000");
|
||||
parse_option(o, "ar", "44100", options);
|
||||
parse_option(o, "ac", "2", options);
|
||||
|
||||
av_dict_set(&o->g->format_opts, "packetsize", "2324", AV_DICT_DONT_OVERWRITE);
|
||||
av_dict_set(&o->g->format_opts, "muxrate", "1411200", AV_DICT_DONT_OVERWRITE); // 2352 * 75 * 8;
|
||||
opt_default(NULL, "packetsize", "2324");
|
||||
opt_default(NULL, "muxrate", "1411200"); // 2352 * 75 * 8;
|
||||
|
||||
/* We have to offset the PTS, so that it is consistent with the SCR.
|
||||
SCR starts at 36000, but the first two packs contain only padding
|
||||
@@ -2228,18 +2250,18 @@ static int opt_target(void *optctx, const char *opt, const char *arg)
|
||||
parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
|
||||
parse_option(o, "r", frame_rates[norm], options);
|
||||
parse_option(o, "pix_fmt", "yuv420p", options);
|
||||
av_dict_set(&o->g->codec_opts, "g", norm == PAL ? "15" : "18", AV_DICT_DONT_OVERWRITE);
|
||||
opt_default(NULL, "g", norm == PAL ? "15" : "18");
|
||||
|
||||
av_dict_set(&o->g->codec_opts, "b:v", "2040000", AV_DICT_DONT_OVERWRITE);
|
||||
av_dict_set(&o->g->codec_opts, "maxrate", "2516000", AV_DICT_DONT_OVERWRITE);
|
||||
av_dict_set(&o->g->codec_opts, "minrate", "0", AV_DICT_DONT_OVERWRITE); // 1145000;
|
||||
av_dict_set(&o->g->codec_opts, "bufsize", "1835008", AV_DICT_DONT_OVERWRITE); // 224*1024*8;
|
||||
av_dict_set(&o->g->codec_opts, "scan_offset", "1", AV_DICT_DONT_OVERWRITE);
|
||||
opt_default(NULL, "b:v", "2040000");
|
||||
opt_default(NULL, "maxrate", "2516000");
|
||||
opt_default(NULL, "minrate", "0"); // 1145000;
|
||||
opt_default(NULL, "bufsize", "1835008"); // 224*1024*8;
|
||||
opt_default(NULL, "scan_offset", "1");
|
||||
|
||||
av_dict_set(&o->g->codec_opts, "b:a", "224000", AV_DICT_DONT_OVERWRITE);
|
||||
opt_default(NULL, "b:a", "224000");
|
||||
parse_option(o, "ar", "44100", options);
|
||||
|
||||
av_dict_set(&o->g->format_opts, "packetsize", "2324", AV_DICT_DONT_OVERWRITE);
|
||||
opt_default(NULL, "packetsize", "2324");
|
||||
|
||||
} else if (!strcmp(arg, "dvd")) {
|
||||
|
||||
@@ -2250,17 +2272,17 @@ static int opt_target(void *optctx, const char *opt, const char *arg)
|
||||
parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
|
||||
parse_option(o, "r", frame_rates[norm], options);
|
||||
parse_option(o, "pix_fmt", "yuv420p", options);
|
||||
av_dict_set(&o->g->codec_opts, "g", norm == PAL ? "15" : "18", AV_DICT_DONT_OVERWRITE);
|
||||
opt_default(NULL, "g", norm == PAL ? "15" : "18");
|
||||
|
||||
av_dict_set(&o->g->codec_opts, "b:v", "6000000", AV_DICT_DONT_OVERWRITE);
|
||||
av_dict_set(&o->g->codec_opts, "maxrate", "9000000", AV_DICT_DONT_OVERWRITE);
|
||||
av_dict_set(&o->g->codec_opts, "minrate", "0", AV_DICT_DONT_OVERWRITE); // 1500000;
|
||||
av_dict_set(&o->g->codec_opts, "bufsize", "1835008", AV_DICT_DONT_OVERWRITE); // 224*1024*8;
|
||||
opt_default(NULL, "b:v", "6000000");
|
||||
opt_default(NULL, "maxrate", "9000000");
|
||||
opt_default(NULL, "minrate", "0"); // 1500000;
|
||||
opt_default(NULL, "bufsize", "1835008"); // 224*1024*8;
|
||||
|
||||
av_dict_set(&o->g->format_opts, "packetsize", "2048", AV_DICT_DONT_OVERWRITE); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
|
||||
av_dict_set(&o->g->format_opts, "muxrate", "10080000", AV_DICT_DONT_OVERWRITE); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
|
||||
opt_default(NULL, "packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
|
||||
opt_default(NULL, "muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
|
||||
|
||||
av_dict_set(&o->g->codec_opts, "b:a", "448000", AV_DICT_DONT_OVERWRITE);
|
||||
opt_default(NULL, "b:a", "448000");
|
||||
parse_option(o, "ar", "48000", options);
|
||||
|
||||
} else if (!strncmp(arg, "dv", 2)) {
|
||||
@@ -2279,6 +2301,10 @@ static int opt_target(void *optctx, const char *opt, const char *arg)
|
||||
av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
|
||||
av_dict_copy(&o->g->codec_opts, codec_opts, AV_DICT_DONT_OVERWRITE);
|
||||
av_dict_copy(&o->g->format_opts, format_opts, AV_DICT_DONT_OVERWRITE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
12
ffplay.c
12
ffplay.c
@@ -441,7 +441,7 @@ static void packet_queue_flush(PacketQueue *q)
|
||||
MyAVPacketList *pkt, *pkt1;
|
||||
|
||||
SDL_LockMutex(q->mutex);
|
||||
for (pkt = q->first_pkt; pkt != NULL; pkt = pkt1) {
|
||||
for (pkt = q->first_pkt; pkt; pkt = pkt1) {
|
||||
pkt1 = pkt->next;
|
||||
av_free_packet(&pkt->pkt);
|
||||
av_freep(&pkt);
|
||||
@@ -991,7 +991,7 @@ static void video_audio_display(VideoState *s)
|
||||
av_free(s->rdft_data);
|
||||
s->rdft = av_rdft_init(rdft_bits, DFT_R2C);
|
||||
s->rdft_bits = rdft_bits;
|
||||
s->rdft_data = av_malloc(4 * nb_freq * sizeof(*s->rdft_data));
|
||||
s->rdft_data = av_malloc_array(nb_freq, 4 *sizeof(*s->rdft_data));
|
||||
}
|
||||
{
|
||||
FFTSample *data[2];
|
||||
@@ -1652,7 +1652,7 @@ static int queue_picture(VideoState *is, AVFrame *src_frame, double pts, double
|
||||
is->img_convert_ctx = sws_getCachedContext(is->img_convert_ctx,
|
||||
vp->width, vp->height, src_frame->format, vp->width, vp->height,
|
||||
AV_PIX_FMT_YUV420P, sws_flags, NULL, NULL, NULL);
|
||||
if (is->img_convert_ctx == NULL) {
|
||||
if (!is->img_convert_ctx) {
|
||||
av_log(NULL, AV_LOG_FATAL, "Cannot initialize the conversion context\n");
|
||||
exit(1);
|
||||
}
|
||||
@@ -2582,7 +2582,7 @@ static int stream_component_open(VideoState *is, int stream_index)
|
||||
if (!av_dict_get(opts, "threads", NULL, 0))
|
||||
av_dict_set(&opts, "threads", "auto", 0);
|
||||
if (stream_lowres)
|
||||
av_dict_set(&opts, "lowres", av_asprintf("%d", stream_lowres), AV_DICT_DONT_STRDUP_VAL);
|
||||
av_dict_set_int(&opts, "lowres", stream_lowres, 0);
|
||||
if (avctx->codec_type == AVMEDIA_TYPE_VIDEO || avctx->codec_type == AVMEDIA_TYPE_AUDIO)
|
||||
av_dict_set(&opts, "refcounted_frames", "1", 0);
|
||||
if (avcodec_open2(avctx, codec, &opts) < 0)
|
||||
@@ -2824,7 +2824,7 @@ static int read_thread(void *arg)
|
||||
av_freep(&opts);
|
||||
|
||||
if (ic->pb)
|
||||
ic->pb->eof_reached = 0; // FIXME hack, ffplay maybe should not use url_feof() to test for the end
|
||||
ic->pb->eof_reached = 0; // FIXME hack, ffplay maybe should not use avio_feof() to test for the end
|
||||
|
||||
if (seek_by_bytes < 0)
|
||||
seek_by_bytes = !!(ic->iformat->flags & AVFMT_TS_DISCONT) && strcmp("ogg", ic->iformat->name);
|
||||
@@ -3013,7 +3013,7 @@ static int read_thread(void *arg)
|
||||
}
|
||||
ret = av_read_frame(ic, pkt);
|
||||
if (ret < 0) {
|
||||
if (ret == AVERROR_EOF || url_feof(ic->pb))
|
||||
if (ret == AVERROR_EOF || avio_feof(ic->pb))
|
||||
eof = 1;
|
||||
if (ic->pb && ic->pb->error)
|
||||
break;
|
||||
|
62
ffprobe.c
62
ffprobe.c
@@ -33,6 +33,7 @@
|
||||
#include "libavutil/avassert.h"
|
||||
#include "libavutil/avstring.h"
|
||||
#include "libavutil/bprint.h"
|
||||
#include "libavutil/hash.h"
|
||||
#include "libavutil/opt.h"
|
||||
#include "libavutil/pixdesc.h"
|
||||
#include "libavutil/dict.h"
|
||||
@@ -80,6 +81,7 @@ static int show_private_data = 1;
|
||||
|
||||
static char *print_format;
|
||||
static char *stream_specifier;
|
||||
static char *show_data_hash;
|
||||
|
||||
typedef struct {
|
||||
int id; ///< identifier
|
||||
@@ -123,6 +125,8 @@ typedef enum {
|
||||
SECTION_ID_FRAME,
|
||||
SECTION_ID_FRAMES,
|
||||
SECTION_ID_FRAME_TAGS,
|
||||
SECTION_ID_FRAME_SIDE_DATA_LIST,
|
||||
SECTION_ID_FRAME_SIDE_DATA,
|
||||
SECTION_ID_LIBRARY_VERSION,
|
||||
SECTION_ID_LIBRARY_VERSIONS,
|
||||
SECTION_ID_PACKET,
|
||||
@@ -152,8 +156,10 @@ static struct section sections[] = {
|
||||
[SECTION_ID_FORMAT] = { SECTION_ID_FORMAT, "format", 0, { SECTION_ID_FORMAT_TAGS, -1 } },
|
||||
[SECTION_ID_FORMAT_TAGS] = { SECTION_ID_FORMAT_TAGS, "tags", SECTION_FLAG_HAS_VARIABLE_FIELDS, { -1 }, .element_name = "tag", .unique_name = "format_tags" },
|
||||
[SECTION_ID_FRAMES] = { SECTION_ID_FRAMES, "frames", SECTION_FLAG_IS_ARRAY, { SECTION_ID_FRAME, SECTION_ID_SUBTITLE, -1 } },
|
||||
[SECTION_ID_FRAME] = { SECTION_ID_FRAME, "frame", 0, { SECTION_ID_FRAME_TAGS, -1 } },
|
||||
[SECTION_ID_FRAME] = { SECTION_ID_FRAME, "frame", 0, { SECTION_ID_FRAME_TAGS, SECTION_ID_FRAME_SIDE_DATA_LIST, -1 } },
|
||||
[SECTION_ID_FRAME_TAGS] = { SECTION_ID_FRAME_TAGS, "tags", SECTION_FLAG_HAS_VARIABLE_FIELDS, { -1 }, .element_name = "tag", .unique_name = "frame_tags" },
|
||||
[SECTION_ID_FRAME_SIDE_DATA_LIST] ={ SECTION_ID_FRAME_SIDE_DATA_LIST, "side_data_list", SECTION_FLAG_IS_ARRAY, { SECTION_ID_FRAME_SIDE_DATA, -1 } },
|
||||
[SECTION_ID_FRAME_SIDE_DATA] = { SECTION_ID_FRAME_SIDE_DATA, "side_data", 0, { -1 } },
|
||||
[SECTION_ID_LIBRARY_VERSIONS] = { SECTION_ID_LIBRARY_VERSIONS, "library_versions", SECTION_FLAG_IS_ARRAY, { SECTION_ID_LIBRARY_VERSION, -1 } },
|
||||
[SECTION_ID_LIBRARY_VERSION] = { SECTION_ID_LIBRARY_VERSION, "library_version", 0, { -1 } },
|
||||
[SECTION_ID_PACKETS] = { SECTION_ID_PACKETS, "packets", SECTION_FLAG_IS_ARRAY, { SECTION_ID_PACKET, -1} },
|
||||
@@ -183,6 +189,8 @@ static const OptionDef *options;
|
||||
static const char *input_filename;
|
||||
static AVInputFormat *iformat = NULL;
|
||||
|
||||
static struct AVHashContext *hash;
|
||||
|
||||
static const char *const binary_unit_prefixes [] = { "", "Ki", "Mi", "Gi", "Ti", "Pi" };
|
||||
static const char *const decimal_unit_prefixes[] = { "", "K" , "M" , "G" , "T" , "P" };
|
||||
|
||||
@@ -681,6 +689,21 @@ static void writer_print_data(WriterContext *wctx, const char *name,
|
||||
av_bprint_finalize(&bp, NULL);
|
||||
}
|
||||
|
||||
static void writer_print_data_hash(WriterContext *wctx, const char *name,
|
||||
uint8_t *data, int size)
|
||||
{
|
||||
char *p, buf[AV_HASH_MAX_SIZE * 2 + 64] = { 0 };
|
||||
|
||||
if (!hash)
|
||||
return;
|
||||
av_hash_init(hash);
|
||||
av_hash_update(hash, data, size);
|
||||
snprintf(buf, sizeof(buf), "%s:", av_hash_get_name(hash));
|
||||
p = buf + strlen(buf);
|
||||
av_hash_final_hex(hash, p, buf + sizeof(buf) - p);
|
||||
writer_print_string(wctx, name, buf, 0);
|
||||
}
|
||||
|
||||
#define MAX_REGISTERED_WRITERS_NB 64
|
||||
|
||||
static const Writer *registered_writers[MAX_REGISTERED_WRITERS_NB + 1];
|
||||
@@ -1688,6 +1711,7 @@ static void show_packet(WriterContext *w, AVFormatContext *fmt_ctx, AVPacket *pk
|
||||
print_fmt("flags", "%c", pkt->flags & AV_PKT_FLAG_KEY ? 'K' : '_');
|
||||
if (do_show_data)
|
||||
writer_print_data(w, "data", pkt->data, pkt->size);
|
||||
writer_print_data_hash(w, "data_hash", pkt->data, pkt->size);
|
||||
writer_print_section_footer(w);
|
||||
|
||||
av_bprint_finalize(&pbuf, NULL);
|
||||
@@ -1722,6 +1746,7 @@ static void show_frame(WriterContext *w, AVFrame *frame, AVStream *stream,
|
||||
{
|
||||
AVBPrint pbuf;
|
||||
const char *s;
|
||||
int i;
|
||||
|
||||
av_bprint_init(&pbuf, 1, AV_BPRINT_SIZE_UNLIMITED);
|
||||
|
||||
@@ -1784,6 +1809,20 @@ static void show_frame(WriterContext *w, AVFrame *frame, AVStream *stream,
|
||||
}
|
||||
if (do_show_frame_tags)
|
||||
show_tags(w, av_frame_get_metadata(frame), SECTION_ID_FRAME_TAGS);
|
||||
if (frame->nb_side_data) {
|
||||
writer_print_section_header(w, SECTION_ID_FRAME_SIDE_DATA_LIST);
|
||||
for (i = 0; i < frame->nb_side_data; i++) {
|
||||
AVFrameSideData *sd = frame->side_data[i];
|
||||
const char *name;
|
||||
|
||||
writer_print_section_header(w, SECTION_ID_FRAME_SIDE_DATA);
|
||||
name = av_frame_side_data_name(sd->type);
|
||||
print_str("side_data_type", name ? name : "unknown");
|
||||
print_int("side_data_size", sd->size);
|
||||
writer_print_section_footer(w);
|
||||
}
|
||||
writer_print_section_footer(w);
|
||||
}
|
||||
|
||||
writer_print_section_footer(w);
|
||||
|
||||
@@ -2131,6 +2170,8 @@ static int show_stream(WriterContext *w, AVFormatContext *fmt_ctx, int stream_id
|
||||
else print_str_opt("bit_rate", "N/A");
|
||||
if (dec_ctx->rc_max_rate > 0) print_val ("max_bit_rate", dec_ctx->rc_max_rate, unit_bit_per_second_str);
|
||||
else print_str_opt("max_bit_rate", "N/A");
|
||||
if (dec_ctx->bits_per_raw_sample > 0) print_fmt("bits_per_raw_sample", "%d", dec_ctx->bits_per_raw_sample);
|
||||
else print_str_opt("bits_per_raw_sample", "N/A");
|
||||
if (stream->nb_frames) print_fmt ("nb_frames", "%"PRId64, stream->nb_frames);
|
||||
else print_str_opt("nb_frames", "N/A");
|
||||
if (nb_streams_frames[stream_idx]) print_fmt ("nb_read_frames", "%"PRIu64, nb_streams_frames[stream_idx]);
|
||||
@@ -2140,6 +2181,8 @@ static int show_stream(WriterContext *w, AVFormatContext *fmt_ctx, int stream_id
|
||||
if (do_show_data)
|
||||
writer_print_data(w, "extradata", dec_ctx->extradata,
|
||||
dec_ctx->extradata_size);
|
||||
writer_print_data_hash(w, "extradata_hash", dec_ctx->extradata,
|
||||
dec_ctx->extradata_size);
|
||||
|
||||
/* Print disposition information */
|
||||
#define PRINT_DISPOSITION(flagname, name) do { \
|
||||
@@ -2868,6 +2911,7 @@ static const OptionDef real_options[] = {
|
||||
{ "select_streams", OPT_STRING | HAS_ARG, {(void*)&stream_specifier}, "select the specified streams", "stream_specifier" },
|
||||
{ "sections", OPT_EXIT, {.func_arg = opt_sections}, "print sections structure and section information, and exit" },
|
||||
{ "show_data", OPT_BOOL, {(void*)&do_show_data}, "show packets data" },
|
||||
{ "show_data_hash", OPT_STRING | HAS_ARG, {(void*)&show_data_hash}, "show packets data hash" },
|
||||
{ "show_error", 0, {(void*)&opt_show_error}, "show probing error" },
|
||||
{ "show_format", 0, {(void*)&opt_show_format}, "show format/container info" },
|
||||
{ "show_frames", 0, {(void*)&opt_show_frames}, "show frames info" },
|
||||
@@ -2971,6 +3015,21 @@ int main(int argc, char **argv)
|
||||
w_name = av_strtok(print_format, "=", &buf);
|
||||
w_args = buf;
|
||||
|
||||
if (show_data_hash) {
|
||||
if ((ret = av_hash_alloc(&hash, show_data_hash)) < 0) {
|
||||
if (ret == AVERROR(EINVAL)) {
|
||||
const char *n;
|
||||
av_log(NULL, AV_LOG_ERROR,
|
||||
"Unknown hash algorithm '%s'\nKnown algorithms:",
|
||||
show_data_hash);
|
||||
for (i = 0; (n = av_hash_names(i)); i++)
|
||||
av_log(NULL, AV_LOG_ERROR, " %s", n);
|
||||
av_log(NULL, AV_LOG_ERROR, "\n");
|
||||
}
|
||||
goto end;
|
||||
}
|
||||
}
|
||||
|
||||
w = writer_get_by_name(w_name);
|
||||
if (!w) {
|
||||
av_log(NULL, AV_LOG_ERROR, "Unknown output format with name '%s'\n", w_name);
|
||||
@@ -3010,6 +3069,7 @@ int main(int argc, char **argv)
|
||||
end:
|
||||
av_freep(&print_format);
|
||||
av_freep(&read_intervals);
|
||||
av_hash_freep(&hash);
|
||||
|
||||
uninit_opts();
|
||||
for (i = 0; i < FF_ARRAY_ELEMS(sections); i++)
|
||||
|
85
ffserver.c
85
ffserver.c
@@ -91,7 +91,7 @@ enum HTTPState {
|
||||
RTSPSTATE_SEND_PACKET,
|
||||
};
|
||||
|
||||
static const char *http_state[] = {
|
||||
static const char * const http_state[] = {
|
||||
"HTTP_WAIT_REQUEST",
|
||||
"HTTP_SEND_HEADER",
|
||||
|
||||
@@ -592,7 +592,7 @@ static void start_multicast(void)
|
||||
int default_port, stream_index;
|
||||
|
||||
default_port = 6000;
|
||||
for(stream = first_stream; stream != NULL; stream = stream->next) {
|
||||
for(stream = first_stream; stream; stream = stream->next) {
|
||||
if (stream->is_multicast) {
|
||||
unsigned random0 = av_lfg_get(&random_state);
|
||||
unsigned random1 = av_lfg_get(&random_state);
|
||||
@@ -646,7 +646,7 @@ static int http_server(void)
|
||||
struct pollfd *poll_table, *poll_entry;
|
||||
HTTPContext *c, *c_next;
|
||||
|
||||
if(!(poll_table = av_mallocz((nb_max_http_connections + 2)*sizeof(*poll_table)))) {
|
||||
if(!(poll_table = av_mallocz_array(nb_max_http_connections + 2, sizeof(*poll_table)))) {
|
||||
http_log("Impossible to allocate a poll table handling %d connections.\n", nb_max_http_connections);
|
||||
return -1;
|
||||
}
|
||||
@@ -696,7 +696,7 @@ static int http_server(void)
|
||||
/* wait for events on each HTTP handle */
|
||||
c = first_http_ctx;
|
||||
delay = 1000;
|
||||
while (c != NULL) {
|
||||
while (c) {
|
||||
int fd;
|
||||
fd = c->fd;
|
||||
switch(c->state) {
|
||||
@@ -763,7 +763,7 @@ static int http_server(void)
|
||||
}
|
||||
|
||||
/* now handle the events */
|
||||
for(c = first_http_ctx; c != NULL; c = c_next) {
|
||||
for(c = first_http_ctx; c; c = c_next) {
|
||||
c_next = c->next;
|
||||
if (handle_connection(c) < 0) {
|
||||
log_connection(c);
|
||||
@@ -881,7 +881,7 @@ static void close_connection(HTTPContext *c)
|
||||
|
||||
/* remove connection from list */
|
||||
cp = &first_http_ctx;
|
||||
while ((*cp) != NULL) {
|
||||
while (*cp) {
|
||||
c1 = *cp;
|
||||
if (c1 == c)
|
||||
*cp = c->next;
|
||||
@@ -890,7 +890,7 @@ static void close_connection(HTTPContext *c)
|
||||
}
|
||||
|
||||
/* remove references, if any (XXX: do it faster) */
|
||||
for(c1 = first_http_ctx; c1 != NULL; c1 = c1->next) {
|
||||
for(c1 = first_http_ctx; c1; c1 = c1->next) {
|
||||
if (c1->rtsp_c == c)
|
||||
c1->rtsp_c = NULL;
|
||||
}
|
||||
@@ -1258,24 +1258,13 @@ static int modify_current_stream(HTTPContext *c, char *rates)
|
||||
return action_required;
|
||||
}
|
||||
|
||||
/* XXX: factorize in utils.c ? */
|
||||
/* XXX: take care with different space meaning */
|
||||
static void skip_spaces(const char **pp)
|
||||
{
|
||||
const char *p;
|
||||
p = *pp;
|
||||
while (*p == ' ' || *p == '\t')
|
||||
p++;
|
||||
*pp = p;
|
||||
}
|
||||
|
||||
static void get_word(char *buf, int buf_size, const char **pp)
|
||||
{
|
||||
const char *p;
|
||||
char *q;
|
||||
|
||||
p = *pp;
|
||||
skip_spaces(&p);
|
||||
p += strspn(p, SPACE_CHARS);
|
||||
q = buf;
|
||||
while (!av_isspace(*p) && *p != '\0') {
|
||||
if ((q - buf) < buf_size - 1)
|
||||
@@ -1486,7 +1475,7 @@ static void compute_real_filename(char *filename, int max_size)
|
||||
p = strrchr(file1, '.');
|
||||
if (p)
|
||||
*p = '\0';
|
||||
for(stream = first_stream; stream != NULL; stream = stream->next) {
|
||||
for(stream = first_stream; stream; stream = stream->next) {
|
||||
av_strlcpy(file2, stream->filename, sizeof(file2));
|
||||
p = strrchr(file2, '.');
|
||||
if (p)
|
||||
@@ -1595,12 +1584,12 @@ static int http_parse_request(HTTPContext *c)
|
||||
av_strlcpy(filename, "index.html", sizeof(filename) - 1);
|
||||
|
||||
stream = first_stream;
|
||||
while (stream != NULL) {
|
||||
while (stream) {
|
||||
if (!strcmp(stream->filename, filename) && validate_acl(stream, c))
|
||||
break;
|
||||
stream = stream->next;
|
||||
}
|
||||
if (stream == NULL) {
|
||||
if (!stream) {
|
||||
snprintf(msg, sizeof(msg), "File '%s' not found", url);
|
||||
http_log("File '%s' not found\n", url);
|
||||
goto send_error;
|
||||
@@ -1974,7 +1963,7 @@ static void compute_status(HTTPContext *c)
|
||||
avio_printf(pb, "<table cellspacing=0 cellpadding=4>\n");
|
||||
avio_printf(pb, "<tr><th valign=top>Path<th align=left>Served<br>Conns<th><br>bytes<th valign=top>Format<th>Bit rate<br>kbits/s<th align=left>Video<br>kbits/s<th><br>Codec<th align=left>Audio<br>kbits/s<th><br>Codec<th align=left valign=top>Feed\n");
|
||||
stream = first_stream;
|
||||
while (stream != NULL) {
|
||||
while (stream) {
|
||||
char sfilename[1024];
|
||||
char *eosf;
|
||||
|
||||
@@ -2063,7 +2052,7 @@ static void compute_status(HTTPContext *c)
|
||||
avio_printf(pb, "</table>\n");
|
||||
|
||||
stream = first_stream;
|
||||
while (stream != NULL) {
|
||||
while (stream) {
|
||||
if (stream->feed == stream) {
|
||||
avio_printf(pb, "<h2>Feed %s</h2>", stream->filename);
|
||||
if (stream->pid) {
|
||||
@@ -2141,7 +2130,7 @@ static void compute_status(HTTPContext *c)
|
||||
avio_printf(pb, "<tr><th>#<th>File<th>IP<th>Proto<th>State<th>Target bits/sec<th>Actual bits/sec<th>Bytes transferred\n");
|
||||
c1 = first_http_ctx;
|
||||
i = 0;
|
||||
while (c1 != NULL) {
|
||||
while (c1) {
|
||||
int bitrate;
|
||||
int j;
|
||||
|
||||
@@ -2297,7 +2286,7 @@ static int http_prepare_data(HTTPContext *c)
|
||||
c->fmt_ctx = *ctx;
|
||||
av_freep(&ctx);
|
||||
av_dict_copy(&(c->fmt_ctx.metadata), c->stream->metadata, 0);
|
||||
c->fmt_ctx.streams = av_mallocz(sizeof(AVStream *) * c->stream->nb_streams);
|
||||
c->fmt_ctx.streams = av_mallocz_array(c->stream->nb_streams, sizeof(AVStream *));
|
||||
|
||||
for(i=0;i<c->stream->nb_streams;i++) {
|
||||
AVStream *src;
|
||||
@@ -2785,7 +2774,7 @@ static int http_receive_data(HTTPContext *c)
|
||||
}
|
||||
|
||||
/* wake up any waiting connections */
|
||||
for(c1 = first_http_ctx; c1 != NULL; c1 = c1->next) {
|
||||
for(c1 = first_http_ctx; c1; c1 = c1->next) {
|
||||
if (c1->state == HTTPSTATE_WAIT_FEED &&
|
||||
c1->stream->feed == c->stream->feed)
|
||||
c1->state = HTTPSTATE_SEND_DATA;
|
||||
@@ -2841,7 +2830,7 @@ static int http_receive_data(HTTPContext *c)
|
||||
c->stream->feed_opened = 0;
|
||||
close(c->feed_fd);
|
||||
/* wake up any waiting connections to stop waiting for feed */
|
||||
for(c1 = first_http_ctx; c1 != NULL; c1 = c1->next) {
|
||||
for(c1 = first_http_ctx; c1; c1 = c1->next) {
|
||||
if (c1->state == HTTPSTATE_WAIT_FEED &&
|
||||
c1->stream->feed == c->stream->feed)
|
||||
c1->state = HTTPSTATE_SEND_DATA_TRAILER;
|
||||
@@ -2977,8 +2966,10 @@ static int prepare_sdp_description(FFStream *stream, uint8_t **pbuffer,
|
||||
AVDictionaryEntry *entry = av_dict_get(stream->metadata, "title", NULL, 0);
|
||||
int i;
|
||||
|
||||
*pbuffer = NULL;
|
||||
|
||||
avc = avformat_alloc_context();
|
||||
if (avc == NULL || !rtp_format) {
|
||||
if (!avc || !rtp_format) {
|
||||
return -1;
|
||||
}
|
||||
avc->oformat = rtp_format;
|
||||
@@ -3013,7 +3004,7 @@ static int prepare_sdp_description(FFStream *stream, uint8_t **pbuffer,
|
||||
av_free(avc);
|
||||
av_free(avs);
|
||||
|
||||
return strlen(*pbuffer);
|
||||
return *pbuffer ? strlen(*pbuffer) : AVERROR(ENOMEM);
|
||||
}
|
||||
|
||||
static void rtsp_cmd_options(HTTPContext *c, const char *url)
|
||||
@@ -3041,7 +3032,7 @@ static void rtsp_cmd_describe(HTTPContext *c, const char *url)
|
||||
if (*path == '/')
|
||||
path++;
|
||||
|
||||
for(stream = first_stream; stream != NULL; stream = stream->next) {
|
||||
for(stream = first_stream; stream; stream = stream->next) {
|
||||
if (!stream->is_feed &&
|
||||
stream->fmt && !strcmp(stream->fmt->name, "rtp") &&
|
||||
!strcmp(path, stream->filename)) {
|
||||
@@ -3049,7 +3040,7 @@ static void rtsp_cmd_describe(HTTPContext *c, const char *url)
|
||||
}
|
||||
}
|
||||
/* no stream found */
|
||||
rtsp_reply_error(c, RTSP_STATUS_SERVICE); /* XXX: right error ? */
|
||||
rtsp_reply_error(c, RTSP_STATUS_NOT_FOUND);
|
||||
return;
|
||||
|
||||
found:
|
||||
@@ -3079,7 +3070,7 @@ static HTTPContext *find_rtp_session(const char *session_id)
|
||||
if (session_id[0] == '\0')
|
||||
return NULL;
|
||||
|
||||
for(c = first_http_ctx; c != NULL; c = c->next) {
|
||||
for(c = first_http_ctx; c; c = c->next) {
|
||||
if (!strcmp(c->session_id, session_id))
|
||||
return c;
|
||||
}
|
||||
@@ -3119,7 +3110,7 @@ static void rtsp_cmd_setup(HTTPContext *c, const char *url,
|
||||
path++;
|
||||
|
||||
/* now check each stream */
|
||||
for(stream = first_stream; stream != NULL; stream = stream->next) {
|
||||
for(stream = first_stream; stream; stream = stream->next) {
|
||||
if (!stream->is_feed &&
|
||||
stream->fmt && !strcmp(stream->fmt->name, "rtp")) {
|
||||
/* accept aggregate filenames only if single stream */
|
||||
@@ -3425,7 +3416,7 @@ static int rtp_new_av_stream(HTTPContext *c,
|
||||
if (!st)
|
||||
goto fail;
|
||||
ctx->nb_streams = 1;
|
||||
ctx->streams = av_mallocz(sizeof(AVStream *) * ctx->nb_streams);
|
||||
ctx->streams = av_mallocz_array(ctx->nb_streams, sizeof(AVStream *));
|
||||
if (!ctx->streams)
|
||||
goto fail;
|
||||
ctx->streams[0] = st;
|
||||
@@ -3580,7 +3571,7 @@ static void remove_stream(FFStream *stream)
|
||||
{
|
||||
FFStream **ps;
|
||||
ps = &first_stream;
|
||||
while (*ps != NULL) {
|
||||
while (*ps) {
|
||||
if (*ps == stream)
|
||||
*ps = (*ps)->next;
|
||||
else
|
||||
@@ -3646,7 +3637,7 @@ static void build_file_streams(void)
|
||||
int i, ret;
|
||||
|
||||
/* gather all streams */
|
||||
for(stream = first_stream; stream != NULL; stream = stream_next) {
|
||||
for(stream = first_stream; stream; stream = stream_next) {
|
||||
AVFormatContext *infile = NULL;
|
||||
stream_next = stream->next;
|
||||
if (stream->stream_type == STREAM_TYPE_LIVE &&
|
||||
@@ -3698,7 +3689,7 @@ static void build_feed_streams(void)
|
||||
int i;
|
||||
|
||||
/* gather all streams */
|
||||
for(stream = first_stream; stream != NULL; stream = stream->next) {
|
||||
for(stream = first_stream; stream; stream = stream->next) {
|
||||
feed = stream->feed;
|
||||
if (feed) {
|
||||
if (stream->is_feed) {
|
||||
@@ -3713,7 +3704,7 @@ static void build_feed_streams(void)
|
||||
}
|
||||
|
||||
/* create feed files if needed */
|
||||
for(feed = first_feed; feed != NULL; feed = feed->next_feed) {
|
||||
for(feed = first_feed; feed; feed = feed->next_feed) {
|
||||
int fd;
|
||||
|
||||
if (avio_check(feed->feed_filename, AVIO_FLAG_READ) > 0) {
|
||||
@@ -3845,7 +3836,7 @@ static void compute_bandwidth(void)
|
||||
int i;
|
||||
FFStream *stream;
|
||||
|
||||
for(stream = first_stream; stream != NULL; stream = stream->next) {
|
||||
for(stream = first_stream; stream; stream = stream->next) {
|
||||
bandwidth = 0;
|
||||
for(i=0;i<stream->nb_streams;i++) {
|
||||
AVStream *st = stream->streams[i];
|
||||
@@ -4079,14 +4070,20 @@ static int parse_ffconfig(const char *filename)
|
||||
|
||||
get_arg(cmd, sizeof(cmd), &p);
|
||||
|
||||
if (!av_strcasecmp(cmd, "Port")) {
|
||||
if (!av_strcasecmp(cmd, "Port") || !av_strcasecmp(cmd, "HTTPPort")) {
|
||||
if (!av_strcasecmp(cmd, "Port"))
|
||||
WARNING("Port option is deprecated, use HTTPPort instead\n");
|
||||
get_arg(arg, sizeof(arg), &p);
|
||||
val = atoi(arg);
|
||||
if (val < 1 || val > 65536) {
|
||||
ERROR("Invalid_port: %s\n", arg);
|
||||
ERROR("Invalid port: %s\n", arg);
|
||||
}
|
||||
if (val < 1024)
|
||||
WARNING("Trying to use IETF assigned system port: %d\n", val);
|
||||
my_http_addr.sin_port = htons(val);
|
||||
} else if (!av_strcasecmp(cmd, "BindAddress")) {
|
||||
} else if (!av_strcasecmp(cmd, "HTTPBindAddress") || !av_strcasecmp(cmd, "BindAddress")) {
|
||||
if (!av_strcasecmp(cmd, "BindAddress"))
|
||||
WARNING("BindAddress option is deprecated, use HTTPBindAddress instead\n");
|
||||
get_arg(arg, sizeof(arg), &p);
|
||||
if (resolve_host(&my_http_addr.sin_addr, arg) != 0) {
|
||||
ERROR("%s:%d: Invalid host/IP address: %s\n", arg);
|
||||
@@ -4292,7 +4289,7 @@ static int parse_ffconfig(const char *filename)
|
||||
FFStream *sfeed;
|
||||
|
||||
sfeed = first_feed;
|
||||
while (sfeed != NULL) {
|
||||
while (sfeed) {
|
||||
if (!strcmp(sfeed->filename, arg))
|
||||
break;
|
||||
sfeed = sfeed->next_feed;
|
||||
|
@@ -101,7 +101,7 @@ static int eightsvx_decode_frame(AVCodecContext *avctx, void *data,
|
||||
}
|
||||
if (avpkt->size < (hdr_size + 1) * avctx->channels) {
|
||||
av_log(avctx, AV_LOG_ERROR, "packet size is too small\n");
|
||||
return AVERROR(EINVAL);
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
esc->fib_acc[0] = avpkt->data[1] + 128;
|
||||
@@ -124,7 +124,7 @@ static int eightsvx_decode_frame(AVCodecContext *avctx, void *data,
|
||||
}
|
||||
if (!esc->data[0]) {
|
||||
av_log(avctx, AV_LOG_ERROR, "unexpected empty packet\n");
|
||||
return AVERROR(EINVAL);
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
/* decode next piece of data from the buffer */
|
||||
|
@@ -15,6 +15,7 @@ HEADERS = avcodec.h \
|
||||
|
||||
OBJS = allcodecs.o \
|
||||
audioconvert.o \
|
||||
avdct.o \
|
||||
avpacket.o \
|
||||
avpicture.o \
|
||||
bitstream.o \
|
||||
@@ -31,7 +32,7 @@ OBJS = allcodecs.o \
|
||||
resample2.o \
|
||||
utils.o \
|
||||
|
||||
# parts needed for many different codecs
|
||||
# subsystems
|
||||
OBJS-$(CONFIG_AANDCTTABLES) += aandcttab.o
|
||||
OBJS-$(CONFIG_AC3DSP) += ac3dsp.o
|
||||
OBJS-$(CONFIG_AUDIO_FRAME_QUEUE) += audio_frame_queue.o
|
||||
@@ -41,12 +42,11 @@ OBJS-$(CONFIG_BSWAPDSP) += bswapdsp.o
|
||||
OBJS-$(CONFIG_CABAC) += cabac.o
|
||||
OBJS-$(CONFIG_CRYSTALHD) += crystalhd.o
|
||||
OBJS-$(CONFIG_DCT) += dct.o dct32_fixed.o dct32_float.o
|
||||
OBJS-$(CONFIG_DSPUTIL) += dsputil.o
|
||||
OBJS-$(CONFIG_DXVA2) += dxva2.o
|
||||
OBJS-$(CONFIG_ERROR_RESILIENCE) += error_resilience.o
|
||||
OBJS-$(CONFIG_EXIF) += exif.o tiff_common.o
|
||||
OBJS-$(CONFIG_FDCTDSP) += fdctdsp.o faandct.o \
|
||||
jfdctfst.o jfdctint.o
|
||||
OBJS-$(CONFIG_FAANDCT) += faandct.o
|
||||
OBJS-$(CONFIG_FAANIDCT) += faanidct.o
|
||||
OBJS-$(CONFIG_FDCTDSP) += fdctdsp.o jfdctfst.o jfdctint.o
|
||||
FFT-OBJS-$(CONFIG_HARDCODED_TABLES) += cos_tables.o cos_fixed_tables.o
|
||||
OBJS-$(CONFIG_FFT) += avfft.o fft_fixed.o fft_float.o \
|
||||
fft_fixed_32.o fft_init_table.o \
|
||||
@@ -54,15 +54,15 @@ OBJS-$(CONFIG_FFT) += avfft.o fft_fixed.o fft_float.o \
|
||||
OBJS-$(CONFIG_GOLOMB) += golomb.o
|
||||
OBJS-$(CONFIG_H263DSP) += h263dsp.o
|
||||
OBJS-$(CONFIG_H264CHROMA) += h264chroma.o
|
||||
OBJS-$(CONFIG_H264DSP) += h264dsp.o h264idct.o startcode.o
|
||||
OBJS-$(CONFIG_H264DSP) += h264dsp.o h264idct.o
|
||||
OBJS-$(CONFIG_H264PRED) += h264pred.o
|
||||
OBJS-$(CONFIG_H264QPEL) += h264qpel.o
|
||||
OBJS-$(CONFIG_HPELDSP) += hpeldsp.o
|
||||
OBJS-$(CONFIG_HUFFMAN) += huffman.o
|
||||
OBJS-$(CONFIG_HUFFYUVDSP) += huffyuvdsp.o
|
||||
OBJS-$(CONFIG_HUFFYUVENCDSP) += huffyuvencdsp.o
|
||||
OBJS-$(CONFIG_IDCTDSP) += idctdsp.o faanidct.o \
|
||||
simple_idct.o jrevdct.o
|
||||
OBJS-$(CONFIG_IDCTDSP) += idctdsp.o simple_idct.o jrevdct.o
|
||||
OBJS-$(CONFIG_IIRFILTER) += iirfilter.o
|
||||
OBJS-$(CONFIG_INTRAX8) += intrax8.o intrax8dsp.o
|
||||
OBJS-$(CONFIG_LIBXVID) += libxvid_rc.o
|
||||
OBJS-$(CONFIG_LLAUDDSP) += lossless_audiodsp.o
|
||||
@@ -70,6 +70,7 @@ OBJS-$(CONFIG_LLVIDDSP) += lossless_videodsp.o
|
||||
OBJS-$(CONFIG_LPC) += lpc.o
|
||||
OBJS-$(CONFIG_LSP) += lsp.o
|
||||
OBJS-$(CONFIG_MDCT) += mdct_fixed.o mdct_float.o mdct_fixed_32.o
|
||||
OBJS-$(CONFIG_ME_CMP) += me_cmp.o dsputil_compat.o
|
||||
OBJS-$(CONFIG_MPEG_ER) += mpeg_er.o
|
||||
OBJS-$(CONFIG_MPEGAUDIO) += mpegaudio.o mpegaudiodata.o \
|
||||
mpegaudiodecheader.o
|
||||
@@ -89,12 +90,11 @@ RDFT-OBJS-$(CONFIG_HARDCODED_TABLES) += sin_tables.o
|
||||
OBJS-$(CONFIG_RDFT) += rdft.o $(RDFT-OBJS-yes)
|
||||
OBJS-$(CONFIG_SHARED) += log2_tab.o
|
||||
OBJS-$(CONFIG_SINEWIN) += sinewin.o
|
||||
OBJS-$(CONFIG_STARTCODE) += startcode.o
|
||||
OBJS-$(CONFIG_TPELDSP) += tpeldsp.o
|
||||
OBJS-$(CONFIG_VAAPI) += vaapi.o
|
||||
OBJS-$(CONFIG_VDA) += vda.o
|
||||
OBJS-$(CONFIG_VDPAU) += vdpau.o
|
||||
OBJS-$(CONFIG_VIDEODSP) += videodsp.o
|
||||
OBJS-$(CONFIG_VP3DSP) += vp3dsp.o
|
||||
OBJS-$(CONFIG_WMA_FREQS) += wma_freqs.o
|
||||
|
||||
# decoders/encoders
|
||||
OBJS-$(CONFIG_ZERO12V_DECODER) += 012v.o
|
||||
@@ -105,8 +105,7 @@ OBJS-$(CONFIG_AAC_DECODER) += aacdec.o aactab.o aacsbr.o aacps.o \
|
||||
sbrdsp.o aacpsdsp.o
|
||||
OBJS-$(CONFIG_AAC_ENCODER) += aacenc.o aaccoder.o \
|
||||
aacpsy.o aactab.o \
|
||||
psymodel.o iirfilter.o \
|
||||
mpeg4audio.o kbdwin.o
|
||||
psymodel.o mpeg4audio.o kbdwin.o
|
||||
OBJS-$(CONFIG_AASC_DECODER) += aasc.o msrledec.o
|
||||
OBJS-$(CONFIG_AC3_DECODER) += ac3dec_float.o ac3dec_data.o ac3.o kbdwin.o
|
||||
OBJS-$(CONFIG_AC3_FIXED_DECODER) += ac3dec_fixed.o ac3dec_data.o ac3.o kbdwin.o
|
||||
@@ -159,8 +158,8 @@ OBJS-$(CONFIG_AYUV_ENCODER) += v408enc.o
|
||||
OBJS-$(CONFIG_BETHSOFTVID_DECODER) += bethsoftvideo.o
|
||||
OBJS-$(CONFIG_BFI_DECODER) += bfi.o
|
||||
OBJS-$(CONFIG_BINK_DECODER) += bink.o binkdsp.o
|
||||
OBJS-$(CONFIG_BINKAUDIO_DCT_DECODER) += binkaudio.o wma.o wma_common.o
|
||||
OBJS-$(CONFIG_BINKAUDIO_RDFT_DECODER) += binkaudio.o wma.o wma_common.o
|
||||
OBJS-$(CONFIG_BINKAUDIO_DCT_DECODER) += binkaudio.o
|
||||
OBJS-$(CONFIG_BINKAUDIO_RDFT_DECODER) += binkaudio.o
|
||||
OBJS-$(CONFIG_BINTEXT_DECODER) += bintext.o cga_data.o
|
||||
OBJS-$(CONFIG_BMP_DECODER) += bmp.o msrledec.o
|
||||
OBJS-$(CONFIG_BMP_ENCODER) += bmpenc.o
|
||||
@@ -318,12 +317,12 @@ OBJS-$(CONFIG_MP3ON4_DECODER) += mpegaudiodec_fixed.o mpeg4audio.o
|
||||
OBJS-$(CONFIG_MP3ON4FLOAT_DECODER) += mpegaudiodec_float.o mpeg4audio.o
|
||||
OBJS-$(CONFIG_MPC7_DECODER) += mpc7.o mpc.o
|
||||
OBJS-$(CONFIG_MPC8_DECODER) += mpc8.o mpc.o
|
||||
OBJS-$(CONFIG_MPEGVIDEO_DECODER) += mpeg12.o mpeg12data.o \
|
||||
mpegvideo.o error_resilience.o
|
||||
OBJS-$(CONFIG_MPEGVIDEO_DECODER) += mpeg12dec.o mpeg12.o mpeg12data.o
|
||||
OBJS-$(CONFIG_MPEG1VIDEO_DECODER) += mpeg12dec.o mpeg12.o mpeg12data.o
|
||||
OBJS-$(CONFIG_MPEG1VIDEO_ENCODER) += mpeg12enc.o mpeg12.o
|
||||
OBJS-$(CONFIG_MPEG2VIDEO_DECODER) += mpeg12dec.o mpeg12.o mpeg12data.o
|
||||
OBJS-$(CONFIG_MPEG2VIDEO_ENCODER) += mpeg12enc.o mpeg12.o
|
||||
OBJS-$(CONFIG_MPEG4_DECODER) += xvididct.o
|
||||
OBJS-$(CONFIG_MPL2_DECODER) += mpl2dec.o ass.o
|
||||
OBJS-$(CONFIG_MSMPEG4V1_DECODER) += msmpeg4dec.o msmpeg4.o msmpeg4data.o
|
||||
OBJS-$(CONFIG_MSMPEG4V2_DECODER) += msmpeg4dec.o msmpeg4.o msmpeg4data.o
|
||||
@@ -476,7 +475,7 @@ OBJS-$(CONFIG_VB_DECODER) += vb.o
|
||||
OBJS-$(CONFIG_VBLE_DECODER) += vble.o
|
||||
OBJS-$(CONFIG_VC1_DECODER) += vc1dec.o vc1.o vc1data.o vc1dsp.o \
|
||||
msmpeg4dec.o msmpeg4.o msmpeg4data.o \
|
||||
wmv2dsp.o startcode.o
|
||||
wmv2dsp.o
|
||||
OBJS-$(CONFIG_VCR1_DECODER) += vcr1.o
|
||||
OBJS-$(CONFIG_VMDAUDIO_DECODER) += vmdaudio.o
|
||||
OBJS-$(CONFIG_VMDVIDEO_DECODER) += vmdvideo.o
|
||||
@@ -499,7 +498,7 @@ OBJS-$(CONFIG_WAVPACK_DECODER) += wavpack.o
|
||||
OBJS-$(CONFIG_WAVPACK_ENCODER) += wavpackenc.o
|
||||
OBJS-$(CONFIG_WEBP_DECODER) += vp8.o vp8dsp.o vp56rac.o
|
||||
OBJS-$(CONFIG_WEBP_DECODER) += webp.o exif.o tiff_common.o
|
||||
OBJS-$(CONFIG_WEBVTT_DECODER) += webvttdec.o
|
||||
OBJS-$(CONFIG_WEBVTT_DECODER) += webvttdec.o ass.o
|
||||
OBJS-$(CONFIG_WEBVTT_ENCODER) += webvttenc.o ass_split.o
|
||||
OBJS-$(CONFIG_WMALOSSLESS_DECODER) += wmalosslessdec.o wma_common.o
|
||||
OBJS-$(CONFIG_WMAPRO_DECODER) += wmaprodec.o wma.o wma_common.o
|
||||
@@ -647,6 +646,11 @@ OBJS-$(CONFIG_ADPCM_YAMAHA_ENCODER) += adpcmenc.o adpcm_data.o
|
||||
OBJS-$(CONFIG_VIMA_DECODER) += vima.o adpcm_data.o
|
||||
|
||||
# hardware accelerators
|
||||
OBJS-$(CONFIG_DXVA2) += dxva2.o
|
||||
OBJS-$(CONFIG_VAAPI) += vaapi.o
|
||||
OBJS-$(CONFIG_VDA) += vda.o
|
||||
OBJS-$(CONFIG_VDPAU) += vdpau.o
|
||||
|
||||
OBJS-$(CONFIG_H263_VAAPI_HWACCEL) += vaapi_mpeg4.o vaapi_mpeg.o
|
||||
OBJS-$(CONFIG_H263_VDPAU_HWACCEL) += vdpau_mpeg4.o
|
||||
OBJS-$(CONFIG_H264_DXVA2_HWACCEL) += dxva2_h264.o
|
||||
@@ -705,6 +709,7 @@ OBJS-$(CONFIG_TAK_DEMUXER) += tak.o
|
||||
OBJS-$(CONFIG_WEBM_MUXER) += mpeg4audio.o mpegaudiodata.o \
|
||||
xiph.o flac.o flacdata.o \
|
||||
vorbis_data.o
|
||||
OBJS-$(CONFIG_WEBM_DASH_MANIFEST_DEMUXER) += vorbis_parser.o xiph.o
|
||||
OBJS-$(CONFIG_WTV_DEMUXER) += mpeg4audio.o mpegaudiodata.o
|
||||
|
||||
# libavfilter dependencies
|
||||
@@ -716,10 +721,10 @@ OBJS-$(CONFIG_LIBCELT_DECODER) += libcelt_dec.o
|
||||
OBJS-$(CONFIG_LIBFAAC_ENCODER) += libfaac.o
|
||||
OBJS-$(CONFIG_LIBFDK_AAC_DECODER) += libfdk-aacdec.o
|
||||
OBJS-$(CONFIG_LIBFDK_AAC_ENCODER) += libfdk-aacenc.o
|
||||
OBJS-$(CONFIG_LIBGSM_DECODER) += libgsm.o
|
||||
OBJS-$(CONFIG_LIBGSM_ENCODER) += libgsm.o
|
||||
OBJS-$(CONFIG_LIBGSM_MS_DECODER) += libgsm.o
|
||||
OBJS-$(CONFIG_LIBGSM_MS_ENCODER) += libgsm.o
|
||||
OBJS-$(CONFIG_LIBGSM_DECODER) += libgsmdec.o
|
||||
OBJS-$(CONFIG_LIBGSM_ENCODER) += libgsmenc.o
|
||||
OBJS-$(CONFIG_LIBGSM_MS_DECODER) += libgsmdec.o
|
||||
OBJS-$(CONFIG_LIBGSM_MS_ENCODER) += libgsmenc.o
|
||||
OBJS-$(CONFIG_LIBILBC_DECODER) += libilbc.o
|
||||
OBJS-$(CONFIG_LIBILBC_ENCODER) += libilbc.o
|
||||
OBJS-$(CONFIG_LIBMP3LAME_ENCODER) += libmp3lame.o mpegaudiodecheader.o
|
||||
@@ -803,7 +808,7 @@ OBJS-$(CONFIG_RV40_PARSER) += rv34_parser.o
|
||||
OBJS-$(CONFIG_TAK_PARSER) += tak_parser.o tak.o
|
||||
OBJS-$(CONFIG_VC1_PARSER) += vc1_parser.o vc1.o vc1data.o vc1dsp.o \
|
||||
msmpeg4.o msmpeg4data.o mpeg4video.o \
|
||||
h263.o startcode.o
|
||||
h263.o
|
||||
OBJS-$(CONFIG_VORBIS_PARSER) += vorbis_parser.o xiph.o
|
||||
OBJS-$(CONFIG_VP3_PARSER) += vp3_parser.o
|
||||
OBJS-$(CONFIG_VP8_PARSER) += vp8_parser.o
|
||||
@@ -851,24 +856,25 @@ SKIPHEADERS-$(CONFIG_VAAPI) += vaapi_internal.h
|
||||
SKIPHEADERS-$(CONFIG_VDA) += vda.h vda_internal.h
|
||||
SKIPHEADERS-$(CONFIG_VDPAU) += vdpau.h vdpau_internal.h
|
||||
|
||||
TESTPROGS = cabac \
|
||||
fft \
|
||||
fft-fixed \
|
||||
fft-fixed32 \
|
||||
golomb \
|
||||
iirfilter \
|
||||
imgconvert \
|
||||
rangecoder \
|
||||
snowenc \
|
||||
TESTPROGS = imgconvert \
|
||||
|
||||
TESTPROGS-$(CONFIG_CABAC) += cabac
|
||||
TESTPROGS-$(CONFIG_FFT) += fft fft-fixed fft-fixed32
|
||||
TESTPROGS-$(CONFIG_IDCTDSP) += dct
|
||||
TESTPROGS-$(CONFIG_IIRFILTER) += iirfilter
|
||||
TESTPROGS-$(HAVE_MMX) += motion
|
||||
TESTPROGS-$(CONFIG_GOLOMB) += golomb
|
||||
TESTPROGS-$(CONFIG_RANGECODER) += rangecoder
|
||||
TESTPROGS-$(CONFIG_SNOW_ENCODER) += snowenc
|
||||
|
||||
TESTPROGS-$(CONFIG_DCT) += dct
|
||||
TESTPROGS-$(HAVE_MMX) += motion
|
||||
TESTOBJS = dctref.o
|
||||
|
||||
TOOLS = fourcc2pixfmt
|
||||
|
||||
HOSTPROGS = aac_tablegen \
|
||||
aacps_tablegen \
|
||||
aacsbr_tablegen \
|
||||
cabac_tablegen \
|
||||
cbrt_tablegen \
|
||||
cos_tablegen \
|
||||
dsd_tablegen \
|
||||
@@ -896,7 +902,7 @@ else
|
||||
$(SUBDIR)%_tablegen$(HOSTEXESUF): HOSTCFLAGS += -DCONFIG_SMALL=0
|
||||
endif
|
||||
|
||||
GEN_HEADERS = cbrt_tables.h aacps_tables.h aac_tables.h dsd_tables.h dv_tables.h \
|
||||
GEN_HEADERS = cabac_tables.h cbrt_tables.h aacps_tables.h aacsbr_tables.h aac_tables.h dsd_tables.h dv_tables.h \
|
||||
sinewin_tables.h mpegaudio_tables.h motionpixels_tables.h \
|
||||
pcm_tables.h qdm2_tables.h
|
||||
GEN_HEADERS := $(addprefix $(SUBDIR), $(GEN_HEADERS))
|
||||
@@ -907,7 +913,9 @@ $(GEN_HEADERS): $(SUBDIR)%_tables.h: $(SUBDIR)%_tablegen$(HOSTEXESUF)
|
||||
ifdef CONFIG_HARDCODED_TABLES
|
||||
$(SUBDIR)aacdec.o: $(SUBDIR)cbrt_tables.h
|
||||
$(SUBDIR)aacps.o: $(SUBDIR)aacps_tables.h
|
||||
$(SUBDIR)aacsbr.o: $(SUBDIR)aacsbr_tables.h
|
||||
$(SUBDIR)aactab.o: $(SUBDIR)aac_tables.h
|
||||
$(SUBDIR)cabac.o: $(SUBDIR)cabac_tables.h
|
||||
$(SUBDIR)dsddec.o: $(SUBDIR)dsd_tables.h
|
||||
$(SUBDIR)dvenc.o: $(SUBDIR)dv_tables.h
|
||||
$(SUBDIR)sinewin.o: $(SUBDIR)sinewin_tables.h
|
||||
|
@@ -187,11 +187,11 @@ static av_cold int a64multi_close_encoder(AVCodecContext *avctx)
|
||||
{
|
||||
A64Context *c = avctx->priv_data;
|
||||
av_frame_free(&avctx->coded_frame);
|
||||
av_free(c->mc_meta_charset);
|
||||
av_free(c->mc_best_cb);
|
||||
av_free(c->mc_charset);
|
||||
av_free(c->mc_charmap);
|
||||
av_free(c->mc_colram);
|
||||
av_freep(&c->mc_meta_charset);
|
||||
av_freep(&c->mc_best_cb);
|
||||
av_freep(&c->mc_charset);
|
||||
av_freep(&c->mc_charmap);
|
||||
av_freep(&c->mc_colram);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -351,7 +351,6 @@ static int a64multi_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
|
||||
|
||||
/* advance pointers */
|
||||
buf += charset_size;
|
||||
charset += charset_size;
|
||||
}
|
||||
|
||||
/* write x frames to buf */
|
||||
|
@@ -57,7 +57,7 @@ static int aac_adtstoasc_filter(AVBitStreamFilterContext *bsfc,
|
||||
|
||||
if (avpriv_aac_parse_header(&gb, &hdr) < 0) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Error parsing ADTS frame header!\n");
|
||||
return -1;
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
if (!hdr.crc_absent && hdr.num_aac_frames > 1) {
|
||||
|
@@ -34,7 +34,7 @@ static int aac_sync(uint64_t state, AACAC3ParseContext *hdr_info,
|
||||
int size;
|
||||
union {
|
||||
uint64_t u64;
|
||||
uint8_t u8[8];
|
||||
uint8_t u8[8 + FF_INPUT_BUFFER_PADDING_SIZE];
|
||||
} tmp;
|
||||
|
||||
tmp.u64 = av_be2ne64(state);
|
||||
|
@@ -31,7 +31,7 @@
|
||||
#include "libavutil/mathematics.h"
|
||||
float ff_aac_pow2sf_tab[428];
|
||||
|
||||
void ff_aac_tableinit(void)
|
||||
av_cold void ff_aac_tableinit(void)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < 428; i++)
|
||||
|
@@ -53,7 +53,7 @@ static const uint8_t run_value_bits_short[16] = {
|
||||
3, 3, 3, 3, 3, 3, 3, 6, 6, 6, 6, 6, 6, 6, 6, 9
|
||||
};
|
||||
|
||||
static const uint8_t *run_value_bits[2] = {
|
||||
static const uint8_t * const run_value_bits[2] = {
|
||||
run_value_bits_long, run_value_bits_short
|
||||
};
|
||||
|
||||
@@ -776,7 +776,6 @@ static void search_for_quantizers_twoloop(AVCodecContext *avctx,
|
||||
do {
|
||||
int prev = -1;
|
||||
tbits = 0;
|
||||
fflag = 0;
|
||||
for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
|
||||
start = w*128;
|
||||
for (g = 0; g < sce->ics.num_swb; g++) {
|
||||
@@ -953,7 +952,6 @@ static void search_for_quantizers_faac(AVCodecContext *avctx, AACEncContext *s,
|
||||
}
|
||||
sce->zeroes[w*16+g] = 0;
|
||||
scf = prev_scf = av_clip(SCALE_ONE_POS - SCALE_DIV_512 - log2f(1/maxq[w*16+g])*16/3, 60, 218);
|
||||
step = 16;
|
||||
for (;;) {
|
||||
float dist = 0.0f;
|
||||
int quant_max;
|
||||
|
@@ -705,8 +705,8 @@ static av_cold int dsp_init(AVCodecContext *avctx, AACEncContext *s)
|
||||
static av_cold int alloc_buffers(AVCodecContext *avctx, AACEncContext *s)
|
||||
{
|
||||
int ch;
|
||||
FF_ALLOCZ_OR_GOTO(avctx, s->buffer.samples, 3 * 1024 * s->channels * sizeof(s->buffer.samples[0]), alloc_fail);
|
||||
FF_ALLOCZ_OR_GOTO(avctx, s->cpe, sizeof(ChannelElement) * s->chan_map[0], alloc_fail);
|
||||
FF_ALLOCZ_ARRAY_OR_GOTO(avctx, s->buffer.samples, s->channels, 3 * 1024 * sizeof(s->buffer.samples[0]), alloc_fail);
|
||||
FF_ALLOCZ_ARRAY_OR_GOTO(avctx, s->cpe, s->chan_map[0], sizeof(ChannelElement), alloc_fail);
|
||||
FF_ALLOCZ_OR_GOTO(avctx, avctx->extradata, 5 + FF_INPUT_BUFFER_PADDING_SIZE, alloc_fail);
|
||||
|
||||
for(ch = 0; ch < s->channels; ch++)
|
||||
|
@@ -82,7 +82,7 @@ int main(void)
|
||||
write_float_3d_array(f34_2_4, 4, 8, 2);
|
||||
printf("};\n");
|
||||
|
||||
printf("static TABLE_CONST DECLARE_ALIGNED(16, float, Q_fract_allpass)[2][50][3][2] = {\n");
|
||||
printf("static const DECLARE_ALIGNED(16, float, Q_fract_allpass)[2][50][3][2] = {\n");
|
||||
write_float_4d_array(Q_fract_allpass, 2, 50, 3, 2);
|
||||
printf("};\n");
|
||||
printf("static const DECLARE_ALIGNED(16, float, phi_fract)[2][50][2] = {\n");
|
||||
|
@@ -70,7 +70,7 @@ static const float g2_Q4[] = {
|
||||
0.16486303567403f, 0.23279856662996f, 0.25f
|
||||
};
|
||||
|
||||
static void make_filters_from_proto(float (*filter)[8][2], const float *proto, int bands)
|
||||
static av_cold void make_filters_from_proto(float (*filter)[8][2], const float *proto, int bands)
|
||||
{
|
||||
int q, n;
|
||||
for (q = 0; q < bands; q++) {
|
||||
@@ -82,7 +82,7 @@ static void make_filters_from_proto(float (*filter)[8][2], const float *proto, i
|
||||
}
|
||||
}
|
||||
|
||||
static void ps_tableinit(void)
|
||||
static av_cold void ps_tableinit(void)
|
||||
{
|
||||
static const float ipdopd_sin[] = { 0, M_SQRT1_2, 1, M_SQRT1_2, 0, -M_SQRT1_2, -1, -M_SQRT1_2 };
|
||||
static const float ipdopd_cos[] = { 1, M_SQRT1_2, 0, -M_SQRT1_2, -1, -M_SQRT1_2, 0, M_SQRT1_2 };
|
||||
|
@@ -30,6 +30,7 @@
|
||||
#include "sbr.h"
|
||||
#include "aacsbr.h"
|
||||
#include "aacsbrdata.h"
|
||||
#include "aacsbr_tablegen.h"
|
||||
#include "fft.h"
|
||||
#include "aacps.h"
|
||||
#include "sbrdsp.h"
|
||||
@@ -95,7 +96,6 @@ static void aacsbr_func_ptr_init(AACSBRContext *c);
|
||||
|
||||
av_cold void ff_aac_sbr_init(void)
|
||||
{
|
||||
int n;
|
||||
static const struct {
|
||||
const void *sbr_codes, *sbr_bits;
|
||||
const unsigned int table_size, elem_size;
|
||||
@@ -124,13 +124,7 @@ av_cold void ff_aac_sbr_init(void)
|
||||
SBR_INIT_VLC_STATIC(8, 592);
|
||||
SBR_INIT_VLC_STATIC(9, 512);
|
||||
|
||||
for (n = 1; n < 320; n++)
|
||||
sbr_qmf_window_us[320 + n] = sbr_qmf_window_us[320 - n];
|
||||
sbr_qmf_window_us[384] = -sbr_qmf_window_us[384];
|
||||
sbr_qmf_window_us[512] = -sbr_qmf_window_us[512];
|
||||
|
||||
for (n = 0; n < 320; n++)
|
||||
sbr_qmf_window_ds[n] = sbr_qmf_window_us[2*n];
|
||||
aacsbr_tableinit();
|
||||
|
||||
ff_ps_init();
|
||||
}
|
||||
|
39
libavcodec/aacsbr_tablegen.c
Normal file
39
libavcodec/aacsbr_tablegen.c
Normal file
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
* Header file for hardcoded AAC SBR windows
|
||||
*
|
||||
* Copyright (c) 2014 Reimar Döffinger <Reimar.Doeffinger@gmx.de>
|
||||
*
|
||||
* This file is part of FFmpeg.
|
||||
*
|
||||
* FFmpeg is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* FFmpeg is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with FFmpeg; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#define CONFIG_HARDCODED_TABLES 0
|
||||
#include "libavutil/common.h"
|
||||
#include "aacsbr_tablegen.h"
|
||||
#include "tableprint.h"
|
||||
|
||||
int main(void)
|
||||
{
|
||||
aacsbr_tableinit();
|
||||
|
||||
write_fileheader();
|
||||
|
||||
WRITE_ARRAY_ALIGNED("static const", 32, float, sbr_qmf_window_ds);
|
||||
WRITE_ARRAY_ALIGNED("static const", 32, float, sbr_qmf_window_us);
|
||||
|
||||
return 0;
|
||||
}
|
129
libavcodec/aacsbr_tablegen.h
Normal file
129
libavcodec/aacsbr_tablegen.h
Normal file
@@ -0,0 +1,129 @@
|
||||
/*
|
||||
* Header file for hardcoded AAC SBR windows
|
||||
*
|
||||
* Copyright (c) 2014 Reimar Döffinger <Reimar.Doeffinger@gmx.de>
|
||||
*
|
||||
* This file is part of FFmpeg.
|
||||
*
|
||||
* FFmpeg is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* FFmpeg is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with FFmpeg; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_AACSBR_TABLEGEN_H
|
||||
#define AVCODEC_AACSBR_TABLEGEN_H
|
||||
|
||||
#if CONFIG_HARDCODED_TABLES
|
||||
#define aacsbr_tableinit()
|
||||
#include "libavcodec/aacsbr_tables.h"
|
||||
#else
|
||||
///< window coefficients for analysis/synthesis QMF banks
|
||||
static DECLARE_ALIGNED(32, float, sbr_qmf_window_ds)[320];
|
||||
static DECLARE_ALIGNED(32, float, sbr_qmf_window_us)[640] = {
|
||||
0.0000000000, -0.0005525286, -0.0005617692, -0.0004947518,
|
||||
-0.0004875227, -0.0004893791, -0.0005040714, -0.0005226564,
|
||||
-0.0005466565, -0.0005677802, -0.0005870930, -0.0006132747,
|
||||
-0.0006312493, -0.0006540333, -0.0006777690, -0.0006941614,
|
||||
-0.0007157736, -0.0007255043, -0.0007440941, -0.0007490598,
|
||||
-0.0007681371, -0.0007724848, -0.0007834332, -0.0007779869,
|
||||
-0.0007803664, -0.0007801449, -0.0007757977, -0.0007630793,
|
||||
-0.0007530001, -0.0007319357, -0.0007215391, -0.0006917937,
|
||||
-0.0006650415, -0.0006341594, -0.0005946118, -0.0005564576,
|
||||
-0.0005145572, -0.0004606325, -0.0004095121, -0.0003501175,
|
||||
-0.0002896981, -0.0002098337, -0.0001446380, -0.0000617334,
|
||||
0.0000134949, 0.0001094383, 0.0002043017, 0.0002949531,
|
||||
0.0004026540, 0.0005107388, 0.0006239376, 0.0007458025,
|
||||
0.0008608443, 0.0009885988, 0.0011250155, 0.0012577884,
|
||||
0.0013902494, 0.0015443219, 0.0016868083, 0.0018348265,
|
||||
0.0019841140, 0.0021461583, 0.0023017254, 0.0024625616,
|
||||
0.0026201758, 0.0027870464, 0.0029469447, 0.0031125420,
|
||||
0.0032739613, 0.0034418874, 0.0036008268, 0.0037603922,
|
||||
0.0039207432, 0.0040819753, 0.0042264269, 0.0043730719,
|
||||
0.0045209852, 0.0046606460, 0.0047932560, 0.0049137603,
|
||||
0.0050393022, 0.0051407353, 0.0052461166, 0.0053471681,
|
||||
0.0054196775, 0.0054876040, 0.0055475714, 0.0055938023,
|
||||
0.0056220643, 0.0056455196, 0.0056389199, 0.0056266114,
|
||||
0.0055917128, 0.0055404363, 0.0054753783, 0.0053838975,
|
||||
0.0052715758, 0.0051382275, 0.0049839687, 0.0048109469,
|
||||
0.0046039530, 0.0043801861, 0.0041251642, 0.0038456408,
|
||||
0.0035401246, 0.0032091885, 0.0028446757, 0.0024508540,
|
||||
0.0020274176, 0.0015784682, 0.0010902329, 0.0005832264,
|
||||
0.0000276045, -0.0005464280, -0.0011568135, -0.0018039472,
|
||||
-0.0024826723, -0.0031933778, -0.0039401124, -0.0047222596,
|
||||
-0.0055337211, -0.0063792293, -0.0072615816, -0.0081798233,
|
||||
-0.0091325329, -0.0101150215, -0.0111315548, -0.0121849995,
|
||||
0.0132718220, 0.0143904666, 0.0155405553, 0.0167324712,
|
||||
0.0179433381, 0.0191872431, 0.0204531793, 0.0217467550,
|
||||
0.0230680169, 0.0244160992, 0.0257875847, 0.0271859429,
|
||||
0.0286072173, 0.0300502657, 0.0315017608, 0.0329754081,
|
||||
0.0344620948, 0.0359697560, 0.0374812850, 0.0390053679,
|
||||
0.0405349170, 0.0420649094, 0.0436097542, 0.0451488405,
|
||||
0.0466843027, 0.0482165720, 0.0497385755, 0.0512556155,
|
||||
0.0527630746, 0.0542452768, 0.0557173648, 0.0571616450,
|
||||
0.0585915683, 0.0599837480, 0.0613455171, 0.0626857808,
|
||||
0.0639715898, 0.0652247106, 0.0664367512, 0.0676075985,
|
||||
0.0687043828, 0.0697630244, 0.0707628710, 0.0717002673,
|
||||
0.0725682583, 0.0733620255, 0.0741003642, 0.0747452558,
|
||||
0.0753137336, 0.0758008358, 0.0761992479, 0.0764992170,
|
||||
0.0767093490, 0.0768173975, 0.0768230011, 0.0767204924,
|
||||
0.0765050718, 0.0761748321, 0.0757305756, 0.0751576255,
|
||||
0.0744664394, 0.0736406005, 0.0726774642, 0.0715826364,
|
||||
0.0703533073, 0.0689664013, 0.0674525021, 0.0657690668,
|
||||
0.0639444805, 0.0619602779, 0.0598166570, 0.0575152691,
|
||||
0.0550460034, 0.0524093821, 0.0495978676, 0.0466303305,
|
||||
0.0434768782, 0.0401458278, 0.0366418116, 0.0329583930,
|
||||
0.0290824006, 0.0250307561, 0.0207997072, 0.0163701258,
|
||||
0.0117623832, 0.0069636862, 0.0019765601, -0.0032086896,
|
||||
-0.0085711749, -0.0141288827, -0.0198834129, -0.0258227288,
|
||||
-0.0319531274, -0.0382776572, -0.0447806821, -0.0514804176,
|
||||
-0.0583705326, -0.0654409853, -0.0726943300, -0.0801372934,
|
||||
-0.0877547536, -0.0955533352, -0.1035329531, -0.1116826931,
|
||||
-0.1200077984, -0.1285002850, -0.1371551761, -0.1459766491,
|
||||
-0.1549607071, -0.1640958855, -0.1733808172, -0.1828172548,
|
||||
-0.1923966745, -0.2021250176, -0.2119735853, -0.2219652696,
|
||||
-0.2320690870, -0.2423016884, -0.2526480309, -0.2631053299,
|
||||
-0.2736634040, -0.2843214189, -0.2950716717, -0.3059098575,
|
||||
-0.3168278913, -0.3278113727, -0.3388722693, -0.3499914122,
|
||||
0.3611589903, 0.3723795546, 0.3836350013, 0.3949211761,
|
||||
0.4062317676, 0.4175696896, 0.4289119920, 0.4402553754,
|
||||
0.4515996535, 0.4629308085, 0.4742453214, 0.4855253091,
|
||||
0.4967708254, 0.5079817500, 0.5191234970, 0.5302240895,
|
||||
0.5412553448, 0.5522051258, 0.5630789140, 0.5738524131,
|
||||
0.5845403235, 0.5951123086, 0.6055783538, 0.6159109932,
|
||||
0.6261242695, 0.6361980107, 0.6461269695, 0.6559016302,
|
||||
0.6655139880, 0.6749663190, 0.6842353293, 0.6933282376,
|
||||
0.7022388719, 0.7109410426, 0.7194462634, 0.7277448900,
|
||||
0.7358211758, 0.7436827863, 0.7513137456, 0.7587080760,
|
||||
0.7658674865, 0.7727780881, 0.7794287519, 0.7858353120,
|
||||
0.7919735841, 0.7978466413, 0.8034485751, 0.8087695004,
|
||||
0.8138191270, 0.8185776004, 0.8230419890, 0.8272275347,
|
||||
0.8311038457, 0.8346937361, 0.8379717337, 0.8409541392,
|
||||
0.8436238281, 0.8459818469, 0.8480315777, 0.8497805198,
|
||||
0.8511971524, 0.8523047035, 0.8531020949, 0.8535720573,
|
||||
0.8537385600,
|
||||
};
|
||||
|
||||
static av_cold void aacsbr_tableinit(void)
|
||||
{
|
||||
int n;
|
||||
for (n = 1; n < 320; n++)
|
||||
sbr_qmf_window_us[320 + n] = sbr_qmf_window_us[320 - n];
|
||||
sbr_qmf_window_us[384] = -sbr_qmf_window_us[384];
|
||||
sbr_qmf_window_us[512] = -sbr_qmf_window_us[512];
|
||||
|
||||
for (n = 0; n < 320; n++)
|
||||
sbr_qmf_window_ds[n] = sbr_qmf_window_us[2*n];
|
||||
}
|
||||
#endif /* CONFIG_HARDCODED_TABLES */
|
||||
|
||||
#endif /* AVCODEC_AACSBR_TABLEGEN_H */
|
@@ -266,92 +266,6 @@ static const int8_t sbr_offset[6][16] = {
|
||||
{-2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16, 20, 24}, // 64000 Hz < fs_sbr
|
||||
};
|
||||
|
||||
///< window coefficients for analysis/synthesis QMF banks
|
||||
static DECLARE_ALIGNED(32, float, sbr_qmf_window_ds)[320];
|
||||
static DECLARE_ALIGNED(32, float, sbr_qmf_window_us)[640] = {
|
||||
0.0000000000, -0.0005525286, -0.0005617692, -0.0004947518,
|
||||
-0.0004875227, -0.0004893791, -0.0005040714, -0.0005226564,
|
||||
-0.0005466565, -0.0005677802, -0.0005870930, -0.0006132747,
|
||||
-0.0006312493, -0.0006540333, -0.0006777690, -0.0006941614,
|
||||
-0.0007157736, -0.0007255043, -0.0007440941, -0.0007490598,
|
||||
-0.0007681371, -0.0007724848, -0.0007834332, -0.0007779869,
|
||||
-0.0007803664, -0.0007801449, -0.0007757977, -0.0007630793,
|
||||
-0.0007530001, -0.0007319357, -0.0007215391, -0.0006917937,
|
||||
-0.0006650415, -0.0006341594, -0.0005946118, -0.0005564576,
|
||||
-0.0005145572, -0.0004606325, -0.0004095121, -0.0003501175,
|
||||
-0.0002896981, -0.0002098337, -0.0001446380, -0.0000617334,
|
||||
0.0000134949, 0.0001094383, 0.0002043017, 0.0002949531,
|
||||
0.0004026540, 0.0005107388, 0.0006239376, 0.0007458025,
|
||||
0.0008608443, 0.0009885988, 0.0011250155, 0.0012577884,
|
||||
0.0013902494, 0.0015443219, 0.0016868083, 0.0018348265,
|
||||
0.0019841140, 0.0021461583, 0.0023017254, 0.0024625616,
|
||||
0.0026201758, 0.0027870464, 0.0029469447, 0.0031125420,
|
||||
0.0032739613, 0.0034418874, 0.0036008268, 0.0037603922,
|
||||
0.0039207432, 0.0040819753, 0.0042264269, 0.0043730719,
|
||||
0.0045209852, 0.0046606460, 0.0047932560, 0.0049137603,
|
||||
0.0050393022, 0.0051407353, 0.0052461166, 0.0053471681,
|
||||
0.0054196775, 0.0054876040, 0.0055475714, 0.0055938023,
|
||||
0.0056220643, 0.0056455196, 0.0056389199, 0.0056266114,
|
||||
0.0055917128, 0.0055404363, 0.0054753783, 0.0053838975,
|
||||
0.0052715758, 0.0051382275, 0.0049839687, 0.0048109469,
|
||||
0.0046039530, 0.0043801861, 0.0041251642, 0.0038456408,
|
||||
0.0035401246, 0.0032091885, 0.0028446757, 0.0024508540,
|
||||
0.0020274176, 0.0015784682, 0.0010902329, 0.0005832264,
|
||||
0.0000276045, -0.0005464280, -0.0011568135, -0.0018039472,
|
||||
-0.0024826723, -0.0031933778, -0.0039401124, -0.0047222596,
|
||||
-0.0055337211, -0.0063792293, -0.0072615816, -0.0081798233,
|
||||
-0.0091325329, -0.0101150215, -0.0111315548, -0.0121849995,
|
||||
0.0132718220, 0.0143904666, 0.0155405553, 0.0167324712,
|
||||
0.0179433381, 0.0191872431, 0.0204531793, 0.0217467550,
|
||||
0.0230680169, 0.0244160992, 0.0257875847, 0.0271859429,
|
||||
0.0286072173, 0.0300502657, 0.0315017608, 0.0329754081,
|
||||
0.0344620948, 0.0359697560, 0.0374812850, 0.0390053679,
|
||||
0.0405349170, 0.0420649094, 0.0436097542, 0.0451488405,
|
||||
0.0466843027, 0.0482165720, 0.0497385755, 0.0512556155,
|
||||
0.0527630746, 0.0542452768, 0.0557173648, 0.0571616450,
|
||||
0.0585915683, 0.0599837480, 0.0613455171, 0.0626857808,
|
||||
0.0639715898, 0.0652247106, 0.0664367512, 0.0676075985,
|
||||
0.0687043828, 0.0697630244, 0.0707628710, 0.0717002673,
|
||||
0.0725682583, 0.0733620255, 0.0741003642, 0.0747452558,
|
||||
0.0753137336, 0.0758008358, 0.0761992479, 0.0764992170,
|
||||
0.0767093490, 0.0768173975, 0.0768230011, 0.0767204924,
|
||||
0.0765050718, 0.0761748321, 0.0757305756, 0.0751576255,
|
||||
0.0744664394, 0.0736406005, 0.0726774642, 0.0715826364,
|
||||
0.0703533073, 0.0689664013, 0.0674525021, 0.0657690668,
|
||||
0.0639444805, 0.0619602779, 0.0598166570, 0.0575152691,
|
||||
0.0550460034, 0.0524093821, 0.0495978676, 0.0466303305,
|
||||
0.0434768782, 0.0401458278, 0.0366418116, 0.0329583930,
|
||||
0.0290824006, 0.0250307561, 0.0207997072, 0.0163701258,
|
||||
0.0117623832, 0.0069636862, 0.0019765601, -0.0032086896,
|
||||
-0.0085711749, -0.0141288827, -0.0198834129, -0.0258227288,
|
||||
-0.0319531274, -0.0382776572, -0.0447806821, -0.0514804176,
|
||||
-0.0583705326, -0.0654409853, -0.0726943300, -0.0801372934,
|
||||
-0.0877547536, -0.0955533352, -0.1035329531, -0.1116826931,
|
||||
-0.1200077984, -0.1285002850, -0.1371551761, -0.1459766491,
|
||||
-0.1549607071, -0.1640958855, -0.1733808172, -0.1828172548,
|
||||
-0.1923966745, -0.2021250176, -0.2119735853, -0.2219652696,
|
||||
-0.2320690870, -0.2423016884, -0.2526480309, -0.2631053299,
|
||||
-0.2736634040, -0.2843214189, -0.2950716717, -0.3059098575,
|
||||
-0.3168278913, -0.3278113727, -0.3388722693, -0.3499914122,
|
||||
0.3611589903, 0.3723795546, 0.3836350013, 0.3949211761,
|
||||
0.4062317676, 0.4175696896, 0.4289119920, 0.4402553754,
|
||||
0.4515996535, 0.4629308085, 0.4742453214, 0.4855253091,
|
||||
0.4967708254, 0.5079817500, 0.5191234970, 0.5302240895,
|
||||
0.5412553448, 0.5522051258, 0.5630789140, 0.5738524131,
|
||||
0.5845403235, 0.5951123086, 0.6055783538, 0.6159109932,
|
||||
0.6261242695, 0.6361980107, 0.6461269695, 0.6559016302,
|
||||
0.6655139880, 0.6749663190, 0.6842353293, 0.6933282376,
|
||||
0.7022388719, 0.7109410426, 0.7194462634, 0.7277448900,
|
||||
0.7358211758, 0.7436827863, 0.7513137456, 0.7587080760,
|
||||
0.7658674865, 0.7727780881, 0.7794287519, 0.7858353120,
|
||||
0.7919735841, 0.7978466413, 0.8034485751, 0.8087695004,
|
||||
0.8138191270, 0.8185776004, 0.8230419890, 0.8272275347,
|
||||
0.8311038457, 0.8346937361, 0.8379717337, 0.8409541392,
|
||||
0.8436238281, 0.8459818469, 0.8480315777, 0.8497805198,
|
||||
0.8511971524, 0.8523047035, 0.8531020949, 0.8535720573,
|
||||
0.8537385600,
|
||||
};
|
||||
|
||||
/* First eight entries repeated at end to simplify SIMD implementations. */
|
||||
const DECLARE_ALIGNED(16, float, ff_sbr_noise_table)[][2] = {
|
||||
{-0.99948153278296, -0.59483417516607}, { 0.97113454393991, -0.67528515225647},
|
||||
|
@@ -336,7 +336,7 @@ function fft_pass_neon
|
||||
endfunc
|
||||
|
||||
.macro def_fft n, n2, n4
|
||||
function fft\n\()_neon align=6
|
||||
function fft\n\()_neon, align=6
|
||||
sub sp, sp, #16
|
||||
stp x28, x30, [sp]
|
||||
add x28, x0, #\n4*2*8
|
||||
|
@@ -27,73 +27,73 @@
|
||||
#include "libavutil/aarch64/cpu.h"
|
||||
#include "libavcodec/h264qpel.h"
|
||||
|
||||
void ff_put_h264_qpel16_mc00_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel16_mc10_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel16_mc20_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel16_mc30_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel16_mc01_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel16_mc11_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel16_mc21_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel16_mc31_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel16_mc02_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel16_mc12_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel16_mc22_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel16_mc32_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel16_mc03_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel16_mc13_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel16_mc23_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel16_mc33_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel16_mc00_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel16_mc10_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel16_mc20_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel16_mc30_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel16_mc01_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel16_mc11_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel16_mc21_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel16_mc31_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel16_mc02_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel16_mc12_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel16_mc22_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel16_mc32_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel16_mc03_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel16_mc13_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel16_mc23_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel16_mc33_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
|
||||
void ff_put_h264_qpel8_mc00_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel8_mc10_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel8_mc20_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel8_mc30_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel8_mc01_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel8_mc11_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel8_mc21_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel8_mc31_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel8_mc02_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel8_mc12_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel8_mc22_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel8_mc32_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel8_mc03_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel8_mc13_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel8_mc23_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel8_mc33_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel8_mc00_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel8_mc10_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel8_mc20_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel8_mc30_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel8_mc01_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel8_mc11_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel8_mc21_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel8_mc31_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel8_mc02_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel8_mc12_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel8_mc22_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel8_mc32_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel8_mc03_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel8_mc13_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel8_mc23_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_put_h264_qpel8_mc33_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
|
||||
void ff_avg_h264_qpel16_mc00_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel16_mc10_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel16_mc20_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel16_mc30_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel16_mc01_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel16_mc11_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel16_mc21_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel16_mc31_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel16_mc02_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel16_mc12_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel16_mc22_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel16_mc32_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel16_mc03_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel16_mc13_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel16_mc23_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel16_mc33_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel16_mc00_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel16_mc10_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel16_mc20_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel16_mc30_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel16_mc01_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel16_mc11_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel16_mc21_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel16_mc31_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel16_mc02_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel16_mc12_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel16_mc22_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel16_mc32_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel16_mc03_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel16_mc13_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel16_mc23_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel16_mc33_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
|
||||
void ff_avg_h264_qpel8_mc00_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel8_mc10_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel8_mc20_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel8_mc30_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel8_mc01_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel8_mc11_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel8_mc21_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel8_mc31_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel8_mc02_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel8_mc12_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel8_mc22_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel8_mc32_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel8_mc03_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel8_mc13_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel8_mc23_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel8_mc33_neon(uint8_t *dst, uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel8_mc00_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel8_mc10_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel8_mc20_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel8_mc30_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel8_mc01_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel8_mc11_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel8_mc21_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel8_mc31_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel8_mc02_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel8_mc12_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel8_mc22_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel8_mc32_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel8_mc03_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel8_mc13_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel8_mc23_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
void ff_avg_h264_qpel8_mc33_neon(uint8_t *dst, const uint8_t *src, ptrdiff_t stride);
|
||||
|
||||
av_cold void ff_h264qpel_init_aarch64(H264QpelContext *c, int bit_depth)
|
||||
{
|
||||
|
@@ -24,7 +24,7 @@
|
||||
#define WFRAC_BITS 16 // fractional bits for window
|
||||
#define OUT_SHIFT (WFRAC_BITS + FRAC_BITS - 15)
|
||||
|
||||
const tbl_rev128.s align=4
|
||||
const tbl_rev128.s, align=4
|
||||
.byte 12, 13, 14, 15
|
||||
.byte 8, 9, 10, 11
|
||||
.byte 4, 5, 6, 7
|
||||
|
@@ -23,7 +23,7 @@
|
||||
#include "asm-offsets.h"
|
||||
|
||||
.macro shuffle a, b, c, d
|
||||
const shuffle_\a\b\c\d align=4
|
||||
const shuffle_\a\b\c\d, align=4
|
||||
.byte (\a * 4), (\a * 4 + 1), (\a * 4 + 2), (\a * 4 + 3)
|
||||
.byte (\b * 4), (\b * 4 + 1), (\b * 4 + 2), (\b * 4 + 3)
|
||||
.byte (\c * 4), (\c * 4 + 1), (\c * 4 + 2), (\c * 4 + 3)
|
||||
@@ -344,7 +344,7 @@ function fft15_pass
|
||||
ret
|
||||
endfunc
|
||||
|
||||
function fft30_neon align=6
|
||||
function fft30_neon, align=6
|
||||
sub sp, sp, #0x20
|
||||
stp x20, x21, [sp]
|
||||
stp x22, x30, [sp, #0x10]
|
||||
@@ -372,7 +372,7 @@ function fft30_neon align=6
|
||||
endfunc
|
||||
|
||||
.macro def_fft n, n2
|
||||
function fft\n\()_neon align=6
|
||||
function fft\n\()_neon, align=6
|
||||
sub sp, sp, #0x30
|
||||
stp x20, x21, [sp]
|
||||
stp x22, x30, [sp, #0x10]
|
||||
@@ -641,7 +641,7 @@ function ff_celt_imdct_half_neon, export=1
|
||||
endfunc
|
||||
|
||||
// [0] = exp(2 * i * pi / 5), [1] = exp(2 * i * pi * 2 / 5)
|
||||
const fact5 align=4
|
||||
const fact5, align=4
|
||||
.float 0.30901699437494745, 0.95105651629515353
|
||||
.float -0.80901699437494734, 0.58778525229247325
|
||||
endconst
|
||||
|
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Autodesk RLE Decoder
|
||||
* Copyright (C) 2005 the ffmpeg project
|
||||
* Copyright (c) 2005 The FFmpeg Project
|
||||
*
|
||||
* This file is part of FFmpeg.
|
||||
*
|
||||
|
@@ -67,7 +67,8 @@
|
||||
#define AC3_RENAME(x) x ## _fixed
|
||||
#define AC3_NORM(norm) (1<<24)/(norm)
|
||||
#define AC3_MUL(a,b) ((((int64_t) (a)) * (b))>>12)
|
||||
#define AC3_RANGE(x) (x)
|
||||
#define AC3_RANGE(x) (x|((x&128)<<1))
|
||||
#define AC3_HEAVY_RANGE(x) (x<<1)
|
||||
#define AC3_DYNAMIC_RANGE(x) (x)
|
||||
#define AC3_SPX_BLEND(x) (x)
|
||||
#define AC3_DYNAMIC_RANGE1 0
|
||||
@@ -86,6 +87,7 @@
|
||||
#define AC3_NORM(norm) (1.0f/(norm))
|
||||
#define AC3_MUL(a,b) ((a) * (b))
|
||||
#define AC3_RANGE(x) (dynamic_range_tab[(x)])
|
||||
#define AC3_HEAVY_RANGE(x) (heavy_dynamic_range_tab[(x)])
|
||||
#define AC3_DYNAMIC_RANGE(x) (powf(x, s->drc_scale))
|
||||
#define AC3_SPX_BLEND(x) (x)* (1.0f/32)
|
||||
#define AC3_DYNAMIC_RANGE1 1.0f
|
||||
|
@@ -166,7 +166,7 @@ static int ac3_sync(uint64_t state, AACAC3ParseContext *hdr_info,
|
||||
int err;
|
||||
union {
|
||||
uint64_t u64;
|
||||
uint8_t u8[8];
|
||||
uint8_t u8[8 + FF_INPUT_BUFFER_PADDING_SIZE];
|
||||
} tmp = { av_be2ne64(state) };
|
||||
AC3HeaderInfo hdr, *phdr = &hdr;
|
||||
GetBitContext gbc;
|
||||
|
@@ -65,6 +65,7 @@ static const uint8_t quantization_tab[16] = {
|
||||
|
||||
/** dynamic range table. converts codes to scale factors. */
|
||||
static float dynamic_range_tab[256];
|
||||
static float heavy_dynamic_range_tab[256];
|
||||
|
||||
/** Adjustments in dB gain */
|
||||
static const float gain_levels[9] = {
|
||||
@@ -164,6 +165,14 @@ static av_cold void ac3_tables_init(void)
|
||||
int v = (i >> 5) - ((i >> 7) << 3) - 5;
|
||||
dynamic_range_tab[i] = powf(2.0f, v) * ((i & 0x1F) | 0x20);
|
||||
}
|
||||
|
||||
/* generate compr dynamic range table
|
||||
reference: Section 7.7.2 Heavy Compression */
|
||||
for (i = 0; i < 256; i++) {
|
||||
int v = (i >> 4) - ((i >> 7) << 4) - 4;
|
||||
heavy_dynamic_range_tab[i] = powf(2.0f, v) * ((i & 0xF) | 0x10);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -236,9 +245,19 @@ static int ac3_parse_header(AC3DecodeContext *s)
|
||||
/* read the rest of the bsi. read twice for dual mono mode. */
|
||||
i = !s->channel_mode;
|
||||
do {
|
||||
skip_bits(gbc, 5); // skip dialog normalization
|
||||
if (get_bits1(gbc))
|
||||
skip_bits(gbc, 8); //skip compression
|
||||
s->dialog_normalization[(!s->channel_mode)-i] = -get_bits(gbc, 5);
|
||||
if (s->dialog_normalization[(!s->channel_mode)-i] == 0) {
|
||||
s->dialog_normalization[(!s->channel_mode)-i] = -31;
|
||||
}
|
||||
if (s->target_level != 0) {
|
||||
s->level_gain[(!s->channel_mode)-i] = powf(2.0f,
|
||||
(float)(s->target_level -
|
||||
s->dialog_normalization[(!s->channel_mode)-i])/6.0f);
|
||||
}
|
||||
if (s->compression_exists[(!s->channel_mode)-i] = get_bits1(gbc)) {
|
||||
s->heavy_dynamic_range[(!s->channel_mode)-i] =
|
||||
AC3_HEAVY_RANGE(get_bits(gbc, 8));
|
||||
}
|
||||
if (get_bits1(gbc))
|
||||
skip_bits(gbc, 8); //skip language code
|
||||
if (get_bits1(gbc))
|
||||
@@ -819,8 +838,9 @@ static int decode_audio_block(AC3DecodeContext *s, int blk)
|
||||
if (get_bits1(gbc)) {
|
||||
/* Allow asymmetric application of DRC when drc_scale > 1.
|
||||
Amplification of quiet sounds is enhanced */
|
||||
INTFLOAT range = AC3_RANGE(get_bits(gbc, 8));
|
||||
if (range > 1.0 || s->drc_scale <= 1.0)
|
||||
int range_bits = get_bits(gbc, 8);
|
||||
INTFLOAT range = AC3_RANGE(range_bits);
|
||||
if (range_bits <= 127 || s->drc_scale <= 1.0)
|
||||
s->dynamic_range[i] = AC3_DYNAMIC_RANGE(range);
|
||||
else
|
||||
s->dynamic_range[i] = range;
|
||||
@@ -1314,15 +1334,20 @@ static int decode_audio_block(AC3DecodeContext *s, int blk)
|
||||
|
||||
/* apply scaling to coefficients (headroom, dynrng) */
|
||||
for (ch = 1; ch <= s->channels; ch++) {
|
||||
int audio_channel = 0;
|
||||
INTFLOAT gain;
|
||||
if(s->channel_mode == AC3_CHMODE_DUALMONO) {
|
||||
gain = s->dynamic_range[2-ch];
|
||||
} else {
|
||||
gain = s->dynamic_range[0];
|
||||
}
|
||||
if (s->channel_mode == AC3_CHMODE_DUALMONO)
|
||||
audio_channel = 2-ch;
|
||||
if (s->heavy_compression && s->compression_exists[audio_channel])
|
||||
gain = s->heavy_dynamic_range[audio_channel];
|
||||
else
|
||||
gain = s->dynamic_range[audio_channel];
|
||||
|
||||
#if USE_FIXED
|
||||
scale_coefs(s->transform_coeffs[ch], s->fixed_coeffs[ch], gain, 256);
|
||||
#else
|
||||
if (s->target_level != 0)
|
||||
gain = gain * s->level_gain[audio_channel];
|
||||
gain *= 1.0 / 4194304.0f;
|
||||
s->fmt_conv.int32_to_float_fmul_scalar(s->transform_coeffs[ch],
|
||||
s->fixed_coeffs[ch], gain, 256);
|
||||
|
@@ -84,6 +84,9 @@ typedef struct AC3DecodeContext {
|
||||
int bitstream_mode; ///< bitstream mode (bsmod)
|
||||
int channel_mode; ///< channel mode (acmod)
|
||||
int lfe_on; ///< lfe channel in use
|
||||
int dialog_normalization[2]; ///< dialog level in dBFS (dialnorm)
|
||||
int compression_exists[2]; ///< compression field is valid for frame (compre)
|
||||
int compression_gain[2]; ///< gain to apply for heavy compression (compr)
|
||||
int channel_map; ///< custom channel map
|
||||
int preferred_downmix; ///< Preferred 2-channel downmix mode (dmixmod)
|
||||
int center_mix_level; ///< Center mix level index
|
||||
@@ -103,6 +106,8 @@ typedef struct AC3DecodeContext {
|
||||
float ltrt_surround_mix_level;
|
||||
float loro_center_mix_level;
|
||||
float loro_surround_mix_level;
|
||||
int target_level; ///< target level in dBFS
|
||||
float level_gain[2];
|
||||
|
||||
///@name Frame syntax parameters
|
||||
int snr_offset_strategy; ///< SNR offset strategy (snroffststr)
|
||||
@@ -161,6 +166,8 @@ typedef struct AC3DecodeContext {
|
||||
///@name Dynamic range
|
||||
INTFLOAT dynamic_range[2]; ///< dynamic range
|
||||
INTFLOAT drc_scale; ///< percentage of dynamic range compression to be applied
|
||||
int heavy_compression; ///< apply heavy compression
|
||||
INTFLOAT heavy_dynamic_range[2]; ///< heavy dynamic range compression
|
||||
///@}
|
||||
|
||||
///@name Bandwidth
|
||||
|
@@ -53,19 +53,7 @@
|
||||
#include "ac3dec.h"
|
||||
|
||||
|
||||
/**
|
||||
* Table for center mix levels
|
||||
* reference: Section 5.4.2.4 cmixlev
|
||||
*/
|
||||
static const uint8_t center_levels[4] = { 4, 5, 6, 5 };
|
||||
|
||||
/**
|
||||
* Table for surround mix levels
|
||||
* reference: Section 5.4.2.5 surmixlev
|
||||
*/
|
||||
static const uint8_t surround_levels[4] = { 4, 6, 7, 6 };
|
||||
|
||||
int end_freq_inv_tab[8] =
|
||||
static const int end_freq_inv_tab[8] =
|
||||
{
|
||||
50529027, 44278013, 39403370, 32292987, 27356480, 23729101, 20951060, 18755316
|
||||
};
|
||||
@@ -81,40 +69,69 @@ static void scale_coefs (
|
||||
int temp, temp1, temp2, temp3, temp4, temp5, temp6, temp7;
|
||||
|
||||
mul = (dynrng & 0x1f) + 0x20;
|
||||
shift = 4 - ((dynrng << 24) >> 29);
|
||||
round = 1 << (shift-1);
|
||||
for (i=0; i<len; i+=8) {
|
||||
shift = 4 - ((dynrng << 23) >> 28);
|
||||
if (shift > 0 ) {
|
||||
round = 1 << (shift-1);
|
||||
for (i=0; i<len; i+=8) {
|
||||
|
||||
temp = src[i] * mul;
|
||||
temp1 = src[i+1] * mul;
|
||||
temp = temp + round;
|
||||
temp2 = src[i+2] * mul;
|
||||
temp = src[i] * mul;
|
||||
temp1 = src[i+1] * mul;
|
||||
temp = temp + round;
|
||||
temp2 = src[i+2] * mul;
|
||||
|
||||
temp1 = temp1 + round;
|
||||
dst[i] = temp >> shift;
|
||||
temp3 = src[i+3] * mul;
|
||||
temp2 = temp2 + round;
|
||||
temp1 = temp1 + round;
|
||||
dst[i] = temp >> shift;
|
||||
temp3 = src[i+3] * mul;
|
||||
temp2 = temp2 + round;
|
||||
|
||||
dst[i+1] = temp1 >> shift;
|
||||
temp4 = src[i + 4] * mul;
|
||||
temp3 = temp3 + round;
|
||||
dst[i+2] = temp2 >> shift;
|
||||
dst[i+1] = temp1 >> shift;
|
||||
temp4 = src[i + 4] * mul;
|
||||
temp3 = temp3 + round;
|
||||
dst[i+2] = temp2 >> shift;
|
||||
|
||||
temp5 = src[i+5] * mul;
|
||||
temp4 = temp4 + round;
|
||||
dst[i+3] = temp3 >> shift;
|
||||
temp6 = src[i+6] * mul;
|
||||
temp5 = src[i+5] * mul;
|
||||
temp4 = temp4 + round;
|
||||
dst[i+3] = temp3 >> shift;
|
||||
temp6 = src[i+6] * mul;
|
||||
|
||||
dst[i+4] = temp4 >> shift;
|
||||
temp5 = temp5 + round;
|
||||
temp7 = src[i+7] * mul;
|
||||
temp6 = temp6 + round;
|
||||
dst[i+4] = temp4 >> shift;
|
||||
temp5 = temp5 + round;
|
||||
temp7 = src[i+7] * mul;
|
||||
temp6 = temp6 + round;
|
||||
|
||||
dst[i+5] = temp5 >> shift;
|
||||
temp7 = temp7 + round;
|
||||
dst[i+6] = temp6 >> shift;
|
||||
dst[i+7] = temp7 >> shift;
|
||||
dst[i+5] = temp5 >> shift;
|
||||
temp7 = temp7 + round;
|
||||
dst[i+6] = temp6 >> shift;
|
||||
dst[i+7] = temp7 >> shift;
|
||||
|
||||
}
|
||||
} else {
|
||||
shift = -shift;
|
||||
for (i=0; i<len; i+=8) {
|
||||
|
||||
temp = src[i] * mul;
|
||||
temp1 = src[i+1] * mul;
|
||||
temp2 = src[i+2] * mul;
|
||||
|
||||
dst[i] = temp << shift;
|
||||
temp3 = src[i+3] * mul;
|
||||
|
||||
dst[i+1] = temp1 << shift;
|
||||
temp4 = src[i + 4] * mul;
|
||||
dst[i+2] = temp2 << shift;
|
||||
|
||||
temp5 = src[i+5] * mul;
|
||||
dst[i+3] = temp3 << shift;
|
||||
temp6 = src[i+6] * mul;
|
||||
|
||||
dst[i+4] = temp4 << shift;
|
||||
temp7 = src[i+7] * mul;
|
||||
|
||||
dst[i+5] = temp5 << shift;
|
||||
dst[i+6] = temp6 << shift;
|
||||
dst[i+7] = temp7 << shift;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -150,6 +167,8 @@ static void ac3_downmix_c_fixed16(int16_t **samples, int16_t (*matrix)[2],
|
||||
#include "ac3dec.c"
|
||||
|
||||
static const AVOption options[] = {
|
||||
{ "drc_scale", "percentage of dynamic range compression to apply", OFFSET(drc_scale), AV_OPT_TYPE_FLOAT, {.dbl = 1.0}, 0.0, 6.0, PAR },
|
||||
{ "heavy_compr", "heavy dynamic range compression enabled", OFFSET(heavy_compression), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, 1, PAR },
|
||||
{ NULL},
|
||||
};
|
||||
|
||||
|
@@ -32,6 +32,8 @@
|
||||
|
||||
static const AVOption options[] = {
|
||||
{ "drc_scale", "percentage of dynamic range compression to apply", OFFSET(drc_scale), AV_OPT_TYPE_FLOAT, {.dbl = 1.0}, 0.0, 6.0, PAR },
|
||||
{ "heavy_compr", "heavy dynamic range compression enabled", OFFSET(heavy_compression), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, 1, PAR },
|
||||
{ "target_level", "target level in -dBFS (0 not applied)", OFFSET(target_level), AV_OPT_TYPE_INT, {.i64 = 0 }, -31, 0, PAR },
|
||||
|
||||
{"dmix_mode", "Preferred Stereo Downmix Mode", OFFSET(preferred_stereo_downmix), AV_OPT_TYPE_INT, {.i64 = -1 }, -1, 2, 0, "dmix_mode"},
|
||||
{"ltrt_cmixlev", "Lt/Rt Center Mix Level", OFFSET(ltrt_center_mix_level), AV_OPT_TYPE_FLOAT, {.dbl = -1.0 }, -1.0, 2.0, 0},
|
||||
|
@@ -36,6 +36,7 @@
|
||||
#include "libavutil/internal.h"
|
||||
#include "libavutil/opt.h"
|
||||
#include "avcodec.h"
|
||||
#include "me_cmp.h"
|
||||
#include "put_bits.h"
|
||||
#include "audiodsp.h"
|
||||
#include "ac3dsp.h"
|
||||
@@ -379,7 +380,7 @@ static void compute_exp_strategy(AC3EncodeContext *s)
|
||||
exp_strategy[blk] = EXP_NEW;
|
||||
continue;
|
||||
}
|
||||
exp_diff = s->dsp.sad[0](NULL, exp, exp - AC3_MAX_COEFS, 16, 16);
|
||||
exp_diff = s->mecc.sad[0](NULL, exp, exp - AC3_MAX_COEFS, 16, 16);
|
||||
exp_strategy[blk] = EXP_REUSE;
|
||||
if (ch == CPL_CH && exp_diff > (EXP_DIFF_THRESHOLD * (s->blocks[blk].end_freq[ch] - s->start_freq[ch]) / AC3_MAX_COEFS))
|
||||
exp_strategy[blk] = EXP_NEW;
|
||||
@@ -2326,50 +2327,50 @@ static av_cold int allocate_buffers(AC3EncodeContext *s)
|
||||
if (s->allocate_sample_buffers(s))
|
||||
goto alloc_fail;
|
||||
|
||||
FF_ALLOC_OR_GOTO(avctx, s->bap_buffer, total_coefs *
|
||||
FF_ALLOC_ARRAY_OR_GOTO(avctx, s->bap_buffer, total_coefs,
|
||||
sizeof(*s->bap_buffer), alloc_fail);
|
||||
FF_ALLOC_OR_GOTO(avctx, s->bap1_buffer, total_coefs *
|
||||
FF_ALLOC_ARRAY_OR_GOTO(avctx, s->bap1_buffer, total_coefs,
|
||||
sizeof(*s->bap1_buffer), alloc_fail);
|
||||
FF_ALLOCZ_OR_GOTO(avctx, s->mdct_coef_buffer, total_coefs *
|
||||
FF_ALLOCZ_ARRAY_OR_GOTO(avctx, s->mdct_coef_buffer, total_coefs,
|
||||
sizeof(*s->mdct_coef_buffer), alloc_fail);
|
||||
FF_ALLOC_OR_GOTO(avctx, s->exp_buffer, total_coefs *
|
||||
FF_ALLOC_ARRAY_OR_GOTO(avctx, s->exp_buffer, total_coefs,
|
||||
sizeof(*s->exp_buffer), alloc_fail);
|
||||
FF_ALLOC_OR_GOTO(avctx, s->grouped_exp_buffer, channel_blocks * 128 *
|
||||
FF_ALLOC_ARRAY_OR_GOTO(avctx, s->grouped_exp_buffer, channel_blocks, 128 *
|
||||
sizeof(*s->grouped_exp_buffer), alloc_fail);
|
||||
FF_ALLOC_OR_GOTO(avctx, s->psd_buffer, total_coefs *
|
||||
FF_ALLOC_ARRAY_OR_GOTO(avctx, s->psd_buffer, total_coefs,
|
||||
sizeof(*s->psd_buffer), alloc_fail);
|
||||
FF_ALLOC_OR_GOTO(avctx, s->band_psd_buffer, channel_blocks * 64 *
|
||||
FF_ALLOC_ARRAY_OR_GOTO(avctx, s->band_psd_buffer, channel_blocks, 64 *
|
||||
sizeof(*s->band_psd_buffer), alloc_fail);
|
||||
FF_ALLOC_OR_GOTO(avctx, s->mask_buffer, channel_blocks * 64 *
|
||||
FF_ALLOC_ARRAY_OR_GOTO(avctx, s->mask_buffer, channel_blocks, 64 *
|
||||
sizeof(*s->mask_buffer), alloc_fail);
|
||||
FF_ALLOC_OR_GOTO(avctx, s->qmant_buffer, total_coefs *
|
||||
FF_ALLOC_ARRAY_OR_GOTO(avctx, s->qmant_buffer, total_coefs,
|
||||
sizeof(*s->qmant_buffer), alloc_fail);
|
||||
if (s->cpl_enabled) {
|
||||
FF_ALLOC_OR_GOTO(avctx, s->cpl_coord_exp_buffer, channel_blocks * 16 *
|
||||
FF_ALLOC_ARRAY_OR_GOTO(avctx, s->cpl_coord_exp_buffer, channel_blocks, 16 *
|
||||
sizeof(*s->cpl_coord_exp_buffer), alloc_fail);
|
||||
FF_ALLOC_OR_GOTO(avctx, s->cpl_coord_mant_buffer, channel_blocks * 16 *
|
||||
FF_ALLOC_ARRAY_OR_GOTO(avctx, s->cpl_coord_mant_buffer, channel_blocks, 16 *
|
||||
sizeof(*s->cpl_coord_mant_buffer), alloc_fail);
|
||||
}
|
||||
for (blk = 0; blk < s->num_blocks; blk++) {
|
||||
AC3Block *block = &s->blocks[blk];
|
||||
FF_ALLOCZ_OR_GOTO(avctx, block->mdct_coef, channels * sizeof(*block->mdct_coef),
|
||||
FF_ALLOCZ_ARRAY_OR_GOTO(avctx, block->mdct_coef, channels, sizeof(*block->mdct_coef),
|
||||
alloc_fail);
|
||||
FF_ALLOCZ_OR_GOTO(avctx, block->exp, channels * sizeof(*block->exp),
|
||||
FF_ALLOCZ_ARRAY_OR_GOTO(avctx, block->exp, channels, sizeof(*block->exp),
|
||||
alloc_fail);
|
||||
FF_ALLOCZ_OR_GOTO(avctx, block->grouped_exp, channels * sizeof(*block->grouped_exp),
|
||||
FF_ALLOCZ_ARRAY_OR_GOTO(avctx, block->grouped_exp, channels, sizeof(*block->grouped_exp),
|
||||
alloc_fail);
|
||||
FF_ALLOCZ_OR_GOTO(avctx, block->psd, channels * sizeof(*block->psd),
|
||||
FF_ALLOCZ_ARRAY_OR_GOTO(avctx, block->psd, channels, sizeof(*block->psd),
|
||||
alloc_fail);
|
||||
FF_ALLOCZ_OR_GOTO(avctx, block->band_psd, channels * sizeof(*block->band_psd),
|
||||
FF_ALLOCZ_ARRAY_OR_GOTO(avctx, block->band_psd, channels, sizeof(*block->band_psd),
|
||||
alloc_fail);
|
||||
FF_ALLOCZ_OR_GOTO(avctx, block->mask, channels * sizeof(*block->mask),
|
||||
FF_ALLOCZ_ARRAY_OR_GOTO(avctx, block->mask, channels, sizeof(*block->mask),
|
||||
alloc_fail);
|
||||
FF_ALLOCZ_OR_GOTO(avctx, block->qmant, channels * sizeof(*block->qmant),
|
||||
FF_ALLOCZ_ARRAY_OR_GOTO(avctx, block->qmant, channels, sizeof(*block->qmant),
|
||||
alloc_fail);
|
||||
if (s->cpl_enabled) {
|
||||
FF_ALLOCZ_OR_GOTO(avctx, block->cpl_coord_exp, channels * sizeof(*block->cpl_coord_exp),
|
||||
FF_ALLOCZ_ARRAY_OR_GOTO(avctx, block->cpl_coord_exp, channels, sizeof(*block->cpl_coord_exp),
|
||||
alloc_fail);
|
||||
FF_ALLOCZ_OR_GOTO(avctx, block->cpl_coord_mant, channels * sizeof(*block->cpl_coord_mant),
|
||||
FF_ALLOCZ_ARRAY_OR_GOTO(avctx, block->cpl_coord_mant, channels, sizeof(*block->cpl_coord_mant),
|
||||
alloc_fail);
|
||||
}
|
||||
|
||||
@@ -2392,11 +2393,11 @@ static av_cold int allocate_buffers(AC3EncodeContext *s)
|
||||
}
|
||||
|
||||
if (!s->fixed_point) {
|
||||
FF_ALLOCZ_OR_GOTO(avctx, s->fixed_coef_buffer, total_coefs *
|
||||
FF_ALLOCZ_ARRAY_OR_GOTO(avctx, s->fixed_coef_buffer, total_coefs,
|
||||
sizeof(*s->fixed_coef_buffer), alloc_fail);
|
||||
for (blk = 0; blk < s->num_blocks; blk++) {
|
||||
AC3Block *block = &s->blocks[blk];
|
||||
FF_ALLOCZ_OR_GOTO(avctx, block->fixed_coef, channels *
|
||||
FF_ALLOCZ_ARRAY_OR_GOTO(avctx, block->fixed_coef, channels,
|
||||
sizeof(*block->fixed_coef), alloc_fail);
|
||||
for (ch = 0; ch < channels; ch++)
|
||||
block->fixed_coef[ch] = &s->fixed_coef_buffer[AC3_MAX_COEFS * (s->num_blocks * ch + blk)];
|
||||
@@ -2404,7 +2405,7 @@ static av_cold int allocate_buffers(AC3EncodeContext *s)
|
||||
} else {
|
||||
for (blk = 0; blk < s->num_blocks; blk++) {
|
||||
AC3Block *block = &s->blocks[blk];
|
||||
FF_ALLOCZ_OR_GOTO(avctx, block->fixed_coef, channels *
|
||||
FF_ALLOCZ_ARRAY_OR_GOTO(avctx, block->fixed_coef, channels,
|
||||
sizeof(*block->fixed_coef), alloc_fail);
|
||||
for (ch = 0; ch < channels; ch++)
|
||||
block->fixed_coef[ch] = (int32_t *)block->mdct_coef[ch];
|
||||
@@ -2480,7 +2481,7 @@ av_cold int ff_ac3_encode_init(AVCodecContext *avctx)
|
||||
goto init_fail;
|
||||
|
||||
ff_audiodsp_init(&s->adsp);
|
||||
ff_dsputil_init(&s->dsp, avctx);
|
||||
ff_me_cmp_init(&s->mecc, avctx);
|
||||
ff_ac3dsp_init(&s->ac3dsp, avctx->flags & CODEC_FLAG_BITEXACT);
|
||||
|
||||
dprint_options(s);
|
||||
|
@@ -35,9 +35,9 @@
|
||||
#include "ac3.h"
|
||||
#include "ac3dsp.h"
|
||||
#include "avcodec.h"
|
||||
#include "dsputil.h"
|
||||
#include "fft.h"
|
||||
#include "mathops.h"
|
||||
#include "me_cmp.h"
|
||||
#include "put_bits.h"
|
||||
#include "audiodsp.h"
|
||||
|
||||
@@ -162,9 +162,9 @@ typedef struct AC3EncodeContext {
|
||||
AC3EncOptions options; ///< encoding options
|
||||
AVCodecContext *avctx; ///< parent AVCodecContext
|
||||
PutBitContext pb; ///< bitstream writer context
|
||||
DSPContext dsp;
|
||||
AudioDSPContext adsp;
|
||||
AVFloatDSPContext fdsp;
|
||||
MECmpContext mecc;
|
||||
AC3DSPContext ac3dsp; ///< AC-3 optimized functions
|
||||
FFTContext mdct; ///< FFT context for MDCT calculation
|
||||
const SampleType *mdct_window; ///< MDCT window function array
|
||||
|
@@ -57,7 +57,7 @@ int AC3_NAME(allocate_sample_buffers)(AC3EncodeContext *s)
|
||||
|
||||
FF_ALLOC_OR_GOTO(s->avctx, s->windowed_samples, AC3_WINDOW_SIZE *
|
||||
sizeof(*s->windowed_samples), alloc_fail);
|
||||
FF_ALLOC_OR_GOTO(s->avctx, s->planar_samples, s->channels * sizeof(*s->planar_samples),
|
||||
FF_ALLOC_ARRAY_OR_GOTO(s->avctx, s->planar_samples, s->channels, sizeof(*s->planar_samples),
|
||||
alloc_fail);
|
||||
for (ch = 0; ch < s->channels; ch++) {
|
||||
FF_ALLOCZ_OR_GOTO(s->avctx, s->planar_samples[ch],
|
||||
@@ -263,7 +263,7 @@ static void apply_channel_coupling(AC3EncodeContext *s)
|
||||
energy_cpl = energy[blk][CPL_CH][bnd];
|
||||
energy_ch = energy[blk][ch][bnd];
|
||||
blk1 = blk+1;
|
||||
while (!s->blocks[blk1].new_cpl_coords[ch] && blk1 < s->num_blocks) {
|
||||
while (blk1 < s->num_blocks && !s->blocks[blk1].new_cpl_coords[ch]) {
|
||||
if (s->blocks[blk1].cpl_in_use) {
|
||||
energy_cpl += energy[blk1][CPL_CH][bnd];
|
||||
energy_ch += energy[blk1][ch][bnd];
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2003 The ffmpeg Project
|
||||
* Copyright (c) 2001-2003 The FFmpeg Project
|
||||
*
|
||||
* first version by Francois Revol (revol@free.fr)
|
||||
* fringe ADPCM codecs (e.g., DK3, DK4, Westwood)
|
||||
@@ -1530,7 +1530,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data,
|
||||
|
||||
static const enum AVSampleFormat sample_fmts_s16[] = { AV_SAMPLE_FMT_S16,
|
||||
AV_SAMPLE_FMT_NONE };
|
||||
static const enum AVSampleFormat sample_fmts_s16p[] = { AV_SAMPLE_FMT_S16,
|
||||
static const enum AVSampleFormat sample_fmts_s16p[] = { AV_SAMPLE_FMT_S16P,
|
||||
AV_SAMPLE_FMT_NONE };
|
||||
static const enum AVSampleFormat sample_fmts_both[] = { AV_SAMPLE_FMT_S16,
|
||||
AV_SAMPLE_FMT_S16P,
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2003 The ffmpeg Project
|
||||
* Copyright (c) 2001-2003 The FFmpeg Project
|
||||
*
|
||||
* This file is part of FFmpeg.
|
||||
*
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2003 The ffmpeg Project
|
||||
* Copyright (c) 2001-2003 The FFmpeg Project
|
||||
*
|
||||
* This file is part of FFmpeg.
|
||||
*
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2003 The ffmpeg Project
|
||||
* Copyright (c) 2001-2003 The FFmpeg Project
|
||||
*
|
||||
* This file is part of FFmpeg.
|
||||
*
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2003 The ffmpeg Project
|
||||
* Copyright (c) 2001-2003 The FFmpeg Project
|
||||
*
|
||||
* first version by Francois Revol (revol@free.fr)
|
||||
* fringe ADPCM codecs (e.g., DK3, DK4, Westwood)
|
||||
@@ -509,7 +509,7 @@ static int adpcm_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
|
||||
|
||||
/* stereo: 4 bytes (8 samples) for left, 4 bytes for right */
|
||||
if (avctx->trellis > 0) {
|
||||
FF_ALLOC_OR_GOTO(avctx, buf, avctx->channels * blocks * 8, error);
|
||||
FF_ALLOC_ARRAY_OR_GOTO(avctx, buf, avctx->channels, blocks * 8, error);
|
||||
for (ch = 0; ch < avctx->channels; ch++) {
|
||||
adpcm_compress_trellis(avctx, &samples_p[ch][1],
|
||||
buf + ch * blocks * 8, &c->status[ch],
|
||||
|
@@ -80,11 +80,3 @@ int ff_adx_decode_header(AVCodecContext *avctx, const uint8_t *buf,
|
||||
*header_size = offset;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if LIBAVCODEC_VERSION_MAJOR < 56
|
||||
int avpriv_adx_decode_header(AVCodecContext *avctx, const uint8_t *buf,
|
||||
int bufsize, int *header_size, int *coeff)
|
||||
{
|
||||
return ff_adx_decode_header(avctx, buf, bufsize, header_size, coeff);
|
||||
}
|
||||
#endif
|
||||
|
@@ -77,9 +77,4 @@ void ff_adx_calculate_coeffs(int cutoff, int sample_rate, int bits, int *coeff);
|
||||
int ff_adx_decode_header(AVCodecContext *avctx, const uint8_t *buf,
|
||||
int bufsize, int *header_size, int *coeff);
|
||||
|
||||
#if LIBAVCODEC_VERSION_MAJOR < 56
|
||||
int avpriv_adx_decode_header(AVCodecContext *avctx, const uint8_t *buf,
|
||||
int bufsize, int *header_size, int *coeff);
|
||||
#endif
|
||||
|
||||
#endif /* AVCODEC_ADX_H */
|
||||
|
@@ -132,7 +132,7 @@ static const uint8_t aic_c_ext_scan[192] = {
|
||||
177, 184, 176, 169, 162, 161, 168, 160,
|
||||
};
|
||||
|
||||
static const uint8_t *aic_scan[NUM_BANDS] = {
|
||||
static const uint8_t * const aic_scan[NUM_BANDS] = {
|
||||
aic_y_scan, aic_c_scan, aic_y_ext_scan, aic_c_ext_scan
|
||||
};
|
||||
|
||||
|
@@ -48,6 +48,7 @@
|
||||
#include <inttypes.h>
|
||||
|
||||
#include "libavutil/channel_layout.h"
|
||||
#include "libavutil/opt.h"
|
||||
#include "avcodec.h"
|
||||
#include "get_bits.h"
|
||||
#include "bytestream.h"
|
||||
@@ -60,6 +61,7 @@
|
||||
#define ALAC_EXTRADATA_SIZE 36
|
||||
|
||||
typedef struct {
|
||||
AVClass *class;
|
||||
AVCodecContext *avctx;
|
||||
GetBitContext gb;
|
||||
int channels;
|
||||
@@ -78,6 +80,7 @@ typedef struct {
|
||||
int nb_samples; /**< number of samples in the current frame */
|
||||
|
||||
int direct_output;
|
||||
int extra_bit_bug;
|
||||
} ALACContext;
|
||||
|
||||
static inline unsigned int decode_scalar(GetBitContext *gb, int k, int bps)
|
||||
@@ -380,12 +383,17 @@ static int decode_element(AVCodecContext *avctx, AVFrame *frame, int ch_index,
|
||||
decorr_left_weight = 0;
|
||||
}
|
||||
|
||||
if (alac->extra_bits && alac->extra_bit_bug) {
|
||||
append_extra_bits(alac->output_samples_buffer, alac->extra_bits_buffer,
|
||||
alac->extra_bits, channels, alac->nb_samples);
|
||||
}
|
||||
|
||||
if (channels == 2 && decorr_left_weight) {
|
||||
decorrelate_stereo(alac->output_samples_buffer, alac->nb_samples,
|
||||
decorr_shift, decorr_left_weight);
|
||||
}
|
||||
|
||||
if (alac->extra_bits) {
|
||||
if (alac->extra_bits && !alac->extra_bit_bug) {
|
||||
append_extra_bits(alac->output_samples_buffer, alac->extra_bits_buffer,
|
||||
alac->extra_bits, channels, alac->nb_samples);
|
||||
}
|
||||
@@ -630,6 +638,20 @@ static int init_thread_copy(AVCodecContext *avctx)
|
||||
return allocate_buffers(alac);
|
||||
}
|
||||
|
||||
static const AVOption options[] = {
|
||||
{ "extra_bits_bug", "Force non-standard decoding process",
|
||||
offsetof(ALACContext, extra_bit_bug), AV_OPT_TYPE_INT, { .i64 = 0 },
|
||||
0, 1, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM },
|
||||
{ NULL },
|
||||
};
|
||||
|
||||
static const AVClass alac_class = {
|
||||
.class_name = "alac",
|
||||
.item_name = av_default_item_name,
|
||||
.option = options,
|
||||
.version = LIBAVUTIL_VERSION_INT,
|
||||
};
|
||||
|
||||
AVCodec ff_alac_decoder = {
|
||||
.name = "alac",
|
||||
.long_name = NULL_IF_CONFIG_SMALL("ALAC (Apple Lossless Audio Codec)"),
|
||||
@@ -641,4 +663,5 @@ AVCodec ff_alac_decoder = {
|
||||
.decode = alac_decode_frame,
|
||||
.init_thread_copy = ONLY_IF_THREADS_ENABLED(init_thread_copy),
|
||||
.capabilities = CODEC_CAP_DR1 | CODEC_CAP_FRAME_THREADS,
|
||||
.priv_class = &alac_class
|
||||
};
|
||||
|
@@ -66,7 +66,7 @@ typedef struct AlacEncodeContext {
|
||||
int write_sample_size;
|
||||
int extra_bits;
|
||||
int32_t sample_buf[2][DEFAULT_FRAME_SIZE];
|
||||
int32_t predictor_buf[DEFAULT_FRAME_SIZE];
|
||||
int32_t predictor_buf[2][DEFAULT_FRAME_SIZE];
|
||||
int interlacing_shift;
|
||||
int interlacing_leftweight;
|
||||
PutBitContext pbctx;
|
||||
@@ -253,13 +253,14 @@ static void alac_linear_predictor(AlacEncodeContext *s, int ch)
|
||||
{
|
||||
int i;
|
||||
AlacLPCContext lpc = s->lpc[ch];
|
||||
int32_t *residual = s->predictor_buf[ch];
|
||||
|
||||
if (lpc.lpc_order == 31) {
|
||||
s->predictor_buf[0] = s->sample_buf[ch][0];
|
||||
residual[0] = s->sample_buf[ch][0];
|
||||
|
||||
for (i = 1; i < s->frame_size; i++) {
|
||||
s->predictor_buf[i] = s->sample_buf[ch][i ] -
|
||||
s->sample_buf[ch][i - 1];
|
||||
residual[i] = s->sample_buf[ch][i ] -
|
||||
s->sample_buf[ch][i - 1];
|
||||
}
|
||||
|
||||
return;
|
||||
@@ -269,7 +270,6 @@ static void alac_linear_predictor(AlacEncodeContext *s, int ch)
|
||||
|
||||
if (lpc.lpc_order > 0) {
|
||||
int32_t *samples = s->sample_buf[ch];
|
||||
int32_t *residual = s->predictor_buf;
|
||||
|
||||
// generate warm-up samples
|
||||
residual[0] = samples[0];
|
||||
@@ -313,11 +313,11 @@ static void alac_linear_predictor(AlacEncodeContext *s, int ch)
|
||||
}
|
||||
}
|
||||
|
||||
static void alac_entropy_coder(AlacEncodeContext *s)
|
||||
static void alac_entropy_coder(AlacEncodeContext *s, int ch)
|
||||
{
|
||||
unsigned int history = s->rc.initial_history;
|
||||
int sign_modifier = 0, i, k;
|
||||
int32_t *samples = s->predictor_buf;
|
||||
int32_t *samples = s->predictor_buf[ch];
|
||||
|
||||
for (i = 0; i < s->frame_size;) {
|
||||
int x;
|
||||
@@ -394,6 +394,19 @@ static void write_element(AlacEncodeContext *s,
|
||||
init_sample_buffers(s, channels, samples);
|
||||
write_element_header(s, element, instance);
|
||||
|
||||
// extract extra bits if needed
|
||||
if (s->extra_bits) {
|
||||
uint32_t mask = (1 << s->extra_bits) - 1;
|
||||
for (j = 0; j < channels; j++) {
|
||||
int32_t *extra = s->predictor_buf[j];
|
||||
int32_t *smp = s->sample_buf[j];
|
||||
for (i = 0; i < s->frame_size; i++) {
|
||||
extra[i] = smp[i] & mask;
|
||||
smp[i] >>= s->extra_bits;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (channels == 2)
|
||||
alac_stereo_decorrelation(s);
|
||||
else
|
||||
@@ -419,8 +432,7 @@ static void write_element(AlacEncodeContext *s,
|
||||
uint32_t mask = (1 << s->extra_bits) - 1;
|
||||
for (i = 0; i < s->frame_size; i++) {
|
||||
for (j = 0; j < channels; j++) {
|
||||
put_bits(pb, s->extra_bits, s->sample_buf[j][i] & mask);
|
||||
s->sample_buf[j][i] >>= s->extra_bits;
|
||||
put_bits(pb, s->extra_bits, s->predictor_buf[j][i] & mask);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -432,10 +444,11 @@ static void write_element(AlacEncodeContext *s,
|
||||
// TODO: determine when this will actually help. for now it's not used.
|
||||
if (prediction_type == 15) {
|
||||
// 2nd pass 1st order filter
|
||||
int32_t *residual = s->predictor_buf[channels];
|
||||
for (j = s->frame_size - 1; j > 0; j--)
|
||||
s->predictor_buf[j] -= s->predictor_buf[j - 1];
|
||||
residual[j] -= residual[j - 1];
|
||||
}
|
||||
alac_entropy_coder(s);
|
||||
alac_entropy_coder(s, i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,7 +1,6 @@
|
||||
OBJS-$(CONFIG_BLOCKDSP) += alpha/blockdsp_alpha.o
|
||||
OBJS-$(CONFIG_DSPUTIL) += alpha/dsputil_alpha.o \
|
||||
alpha/motion_est_alpha.o \
|
||||
alpha/motion_est_mvi_asm.o
|
||||
OBJS-$(CONFIG_ME_CMP) += alpha/me_cmp_alpha.o \
|
||||
alpha/me_cmp_mvi_asm.o
|
||||
OBJS-$(CONFIG_HPELDSP) += alpha/hpeldsp_alpha.o \
|
||||
alpha/hpeldsp_alpha_asm.o
|
||||
OBJS-$(CONFIG_IDCTDSP) += alpha/idctdsp_alpha.o \
|
||||
|
@@ -1,112 +0,0 @@
|
||||
/*
|
||||
* Alpha optimized DSP utils
|
||||
* Copyright (c) 2002 Falk Hueffner <falk@debian.org>
|
||||
*
|
||||
* This file is part of FFmpeg.
|
||||
*
|
||||
* FFmpeg is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* FFmpeg is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with FFmpeg; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include "libavutil/attributes.h"
|
||||
#include "libavcodec/dsputil.h"
|
||||
#include "dsputil_alpha.h"
|
||||
#include "asm.h"
|
||||
|
||||
#if 0
|
||||
/* These functions were the base for the optimized assembler routines,
|
||||
and remain here for documentation purposes. */
|
||||
static void put_pixels_clamped_mvi(const int16_t *block, uint8_t *pixels,
|
||||
ptrdiff_t line_size)
|
||||
{
|
||||
int i = 8;
|
||||
uint64_t clampmask = zap(-1, 0xaa); /* 0x00ff00ff00ff00ff */
|
||||
|
||||
do {
|
||||
uint64_t shorts0, shorts1;
|
||||
|
||||
shorts0 = ldq(block);
|
||||
shorts0 = maxsw4(shorts0, 0);
|
||||
shorts0 = minsw4(shorts0, clampmask);
|
||||
stl(pkwb(shorts0), pixels);
|
||||
|
||||
shorts1 = ldq(block + 4);
|
||||
shorts1 = maxsw4(shorts1, 0);
|
||||
shorts1 = minsw4(shorts1, clampmask);
|
||||
stl(pkwb(shorts1), pixels + 4);
|
||||
|
||||
pixels += line_size;
|
||||
block += 8;
|
||||
} while (--i);
|
||||
}
|
||||
|
||||
void add_pixels_clamped_mvi(const int16_t *block, uint8_t *pixels,
|
||||
ptrdiff_t line_size)
|
||||
{
|
||||
int h = 8;
|
||||
/* Keep this function a leaf function by generating the constants
|
||||
manually (mainly for the hack value ;-). */
|
||||
uint64_t clampmask = zap(-1, 0xaa); /* 0x00ff00ff00ff00ff */
|
||||
uint64_t signmask = zap(-1, 0x33);
|
||||
signmask ^= signmask >> 1; /* 0x8000800080008000 */
|
||||
|
||||
do {
|
||||
uint64_t shorts0, pix0, signs0;
|
||||
uint64_t shorts1, pix1, signs1;
|
||||
|
||||
shorts0 = ldq(block);
|
||||
shorts1 = ldq(block + 4);
|
||||
|
||||
pix0 = unpkbw(ldl(pixels));
|
||||
/* Signed subword add (MMX paddw). */
|
||||
signs0 = shorts0 & signmask;
|
||||
shorts0 &= ~signmask;
|
||||
shorts0 += pix0;
|
||||
shorts0 ^= signs0;
|
||||
/* Clamp. */
|
||||
shorts0 = maxsw4(shorts0, 0);
|
||||
shorts0 = minsw4(shorts0, clampmask);
|
||||
|
||||
/* Next 4. */
|
||||
pix1 = unpkbw(ldl(pixels + 4));
|
||||
signs1 = shorts1 & signmask;
|
||||
shorts1 &= ~signmask;
|
||||
shorts1 += pix1;
|
||||
shorts1 ^= signs1;
|
||||
shorts1 = maxsw4(shorts1, 0);
|
||||
shorts1 = minsw4(shorts1, clampmask);
|
||||
|
||||
stl(pkwb(shorts0), pixels);
|
||||
stl(pkwb(shorts1), pixels + 4);
|
||||
|
||||
pixels += line_size;
|
||||
block += 8;
|
||||
} while (--h);
|
||||
}
|
||||
#endif
|
||||
|
||||
av_cold void ff_dsputil_init_alpha(DSPContext *c, AVCodecContext *avctx)
|
||||
{
|
||||
/* amask clears all bits that correspond to present features. */
|
||||
if (amask(AMASK_MVI) == 0) {
|
||||
c->sad[0] = pix_abs16x16_mvi_asm;
|
||||
c->sad[1] = pix_abs8x8_mvi;
|
||||
c->pix_abs[0][0] = pix_abs16x16_mvi_asm;
|
||||
c->pix_abs[1][0] = pix_abs8x8_mvi;
|
||||
c->pix_abs[0][1] = pix_abs16x16_x2_mvi;
|
||||
c->pix_abs[0][2] = pix_abs16x16_y2_mvi;
|
||||
c->pix_abs[0][3] = pix_abs16x16_xy2_mvi;
|
||||
}
|
||||
|
||||
}
|
@@ -33,6 +33,78 @@ void (*put_pixels_clamped_axp_p)(const int16_t *block, uint8_t *pixels,
|
||||
void (*add_pixels_clamped_axp_p)(const int16_t *block, uint8_t *pixels,
|
||||
int line_size);
|
||||
|
||||
#if 0
|
||||
/* These functions were the base for the optimized assembler routines,
|
||||
and remain here for documentation purposes. */
|
||||
static void put_pixels_clamped_mvi(const int16_t *block, uint8_t *pixels,
|
||||
ptrdiff_t line_size)
|
||||
{
|
||||
int i = 8;
|
||||
uint64_t clampmask = zap(-1, 0xaa); /* 0x00ff00ff00ff00ff */
|
||||
|
||||
do {
|
||||
uint64_t shorts0, shorts1;
|
||||
|
||||
shorts0 = ldq(block);
|
||||
shorts0 = maxsw4(shorts0, 0);
|
||||
shorts0 = minsw4(shorts0, clampmask);
|
||||
stl(pkwb(shorts0), pixels);
|
||||
|
||||
shorts1 = ldq(block + 4);
|
||||
shorts1 = maxsw4(shorts1, 0);
|
||||
shorts1 = minsw4(shorts1, clampmask);
|
||||
stl(pkwb(shorts1), pixels + 4);
|
||||
|
||||
pixels += line_size;
|
||||
block += 8;
|
||||
} while (--i);
|
||||
}
|
||||
|
||||
void add_pixels_clamped_mvi(const int16_t *block, uint8_t *pixels,
|
||||
ptrdiff_t line_size)
|
||||
{
|
||||
int h = 8;
|
||||
/* Keep this function a leaf function by generating the constants
|
||||
manually (mainly for the hack value ;-). */
|
||||
uint64_t clampmask = zap(-1, 0xaa); /* 0x00ff00ff00ff00ff */
|
||||
uint64_t signmask = zap(-1, 0x33);
|
||||
signmask ^= signmask >> 1; /* 0x8000800080008000 */
|
||||
|
||||
do {
|
||||
uint64_t shorts0, pix0, signs0;
|
||||
uint64_t shorts1, pix1, signs1;
|
||||
|
||||
shorts0 = ldq(block);
|
||||
shorts1 = ldq(block + 4);
|
||||
|
||||
pix0 = unpkbw(ldl(pixels));
|
||||
/* Signed subword add (MMX paddw). */
|
||||
signs0 = shorts0 & signmask;
|
||||
shorts0 &= ~signmask;
|
||||
shorts0 += pix0;
|
||||
shorts0 ^= signs0;
|
||||
/* Clamp. */
|
||||
shorts0 = maxsw4(shorts0, 0);
|
||||
shorts0 = minsw4(shorts0, clampmask);
|
||||
|
||||
/* Next 4. */
|
||||
pix1 = unpkbw(ldl(pixels + 4));
|
||||
signs1 = shorts1 & signmask;
|
||||
shorts1 &= ~signmask;
|
||||
shorts1 += pix1;
|
||||
shorts1 ^= signs1;
|
||||
shorts1 = maxsw4(shorts1, 0);
|
||||
shorts1 = minsw4(shorts1, clampmask);
|
||||
|
||||
stl(pkwb(shorts0), pixels);
|
||||
stl(pkwb(shorts1), pixels + 4);
|
||||
|
||||
pixels += line_size;
|
||||
block += 8;
|
||||
} while (--h);
|
||||
}
|
||||
#endif
|
||||
|
||||
av_cold void ff_idctdsp_init_alpha(IDCTDSPContext *c, AVCodecContext *avctx,
|
||||
unsigned high_bit_depth)
|
||||
{
|
||||
|
@@ -19,9 +19,12 @@
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include "dsputil_alpha.h"
|
||||
#include "libavutil/attributes.h"
|
||||
#include "libavcodec/me_cmp.h"
|
||||
#include "asm.h"
|
||||
|
||||
int pix_abs16x16_mvi_asm(void *v, uint8_t *pix1, uint8_t *pix2, int line_size, int h);
|
||||
|
||||
static inline uint64_t avg2(uint64_t a, uint64_t b)
|
||||
{
|
||||
return (a | b) - (((a ^ b) & BYTE_VEC(0xfe)) >> 1);
|
||||
@@ -41,7 +44,7 @@ static inline uint64_t avg4(uint64_t l1, uint64_t l2, uint64_t l3, uint64_t l4)
|
||||
return r1 + r2;
|
||||
}
|
||||
|
||||
int pix_abs8x8_mvi(void *v, uint8_t *pix1, uint8_t *pix2, int line_size, int h)
|
||||
static int pix_abs8x8_mvi(void *v, uint8_t *pix1, uint8_t *pix2, int line_size, int h)
|
||||
{
|
||||
int result = 0;
|
||||
|
||||
@@ -116,7 +119,7 @@ int pix_abs16x16_mvi(uint8_t *pix1, uint8_t *pix2, int line_size)
|
||||
}
|
||||
#endif
|
||||
|
||||
int pix_abs16x16_x2_mvi(void *v, uint8_t *pix1, uint8_t *pix2, int line_size, int h)
|
||||
static int pix_abs16x16_x2_mvi(void *v, uint8_t *pix1, uint8_t *pix2, int line_size, int h)
|
||||
{
|
||||
int result = 0;
|
||||
uint64_t disalign = (size_t) pix2 & 0x7;
|
||||
@@ -189,7 +192,7 @@ int pix_abs16x16_x2_mvi(void *v, uint8_t *pix1, uint8_t *pix2, int line_size, in
|
||||
return result;
|
||||
}
|
||||
|
||||
int pix_abs16x16_y2_mvi(void *v, uint8_t *pix1, uint8_t *pix2, int line_size, int h)
|
||||
static int pix_abs16x16_y2_mvi(void *v, uint8_t *pix1, uint8_t *pix2, int line_size, int h)
|
||||
{
|
||||
int result = 0;
|
||||
|
||||
@@ -242,7 +245,7 @@ int pix_abs16x16_y2_mvi(void *v, uint8_t *pix1, uint8_t *pix2, int line_size, in
|
||||
return result;
|
||||
}
|
||||
|
||||
int pix_abs16x16_xy2_mvi(void *v, uint8_t *pix1, uint8_t *pix2, int line_size, int h)
|
||||
static int pix_abs16x16_xy2_mvi(void *v, uint8_t *pix1, uint8_t *pix2, int line_size, int h)
|
||||
{
|
||||
int result = 0;
|
||||
|
||||
@@ -298,3 +301,17 @@ int pix_abs16x16_xy2_mvi(void *v, uint8_t *pix1, uint8_t *pix2, int line_size, i
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
av_cold void ff_me_cmp_init_alpha(MECmpContext *c, AVCodecContext *avctx)
|
||||
{
|
||||
/* amask clears all bits that correspond to present features. */
|
||||
if (amask(AMASK_MVI) == 0) {
|
||||
c->sad[0] = pix_abs16x16_mvi_asm;
|
||||
c->sad[1] = pix_abs8x8_mvi;
|
||||
c->pix_abs[0][0] = pix_abs16x16_mvi_asm;
|
||||
c->pix_abs[1][0] = pix_abs8x8_mvi;
|
||||
c->pix_abs[0][1] = pix_abs16x16_x2_mvi;
|
||||
c->pix_abs[0][2] = pix_abs16x16_y2_mvi;
|
||||
c->pix_abs[0][3] = pix_abs16x16_xy2_mvi;
|
||||
}
|
||||
}
|
@@ -103,7 +103,7 @@ static void dct_unquantize_h263_inter_axp(MpegEncContext *s, int16_t *block,
|
||||
dct_unquantize_h263_axp(block, n_coeffs, qscale, (qscale - 1) | 1);
|
||||
}
|
||||
|
||||
av_cold void ff_MPV_common_init_axp(MpegEncContext *s)
|
||||
av_cold void ff_mpv_common_init_axp(MpegEncContext *s)
|
||||
{
|
||||
s->dct_unquantize_h263_intra = dct_unquantize_h263_intra_axp;
|
||||
s->dct_unquantize_h263_inter = dct_unquantize_h263_inter_axp;
|
||||
|
@@ -19,12 +19,11 @@
|
||||
*/
|
||||
|
||||
#include "libavutil/attributes.h"
|
||||
#include "libavcodec/dsputil.h"
|
||||
#include "libavcodec/pixblockdsp.h"
|
||||
#include "asm.h"
|
||||
|
||||
static void get_pixels_mvi(int16_t *restrict block,
|
||||
const uint8_t *restrict pixels, int line_size)
|
||||
const uint8_t *restrict pixels, ptrdiff_t line_size)
|
||||
{
|
||||
int h = 8;
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user