Compare commits
2062 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
3429714f3d | ||
![]() |
ee902d3d2d | ||
![]() |
9bc62da980 | ||
![]() |
2a6d16ba5f | ||
![]() |
c7e967a7cb | ||
![]() |
5262c88bb0 | ||
![]() |
bd78b9416d | ||
![]() |
48ae72e501 | ||
![]() |
0f671dfeac | ||
![]() |
345962121d | ||
![]() |
0cbf53bdf5 | ||
![]() |
b20409c690 | ||
![]() |
7997ec54c9 | ||
![]() |
e805826903 | ||
![]() |
137a000377 | ||
![]() |
78c314e39e | ||
![]() |
756d85dc14 | ||
![]() |
eeab3e1b20 | ||
![]() |
a75787a71a | ||
![]() |
09425294c9 | ||
![]() |
3572eaaf02 | ||
![]() |
25da8d84a4 | ||
![]() |
0f642909d8 | ||
![]() |
6252e9141b | ||
![]() |
c65a731b6f | ||
![]() |
58096b70fa | ||
![]() |
0ae93844d0 | ||
![]() |
657dc91b44 | ||
![]() |
352d17086f | ||
![]() |
193440f566 | ||
![]() |
563e542b31 | ||
![]() |
b0b6d8de7e | ||
![]() |
2f5c5767d1 | ||
![]() |
979a54ed18 | ||
![]() |
d11bca8043 | ||
![]() |
a3ef410b9c | ||
![]() |
260e5c6dbe | ||
![]() |
bac6554c74 | ||
![]() |
1e366c15ed | ||
![]() |
675fb3a8af | ||
![]() |
25fc0faccb | ||
![]() |
164083434e | ||
![]() |
8026606497 | ||
![]() |
6ac8ac0109 | ||
![]() |
f07e2ff697 | ||
![]() |
b62b3e1a25 | ||
![]() |
a45b8af839 | ||
![]() |
a443b48ccf | ||
![]() |
a45402d4c0 | ||
![]() |
0bdc64e8b9 | ||
![]() |
5fbf63ea39 | ||
![]() |
4d74bb24e3 | ||
![]() |
7f8d0cf93a | ||
![]() |
28fba55306 | ||
![]() |
7caee17204 | ||
![]() |
edec2a4da3 | ||
![]() |
65074a5dae | ||
![]() |
e3b6144e0c | ||
![]() |
8acbba0ec3 | ||
![]() |
9e9cde6afa | ||
![]() |
4f8814964c | ||
![]() |
8a6770a214 | ||
![]() |
763e6ecf83 | ||
![]() |
07d508e4f5 | ||
![]() |
b089b58250 | ||
![]() |
a7dd37169c | ||
![]() |
3032291b3a | ||
![]() |
f9bbc26e69 | ||
![]() |
b895e29941 | ||
![]() |
3d71024f8a | ||
![]() |
b834dc14da | ||
![]() |
d0041dc8c4 | ||
![]() |
b3c082412c | ||
![]() |
918ed73b70 | ||
![]() |
2791eba1d7 | ||
![]() |
0d3a07852c | ||
![]() |
c7a2ac6b6b | ||
![]() |
0ce35b8ce8 | ||
![]() |
25312a427b | ||
![]() |
9143ab0e5a | ||
![]() |
022bfd3dd4 | ||
![]() |
e0a12b3dc3 | ||
![]() |
252ba4a925 | ||
![]() |
5bb31e856d | ||
![]() |
eac0451e47 | ||
![]() |
68c6347089 | ||
![]() |
bcd7f35717 | ||
![]() |
93cbdcd4d3 | ||
![]() |
959ab06c68 | ||
![]() |
46db3121c6 | ||
![]() |
c96c755320 | ||
![]() |
9f8cdd520b | ||
![]() |
f5631d23e0 | ||
![]() |
50f4543c6b | ||
![]() |
1344e91f33 | ||
![]() |
f13e6ec7a6 | ||
![]() |
bf2c9e1ad4 | ||
![]() |
0663aab1d9 | ||
![]() |
e911f125fc | ||
![]() |
5aead5ee05 | ||
![]() |
3a5b749d7c | ||
![]() |
4b4d0b0290 | ||
![]() |
c9b25252cb | ||
![]() |
4400385d5f | ||
![]() |
d85e25fe0b | ||
![]() |
3d1972d182 | ||
![]() |
71b1abe638 | ||
![]() |
991ef3a67e | ||
![]() |
b850b01533 | ||
![]() |
23a17b4a3d | ||
![]() |
3a8ad4b878 | ||
![]() |
b85a939633 | ||
![]() |
7e130ca5b4 | ||
![]() |
f295f9488a | ||
![]() |
2c01dd2ea5 | ||
![]() |
5e26152ee4 | ||
![]() |
135c733125 | ||
![]() |
3b3a3c3d44 | ||
![]() |
13244abcd3 | ||
![]() |
9783d5bfda | ||
![]() |
0e4efad93c | ||
![]() |
0103bc67fd | ||
![]() |
d5af3fb1c5 | ||
![]() |
6ec5a199ea | ||
![]() |
f7b5366657 | ||
![]() |
542332e523 | ||
![]() |
aa24dd487f | ||
![]() |
3bcd1daad7 | ||
![]() |
91f88eab32 | ||
![]() |
aac467ae17 | ||
![]() |
968e733b2e | ||
![]() |
192d46e6d1 | ||
![]() |
bb8614cb7b | ||
![]() |
d9bdf7d9ae | ||
![]() |
a588e1e560 | ||
![]() |
36e7385d0e | ||
![]() |
5108323aa9 | ||
![]() |
1d69ab9d1c | ||
![]() |
6e9b060e4f | ||
![]() |
08aec6f68e | ||
![]() |
49d9cbe55d | ||
![]() |
dac9e50902 | ||
![]() |
43520771f1 | ||
![]() |
1027a44681 | ||
![]() |
650aa36f35 | ||
![]() |
8524558858 | ||
![]() |
a6f730730b | ||
![]() |
eac5c7b837 | ||
![]() |
868cec5874 | ||
![]() |
534f901fca | ||
![]() |
c5dc8cc03a | ||
![]() |
e316caf712 | ||
![]() |
9fa056ba75 | ||
![]() |
242f1152bf | ||
![]() |
5a57f389f4 | ||
![]() |
7a4be4315f | ||
![]() |
ebc29e8625 | ||
![]() |
b329460c51 | ||
![]() |
d76adfae9c | ||
![]() |
fc469e5c7f | ||
![]() |
02444f02f1 | ||
![]() |
781a5a392c | ||
![]() |
302ed9c43f | ||
![]() |
2f4233614a | ||
![]() |
c8ac46e924 | ||
![]() |
8b0226f2a6 | ||
![]() |
d0b0fe6691 | ||
![]() |
1537d0b432 | ||
![]() |
61d0a6dd95 | ||
![]() |
9adc999d2a | ||
![]() |
68b8e21b8b | ||
![]() |
46b64e3098 | ||
![]() |
6c96aa0606 | ||
![]() |
cfcaf6b38e | ||
![]() |
59f1f764d6 | ||
![]() |
b4d41beebe | ||
![]() |
2e0935965b | ||
![]() |
7319a47c7e | ||
![]() |
8f8caca224 | ||
![]() |
26e20dfd06 | ||
![]() |
3cec81f4d4 | ||
![]() |
e352b29371 | ||
![]() |
5639ed9abb | ||
![]() |
604c9b1196 | ||
![]() |
7464e98f74 | ||
![]() |
d7716961a8 | ||
![]() |
543fceba9c | ||
![]() |
f151f5415a | ||
![]() |
7f6515e491 | ||
![]() |
ea5423a017 | ||
![]() |
42801505cd | ||
![]() |
ed49b142bb | ||
![]() |
24e7e0237b | ||
![]() |
00d4013d9f | ||
![]() |
55a06b4619 | ||
![]() |
9978916c53 | ||
![]() |
51f2422c2b | ||
![]() |
00d4759134 | ||
![]() |
3384d76503 | ||
![]() |
24fdf7334d | ||
![]() |
e4a77dc204 | ||
![]() |
b50e003e1c | ||
![]() |
928322c15f | ||
![]() |
b28652599d | ||
![]() |
8653419e9d | ||
![]() |
e5d217f048 | ||
![]() |
21c0c0f9d4 | ||
![]() |
d828b08143 | ||
![]() |
7944065114 | ||
![]() |
4c592c3908 | ||
![]() |
0b5adc3520 | ||
![]() |
6b0ab561d0 | ||
![]() |
93f959b672 | ||
![]() |
1aca990bd9 | ||
![]() |
2fbb9e647c | ||
![]() |
6a2bfd52e5 | ||
![]() |
e74f2be1ed | ||
![]() |
e4788e9cd9 | ||
![]() |
fc9ced41e4 | ||
![]() |
2336c76d5a | ||
![]() |
b0464212bd | ||
![]() |
14285c3331 | ||
![]() |
cae851c789 | ||
![]() |
5bf4cd8e5b | ||
![]() |
c299b6fd08 | ||
![]() |
32eadfe453 | ||
![]() |
090a7801a8 | ||
![]() |
2db29482f1 | ||
![]() |
0cb994dfe3 | ||
![]() |
8895bf7b78 | ||
![]() |
0f257e29c5 | ||
![]() |
dd5d617956 | ||
![]() |
27897d2ef6 | ||
![]() |
cb58c771ad | ||
![]() |
491805636c | ||
![]() |
ebf2052a61 | ||
![]() |
885a763cac | ||
![]() |
af8804ac86 | ||
![]() |
aff50ae1d1 | ||
![]() |
bd67d0ead1 | ||
![]() |
8cc5a78e45 | ||
![]() |
89f3043c7f | ||
![]() |
57c89c50bd | ||
![]() |
f001a2bd34 | ||
![]() |
5ce070c16c | ||
![]() |
21ff626ce0 | ||
![]() |
900fff89c9 | ||
![]() |
42a095d095 | ||
![]() |
a105c1f204 | ||
![]() |
fcae9f212a | ||
![]() |
a9d8d35e48 | ||
![]() |
01eac895ab | ||
![]() |
44127b157e | ||
![]() |
3c3b8003a1 | ||
![]() |
857e6667f9 | ||
![]() |
ea38e5a6b7 | ||
![]() |
cfd83a8af6 | ||
![]() |
7dfee8d697 | ||
![]() |
95fc80672f | ||
![]() |
fae545ca2a | ||
![]() |
449bd3c0c3 | ||
![]() |
6db8cd8f37 | ||
![]() |
f00e9c4b10 | ||
![]() |
3ff3990104 | ||
![]() |
500d608861 | ||
![]() |
568853b8f5 | ||
![]() |
4760278007 | ||
![]() |
d0f8b94b43 | ||
![]() |
5269cef408 | ||
![]() |
970a8f1c25 | ||
![]() |
92fa1d9231 | ||
![]() |
5ab882d728 | ||
![]() |
98e8a9e2f2 | ||
![]() |
57e5812198 | ||
![]() |
29208e6dcf | ||
![]() |
1973079417 | ||
![]() |
96fda42a8f | ||
![]() |
fbd6c97f9c | ||
![]() |
2443e522f0 | ||
![]() |
0167fa0060 | ||
![]() |
22e557917d | ||
![]() |
4ae1d6021b | ||
![]() |
cc663bd13a | ||
![]() |
097de4d1d6 | ||
![]() |
675ac56b7e | ||
![]() |
79fd186a50 | ||
![]() |
9326d64ed1 | ||
![]() |
9f9440bd81 | ||
![]() |
e2b8b4caf6 | ||
![]() |
345cfd04d0 | ||
![]() |
3d0867917f | ||
![]() |
3cb0bec687 | ||
![]() |
ec6e035b8b | ||
![]() |
aaf6cc925f | ||
![]() |
6c2ed67c2f | ||
![]() |
f61cb6453d | ||
![]() |
d57a6d2087 | ||
![]() |
e98aced699 | ||
![]() |
c2ea7069c4 | ||
![]() |
9cb1d81a60 | ||
![]() |
82dda8e4ea | ||
![]() |
7acbd56a8a | ||
![]() |
9db78a296c | ||
![]() |
fad6865748 | ||
![]() |
cc5c667eb1 | ||
![]() |
56b98dfc4f | ||
![]() |
c7e8f610f2 | ||
![]() |
b424e67abf | ||
![]() |
36091742d1 | ||
![]() |
1d3a3b9f89 | ||
![]() |
1b5d112406 | ||
![]() |
9a53707e86 | ||
![]() |
79ceaf827b | ||
![]() |
8b8cb30d11 | ||
![]() |
0df95fa327 | ||
![]() |
b78074fd13 | ||
![]() |
234fb81e31 | ||
![]() |
ee37620b6a | ||
![]() |
5f30522894 | ||
![]() |
e5c01ccdf5 | ||
![]() |
2ad38c6e02 | ||
![]() |
4acefd2521 | ||
![]() |
5badcdf20d | ||
![]() |
1907ff0a67 | ||
![]() |
ea0d893817 | ||
![]() |
2a89afb376 | ||
![]() |
e29153f414 | ||
![]() |
23e91a1bfd | ||
![]() |
155f4dd668 | ||
![]() |
bc3d02fa88 | ||
![]() |
2f1de5ca13 | ||
![]() |
d0879a93ea | ||
![]() |
8cd80b5fcb | ||
![]() |
3d5d95db3f | ||
![]() |
0eecf40935 | ||
![]() |
f20141d73f | ||
![]() |
ca59b5b6ec | ||
![]() |
3fe3c8abb1 | ||
![]() |
8c9945285e | ||
![]() |
ba1a19bc35 | ||
![]() |
0e85a28fa4 | ||
![]() |
79f77ce31c | ||
![]() |
ed25ca1661 | ||
![]() |
bcccb2c298 | ||
![]() |
a63ec9d573 | ||
![]() |
0aa208837e | ||
![]() |
1f3d478898 | ||
![]() |
67dbf8bec9 | ||
![]() |
c724c82a78 | ||
![]() |
60420fa3dc | ||
![]() |
ca5c3ff909 | ||
![]() |
57ed5a64fe | ||
![]() |
16158da960 | ||
![]() |
51946d2de8 | ||
![]() |
d25afb579f | ||
![]() |
b67138598c | ||
![]() |
62e52b94e6 | ||
![]() |
c117da9d3e | ||
![]() |
bc75b64cff | ||
![]() |
ecfafc5f2b | ||
![]() |
71ecfcf2d3 | ||
![]() |
20f3cdf0c8 | ||
![]() |
0e3ea5b28a | ||
![]() |
b83beb131f | ||
![]() |
172d22a071 | ||
![]() |
03a17f2bbf | ||
![]() |
0bf416f262 | ||
![]() |
960aff379d | ||
![]() |
b9d08c77a4 | ||
![]() |
40665d27e3 | ||
![]() |
e6ea75c5e6 | ||
![]() |
9e1cfbd38a | ||
![]() |
f41cf2e09e | ||
![]() |
39f247121e | ||
![]() |
54170a33c2 | ||
![]() |
1d242f9816 | ||
![]() |
9a57309665 | ||
![]() |
7a19a8fb69 | ||
![]() |
96398cc123 | ||
![]() |
f41d409b7a | ||
![]() |
d2e0543766 | ||
![]() |
1db2d39dfd | ||
![]() |
4fecf170d7 | ||
![]() |
bcaef717ec | ||
![]() |
932d8d790c | ||
![]() |
010adacbe2 | ||
![]() |
ea41e6d637 | ||
![]() |
fe42f94ce1 | ||
![]() |
6f26f14f13 | ||
![]() |
b4d8724ab2 | ||
![]() |
c9d39fc8c6 | ||
![]() |
02cb7d4c9c | ||
![]() |
efe34e87eb | ||
![]() |
208f3abb91 | ||
![]() |
55b59fab88 | ||
![]() |
0562887a98 | ||
![]() |
299d8ab104 | ||
![]() |
30b8eb0f87 | ||
![]() |
b99ca86350 | ||
![]() |
277ff7f5dc | ||
![]() |
065923b078 | ||
![]() |
9c12c6ff95 | ||
![]() |
5182a2a235 | ||
![]() |
8294f5042d | ||
![]() |
60fd790f38 | ||
![]() |
4e9745fbff | ||
![]() |
331fae80a1 | ||
![]() |
305b03097d | ||
![]() |
78093cf849 | ||
![]() |
600e38f563 | ||
![]() |
6e411d9cc7 | ||
![]() |
8ef46f4a0c | ||
![]() |
cad3148ea3 | ||
![]() |
dfc6f56c5a | ||
![]() |
6369a7b742 | ||
![]() |
d0682b5eb0 | ||
![]() |
458aadf862 | ||
![]() |
f87a34486a | ||
![]() |
bceabbdaba | ||
![]() |
969382162f | ||
![]() |
691f9be622 | ||
![]() |
65ce8f8895 | ||
![]() |
9f0fd17c61 | ||
![]() |
6d8dda1693 | ||
![]() |
d899ea2017 | ||
![]() |
293fee4bc2 | ||
![]() |
f856d9c2f3 | ||
![]() |
eec7f032a9 | ||
![]() |
4b68edd08a | ||
![]() |
d3512a0e89 | ||
![]() |
ce6141259b | ||
![]() |
4327088da3 | ||
![]() |
2f6550bb9a | ||
![]() |
8437cc7206 | ||
![]() |
9146a47600 | ||
![]() |
7df2981f04 | ||
![]() |
8e6a44cfc5 | ||
![]() |
90c9b49405 | ||
![]() |
0b9a9e0e2c | ||
![]() |
33fc1ccb49 | ||
![]() |
478c61ccb2 | ||
![]() |
c2c27e9e51 | ||
![]() |
79be253635 | ||
![]() |
3bedd72a9e | ||
![]() |
14b9302f5f | ||
![]() |
08d81d0a01 | ||
![]() |
230aeee94c | ||
![]() |
e01acd868b | ||
![]() |
148506c965 | ||
![]() |
70e3fae88d | ||
![]() |
a82f3de053 | ||
![]() |
cd975d5658 | ||
![]() |
ac967ad872 | ||
![]() |
ad2424e6b2 | ||
![]() |
b9ffafbfcc | ||
![]() |
75819fafd8 | ||
![]() |
42f3cb419a | ||
![]() |
15ed7ca437 | ||
![]() |
5af0a701a1 | ||
![]() |
0c3ebbf6a5 | ||
![]() |
018ce90284 | ||
![]() |
d96d8e121f | ||
![]() |
2ae2c60554 | ||
![]() |
6995be43ae | ||
![]() |
883f85fa8f | ||
![]() |
c05310d469 | ||
![]() |
5d37d70b0b | ||
![]() |
33acebd3cc | ||
![]() |
367c9d33d6 | ||
![]() |
1f80742f49 | ||
![]() |
312daa1589 | ||
![]() |
d466d82faa | ||
![]() |
a42d5c861f | ||
![]() |
863ee8a855 | ||
![]() |
fd9badd3cb | ||
![]() |
aa8b39d999 | ||
![]() |
f0ae0354d3 | ||
![]() |
ab922f9ef1 | ||
![]() |
7d75a399a4 | ||
![]() |
21ded9ce67 | ||
![]() |
b054054c9b | ||
![]() |
9018bd1197 | ||
![]() |
8bce5c8e74 | ||
![]() |
17b7f99d81 | ||
![]() |
bab11fe7bf | ||
![]() |
1852b2a0f4 | ||
![]() |
0f8908aa1b | ||
![]() |
88b4c1a731 | ||
![]() |
e39f8fad32 | ||
![]() |
9266eb0c62 | ||
![]() |
29d208d5d4 | ||
![]() |
25ccf5df72 | ||
![]() |
c661601f45 | ||
![]() |
4388e78a0f | ||
![]() |
0dba982bb4 | ||
![]() |
fbb6de2ad7 | ||
![]() |
f3dcabef33 | ||
![]() |
660a8b43ab | ||
![]() |
be44856483 | ||
![]() |
33bc81e437 | ||
![]() |
de8cd93a05 | ||
![]() |
4e20e94921 | ||
![]() |
c509202590 | ||
![]() |
4ffec6d933 | ||
![]() |
b9792afad1 | ||
![]() |
beec818d99 | ||
![]() |
61fc1cbfbd | ||
![]() |
7fd10f66b7 | ||
![]() |
f918b8a293 | ||
![]() |
484d42a097 | ||
![]() |
9f6d48d696 | ||
![]() |
8b43b0e8b6 | ||
![]() |
873dac50f5 | ||
![]() |
5f8fcdd448 | ||
![]() |
568f1ecccf | ||
![]() |
6da12d46d3 | ||
![]() |
30d3f9769f | ||
![]() |
ea79dfbad3 | ||
![]() |
d1d3904273 | ||
![]() |
7813e6752b | ||
![]() |
bccae39072 | ||
![]() |
43c1d82b86 | ||
![]() |
9e526213a2 | ||
![]() |
aa97223f14 | ||
![]() |
06d2742899 | ||
![]() |
4eae568a07 | ||
![]() |
a54a51cc9b | ||
![]() |
bb5e148299 | ||
![]() |
98fbf8ef67 | ||
![]() |
ade140eb73 | ||
![]() |
4243415741 | ||
![]() |
0b75b6c3cd | ||
![]() |
9bb6e1175f | ||
![]() |
4cd4a6de4f | ||
![]() |
cdbebae444 | ||
![]() |
8426edef4c | ||
![]() |
7384ec19cf | ||
![]() |
9943c5a42b | ||
![]() |
2007082d2d | ||
![]() |
85dc006b1a | ||
![]() |
771656bd85 | ||
![]() |
a28468d0da | ||
![]() |
afbaa9a737 | ||
![]() |
e60c025e73 | ||
![]() |
4dc305d784 | ||
![]() |
3fa4351d6b | ||
![]() |
9257692ac1 | ||
![]() |
b5b15c4dd9 | ||
![]() |
9e0b0c60bd | ||
![]() |
1fddfaa282 | ||
![]() |
b96c1cd78b | ||
![]() |
894d10332c | ||
![]() |
92c07acce7 | ||
![]() |
c302d034ba | ||
![]() |
40ed1cbf14 | ||
![]() |
3847f3ab58 | ||
![]() |
fe5e6e34c0 | ||
![]() |
2ded57371a | ||
![]() |
0b3c230542 | ||
![]() |
70205f1799 | ||
![]() |
2d9d6afb8d | ||
![]() |
0f9eb9165b | ||
![]() |
cc5f731541 | ||
![]() |
4127d97c8d | ||
![]() |
bb7be3b763 | ||
![]() |
c88ae843da | ||
![]() |
91a9ae5b6b | ||
![]() |
0d5af820f7 | ||
![]() |
c23d7de22e | ||
![]() |
e078549421 | ||
![]() |
30156eab6d | ||
![]() |
c192be1968 | ||
![]() |
e7fdfbdc58 | ||
![]() |
f1b20930f2 | ||
![]() |
7cbe1e0447 | ||
![]() |
c64f361511 | ||
![]() |
4d0cd5f58c | ||
![]() |
8b573ddda7 | ||
![]() |
eac3ac1fe0 | ||
![]() |
eb335f3c5c | ||
![]() |
84c0ece5fd | ||
![]() |
a7b365ae19 | ||
![]() |
de1f8ead89 | ||
![]() |
16c01fb434 | ||
![]() |
84b9463984 | ||
![]() |
2c6a7f9348 | ||
![]() |
920bca3e23 | ||
![]() |
9421d974bc | ||
![]() |
4be03a7a6c | ||
![]() |
3f07dd6e39 | ||
![]() |
1a054bd187 | ||
![]() |
33d6f90e3e | ||
![]() |
20bf91f832 | ||
![]() |
7ababb85f9 | ||
![]() |
00672d2ce5 | ||
![]() |
51ddaf6549 | ||
![]() |
62eca2f827 | ||
![]() |
374c907fb3 | ||
![]() |
1de786777e | ||
![]() |
530eb6acf8 | ||
![]() |
ce80f9fee9 | ||
![]() |
ec01283752 | ||
![]() |
745730c9c2 | ||
![]() |
a38e06c1aa | ||
![]() |
2657f00d3f | ||
![]() |
6690d4c3f5 | ||
![]() |
bee5844ddd | ||
![]() |
eec693328a | ||
![]() |
01974a58df | ||
![]() |
4a30277a59 | ||
![]() |
c544ffd2ae | ||
![]() |
c727006616 | ||
![]() |
08ee02deca | ||
![]() |
f3cba01cce | ||
![]() |
c00365b46d | ||
![]() |
77204f7366 | ||
![]() |
7eece06934 | ||
![]() |
bca3c2cfc0 | ||
![]() |
8bc1553cdb | ||
![]() |
bd7d8604bd | ||
![]() |
454b714283 | ||
![]() |
be96201e5b | ||
![]() |
c4fb79a3db | ||
![]() |
9a796f7f18 | ||
![]() |
d1529273fb | ||
![]() |
a99004a926 | ||
![]() |
fda209b741 | ||
![]() |
a3c3ee6973 | ||
![]() |
7e91f77547 | ||
![]() |
18e4bf4f54 | ||
![]() |
6bf9786a9b | ||
![]() |
e070484040 | ||
![]() |
55f05ac0f1 | ||
![]() |
9f9c741771 | ||
![]() |
086487b633 | ||
![]() |
08bb6f919c | ||
![]() |
aea7616d39 | ||
![]() |
dcb10ef9bf | ||
![]() |
89e705cd5c | ||
![]() |
a2f05d3337 | ||
![]() |
7d37e45f6b | ||
![]() |
10411afdff | ||
![]() |
18fcdc0981 | ||
![]() |
deccb4d827 | ||
![]() |
ffaf2074eb | ||
![]() |
12630fa821 | ||
![]() |
2fa6d21124 | ||
![]() |
74d7db586a | ||
![]() |
b08fd7ea78 | ||
![]() |
42c8db69b6 | ||
![]() |
f3c324a0fe | ||
![]() |
8562c1483b | ||
![]() |
3a6bb97350 | ||
![]() |
05e4b25e9b | ||
![]() |
fb3eb57369 | ||
![]() |
18b46ecc93 | ||
![]() |
9d548fce24 | ||
![]() |
f043965cd5 | ||
![]() |
933eca91e6 | ||
![]() |
05e0ea6050 | ||
![]() |
6f373d75e8 | ||
![]() |
53ab7846ee | ||
![]() |
85929b9caa | ||
![]() |
d4065a9f47 | ||
![]() |
a5adeff457 | ||
![]() |
ac1735e76d | ||
![]() |
720a8d2b75 | ||
![]() |
2e1704059a | ||
![]() |
d16ec1b6db | ||
![]() |
60e0ee7ca2 | ||
![]() |
3a6ddfb874 | ||
![]() |
e4cb6abb2f | ||
![]() |
4b39cc1a09 | ||
![]() |
e6e6149630 | ||
![]() |
d525e662e4 | ||
![]() |
2045334239 | ||
![]() |
cde0ad5ea7 | ||
![]() |
00df32f6a9 | ||
![]() |
8cab24df07 | ||
![]() |
24ca2ffad8 | ||
![]() |
c25b6ae8a2 | ||
![]() |
6499e63f7b | ||
![]() |
4f313a50ee | ||
![]() |
b35fa04152 | ||
![]() |
3f1eaf590c | ||
![]() |
1523d1484d | ||
![]() |
98abb98cb1 | ||
![]() |
b186b7131e | ||
![]() |
57688aecbd | ||
![]() |
8349001638 | ||
![]() |
df8248f66e | ||
![]() |
3428865163 | ||
![]() |
5c805d69a4 | ||
![]() |
4001fc4267 | ||
![]() |
dae7e4e63d | ||
![]() |
3cec54b7d7 | ||
![]() |
2093c1dc51 | ||
![]() |
7a79c055e3 | ||
![]() |
45660c7d1b | ||
![]() |
057b74d19c | ||
![]() |
04f6a5230d | ||
![]() |
b697a3314e | ||
![]() |
dfa0800c41 | ||
![]() |
ecb748866e | ||
![]() |
785f71fcd5 | ||
![]() |
2c4d5d3497 | ||
![]() |
9b424accbe | ||
![]() |
e266e186cf | ||
![]() |
198e55bfa7 | ||
![]() |
b882079b12 | ||
![]() |
ccfae03815 | ||
![]() |
ef4e54e0df | ||
![]() |
94cf1ef008 | ||
![]() |
7f8ef7876e | ||
![]() |
76fa78911f | ||
![]() |
946a5cb64d | ||
![]() |
0f29e92091 | ||
![]() |
7b824e8b25 | ||
![]() |
3c6e148e84 | ||
![]() |
8e6084eebe | ||
![]() |
64e12aec96 | ||
![]() |
3e1ac10345 | ||
![]() |
a2448cfe16 | ||
![]() |
59846452af | ||
![]() |
994ab1804b | ||
![]() |
c7384664ba | ||
![]() |
2b5c1efa14 | ||
![]() |
c6d7c201df | ||
![]() |
8e104619a6 | ||
![]() |
d5d2d6c3b8 | ||
![]() |
1a9c1333b5 | ||
![]() |
2ffb0598db | ||
![]() |
6abe7edabb | ||
![]() |
5aa710f461 | ||
![]() |
e9a6ae775d | ||
![]() |
4dda5e9b08 | ||
![]() |
28d82b7675 | ||
![]() |
2c98dc75f2 | ||
![]() |
e3f50f2471 | ||
![]() |
b1b1a7370e | ||
![]() |
bdcb5794f0 | ||
![]() |
aa7c429c4e | ||
![]() |
8dd0a2c5cf | ||
![]() |
b09cf8afc5 | ||
![]() |
29234f5681 | ||
![]() |
68a35473ed | ||
![]() |
2f6bb86f85 | ||
![]() |
173d51c982 | ||
![]() |
5aed6f56d9 | ||
![]() |
5dc0f607e7 | ||
![]() |
d03867c248 | ||
![]() |
84ccc317ce | ||
![]() |
39dfe6801a | ||
![]() |
e74e14608f | ||
![]() |
1f4bce894a | ||
![]() |
0ea54d698b | ||
![]() |
5e8e2f3861 | ||
![]() |
9d6ad68fa4 | ||
![]() |
12aab852c5 | ||
![]() |
597d826123 | ||
![]() |
dadc1f5ee9 | ||
![]() |
1e16492b98 | ||
![]() |
940f5c08e5 | ||
![]() |
69b2d43d6a | ||
![]() |
70cbb47360 | ||
![]() |
287eb69973 | ||
![]() |
eaf4ab9802 | ||
![]() |
e0c36f5825 | ||
![]() |
2813dabdd4 | ||
![]() |
4809ac75fc | ||
![]() |
6229f7823e | ||
![]() |
db36b6e2ac | ||
![]() |
261d2eaa7f | ||
![]() |
4dd85093f1 | ||
![]() |
db6be5416c | ||
![]() |
b54effba4f | ||
![]() |
4efc79649b | ||
![]() |
bb60142f56 | ||
![]() |
7edb5eec4f | ||
![]() |
76bd8e16af | ||
![]() |
8d6b51b182 | ||
![]() |
d312769166 | ||
![]() |
9311026ec7 | ||
![]() |
aeb1621d1f | ||
![]() |
81e3f819bd | ||
![]() |
2c0bf76bb3 | ||
![]() |
17dc39e76b | ||
![]() |
5e08b54f47 | ||
![]() |
c9c7d59b7d | ||
![]() |
c6074a30ba | ||
![]() |
1b66726906 | ||
![]() |
4cb9f1a774 | ||
![]() |
60b0551334 | ||
![]() |
443502aed8 | ||
![]() |
2383323661 | ||
![]() |
1bdd21d975 | ||
![]() |
a6defd1f5b | ||
![]() |
9e9be5a20c | ||
![]() |
6f2068e626 | ||
![]() |
0e1ebfebc8 | ||
![]() |
7c61e4b1a0 | ||
![]() |
db71c4926d | ||
![]() |
cfaa233962 | ||
![]() |
bb38cb14cc | ||
![]() |
f349f4b550 | ||
![]() |
898e9a24ef | ||
![]() |
fe27aeaeab | ||
![]() |
52f954da75 | ||
![]() |
a83af3fc33 | ||
![]() |
b776113e5d | ||
![]() |
48efe9ec86 | ||
![]() |
35dcc8a040 | ||
![]() |
685f7227dc | ||
![]() |
758a66dc16 | ||
![]() |
5dcb99033d | ||
![]() |
8c28a39c2c | ||
![]() |
48c29883fc | ||
![]() |
7656c4c6e6 | ||
![]() |
e981de81fe | ||
![]() |
73f74f6b16 | ||
![]() |
a602f88e2d | ||
![]() |
a7d451c1dd | ||
![]() |
28396d17ff | ||
![]() |
e1ee0521a6 | ||
![]() |
ff9b21776b | ||
![]() |
30466cac9d | ||
![]() |
937ebb8435 | ||
![]() |
548a5f7ef6 | ||
![]() |
fc0a91e3cd | ||
![]() |
ae65a84517 | ||
![]() |
064a237669 | ||
![]() |
19d0949d31 | ||
![]() |
f6a8c77afb | ||
![]() |
9889b29ff4 | ||
![]() |
b44a242c3d | ||
![]() |
715ccc2bc4 | ||
![]() |
d99653c9e4 | ||
![]() |
0960cc4cc6 | ||
![]() |
b546023b93 | ||
![]() |
e971eef8c0 | ||
![]() |
4e179436b6 | ||
![]() |
457204ee15 | ||
![]() |
db2caf0a80 | ||
![]() |
86476c510e | ||
![]() |
7ba7277775 | ||
![]() |
cc4741888d | ||
![]() |
631ac655c0 | ||
![]() |
09f25533a5 | ||
![]() |
d1970929b5 | ||
![]() |
a1a259881f | ||
![]() |
e3e317e0c0 | ||
![]() |
55d592f7d9 | ||
![]() |
f9fa560597 | ||
![]() |
41ad87ad8e | ||
![]() |
29b1af40f3 | ||
![]() |
6f21fb7932 | ||
![]() |
b0ed88b4c0 | ||
![]() |
9ebfe38f38 | ||
![]() |
4436a8f44d | ||
![]() |
4342b346d2 | ||
![]() |
0bdc5db520 | ||
![]() |
9a5ac36b69 | ||
![]() |
8cb7b7b461 | ||
![]() |
95a449d3ce | ||
![]() |
2b14593148 | ||
![]() |
33301f0017 | ||
![]() |
c9a9a7a1fd | ||
![]() |
e2e36a739d | ||
![]() |
872c0bcd3c | ||
![]() |
2893d1b36d | ||
![]() |
0d71e825db | ||
![]() |
66e49ff3b9 | ||
![]() |
ed736890d6 | ||
![]() |
edff061fb0 | ||
![]() |
960c573cc5 | ||
![]() |
ddac3053cd | ||
![]() |
1a1a98f644 | ||
![]() |
9cbf70fa0e | ||
![]() |
e7d20f12c5 | ||
![]() |
79e0255956 | ||
![]() |
1d8a0c1b43 | ||
![]() |
897d5c3a42 | ||
![]() |
1384df6419 | ||
![]() |
4981baf9b8 | ||
![]() |
6a6c16cbcc | ||
![]() |
c11f731768 | ||
![]() |
b1c99f4c5f | ||
![]() |
2daae445c0 | ||
![]() |
b385c4c6a3 | ||
![]() |
93ab6693d8 | ||
![]() |
c53a1507aa | ||
![]() |
ad0cf8e063 | ||
![]() |
f663734738 | ||
![]() |
98d6f0ffef | ||
![]() |
c96a44d0dd | ||
![]() |
5241f90058 | ||
![]() |
199d9f995d | ||
![]() |
ac4a5e3abd | ||
![]() |
5d29efe4b0 | ||
![]() |
37b3361e75 | ||
![]() |
0a66647061 | ||
![]() |
e0a1d0a2b0 | ||
![]() |
d70e503ebc | ||
![]() |
be0356ca05 | ||
![]() |
8afaa03c53 | ||
![]() |
d5999b7f28 | ||
![]() |
da8cb1c361 | ||
![]() |
470e116e3f | ||
![]() |
e591608753 | ||
![]() |
0de64082a9 | ||
![]() |
cffd2713e9 | ||
![]() |
94fe404c25 | ||
![]() |
cfef947f7f | ||
![]() |
b6a9956396 | ||
![]() |
a51eb6d34c | ||
![]() |
042eba52a5 | ||
![]() |
c04c43b3e4 | ||
![]() |
4b2763cd13 | ||
![]() |
f74be3669d | ||
![]() |
7ffdc7bef2 | ||
![]() |
44fa2671e0 | ||
![]() |
5f7887ca8d | ||
![]() |
a0617025dd | ||
![]() |
05e59135b3 | ||
![]() |
acc897e6b1 | ||
![]() |
e839de0f85 | ||
![]() |
c070a87515 | ||
![]() |
7784f47762 | ||
![]() |
56dc46a189 | ||
![]() |
91e8d2eb1f | ||
![]() |
2f3fadfbe3 | ||
![]() |
5e80fb7ff2 | ||
![]() |
6896f95b24 | ||
![]() |
874792641e | ||
![]() |
817663897e | ||
![]() |
90cdec5e26 | ||
![]() |
a26d0ffa18 | ||
![]() |
4fd7067987 | ||
![]() |
a604de4fd8 | ||
![]() |
fdf22f973d | ||
![]() |
07c3a4f693 | ||
![]() |
513d57cc4d | ||
![]() |
a490391157 | ||
![]() |
37425fcb04 | ||
![]() |
43fee7ad92 | ||
![]() |
77f1199e8f | ||
![]() |
f2ffaae9ac | ||
![]() |
ae4bb6c488 | ||
![]() |
4ff670d99b | ||
![]() |
df82125acb | ||
![]() |
ce63cb4ff2 | ||
![]() |
d9103e848d | ||
![]() |
e1bcbca998 | ||
![]() |
567ea2d64c | ||
![]() |
a28313b09e | ||
![]() |
66b9e60af0 | ||
![]() |
786594184a | ||
![]() |
09024fe681 | ||
![]() |
97da68172a | ||
![]() |
e4f8a973aa | ||
![]() |
77ab341c0c | ||
![]() |
930ffd46e1 | ||
![]() |
dc351e1381 | ||
![]() |
3dae05f4f7 | ||
![]() |
09711545f5 | ||
![]() |
db0471c40f | ||
![]() |
a7f25979dd | ||
![]() |
a6593f7cc6 | ||
![]() |
716674b151 | ||
![]() |
bd0f866731 | ||
![]() |
9f6f407463 | ||
![]() |
f52b871761 | ||
![]() |
c442190a6b | ||
![]() |
898635ad9e | ||
![]() |
4bbd8f05f7 | ||
![]() |
5d590d87b3 | ||
![]() |
fe6f5f2908 | ||
![]() |
240b22afe1 | ||
![]() |
351d0f8b7a | ||
![]() |
50138ea4f7 | ||
![]() |
206c98f303 | ||
![]() |
ea0b9218f4 | ||
![]() |
2f221b6a93 | ||
![]() |
f0158e6f0c | ||
![]() |
4f4de7f49e | ||
![]() |
33aacb7750 | ||
![]() |
17cc78505c | ||
![]() |
200270cc8b | ||
![]() |
d457478fb0 | ||
![]() |
e6b7246a68 | ||
![]() |
9c097f1cfc | ||
![]() |
2121e3e130 | ||
![]() |
63e62cfbe2 | ||
![]() |
5ece4f8b73 | ||
![]() |
76886589ee | ||
![]() |
32a2876b12 | ||
![]() |
bab09864b4 | ||
![]() |
013c3eb05c | ||
![]() |
a52cb42ba6 | ||
![]() |
70b7cf9c39 | ||
![]() |
547fce9585 | ||
![]() |
f5abd12c4d | ||
![]() |
e9899ca3dd | ||
![]() |
5aaf5df06d | ||
![]() |
6d64a14e6d | ||
![]() |
ae437c7ce7 | ||
![]() |
ae6118de19 | ||
![]() |
2847843868 | ||
![]() |
8d9277c3c0 | ||
![]() |
46353759cb | ||
![]() |
e5054c8eed | ||
![]() |
842745fe17 | ||
![]() |
cc769931ab | ||
![]() |
d2d97b34a0 | ||
![]() |
ed1f8915da | ||
![]() |
fe72622819 | ||
![]() |
7f7facdeda | ||
![]() |
d5633dfc28 | ||
![]() |
0c6c5d7bcb | ||
![]() |
d15a94ba20 | ||
![]() |
dd2f868644 | ||
![]() |
77eff7a58a | ||
![]() |
61f1c96ef1 | ||
![]() |
8065a0cdbe | ||
![]() |
f76cd09d46 | ||
![]() |
fc8d59fa6f | ||
![]() |
2a26b22a17 | ||
![]() |
a1cb8779e2 | ||
![]() |
adfc3b81b1 | ||
![]() |
25a360286d | ||
![]() |
aae6b3b918 | ||
![]() |
c55d1d382c | ||
![]() |
00c67fe1d0 | ||
![]() |
47f1596ece | ||
![]() |
e91ba2efa9 | ||
![]() |
10e32618ac | ||
![]() |
db442c8736 | ||
![]() |
0c9f0da0f7 | ||
![]() |
792f0f2045 | ||
![]() |
8c0ae9015a | ||
![]() |
0e89d006d8 | ||
![]() |
7f24e1e1a2 | ||
![]() |
be787bccc0 | ||
![]() |
ad600e10da | ||
![]() |
39cce77faf | ||
![]() |
647405d111 | ||
![]() |
32e666c354 | ||
![]() |
f05855414e | ||
![]() |
23ec8db8a0 | ||
![]() |
d1b5ad3967 | ||
![]() |
a8605be30f | ||
![]() |
a3b1e42ec4 | ||
![]() |
cf589faa5b | ||
![]() |
600d5ee6b1 | ||
![]() |
a9911a1b2d | ||
![]() |
1e0b81abe8 | ||
![]() |
b2b79eca6f | ||
![]() |
573b1de2d7 | ||
![]() |
66b2a3fa31 | ||
![]() |
7729f43312 | ||
![]() |
265c4771cc | ||
![]() |
9a534eda46 | ||
![]() |
e08ff208c7 | ||
![]() |
363effbb99 | ||
![]() |
1700fa013e | ||
![]() |
a0528d9ddd | ||
![]() |
e5813d96d6 | ||
![]() |
faa9d29829 | ||
![]() |
84bf64d359 | ||
![]() |
e9ba309831 | ||
![]() |
2cd28693a5 | ||
![]() |
043ea6f7bf | ||
![]() |
f64d7e919e | ||
![]() |
b3d11437ca | ||
![]() |
931da6a5e9 | ||
![]() |
df74811cd5 | ||
![]() |
0c42f47e38 | ||
![]() |
2114e88432 | ||
![]() |
fd1652b3ba | ||
![]() |
c1e035ea89 | ||
![]() |
5b86447080 | ||
![]() |
238ed47fae | ||
![]() |
b608fba672 | ||
![]() |
19a6431ec2 | ||
![]() |
2612214555 | ||
![]() |
f3c0e0bf6f | ||
![]() |
1a25c336aa | ||
![]() |
b83affdc94 | ||
![]() |
1b17b64ee4 | ||
![]() |
37c3686155 | ||
![]() |
fc1b89d887 | ||
![]() |
f1c21a200b | ||
![]() |
86e5749285 | ||
![]() |
e70312dfc2 | ||
![]() |
a9179b5bd6 | ||
![]() |
beb944786e | ||
![]() |
4fa772acbb | ||
![]() |
280da99a8f | ||
![]() |
c2e995674f | ||
![]() |
dd5123a04c | ||
![]() |
ab9ba88877 | ||
![]() |
4ad1eba011 | ||
![]() |
ce91b2eae6 | ||
![]() |
26ab504ad8 | ||
![]() |
39680cacee | ||
![]() |
5145d22b88 | ||
![]() |
526886e606 | ||
![]() |
d4e8cc35b3 | ||
![]() |
0894b9405c | ||
![]() |
5ee6527c43 | ||
![]() |
9612dcd6b2 | ||
![]() |
76b9043e90 | ||
![]() |
f769671f86 | ||
![]() |
a38a1d516f | ||
![]() |
a050cf0c45 | ||
![]() |
3b20ed8548 | ||
![]() |
11467ecf51 | ||
![]() |
e6c66f1e4e | ||
![]() |
b46b233baf | ||
![]() |
090c67d586 | ||
![]() |
ed2e97ce6a | ||
![]() |
852aaead1f | ||
![]() |
69a9a90d2e | ||
![]() |
3b678da5e3 | ||
![]() |
4898440f6b | ||
![]() |
61e42c1124 | ||
![]() |
74141f693d | ||
![]() |
05da586fef | ||
![]() |
6fe02d25ee | ||
![]() |
2060f4cbba | ||
![]() |
c0002ddb01 | ||
![]() |
f0390638e0 | ||
![]() |
a9564e859b | ||
![]() |
a6674d2e77 | ||
![]() |
abaa41b642 | ||
![]() |
4360c6ff61 | ||
![]() |
4a39d4c65a | ||
![]() |
edb069e556 | ||
![]() |
3b709fd912 | ||
![]() |
50697ac5b2 | ||
![]() |
90bf1e3046 | ||
![]() |
ed6dad3737 | ||
![]() |
6b9b42cc55 | ||
![]() |
82ee7d0dda | ||
![]() |
3f8f1c6ff2 | ||
![]() |
9dcf239721 | ||
![]() |
851ace79a3 | ||
![]() |
a6555f88aa | ||
![]() |
13ee94a480 | ||
![]() |
5f55819850 | ||
![]() |
1cff908589 | ||
![]() |
1086f09da3 | ||
![]() |
80b29c2d0c | ||
![]() |
eacf2e8eb3 | ||
![]() |
ff03df6475 | ||
![]() |
2ce1054257 | ||
![]() |
39a7ded22d | ||
![]() |
e7513e1286 | ||
![]() |
af03ba9aa2 | ||
![]() |
0d96d44c4f | ||
![]() |
a630969535 | ||
![]() |
dd5c2fe177 | ||
![]() |
2fc970a6b8 | ||
![]() |
92d366f6ab | ||
![]() |
eeb9242b62 | ||
![]() |
48579041ba | ||
![]() |
5408d8828a | ||
![]() |
8be93ba049 | ||
![]() |
3ae818f6ab | ||
![]() |
45fd593531 | ||
![]() |
97a8f4dd11 | ||
![]() |
af89c14418 | ||
![]() |
d609566270 | ||
![]() |
6d2a2bfb59 | ||
![]() |
1945db1f13 | ||
![]() |
50dbe6b354 | ||
![]() |
7df3b426bb | ||
![]() |
ad6b00d85f | ||
![]() |
28c020d4df | ||
![]() |
e0caa1eb4e | ||
![]() |
3c1199c3c4 | ||
![]() |
7785ce1c76 | ||
![]() |
0b66fb4505 | ||
![]() |
f1ed83e23a | ||
![]() |
1967cd4e4c | ||
![]() |
ac84c1ce24 | ||
![]() |
4ef02ddd81 | ||
![]() |
59a4792830 | ||
![]() |
4ba5420e4d | ||
![]() |
4641ae352e | ||
![]() |
e56425d1a7 | ||
![]() |
279b2a4deb | ||
![]() |
2dbee1a393 | ||
![]() |
e744e9a305 | ||
![]() |
6ef5e29220 | ||
![]() |
7ad34f4456 | ||
![]() |
899d3706d8 | ||
![]() |
2c5ae57776 | ||
![]() |
2896b98183 | ||
![]() |
872e087305 | ||
![]() |
63001833c5 | ||
![]() |
8fd07fa6cc | ||
![]() |
e96ca404ea | ||
![]() |
ef363ebd59 | ||
![]() |
88b32673db | ||
![]() |
c63418e0a3 | ||
![]() |
99143140de | ||
![]() |
6df9d9b55d | ||
![]() |
d0c0930219 | ||
![]() |
248d8fb60c | ||
![]() |
e205429fcf | ||
![]() |
6fdf35fe35 | ||
![]() |
1bd0bdcdc2 | ||
![]() |
08e6832a94 | ||
![]() |
7f2af3f56b | ||
![]() |
20aac40571 | ||
![]() |
00dbd7c4ae | ||
![]() |
7a649e0783 | ||
![]() |
a1d06a0121 | ||
![]() |
70c9d40008 | ||
![]() |
5ea0753a15 | ||
![]() |
feb9057b83 | ||
![]() |
b76234c00c | ||
![]() |
ad83cfec5a | ||
![]() |
ad5f861b8c | ||
![]() |
7292b0477a | ||
![]() |
c5e337431b | ||
![]() |
24cd4e5071 | ||
![]() |
2de9c5ed98 | ||
![]() |
3c0b98dced | ||
![]() |
cebe8c8095 | ||
![]() |
6dc99fdf0e | ||
![]() |
27c61c32ce | ||
![]() |
d2f8ca4959 | ||
![]() |
f524d2e47c | ||
![]() |
0e8bfd3c93 | ||
![]() |
9bdb7a6c1a | ||
![]() |
ec6a5fc6cc | ||
![]() |
ad5c43bb36 | ||
![]() |
a39201818f | ||
![]() |
e397edbfba | ||
![]() |
c5ffd7aee5 | ||
![]() |
b6e8f10bcb | ||
![]() |
42316907b8 | ||
![]() |
dd3f1563d7 | ||
![]() |
979062fe2f | ||
![]() |
840bc8e284 | ||
![]() |
6aa1cfed0b | ||
![]() |
da833a6d09 | ||
![]() |
3099008f07 | ||
![]() |
1922357e5a | ||
![]() |
4542615063 | ||
![]() |
2f74b8d0ed | ||
![]() |
d5a3a20d1e | ||
![]() |
17702f1fc5 | ||
![]() |
059c842818 | ||
![]() |
af7ca6ea12 | ||
![]() |
b69183f65d | ||
![]() |
be42c0b8d5 | ||
![]() |
7207dd8f82 | ||
![]() |
629b2ed0ac | ||
![]() |
f22aa6b841 | ||
![]() |
e73d26bbd6 | ||
![]() |
1372c55786 | ||
![]() |
843d7bb3a6 | ||
![]() |
7ba2e134fb | ||
![]() |
6e6b79e7b8 | ||
![]() |
04d8af5f17 | ||
![]() |
282c9354f1 | ||
![]() |
24dfd6e79b | ||
![]() |
315f9e929d | ||
![]() |
832b4c0a86 | ||
![]() |
cec4e1c7c7 | ||
![]() |
5753d96771 | ||
![]() |
e162db66a2 | ||
![]() |
20d3348e8a | ||
![]() |
2e0ac145d5 | ||
![]() |
e493814d61 | ||
![]() |
6ef4e0c8b8 | ||
![]() |
c04f125bb4 | ||
![]() |
36552345d0 | ||
![]() |
54112629f1 | ||
![]() |
ab077b3d7a | ||
![]() |
a001db2e2c | ||
![]() |
f31445a82d | ||
![]() |
04a4fb81b3 | ||
![]() |
ff68ceb1b5 | ||
![]() |
d2771a1dc0 | ||
![]() |
96bfb67747 | ||
![]() |
350ed18292 | ||
![]() |
322b571d55 | ||
![]() |
d1afd3e1d6 | ||
![]() |
7b48bf9524 | ||
![]() |
9fbc613f0d | ||
![]() |
d7f530b0d6 | ||
![]() |
02484d1a93 | ||
![]() |
8ab3b71e4b | ||
![]() |
b5583fc3e0 | ||
![]() |
81ce3f8e80 | ||
![]() |
9d86ce783b | ||
![]() |
d4e62ebae7 | ||
![]() |
c669af0f24 | ||
![]() |
3d25869605 | ||
![]() |
65639e6bef | ||
![]() |
f63d381387 | ||
![]() |
f22cf88fd3 | ||
![]() |
22cfa1f759 | ||
![]() |
9d51bad625 | ||
![]() |
a71a5c911e | ||
![]() |
69071e8e9c | ||
![]() |
057ea2a982 | ||
![]() |
5c8eb16769 | ||
![]() |
e23af4662d | ||
![]() |
765abb3b76 | ||
![]() |
c5e295cb9d | ||
![]() |
993a2487de | ||
![]() |
52bf4ad674 | ||
![]() |
fa040c2247 | ||
![]() |
837605704d | ||
![]() |
85cf049d50 | ||
![]() |
9bcc430481 | ||
![]() |
733db64ce0 | ||
![]() |
3a4c22f806 | ||
![]() |
0b2f860db5 | ||
![]() |
f4445c7be4 | ||
![]() |
bf301258b4 | ||
![]() |
25f4e9387d | ||
![]() |
ae6ba2db8f | ||
![]() |
0034314a69 | ||
![]() |
fc1eda543c | ||
![]() |
b7c77912b6 | ||
![]() |
963f761448 | ||
![]() |
088eca2816 | ||
![]() |
0d989dbfc4 | ||
![]() |
6d96c7ea89 | ||
![]() |
f401792595 | ||
![]() |
b48c95b6c9 | ||
![]() |
709ab39cb9 | ||
![]() |
1a5871d1be | ||
![]() |
8be1120deb | ||
![]() |
c48e8d9dca | ||
![]() |
fc67d937cc | ||
![]() |
ec8f56efad | ||
![]() |
17a065cf20 | ||
![]() |
7412835204 | ||
![]() |
17d16008be | ||
![]() |
7321fc2f43 | ||
![]() |
83a897656a | ||
![]() |
530c1441fd | ||
![]() |
15ec053c4c | ||
![]() |
c4f7bee087 | ||
![]() |
685be3d1ae | ||
![]() |
59b55c494e | ||
![]() |
66a68ddd1a | ||
![]() |
a75c2eb25a | ||
![]() |
946f95354b | ||
![]() |
a6e4ce9fd5 | ||
![]() |
6cbbf0592f | ||
![]() |
fb238f8230 | ||
![]() |
7891b4fa59 | ||
![]() |
178764e833 | ||
![]() |
e06263ef1e | ||
![]() |
0eabbe2101 | ||
![]() |
2c4d6a342d | ||
![]() |
0edf3e7a28 | ||
![]() |
9dac7977a9 | ||
![]() |
9bec3ca2b8 | ||
![]() |
f4cd8b80b9 | ||
![]() |
75c8d7c2b4 | ||
![]() |
0b0d47e4b2 | ||
![]() |
45fed258ee | ||
![]() |
e18fc35a07 | ||
![]() |
5a1aa55905 | ||
![]() |
242f8bb3a8 | ||
![]() |
ac1594bc17 | ||
![]() |
bae557edce | ||
![]() |
3dda0bbe42 | ||
![]() |
6cf9d02cea | ||
![]() |
1eda312aca | ||
![]() |
66e9f83953 | ||
![]() |
b01a2204b5 | ||
![]() |
7dba57d1fa | ||
![]() |
61c6e69709 | ||
![]() |
1dd38e99fd | ||
![]() |
9d1155dae3 | ||
![]() |
ee73a69020 | ||
![]() |
019ff7a0c3 | ||
![]() |
c40a1bd253 | ||
![]() |
a708689fda | ||
![]() |
1aed82846c | ||
![]() |
e65c776d18 | ||
![]() |
324b23dde1 | ||
![]() |
47e3e1097e | ||
![]() |
0db6bbb24c | ||
![]() |
c92965dbfb | ||
![]() |
c802a2e718 | ||
![]() |
aeb23fc454 | ||
![]() |
e58a140cf9 | ||
![]() |
cf83c01739 | ||
![]() |
f29c226af0 | ||
![]() |
bbd8c85263 | ||
![]() |
864f9326fb | ||
![]() |
f6bb2cd1b0 | ||
![]() |
080c846f59 | ||
![]() |
8bcf425d06 | ||
![]() |
4f1a252fd3 | ||
![]() |
ed3efbcd0c | ||
![]() |
aba61b22f7 | ||
![]() |
411be72dcb | ||
![]() |
a9b613b60e | ||
![]() |
293a8e426f | ||
![]() |
392b4b663c | ||
![]() |
979932378a | ||
![]() |
460b509a34 | ||
![]() |
0e406aba14 | ||
![]() |
d267a0f8c1 | ||
![]() |
004f1c6cf1 | ||
![]() |
46f52274f3 | ||
![]() |
7b6a97edd1 | ||
![]() |
2f7bd04afb | ||
![]() |
917f86f479 | ||
![]() |
f09162c06b | ||
![]() |
60a876fe7b | ||
![]() |
16f9f7b881 | ||
![]() |
cacc1dcadc | ||
![]() |
1b54e6b12b | ||
![]() |
8091fe3071 | ||
![]() |
c69f230a3a | ||
![]() |
79dd756e14 | ||
![]() |
ced7238cd0 | ||
![]() |
752e71e74f | ||
![]() |
8a95379990 | ||
![]() |
52b0a0ecaa | ||
![]() |
d281a87ae3 | ||
![]() |
462f2876ce | ||
![]() |
3e86ead383 | ||
![]() |
d9f272fe33 | ||
![]() |
40b9f28641 | ||
![]() |
bf700a995d | ||
![]() |
b243393e8b | ||
![]() |
d97d4795fd | ||
![]() |
8022bb1d92 | ||
![]() |
b629b421d7 | ||
![]() |
a9ed4f1d15 | ||
![]() |
6afc319eee | ||
![]() |
137f7a630b | ||
![]() |
a92192d2e4 | ||
![]() |
2b37864e7f | ||
![]() |
18255441dd | ||
![]() |
220a15c074 | ||
![]() |
09450c5509 | ||
![]() |
620e7f0f3b | ||
![]() |
801876fb07 | ||
![]() |
17085a0251 | ||
![]() |
74b0237798 | ||
![]() |
1ac5a29b2e | ||
![]() |
51c810e62b | ||
![]() |
fd937866f7 | ||
![]() |
a72e75bf98 | ||
![]() |
e5cfc8fdad | ||
![]() |
9b7f932ee5 | ||
![]() |
557d4c4eca | ||
![]() |
2d6e58497e | ||
![]() |
7ea1b3472a | ||
![]() |
d565fef1b8 | ||
![]() |
c1724623ce | ||
![]() |
e09a947c1a | ||
![]() |
676110e6d4 | ||
![]() |
0834f2056c | ||
![]() |
aae4f5108d | ||
![]() |
e3b28f10bb | ||
![]() |
5552594a44 | ||
![]() |
99c26805e9 | ||
![]() |
f43ac02723 | ||
![]() |
43fb16cf74 | ||
![]() |
9946da4976 | ||
![]() |
fd367668e1 | ||
![]() |
5ee6fb7583 | ||
![]() |
a74f8121d8 | ||
![]() |
c2c22c75cf | ||
![]() |
d58fa9482e | ||
![]() |
83f84e4c53 | ||
![]() |
4694c0bb7c | ||
![]() |
320ce9f284 | ||
![]() |
da2189596d | ||
![]() |
1f20fa2da8 | ||
![]() |
b9918a7688 | ||
![]() |
40f2b16d52 | ||
![]() |
d3d265bae2 | ||
![]() |
eabdc2a830 | ||
![]() |
2df0c32ea1 | ||
![]() |
f87134c7a1 | ||
![]() |
4da7111eb8 | ||
![]() |
0b7e5d0d75 | ||
![]() |
57884172e0 | ||
![]() |
c80a816142 | ||
![]() |
1f29e5d7a2 | ||
![]() |
a586b3d9b1 | ||
![]() |
a59808dd57 | ||
![]() |
b8c50becc8 | ||
![]() |
7a11333387 | ||
![]() |
25a4180825 | ||
![]() |
094b3ce835 | ||
![]() |
20a66868a2 | ||
![]() |
ca5a77191b | ||
![]() |
ccd04f4320 | ||
![]() |
687cc836ea | ||
![]() |
031285dedf | ||
![]() |
5afe1233c5 | ||
![]() |
941aaa39e8 | ||
![]() |
9a460db63b | ||
![]() |
1d3c87d6cd | ||
![]() |
59d8050df1 | ||
![]() |
76c70e33d2 | ||
![]() |
e44ee1eb8d | ||
![]() |
dad12ce452 | ||
![]() |
dbb472cb2f | ||
![]() |
95ee4e2ce7 | ||
![]() |
72f801619a | ||
![]() |
8bef433881 | ||
![]() |
acea53fea0 | ||
![]() |
28b829b8bb | ||
![]() |
20df02680c | ||
![]() |
bec077a1ab | ||
![]() |
bd239c9a2e | ||
![]() |
0db1f2c2c7 | ||
![]() |
903156aa8a | ||
![]() |
e24e5986a6 | ||
![]() |
3521c70dab | ||
![]() |
c712d240b1 | ||
![]() |
8c4ca4aa5a | ||
![]() |
140f535517 | ||
![]() |
c44d8d9552 | ||
![]() |
fba894615d | ||
![]() |
b8a55994f0 | ||
![]() |
ae17a0c258 | ||
![]() |
937aac4f97 | ||
![]() |
d246397161 | ||
![]() |
76d1ffffd0 | ||
![]() |
7028475f75 | ||
![]() |
c9791925a1 | ||
![]() |
544f811453 | ||
![]() |
cec7afd036 | ||
![]() |
fc6aa30459 | ||
![]() |
cb530dda7d | ||
![]() |
171d971dbf | ||
![]() |
5e6fd132ff | ||
![]() |
5402d1bce5 | ||
![]() |
ea77d3b889 | ||
![]() |
3537ddb76f | ||
![]() |
1d4579e38e | ||
![]() |
cd9d6399fd | ||
![]() |
3df8d52fcd | ||
![]() |
c839b0439f | ||
![]() |
8b2e9636c5 | ||
![]() |
c27328e749 | ||
![]() |
09e1ccc8cd | ||
![]() |
eb4f906900 | ||
![]() |
0d71bd5a94 | ||
![]() |
c1fa5d1bd4 | ||
![]() |
162b521108 | ||
![]() |
c5ca76ad3b | ||
![]() |
31dea05170 | ||
![]() |
54df78af65 | ||
![]() |
09c538b6e6 | ||
![]() |
b7c3bfd5eb | ||
![]() |
73ea3ffcd5 | ||
![]() |
19b4c0ccf9 | ||
![]() |
e96fb980dc | ||
![]() |
27123a77c1 | ||
![]() |
9665a0fdf6 | ||
![]() |
233f3ad869 | ||
![]() |
ce928d7d2b | ||
![]() |
8c6992bf0c | ||
![]() |
241b306b1e | ||
![]() |
0c06949314 | ||
![]() |
99afec08f8 | ||
![]() |
44198a728d | ||
![]() |
f3b54ee989 | ||
![]() |
7cda31cb92 | ||
![]() |
d5a6f11272 | ||
![]() |
7b973e7341 | ||
![]() |
d3834f2901 | ||
![]() |
2bc220958c | ||
![]() |
5d36e8527f | ||
![]() |
8cfb9ccfef | ||
![]() |
0578623039 | ||
![]() |
f9a1317479 | ||
![]() |
cf7b90dea2 | ||
![]() |
f6777ce6fe | ||
![]() |
5b134a0544 | ||
![]() |
3bc86462a2 | ||
![]() |
349a32c436 | ||
![]() |
6414c3ecd0 | ||
![]() |
923a242282 | ||
![]() |
7652b176fc | ||
![]() |
04d8f616fd | ||
![]() |
5f43a7957b | ||
![]() |
af28960412 | ||
![]() |
f0a6874de8 | ||
![]() |
e051d09c58 | ||
![]() |
f22f873ef0 | ||
![]() |
bb44f7d5d7 | ||
![]() |
7eb959bf0b | ||
![]() |
1b6172dcf6 | ||
![]() |
dc5560efda | ||
![]() |
10dd62737e | ||
![]() |
d5a3caef93 | ||
![]() |
9da679e77f | ||
![]() |
911ba8fb19 | ||
![]() |
be695ee389 | ||
![]() |
1a02e78653 | ||
![]() |
eddf95283f | ||
![]() |
65875a8b3b | ||
![]() |
0d8a3656ba | ||
![]() |
586ea0379c | ||
![]() |
91eef40203 | ||
![]() |
9d5fed6dc4 | ||
![]() |
167e6f1489 | ||
![]() |
9f3a70c442 | ||
![]() |
41e86146e7 | ||
![]() |
20a5956b8d | ||
![]() |
5a419b2dd1 | ||
![]() |
04ccd584a7 | ||
![]() |
c732c62cee | ||
![]() |
a2c00d22e7 | ||
![]() |
147f2e91ee | ||
![]() |
04d14c9b68 | ||
![]() |
7ae9791b64 | ||
![]() |
33db99548b | ||
![]() |
1d4480d376 | ||
![]() |
b15b06ebf5 | ||
![]() |
f703c8cc09 | ||
![]() |
fa8c6c1350 | ||
![]() |
f66fed6c42 | ||
![]() |
e97f38ce63 | ||
![]() |
b530e2e351 | ||
![]() |
3c1378ce0a | ||
![]() |
36e4b750a7 | ||
![]() |
2d91abade2 | ||
![]() |
82f8eb5f77 | ||
![]() |
f3296b9454 | ||
![]() |
344f8d307a | ||
![]() |
9db9b209e3 | ||
![]() |
1acc9189b4 | ||
![]() |
7d327d6242 | ||
![]() |
b36b2c89df | ||
![]() |
143a8a44f4 | ||
![]() |
abaf4245a1 | ||
![]() |
158b3fb584 | ||
![]() |
2d6f31730c | ||
![]() |
aba873bbd0 | ||
![]() |
33c8500db4 | ||
![]() |
018ca8b7f6 | ||
![]() |
9a03c23235 | ||
![]() |
d208d1eba3 | ||
![]() |
79a60c8e77 | ||
![]() |
0026c4ecfd | ||
![]() |
f0d1b3acdf | ||
![]() |
1c5647f419 | ||
![]() |
c9eac8062e | ||
![]() |
b60938e4fd | ||
![]() |
5c50214eed | ||
![]() |
3726d07a2a | ||
![]() |
4db0e8fd33 | ||
![]() |
a52384dcda | ||
![]() |
28816050e4 | ||
![]() |
b762494438 | ||
![]() |
d47dd84391 | ||
![]() |
153fadc390 | ||
![]() |
577899a645 | ||
![]() |
67ddf21611 | ||
![]() |
4d8356b678 | ||
![]() |
0e57c05118 | ||
![]() |
403133ab5e | ||
![]() |
573d333010 | ||
![]() |
a61899a0f1 | ||
![]() |
067d11bf71 | ||
![]() |
ec6a855b3a | ||
![]() |
0ba887bbf4 | ||
![]() |
8df41976b7 | ||
![]() |
10b6d7462c | ||
![]() |
b64b719ad5 | ||
![]() |
567c0dcee6 | ||
![]() |
8de1d67967 | ||
![]() |
bef067f88c | ||
![]() |
e3e158e81f | ||
![]() |
502cde409c | ||
![]() |
6b347f519d | ||
![]() |
f9fefa499f | ||
![]() |
02f7665a3c | ||
![]() |
fb7d8d50bc | ||
![]() |
ddc3768161 | ||
![]() |
ecf457f3ac | ||
![]() |
3bd9f17b8a | ||
![]() |
a578b93c73 | ||
![]() |
cc787709ee | ||
![]() |
903a0acba4 | ||
![]() |
e524a9b1ff | ||
![]() |
3e57520982 | ||
![]() |
71718de814 | ||
![]() |
1abb77285c | ||
![]() |
42111bb960 | ||
![]() |
c02ea58c5f | ||
![]() |
70eba7695c | ||
![]() |
904cfd257d | ||
![]() |
436206c175 | ||
![]() |
19fb476841 | ||
![]() |
89ac99ba5f | ||
![]() |
ce083282f0 | ||
![]() |
fcc1022611 | ||
![]() |
319424d25c | ||
![]() |
e81eca0ce5 | ||
![]() |
e079d43af8 | ||
![]() |
345160a9cd | ||
![]() |
8e5be0fffe | ||
![]() |
98baa8151a | ||
![]() |
de52af9017 | ||
![]() |
684508ba15 | ||
![]() |
2a5ac99e6e | ||
![]() |
5b9c817dc7 | ||
![]() |
89fa2b5616 | ||
![]() |
68211c70af | ||
![]() |
550f3e9df3 | ||
![]() |
578da1f0dd | ||
![]() |
4ba6371a83 | ||
![]() |
df8394c693 | ||
![]() |
aaf65bc2a5 | ||
![]() |
9734a7a1de | ||
![]() |
138902dfb6 | ||
![]() |
dceebe1a60 | ||
![]() |
36f3aec363 | ||
![]() |
7d97511e13 | ||
![]() |
27f6da2921 | ||
![]() |
c3d7f00ee3 | ||
![]() |
8c50704ebf | ||
![]() |
1c4c78ee40 | ||
![]() |
075a165d27 | ||
![]() |
c727401aa9 | ||
![]() |
883bc7d2e7 | ||
![]() |
dd3bfe3cc1 | ||
![]() |
8f1457864b | ||
![]() |
e7e5114c50 | ||
![]() |
55f03d8726 | ||
![]() |
e830902934 | ||
![]() |
3e2b745020 | ||
![]() |
e1c0cfaa41 | ||
![]() |
8b0e96e1f2 | ||
![]() |
97cb9b6cbb | ||
![]() |
d225b0f7aa | ||
![]() |
105654e376 | ||
![]() |
0de1d6287e | ||
![]() |
ddb813b0ef | ||
![]() |
5c378d6a6d | ||
![]() |
06e7d58410 | ||
![]() |
77b3e110d2 | ||
![]() |
a950edb472 | ||
![]() |
cdd6f059a6 | ||
![]() |
a9b10e1510 | ||
![]() |
0d92b0d5f4 | ||
![]() |
6ea357ea83 | ||
![]() |
23c9ebffb5 | ||
![]() |
1dbc3e8ac8 | ||
![]() |
81cee700f7 | ||
![]() |
6efe4137ce | ||
![]() |
80ca627abb | ||
![]() |
c9f2ec8a34 | ||
![]() |
c29d999f71 | ||
![]() |
8cde94ec0d | ||
![]() |
5dd4e644f3 | ||
![]() |
b1071db3df | ||
![]() |
8acb76567a | ||
![]() |
acebff8e5d | ||
![]() |
f2e53808e3 | ||
![]() |
0a7afedc48 | ||
![]() |
23f0e2edec | ||
![]() |
d10d1b8655 | ||
![]() |
9a3653c9ec | ||
![]() |
79551d2c7a | ||
![]() |
c8422f04a3 | ||
![]() |
07de0db74b | ||
![]() |
cda5d89def | ||
![]() |
0eb4a42812 | ||
![]() |
55180b3299 | ||
![]() |
d5ddcb5f8e | ||
![]() |
1cf4d2e9be | ||
![]() |
08ccc474b7 | ||
![]() |
61c0683080 | ||
![]() |
1441641d78 | ||
![]() |
a2d5f6b9db | ||
![]() |
56c47364c3 | ||
![]() |
46807921f7 | ||
![]() |
77ab7407c2 | ||
![]() |
19133e96d3 | ||
![]() |
cf32181b70 | ||
![]() |
2cd7c99498 | ||
![]() |
e3a00acde0 | ||
![]() |
8ba6945487 | ||
![]() |
a05f5052fe | ||
![]() |
3f5095f213 | ||
![]() |
755f7929c6 | ||
![]() |
b1a0fccd02 | ||
![]() |
579a0fdc21 | ||
![]() |
d22e88d120 | ||
![]() |
b28f470df0 | ||
![]() |
04152a31cb | ||
![]() |
a52f443714 | ||
![]() |
b7082d953f | ||
![]() |
3956b12fde | ||
![]() |
4d9a46fe31 | ||
![]() |
3edb9aaea6 | ||
![]() |
dd16a0d8cc | ||
![]() |
d85ebea3f3 | ||
![]() |
5672107ed6 | ||
![]() |
5517466804 | ||
![]() |
5ec90c90c6 | ||
![]() |
180d7f330b | ||
![]() |
71f6275169 | ||
![]() |
0e6bad1229 | ||
![]() |
3a6fa38fb1 | ||
![]() |
0aa5c5a89e | ||
![]() |
9ec52e5533 | ||
![]() |
ff5f5cbb46 | ||
![]() |
e58fc44649 | ||
![]() |
233d1acb70 | ||
![]() |
f183febcda | ||
![]() |
bfdf0f078a | ||
![]() |
2ec4a84dca | ||
![]() |
be5dd8aa55 | ||
![]() |
28b1698a7c | ||
![]() |
01831fd004 | ||
![]() |
eb1ac04e59 | ||
![]() |
ac6b5bb834 | ||
![]() |
26cd7b1e1a | ||
![]() |
b7a5538870 | ||
![]() |
5a5d454dcc | ||
![]() |
a9ea79bb49 | ||
![]() |
32288234a2 | ||
![]() |
e3e051c42c | ||
![]() |
7618d360ca | ||
![]() |
c895fa7f66 | ||
![]() |
15fda8bcf1 | ||
![]() |
b7caf89401 | ||
![]() |
4e03b2097c | ||
![]() |
ce42316321 | ||
![]() |
1c80c9d7ef | ||
![]() |
9d2cee52d3 | ||
![]() |
6cfbe1de5a | ||
![]() |
883e98bc25 | ||
![]() |
d995f0a155 | ||
![]() |
ecf5526578 | ||
![]() |
bde8eb7fa3 | ||
![]() |
7703995a2e | ||
![]() |
cc4992aaf3 | ||
![]() |
4c2fd4b262 | ||
![]() |
b39ebcddd4 | ||
![]() |
a97328afef | ||
![]() |
b5fe13448b | ||
![]() |
1964251be7 | ||
![]() |
ee2e5acdb1 | ||
![]() |
4c57be124f | ||
![]() |
b0458e62c8 | ||
![]() |
f2254e36c0 | ||
![]() |
b97f6ef956 | ||
![]() |
9ae83ece8a | ||
![]() |
7dd2005e1a | ||
![]() |
4d5b99dacd | ||
![]() |
1ea7a3e04e | ||
![]() |
92827e1869 | ||
![]() |
a69c70e148 | ||
![]() |
88c937fdc8 | ||
![]() |
475e3799cd | ||
![]() |
8de7bdd756 | ||
![]() |
a43bcaafe2 | ||
![]() |
c0f9df30dd | ||
![]() |
a829870b2f | ||
![]() |
4b892e469b | ||
![]() |
e113692c89 | ||
![]() |
ce6e46be72 | ||
![]() |
6d35aba167 | ||
![]() |
2497914a18 | ||
![]() |
1dbdcb4a8c | ||
![]() |
454f98b881 | ||
![]() |
59f4966756 | ||
![]() |
8f3d3e5f83 | ||
![]() |
9b53691f73 | ||
![]() |
a6fd685fed | ||
![]() |
4620affa24 | ||
![]() |
86a361081d | ||
![]() |
95d312d6c8 | ||
![]() |
28f5cd312c | ||
![]() |
d07ddc93e2 | ||
![]() |
303fc9b368 | ||
![]() |
4f4f08e6f0 | ||
![]() |
c99a882814 | ||
![]() |
6441d522e9 | ||
![]() |
d8ddac363e | ||
![]() |
b8d3f7fc21 | ||
![]() |
ad26e83f9c | ||
![]() |
857fc0a71f | ||
![]() |
2f172f1ae9 | ||
![]() |
ddf5fb71ee | ||
![]() |
a2efbecc4e | ||
![]() |
70277d1d23 | ||
![]() |
280ef183db | ||
![]() |
ab6f4fd4a7 | ||
![]() |
af19d2ed1e | ||
![]() |
d6ed67780b | ||
![]() |
e27f781aeb | ||
![]() |
3cd252d29a | ||
![]() |
ac682955e9 | ||
![]() |
266b3d4fe4 | ||
![]() |
c463dfc7e4 | ||
![]() |
170e2fd7c3 | ||
![]() |
3bc036171f | ||
![]() |
fb01a18462 | ||
![]() |
a7ed01082f | ||
![]() |
3fe962940f | ||
![]() |
de60ce391d | ||
![]() |
164d6c7f5b | ||
![]() |
789274dca8 | ||
![]() |
00d3bb1a07 | ||
![]() |
9f0ba52f34 | ||
![]() |
55179987e7 | ||
![]() |
6b733be755 | ||
![]() |
1f5a3cf688 | ||
![]() |
9e0d1c00b5 | ||
![]() |
32f1a288e2 | ||
![]() |
6843b9dc78 | ||
![]() |
e5b3112996 | ||
![]() |
b0f7de3e7c | ||
![]() |
0bb5ad7a06 | ||
![]() |
6b2caa321f | ||
![]() |
2284413206 | ||
![]() |
bdb7f08666 | ||
![]() |
c7d21dee28 | ||
![]() |
1cf28fd5f3 | ||
![]() |
d902a3f4cb | ||
![]() |
544380aaf0 | ||
![]() |
3a7f9db180 | ||
![]() |
3c4fc6a782 | ||
![]() |
bd68909753 | ||
![]() |
fe5093aafc | ||
![]() |
5820358bbc | ||
![]() |
9c843fb1d0 | ||
![]() |
591e06b0e2 | ||
![]() |
e1cddd1a0c | ||
![]() |
f3aaec781a | ||
![]() |
bac6cfcb3a | ||
![]() |
a5e040ee3c | ||
![]() |
56b8d10676 | ||
![]() |
eb7a6d0813 | ||
![]() |
08e2b0da2c | ||
![]() |
e60770679b | ||
![]() |
ce8dc93aef | ||
![]() |
36c3a0167a | ||
![]() |
947a5111dd | ||
![]() |
592716227c | ||
![]() |
6a65da3a18 | ||
![]() |
8e7808b524 | ||
![]() |
27a9bee243 | ||
![]() |
e833b02f2f | ||
![]() |
ac95b436db | ||
![]() |
4c85073044 | ||
![]() |
d210c0e777 | ||
![]() |
dcdc1cbf43 | ||
![]() |
6c7f1155bb | ||
![]() |
36bf549b27 | ||
![]() |
ff34b2d6d3 | ||
![]() |
6821a5a4ad | ||
![]() |
e927682e1b | ||
![]() |
61af6bebb4 | ||
![]() |
950ce21d4a | ||
![]() |
28dce3cdbc | ||
![]() |
9950073655 | ||
![]() |
a084493535 | ||
![]() |
d87fe2687f | ||
![]() |
103391ca90 | ||
![]() |
7ac6b8cfa7 | ||
![]() |
33c752be51 | ||
![]() |
5c073bbb57 | ||
![]() |
af1818276e | ||
![]() |
adaa274fa8 | ||
![]() |
6edd6a4f00 | ||
![]() |
5ccd08d26d | ||
![]() |
4fd21d58a7 | ||
![]() |
59af5383c1 | ||
![]() |
7f8d28f686 | ||
![]() |
5a9ca68e15 | ||
![]() |
859d7d4640 | ||
![]() |
d9b141c05f | ||
![]() |
27f936eca8 | ||
![]() |
9e8be46252 | ||
![]() |
921caf6203 | ||
![]() |
44dabf1f42 | ||
![]() |
9f9ebe631d | ||
![]() |
074eef56ef | ||
![]() |
77f9a81cca | ||
![]() |
986f63d17f | ||
![]() |
343643fdca | ||
![]() |
739f179dd6 | ||
![]() |
55d11d277b | ||
![]() |
41d82b85ab | ||
![]() |
2bb2c2bd75 | ||
![]() |
3f2c70355a | ||
![]() |
8c71de762b | ||
![]() |
43633c5388 | ||
![]() |
a4cefc25ed | ||
![]() |
fffc9a077d | ||
![]() |
9ac08d93b2 | ||
![]() |
c5560e72d0 | ||
![]() |
44caf99eca | ||
![]() |
85f2c0124d | ||
![]() |
0456d169c4 | ||
![]() |
f1a8943ddd | ||
![]() |
d1c49bcae9 | ||
![]() |
9ffa705edd | ||
![]() |
22a20dbb7a | ||
![]() |
3c020b6959 | ||
![]() |
9c9aec33c0 | ||
![]() |
474d858fd9 | ||
![]() |
164376483f | ||
![]() |
5a5128bab9 | ||
![]() |
4b58349bc8 | ||
![]() |
8a9c5db29e | ||
![]() |
a87527ad67 | ||
![]() |
7d43fbe3ae | ||
![]() |
9bf260b2d2 | ||
![]() |
2dd09ebf55 | ||
![]() |
a07b0ffdc3 | ||
![]() |
4a99134f1a | ||
![]() |
7c3ba1b83a | ||
![]() |
d469aa8cfa | ||
![]() |
de0e49c245 | ||
![]() |
2c21e8b1a4 | ||
![]() |
3a0c70f1e3 | ||
![]() |
45ff7c93dd | ||
![]() |
9030c58a78 | ||
![]() |
5ddfac81c4 | ||
![]() |
2d589273dd | ||
![]() |
688a40b4ed | ||
![]() |
aaeae281a8 | ||
![]() |
b76d6132e3 | ||
![]() |
864d124bb7 | ||
![]() |
2156161056 | ||
![]() |
f685f7d7a8 | ||
![]() |
ad1dadac86 | ||
![]() |
95a064f530 | ||
![]() |
af7d260626 | ||
![]() |
00431bf874 | ||
![]() |
4ae6bcc025 | ||
![]() |
e587a428d7 | ||
![]() |
8c1dc1f6ed | ||
![]() |
91459bd320 | ||
![]() |
6beea6f017 | ||
![]() |
04b0dda853 | ||
![]() |
b24d74e44a | ||
![]() |
fcfa3ebed1 | ||
![]() |
b227be34db | ||
![]() |
808db3e687 | ||
![]() |
68bca03951 | ||
![]() |
da2186be81 |
1
.gitattributes
vendored
Normal file
1
.gitattributes
vendored
Normal file
@@ -0,0 +1 @@
|
||||
*.pnm -diff -text
|
1
.gitignore
vendored
1
.gitignore
vendored
@@ -64,6 +64,7 @@
|
||||
/tests/data/
|
||||
/tests/pixfmts.mak
|
||||
/tests/rotozoom
|
||||
/tests/test_copy.ffmeta
|
||||
/tests/tiny_psnr
|
||||
/tests/tiny_ssim
|
||||
/tests/videogen
|
||||
|
112
Changelog
112
Changelog
@@ -1,7 +1,117 @@
|
||||
Entries are sorted chronologically from oldest to youngest within each release,
|
||||
releases are sorted from youngest to oldest.
|
||||
|
||||
version <next>:
|
||||
version 2.5.4:
|
||||
- avcodec/arm/videodsp_armv5te: Fix linking failure with shared libs
|
||||
- avcodec/mjpegdec: Skip blocks which are outside the visible area
|
||||
- avcodec/h264_slice: ignore SAR changes in slices after the first
|
||||
- avcodec/h264_slice: Check picture structure before setting the related fields
|
||||
- avcodec/h264_slice: Do not change frame_num after the first slice
|
||||
- avutil/opt: Fix type used to access AV_OPT_TYPE_SAMPLE_FMT
|
||||
- avutil/opt: Fix types used to access AV_OPT_TYPE_PIXEL_FMT
|
||||
- avcodec/h264: Be more strict on rejecting pps/sps changes
|
||||
- avcodec/h264: Be more strict on rejecting pps_id changes
|
||||
- avcodec/h264_ps: More completely check the bit depths
|
||||
- avformat/thp: Check av_get_packet() for failure not only for partial output
|
||||
- swscale/utils: Limit filter shifting so as not to read from prior the array
|
||||
- avcodec/mpegvideo_motion: Fix gmc chroma dimensions
|
||||
- avcodec/mjpegdec: Check number of components for JPEG-LS
|
||||
- avcodec/mjpegdec: Check escape sequence validity
|
||||
- avformat/mpc8: Use uint64_t in *_get_v() to avoid undefined behavior
|
||||
- avformat/mpc8: fix broken pointer math
|
||||
- avformat/mpc8: fix hang with fuzzed file
|
||||
- avformat/tta: fix crash with corrupted files
|
||||
- avcodec/ppc/idctdsp.c: POWER LE support in idct_add_altivec()
|
||||
- swscale/input: fix rgba64 alpha non native
|
||||
- swscale/input: Fix alpha of YA16 input
|
||||
- libavcodec/ppc/mpegvideoencdsp.c: fix stack smashing in pix_norm1_altivec() and pix_sum_altivec()
|
||||
- avformat/rmdec: Check for overflow in ff_rm_read_mdpr_codecdata()
|
||||
- avformat/mpeg: do not count PES packets inside PES packets during probing
|
||||
- hevc: always clip luma_log2_weight_denom
|
||||
- rtpdec_h263_rfc2190: Clear the stored bits if discarding buffered data
|
||||
- aacenc: correctly check returned value
|
||||
- swscale: check memory allocations
|
||||
- opt: check memory allocation
|
||||
- avformat/utils: check for malloc failure
|
||||
- avcodec/flac_parser: fix handling EOF if no headers are found
|
||||
- avfilter/vf_framepack: Check and update frame_rate
|
||||
- vp8: improve memory allocation checks
|
||||
- configure: enable vsx together with altivec for ppc64el
|
||||
- avcodec/hevc: Fix handling of skipped_bytes() reallocation failures
|
||||
- qpeg: avoid pointless invalid memcpy()
|
||||
|
||||
|
||||
version 2.5.3:
|
||||
- vp9: fix parser return values in error case
|
||||
- ffmpeg: Clear error message array at init.
|
||||
- avcodec/dvdsubdec: fix accessing dangling pointers
|
||||
- avcodec/dvdsubdec: error on bitmaps with size 0
|
||||
- cmdutils: Use 64bit for file size/offset related variable in cmdutils_read_file()
|
||||
- mov: Fix negative size calculation in mov_read_default().
|
||||
- avformat/mov: fix integer overflow in mov_read_udta_string()
|
||||
- mov: Fix overflow and error handling in read_tfra().
|
||||
- mov: Avoid overflow with mov_metadata_raw()
|
||||
- avcodec/dvdsubdec: fix out of bounds accesses
|
||||
- avfilter/vf_sab: fix filtering tiny images
|
||||
- avformat/flvdec: Increase string array size
|
||||
- avformat/flvdec: do not inject dts=0 metadata packets which failed to be parsed into a new data stream
|
||||
- avformat/cdxl: Fix integer overflow of image_size
|
||||
- libavformat: Build hevc.o when building the RTP muxer
|
||||
|
||||
version 2.5.2:
|
||||
- avcodec/indeo3: ensure offsets are non negative
|
||||
- avcodec/h264: Check *log2_weight_denom
|
||||
- avcodec/hevc_ps: Check diff_cu_qp_delta_depth
|
||||
- avcodec/h264: Clear delayed_pic on deallocation
|
||||
- avcodec/hevc: clear filter_slice_edges() on allocation
|
||||
- avcodec/dcadec: Check that the added xch channel isnt already there
|
||||
- avcodec/indeo3: use signed variables to avoid underflow
|
||||
- swscale: increase yuv2rgb table headroom
|
||||
- avformat/mov: fix integer overflow of size
|
||||
- avformat/mov: check atom nesting depth
|
||||
- avcodec/utvideodec: Fix handling of slice_height=0
|
||||
- avcodec/xface: correct the XFACE_MAX_* values
|
||||
- avcodec/vmdvideo: Check len before using it in method 3
|
||||
- configure: create the tests directory like the doc directory
|
||||
- mmvideo: check frame dimensions
|
||||
- jvdec: check frame dimensions
|
||||
|
||||
version 2.5.1:
|
||||
- lavu/frame: fix malloc error path in av_frame_copy_props()
|
||||
- avformat/aviobuf: Check that avio_seek() target is non negative
|
||||
- swresample/soxr_resample: fix error handling
|
||||
- avformat/flvdec: fix potential use of uninitialized variables
|
||||
- avformat/crypto: fix key vs iv typo
|
||||
- configure: use use_pkg_config() instead of check_pkg_config() for libsmbclient
|
||||
- avcodec/ppc/vp3dsp_altivec: POWER LE support to vp3_idct_add_altivec()
|
||||
- avformat/matroskadec: fix handling of recursive SeekHead elements
|
||||
- doc/examples/filtering_video: fix frame rate
|
||||
- avcodec/mpegaudiodec_template: only allocate fdsp when its used
|
||||
- doc/examples/transcoding: check encoder before using it
|
||||
- update MAINTAINERS file
|
||||
- POWER LE support in put_vp8_epel_h_altivec_core() put_vp8_epel_v_altivec_core() put_vp8_pixels16_altivec()
|
||||
- POWER LE support in vc1_inv_trans_8x4_altivec()
|
||||
|
||||
version 2.5:
|
||||
- HEVC/H.265 RTP payload format (draft v6) packetizer
|
||||
- SUP/PGS subtitle demuxer
|
||||
- ffprobe -show_pixel_formats option
|
||||
- CAST128 symmetric block cipher, ECB mode
|
||||
- STL subtitle demuxer and decoder
|
||||
- libutvideo YUV 4:2:2 10bit support
|
||||
- XCB-based screen-grabber
|
||||
- UDP-Lite support (RFC 3828)
|
||||
- xBR scaling filter
|
||||
- AVFoundation screen capturing support
|
||||
- ffserver supports codec private options
|
||||
- creating DASH compatible fragmented MP4, MPEG-DASH segmenting muxer
|
||||
- WebP muxer with animated WebP support
|
||||
- zygoaudio decoding support
|
||||
- APNG decoder and demuxer
|
||||
- postproc visualization support
|
||||
|
||||
|
||||
version 2.4:
|
||||
- Icecast protocol
|
||||
- ported lenscorrection filter from frei0r filter
|
||||
- large optimizations in dctdnoiz to make it usable
|
||||
|
@@ -64,6 +64,7 @@ There are a handful of files under other licensing terms, namely:
|
||||
documentation accompanying your program if you only distribute executables.
|
||||
You must also indicate any changes including additions and deletions to
|
||||
those three files in the documentation.
|
||||
tests/reference.pnm is under the expat license
|
||||
|
||||
|
||||
external libraries
|
||||
|
@@ -309,6 +309,7 @@ libavdevice
|
||||
|
||||
|
||||
avfoundation.m Thilo Borgmann
|
||||
decklink* Deti Fliegl
|
||||
dshow.c Roger Pack (CC rogerdpack@gmail.com)
|
||||
fbdev_enc.c Lukasz Marek
|
||||
gdigrab.c Roger Pack (CC rogerdpack@gmail.com)
|
||||
@@ -385,6 +386,7 @@ Muxers/Demuxers:
|
||||
aiffdec.c Baptiste Coudurier, Matthieu Bouron
|
||||
aiffenc.c Baptiste Coudurier, Matthieu Bouron
|
||||
ape.c Kostya Shishkov
|
||||
apngdec.c Benoit Fouet
|
||||
ass* Aurelien Jacobs
|
||||
astdec.c Paul B Mahol
|
||||
astenc.c James Almer
|
||||
@@ -462,7 +464,7 @@ Muxers/Demuxers:
|
||||
rtmp* Kostya Shishkov
|
||||
rtp.c, rtpenc.c Martin Storsjo
|
||||
rtpdec_h261.*, rtpenc_h261.* Thomas Volkert
|
||||
rtpdec_hevc.* Thomas Volkert
|
||||
rtpdec_hevc.*, rtpenc_hevc.* Thomas Volkert
|
||||
rtpdec_asf.* Ronald S. Bultje
|
||||
rtpenc_mpv.*, rtpenc_aac.* Martin Storsjo
|
||||
rtsp.c Luca Barbato
|
||||
@@ -496,6 +498,7 @@ Protocols:
|
||||
libssh.c Lukasz Marek
|
||||
mms*.c Ronald S. Bultje
|
||||
udp.c Luca Abeni
|
||||
icecast.c Marvin Scholz
|
||||
|
||||
|
||||
libswresample
|
||||
@@ -534,7 +537,8 @@ x86 Michael Niedermayer
|
||||
Releases
|
||||
========
|
||||
|
||||
2.3 Michael Niedermayer
|
||||
2.5 Michael Niedermayer
|
||||
2.4 Michael Niedermayer
|
||||
2.2 Michael Niedermayer
|
||||
1.2 Michael Niedermayer
|
||||
|
||||
|
3
Makefile
3
Makefile
@@ -32,6 +32,7 @@ OBJS-ffmpeg += ffmpeg_opt.o ffmpeg_filter.o
|
||||
OBJS-ffmpeg-$(HAVE_VDPAU_X11) += ffmpeg_vdpau.o
|
||||
OBJS-ffmpeg-$(HAVE_DXVA2_LIB) += ffmpeg_dxva2.o
|
||||
OBJS-ffmpeg-$(CONFIG_VDA) += ffmpeg_vda.o
|
||||
OBJS-ffserver += ffserver_config.o
|
||||
|
||||
TESTTOOLS = audiogen videogen rotozoom tiny_psnr tiny_ssim base64
|
||||
HOSTPROGS := $(TESTTOOLS:%=tests/%) doc/print_options
|
||||
@@ -111,7 +112,7 @@ endef
|
||||
|
||||
$(foreach P,$(PROGS),$(eval $(call DOPROG,$(P:$(PROGSSUF)$(EXESUF)=))))
|
||||
|
||||
ffprobe.o cmdutils.o : libavutil/ffversion.h
|
||||
ffprobe.o cmdutils.o libavcodec/utils.o libavformat/utils.o libavdevice/avdevice.o libavfilter/avfilter.o libavutil/utils.o libpostproc/postprocess.o libswresample/swresample.o libswscale/utils.o : libavutil/ffversion.h
|
||||
|
||||
$(PROGS): %$(PROGSSUF)$(EXESUF): %$(PROGSSUF)_g$(EXESUF)
|
||||
$(CP) $< $@
|
||||
|
@@ -32,7 +32,7 @@ and in the [wiki](http://trac.ffmpeg.org).
|
||||
|
||||
### Examples
|
||||
|
||||
Conding examples are available in the **doc/example** directory.
|
||||
Coding examples are available in the **doc/examples** directory.
|
||||
|
||||
## License
|
||||
|
||||
|
104
RELEASE_NOTES
104
RELEASE_NOTES
@@ -1,16 +1,14 @@
|
||||
┌────────────────────────────────────────┐
|
||||
│ RELEASE NOTES for FFmpeg 2.4 "Fresnel" │
|
||||
│ RELEASE NOTES for FFmpeg 2.5 "Bohr" │
|
||||
└────────────────────────────────────────┘
|
||||
|
||||
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.
|
||||
The FFmpeg Project proudly presents FFmpeg 2.5 "Bohr", 2.5 months after the
|
||||
release of 2.4.
|
||||
|
||||
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.
|
||||
The most important new features are AVFoundation screen-grabbing support,
|
||||
animated WebP decoding support, and Animated PNG support. In addition, many
|
||||
exciting features for video streaming are also implemented, including MPEG-
|
||||
DASH fragmenting muxer, HEVC RTP payload muxer, and UDP Lite support.
|
||||
|
||||
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
|
||||
@@ -20,24 +18,21 @@
|
||||
│ 🔨 API Information │
|
||||
└────────────────────────────┘
|
||||
|
||||
FFmpeg 2.4 includes the following library versions:
|
||||
FFmpeg 2.5 includes the following library versions:
|
||||
|
||||
• 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
|
||||
• libavutil 54.15.100
|
||||
• libavcodec 56.13.100
|
||||
• libavformat 56.15.102
|
||||
• libavdevice 56. 3.100
|
||||
• libavfilter 5. 2.103
|
||||
• libswscale 3. 1.101
|
||||
• libswresample 1. 1.100
|
||||
• libpostproc 53. 3.100
|
||||
|
||||
Important API changes since 2.3:
|
||||
Important API changes since 2.4:
|
||||
|
||||
• avpriv_dv_frame_profile2() has been deprecated
|
||||
|
||||
• 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.
|
||||
|
||||
Please refer to the doc/APIchanges file for more information.
|
||||
|
||||
@@ -45,37 +40,62 @@
|
||||
│ ★ List of New Features │
|
||||
└────────────────────────────┘
|
||||
|
||||
┌────────────────────────────┐
|
||||
│ ffprobe │
|
||||
└────────────────────────────┘
|
||||
|
||||
• -show_pixel_formats option
|
||||
|
||||
┌────────────────────────────┐
|
||||
│ ffserver │
|
||||
└────────────────────────────┘
|
||||
|
||||
• codec private options support
|
||||
|
||||
┌────────────────────────────┐
|
||||
│ libavcodec │
|
||||
└────────────────────────────┘
|
||||
|
||||
• STL subtitle decoder
|
||||
• libutvideo YUV 4:2:2 10bit support
|
||||
• animated WebP decoding support
|
||||
• zygoaudio decoding support
|
||||
• APNG decoder
|
||||
|
||||
┌────────────────────────────┐
|
||||
│ libavdevice │
|
||||
└────────────────────────────┘
|
||||
|
||||
• XCB-based screen-grabber
|
||||
• AVFoundation screen capturing support
|
||||
|
||||
┌────────────────────────────┐
|
||||
│ libavformat │
|
||||
└────────────────────────────┘
|
||||
|
||||
• 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.
|
||||
• HEVC/H.265 RTP payload format (draft v6) packetizer
|
||||
• SUP/PGS subtitle demuxer
|
||||
• STL subtitle demuxer
|
||||
• UDP-Lite support (RFC 3828)
|
||||
• MPEG-DASH segmenting muxer, which allows creating DASH compatible
|
||||
fragmented MP4
|
||||
• WebP muxer
|
||||
• APNG demuxer
|
||||
|
||||
┌────────────────────────────┐
|
||||
│ libavfilter │
|
||||
└────────────────────────────┘
|
||||
|
||||
• 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.
|
||||
• xBR scaling filter
|
||||
|
||||
┌────────────────────────────┐
|
||||
│ libavutil │
|
||||
└────────────────────────────┘
|
||||
|
||||
• Added clip() function in eval.
|
||||
• CAST128 symmetric block cipher, ECB mode
|
||||
|
||||
┌────────────────────────────┐
|
||||
│ ⚠ Behaviour changes │
|
||||
└────────────────────────────┘
|
||||
┌────────────────────────────┐
|
||||
│ libpostproc │
|
||||
└────────────────────────────┘
|
||||
|
||||
• 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
|
||||
• visualization support
|
||||
|
204
cmdutils.c
204
cmdutils.c
@@ -444,7 +444,7 @@ int locate_option(int argc, char **argv, const OptionDef *options,
|
||||
(po->name && !strcmp(optname, po->name)))
|
||||
return i;
|
||||
|
||||
if (po->flags & HAS_ARG)
|
||||
if (!po->name || po->flags & HAS_ARG)
|
||||
i++;
|
||||
}
|
||||
return 0;
|
||||
@@ -959,9 +959,10 @@ static int init_report(const char *env)
|
||||
|
||||
report_file = fopen(filename.str, "w");
|
||||
if (!report_file) {
|
||||
int ret = AVERROR(errno);
|
||||
av_log(NULL, AV_LOG_ERROR, "Failed to open report \"%s\": %s\n",
|
||||
filename.str, strerror(errno));
|
||||
return AVERROR(errno);
|
||||
return ret;
|
||||
}
|
||||
av_log_set_callback(log_callback_report);
|
||||
av_log(NULL, AV_LOG_INFO,
|
||||
@@ -1543,7 +1544,8 @@ int show_protocols(void *optctx, const char *opt, const char *arg)
|
||||
|
||||
int show_filters(void *optctx, const char *opt, const char *arg)
|
||||
{
|
||||
const AVFilter av_unused(*filter) = NULL;
|
||||
#if CONFIG_AVFILTER
|
||||
const AVFilter *filter = NULL;
|
||||
char descr[64], *descr_cur;
|
||||
int i, j;
|
||||
const AVFilterPad *pad;
|
||||
@@ -1556,7 +1558,6 @@ int show_filters(void *optctx, const char *opt, const char *arg)
|
||||
" V = Video input/output\n"
|
||||
" N = Dynamic number and/or type of input/output\n"
|
||||
" | = Source or sink filter\n");
|
||||
#if CONFIG_AVFILTER
|
||||
while ((filter = avfilter_next(filter))) {
|
||||
descr_cur = descr;
|
||||
for (i = 0; i < 2; i++) {
|
||||
@@ -1581,6 +1582,8 @@ int show_filters(void *optctx, const char *opt, const char *arg)
|
||||
filter->process_command ? 'C' : '.',
|
||||
filter->name, descr, filter->description);
|
||||
}
|
||||
#else
|
||||
printf("No filters available: libavfilter disabled\n");
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
@@ -1857,21 +1860,23 @@ int read_yesno(void)
|
||||
|
||||
int cmdutils_read_file(const char *filename, char **bufptr, size_t *size)
|
||||
{
|
||||
int ret;
|
||||
int64_t ret;
|
||||
FILE *f = av_fopen_utf8(filename, "rb");
|
||||
|
||||
if (!f) {
|
||||
ret = AVERROR(errno);
|
||||
av_log(NULL, AV_LOG_ERROR, "Cannot read file '%s': %s\n", filename,
|
||||
strerror(errno));
|
||||
return AVERROR(errno);
|
||||
return ret;
|
||||
}
|
||||
fseek(f, 0, SEEK_END);
|
||||
*size = ftell(f);
|
||||
fseek(f, 0, SEEK_SET);
|
||||
if (*size == (size_t)-1) {
|
||||
ret = AVERROR(errno);
|
||||
av_log(NULL, AV_LOG_ERROR, "IO error: %s\n", strerror(errno));
|
||||
fclose(f);
|
||||
return AVERROR(errno);
|
||||
return ret;
|
||||
}
|
||||
*bufptr = av_malloc(*size + 1);
|
||||
if (!*bufptr) {
|
||||
@@ -1883,9 +1888,9 @@ int cmdutils_read_file(const char *filename, char **bufptr, size_t *size)
|
||||
if (ret < *size) {
|
||||
av_free(*bufptr);
|
||||
if (ferror(f)) {
|
||||
ret = AVERROR(errno);
|
||||
av_log(NULL, AV_LOG_ERROR, "Error while reading file '%s': %s\n",
|
||||
filename, strerror(errno));
|
||||
ret = AVERROR(errno);
|
||||
} else
|
||||
ret = AVERROR_EOF;
|
||||
} else {
|
||||
@@ -1992,7 +1997,7 @@ AVDictionary *filter_codec_opts(AVDictionary *opts, enum AVCodecID codec_id,
|
||||
switch (check_stream_specifier(s, st, p + 1)) {
|
||||
case 1: *p = 0; break;
|
||||
case 0: continue;
|
||||
default: return NULL;
|
||||
default: exit_program(1);
|
||||
}
|
||||
|
||||
if (av_opt_find(&cc, t->key, NULL, flags, AV_OPT_SEARCH_FAKE_OBJ) ||
|
||||
@@ -2050,3 +2055,184 @@ void *grow_array(void *array, int elem_size, int *size, int new_size)
|
||||
}
|
||||
return array;
|
||||
}
|
||||
|
||||
#if CONFIG_AVDEVICE
|
||||
static int print_device_sources(AVInputFormat *fmt, AVDictionary *opts)
|
||||
{
|
||||
int ret, i;
|
||||
AVFormatContext *dev = NULL;
|
||||
AVDeviceInfoList *device_list = NULL;
|
||||
AVDictionary *tmp_opts = NULL;
|
||||
|
||||
if (!fmt || !fmt->priv_class || !AV_IS_INPUT_DEVICE(fmt->priv_class->category))
|
||||
return AVERROR(EINVAL);
|
||||
|
||||
printf("Audo-detected sources for %s:\n", fmt->name);
|
||||
if (!fmt->get_device_list) {
|
||||
ret = AVERROR(ENOSYS);
|
||||
printf("Cannot list sources. Not implemented.\n");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/* TODO: avformat_open_input calls read_header callback which is not necessary.
|
||||
Function like avformat_alloc_output_context2 for input could be helpful here. */
|
||||
av_dict_copy(&tmp_opts, opts, 0);
|
||||
if ((ret = avformat_open_input(&dev, NULL, fmt, &tmp_opts)) < 0) {
|
||||
printf("Cannot open device: %s.\n", fmt->name);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if ((ret = avdevice_list_devices(dev, &device_list)) < 0) {
|
||||
printf("Cannot list sources.\n");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
for (i = 0; i < device_list->nb_devices; i++) {
|
||||
printf("%s %s [%s]\n", device_list->default_device == i ? "*" : " ",
|
||||
device_list->devices[i]->device_name, device_list->devices[i]->device_description);
|
||||
}
|
||||
|
||||
fail:
|
||||
av_dict_free(&tmp_opts);
|
||||
avdevice_free_list_devices(&device_list);
|
||||
avformat_close_input(&dev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int print_device_sinks(AVOutputFormat *fmt, AVDictionary *opts)
|
||||
{
|
||||
int ret, i;
|
||||
AVFormatContext *dev = NULL;
|
||||
AVDeviceInfoList *device_list = NULL;
|
||||
AVDictionary *tmp_opts = NULL;
|
||||
|
||||
if (!fmt || !fmt->priv_class || !AV_IS_OUTPUT_DEVICE(fmt->priv_class->category))
|
||||
return AVERROR(EINVAL);
|
||||
|
||||
printf("Audo-detected sinks for %s:\n", fmt->name);
|
||||
if (!fmt->get_device_list) {
|
||||
ret = AVERROR(ENOSYS);
|
||||
printf("Cannot list sinks. Not implemented.\n");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if ((ret = avformat_alloc_output_context2(&dev, fmt, NULL, NULL)) < 0) {
|
||||
printf("Cannot open device: %s.\n", fmt->name);
|
||||
goto fail;
|
||||
}
|
||||
av_dict_copy(&tmp_opts, opts, 0);
|
||||
av_opt_set_dict2(dev, &tmp_opts, AV_OPT_SEARCH_CHILDREN);
|
||||
|
||||
if ((ret = avdevice_list_devices(dev, &device_list)) < 0) {
|
||||
printf("Cannot list sinks.\n");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
for (i = 0; i < device_list->nb_devices; i++) {
|
||||
printf("%s %s [%s]\n", device_list->default_device == i ? "*" : " ",
|
||||
device_list->devices[i]->device_name, device_list->devices[i]->device_description);
|
||||
}
|
||||
|
||||
fail:
|
||||
av_dict_free(&tmp_opts);
|
||||
avdevice_free_list_devices(&device_list);
|
||||
avformat_free_context(dev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int show_sinks_sources_parse_arg(const char *arg, char **dev, AVDictionary **opts)
|
||||
{
|
||||
int ret;
|
||||
if (arg) {
|
||||
char *opts_str = NULL;
|
||||
av_assert0(dev && opts);
|
||||
*dev = av_strdup(arg);
|
||||
if (!*dev)
|
||||
return AVERROR(ENOMEM);
|
||||
if ((opts_str = strchr(*dev, ','))) {
|
||||
*(opts_str++) = '\0';
|
||||
if (opts_str[0] && ((ret = av_dict_parse_string(opts, opts_str, "=", ":", 0)) < 0)) {
|
||||
av_freep(dev);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
} else
|
||||
printf("\nDevice name is not provided.\n"
|
||||
"You can pass devicename[,opt1=val1[,opt2=val2...]] as an argument.\n\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
int show_sources(void *optctx, const char *opt, const char *arg)
|
||||
{
|
||||
AVInputFormat *fmt = NULL;
|
||||
char *dev = NULL;
|
||||
AVDictionary *opts = NULL;
|
||||
int ret = 0;
|
||||
int error_level = av_log_get_level();
|
||||
|
||||
av_log_set_level(AV_LOG_ERROR);
|
||||
|
||||
if ((ret = show_sinks_sources_parse_arg(arg, &dev, &opts)) < 0)
|
||||
goto fail;
|
||||
|
||||
do {
|
||||
fmt = av_input_audio_device_next(fmt);
|
||||
if (fmt) {
|
||||
if (!strcmp(fmt->name, "lavfi"))
|
||||
continue; //it's pointless to probe lavfi
|
||||
if (dev && strcmp(fmt->name, dev))
|
||||
continue;
|
||||
print_device_sources(fmt, opts);
|
||||
}
|
||||
} while (fmt);
|
||||
do {
|
||||
fmt = av_input_video_device_next(fmt);
|
||||
if (fmt) {
|
||||
if (dev && strcmp(fmt->name, dev))
|
||||
continue;
|
||||
print_device_sources(fmt, opts);
|
||||
}
|
||||
} while (fmt);
|
||||
fail:
|
||||
av_dict_free(&opts);
|
||||
av_free(dev);
|
||||
av_log_set_level(error_level);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int show_sinks(void *optctx, const char *opt, const char *arg)
|
||||
{
|
||||
AVOutputFormat *fmt = NULL;
|
||||
char *dev = NULL;
|
||||
AVDictionary *opts = NULL;
|
||||
int ret = 0;
|
||||
int error_level = av_log_get_level();
|
||||
|
||||
av_log_set_level(AV_LOG_ERROR);
|
||||
|
||||
if ((ret = show_sinks_sources_parse_arg(arg, &dev, &opts)) < 0)
|
||||
goto fail;
|
||||
|
||||
do {
|
||||
fmt = av_output_audio_device_next(fmt);
|
||||
if (fmt) {
|
||||
if (dev && strcmp(fmt->name, dev))
|
||||
continue;
|
||||
print_device_sinks(fmt, opts);
|
||||
}
|
||||
} while (fmt);
|
||||
do {
|
||||
fmt = av_output_video_device_next(fmt);
|
||||
if (fmt) {
|
||||
if (dev && strcmp(fmt->name, dev))
|
||||
continue;
|
||||
print_device_sinks(fmt, opts);
|
||||
}
|
||||
} while (fmt);
|
||||
fail:
|
||||
av_dict_free(&opts);
|
||||
av_free(dev);
|
||||
av_log_set_level(error_level);
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
14
cmdutils.h
14
cmdutils.h
@@ -443,6 +443,20 @@ int show_formats(void *optctx, const char *opt, const char *arg);
|
||||
*/
|
||||
int show_devices(void *optctx, const char *opt, const char *arg);
|
||||
|
||||
#if CONFIG_AVDEVICE
|
||||
/**
|
||||
* Print a listing containing audodetected sinks of the output device.
|
||||
* Device name with options may be passed as an argument to limit results.
|
||||
*/
|
||||
int show_sinks(void *optctx, const char *opt, const char *arg);
|
||||
|
||||
/**
|
||||
* Print a listing containing audodetected sources of the input device.
|
||||
* Device name with options may be passed as an argument to limit results.
|
||||
*/
|
||||
int show_sources(void *optctx, const char *opt, const char *arg);
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Print a listing containing all the codecs supported by the
|
||||
* program.
|
||||
|
@@ -27,3 +27,9 @@
|
||||
{ "opencl_bench", OPT_EXIT, {.func_arg = opt_opencl_bench}, "run benchmark on all OpenCL devices and show results" },
|
||||
{ "opencl_options", HAS_ARG, {.func_arg = opt_opencl}, "set OpenCL environment options" },
|
||||
#endif
|
||||
#if CONFIG_AVDEVICE
|
||||
{ "sources" , OPT_EXIT | HAS_ARG, { .func_arg = show_sources },
|
||||
"list sources of the input device", "device" },
|
||||
{ "sinks" , OPT_EXIT | HAS_ARG, { .func_arg = show_sinks },
|
||||
"list sinks of the output device", "device" },
|
||||
#endif
|
||||
|
@@ -55,35 +55,17 @@ typedef struct pthread_t {
|
||||
* not mutexes */
|
||||
typedef CRITICAL_SECTION pthread_mutex_t;
|
||||
|
||||
/* This is the CONDITIONAL_VARIABLE typedef for using Window's native
|
||||
* conditional variables on kernels 6.0+.
|
||||
* MinGW does not currently have this typedef. */
|
||||
typedef struct pthread_cond_t {
|
||||
void *ptr;
|
||||
} pthread_cond_t;
|
||||
|
||||
/* function pointers to conditional variable API on windows 6.0+ kernels */
|
||||
#if _WIN32_WINNT < 0x0600
|
||||
static void (WINAPI *cond_broadcast)(pthread_cond_t *cond);
|
||||
static void (WINAPI *cond_init)(pthread_cond_t *cond);
|
||||
static void (WINAPI *cond_signal)(pthread_cond_t *cond);
|
||||
static BOOL (WINAPI *cond_wait)(pthread_cond_t *cond, pthread_mutex_t *mutex,
|
||||
DWORD milliseconds);
|
||||
/* This is the CONDITION_VARIABLE typedef for using Windows' native
|
||||
* conditional variables on kernels 6.0+. */
|
||||
#if HAVE_CONDITION_VARIABLE_PTR
|
||||
typedef CONDITION_VARIABLE pthread_cond_t;
|
||||
#else
|
||||
#define cond_init InitializeConditionVariable
|
||||
#define cond_broadcast WakeAllConditionVariable
|
||||
#define cond_signal WakeConditionVariable
|
||||
#define cond_wait SleepConditionVariableCS
|
||||
typedef struct pthread_cond_t {
|
||||
void *Ptr;
|
||||
} pthread_cond_t;
|
||||
#endif
|
||||
|
||||
#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)
|
||||
#if _WIN32_WINNT >= 0x0600
|
||||
#define InitializeCriticalSection(x) InitializeCriticalSectionEx(x, 0, 0)
|
||||
#define WaitForSingleObject(a, b) WaitForSingleObjectEx(a, b, FALSE)
|
||||
#endif
|
||||
@@ -136,6 +118,36 @@ static inline int pthread_mutex_unlock(pthread_mutex_t *m)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if _WIN32_WINNT >= 0x0600
|
||||
static inline int pthread_cond_init(pthread_cond_t *cond, const void *unused_attr)
|
||||
{
|
||||
InitializeConditionVariable(cond);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* native condition variables do not destroy */
|
||||
static inline void pthread_cond_destroy(pthread_cond_t *cond)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
static inline void pthread_cond_broadcast(pthread_cond_t *cond)
|
||||
{
|
||||
WakeAllConditionVariable(cond);
|
||||
}
|
||||
|
||||
static inline int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
|
||||
{
|
||||
SleepConditionVariableCS(cond, mutex, INFINITE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void pthread_cond_signal(pthread_cond_t *cond)
|
||||
{
|
||||
WakeConditionVariable(cond);
|
||||
}
|
||||
|
||||
#else // _WIN32_WINNT < 0x0600
|
||||
/* for pre-Windows 6.0 platforms we need to define and use our own condition
|
||||
* variable and api */
|
||||
typedef struct win32_cond_t {
|
||||
@@ -147,6 +159,13 @@ typedef struct win32_cond_t {
|
||||
volatile int is_broadcast;
|
||||
} win32_cond_t;
|
||||
|
||||
/* function pointers to conditional variable API on windows 6.0+ kernels */
|
||||
static void (WINAPI *cond_broadcast)(pthread_cond_t *cond);
|
||||
static void (WINAPI *cond_init)(pthread_cond_t *cond);
|
||||
static void (WINAPI *cond_signal)(pthread_cond_t *cond);
|
||||
static BOOL (WINAPI *cond_wait)(pthread_cond_t *cond, pthread_mutex_t *mutex,
|
||||
DWORD milliseconds);
|
||||
|
||||
static av_unused int pthread_cond_init(pthread_cond_t *cond, const void *unused_attr)
|
||||
{
|
||||
win32_cond_t *win32_cond = NULL;
|
||||
@@ -159,7 +178,7 @@ static av_unused int pthread_cond_init(pthread_cond_t *cond, const void *unused_
|
||||
win32_cond = av_mallocz(sizeof(win32_cond_t));
|
||||
if (!win32_cond)
|
||||
return ENOMEM;
|
||||
cond->ptr = win32_cond;
|
||||
cond->Ptr = win32_cond;
|
||||
win32_cond->semaphore = CreateSemaphore(NULL, 0, 0x7fffffff, NULL);
|
||||
if (!win32_cond->semaphore)
|
||||
return ENOMEM;
|
||||
@@ -174,7 +193,7 @@ static av_unused int pthread_cond_init(pthread_cond_t *cond, const void *unused_
|
||||
|
||||
static av_unused void pthread_cond_destroy(pthread_cond_t *cond)
|
||||
{
|
||||
win32_cond_t *win32_cond = cond->ptr;
|
||||
win32_cond_t *win32_cond = cond->Ptr;
|
||||
/* native condition variables do not destroy */
|
||||
if (cond_init)
|
||||
return;
|
||||
@@ -185,12 +204,12 @@ static av_unused void pthread_cond_destroy(pthread_cond_t *cond)
|
||||
pthread_mutex_destroy(&win32_cond->mtx_waiter_count);
|
||||
pthread_mutex_destroy(&win32_cond->mtx_broadcast);
|
||||
av_freep(&win32_cond);
|
||||
cond->ptr = NULL;
|
||||
cond->Ptr = NULL;
|
||||
}
|
||||
|
||||
static av_unused void pthread_cond_broadcast(pthread_cond_t *cond)
|
||||
{
|
||||
win32_cond_t *win32_cond = cond->ptr;
|
||||
win32_cond_t *win32_cond = cond->Ptr;
|
||||
int have_waiter;
|
||||
|
||||
if (cond_broadcast) {
|
||||
@@ -221,7 +240,7 @@ static av_unused void pthread_cond_broadcast(pthread_cond_t *cond)
|
||||
|
||||
static av_unused int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
|
||||
{
|
||||
win32_cond_t *win32_cond = cond->ptr;
|
||||
win32_cond_t *win32_cond = cond->Ptr;
|
||||
int last_waiter;
|
||||
if (cond_wait) {
|
||||
cond_wait(cond, mutex, INFINITE);
|
||||
@@ -253,7 +272,7 @@ static av_unused int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mu
|
||||
|
||||
static av_unused void pthread_cond_signal(pthread_cond_t *cond)
|
||||
{
|
||||
win32_cond_t *win32_cond = cond->ptr;
|
||||
win32_cond_t *win32_cond = cond->Ptr;
|
||||
int have_waiter;
|
||||
if (cond_signal) {
|
||||
cond_signal(cond);
|
||||
@@ -275,6 +294,7 @@ static av_unused void pthread_cond_signal(pthread_cond_t *cond)
|
||||
|
||||
pthread_mutex_unlock(&win32_cond->mtx_broadcast);
|
||||
}
|
||||
#endif
|
||||
|
||||
static av_unused void w32thread_init(void)
|
||||
{
|
||||
|
232
configure
vendored
232
configure
vendored
@@ -251,17 +251,22 @@ External library support:
|
||||
--enable-libx264 enable H.264 encoding via x264 [no]
|
||||
--enable-libx265 enable HEVC encoding via x265 [no]
|
||||
--enable-libxavs enable AVS encoding via xavs [no]
|
||||
--enable-libxcb enable X11 grabbing using XCB [auto]
|
||||
--enable-libxcb-shm enable X11 grabbing shm communication [auto]
|
||||
--enable-libxcb-xfixes enable X11 grabbing mouse rendering [auto]
|
||||
--enable-libxcb-shape enable X11 grabbing shape rendering [auto]
|
||||
--enable-libxvid enable Xvid encoding via xvidcore,
|
||||
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-decklink enable Blackmagick DeckLink I/O support [no]
|
||||
--enable-openal enable OpenAL 1.1 capture support [no]
|
||||
--enable-opencl enable OpenCL code
|
||||
--enable-opengl enable OpenGL rendering [no]
|
||||
--enable-openssl enable openssl [no]
|
||||
--enable-x11grab enable X11 grabbing [no]
|
||||
--disable-sdl disable sdl [autodetect]
|
||||
--enable-x11grab enable X11 grabbing (legacy) [no]
|
||||
--disable-xlib disable xlib [autodetect]
|
||||
--disable-zlib disable zlib [autodetect]
|
||||
|
||||
@@ -1198,13 +1203,17 @@ require_cpp(){
|
||||
check_lib_cpp "$headers" "$classes" "$@" || die "ERROR: $name not found"
|
||||
}
|
||||
|
||||
require_pkg_config(){
|
||||
use_pkg_config(){
|
||||
pkg="$1"
|
||||
check_pkg_config "$@" || die "ERROR: $pkg not found"
|
||||
check_pkg_config "$@" || return 1
|
||||
add_cflags $(get_safe ${pkg}_cflags)
|
||||
add_extralibs $(get_safe ${pkg}_libs)
|
||||
}
|
||||
|
||||
require_pkg_config(){
|
||||
use_pkg_config "$@" || die "ERROR: $pkg not found using pkg-config$pkg_config_fail_message"
|
||||
}
|
||||
|
||||
require_libfreetype(){
|
||||
log require_libfreetype "$@"
|
||||
pkg="freetype2"
|
||||
@@ -1380,6 +1389,10 @@ EXTERNAL_LIBRARY_LIST="
|
||||
libx264
|
||||
libx265
|
||||
libxavs
|
||||
libxcb
|
||||
libxcb_shm
|
||||
libxcb_shape
|
||||
libxcb_xfixes
|
||||
libxvid
|
||||
libzmq
|
||||
libzvbi
|
||||
@@ -1388,6 +1401,7 @@ EXTERNAL_LIBRARY_LIST="
|
||||
opencl
|
||||
opengl
|
||||
openssl
|
||||
sdl
|
||||
x11grab
|
||||
xlib
|
||||
zlib
|
||||
@@ -1594,6 +1608,7 @@ ARCH_FEATURES="
|
||||
|
||||
BUILTIN_LIST="
|
||||
atomic_cas_ptr
|
||||
atomic_compare_exchange
|
||||
machine_rw_barrier
|
||||
MemoryBarrier
|
||||
mm_empty
|
||||
@@ -1620,7 +1635,6 @@ HEADERS_LIST="
|
||||
asm_types_h
|
||||
cdio_paranoia_h
|
||||
cdio_paranoia_paranoia_h
|
||||
CL_cl_h
|
||||
dev_bktr_ioctl_bt848_h
|
||||
dev_bktr_ioctl_meteor_h
|
||||
dev_ic_bt8xx_h
|
||||
@@ -1650,6 +1664,7 @@ HEADERS_LIST="
|
||||
sys_un_h
|
||||
sys_videoio_h
|
||||
termios_h
|
||||
udplite_h
|
||||
unistd_h
|
||||
windows_h
|
||||
winsock2_h
|
||||
@@ -1668,7 +1683,6 @@ MATH_FUNCS="
|
||||
exp2
|
||||
exp2f
|
||||
expf
|
||||
fminf
|
||||
isinf
|
||||
isnan
|
||||
ldexpf
|
||||
@@ -1712,6 +1726,7 @@ SYSTEM_FUNCS="
|
||||
gettimeofday
|
||||
glob
|
||||
glXGetProcAddress
|
||||
gmtime_r
|
||||
inet_aton
|
||||
isatty
|
||||
jack_port_get_latency_range
|
||||
@@ -1720,6 +1735,7 @@ SYSTEM_FUNCS="
|
||||
lzo1x_999_compress
|
||||
mach_absolute_time
|
||||
MapViewOfFile
|
||||
MoveFileExA
|
||||
memalign
|
||||
mkstemp
|
||||
mmap
|
||||
@@ -1765,6 +1781,7 @@ TOOLCHAIN_FEATURES="
|
||||
"
|
||||
|
||||
TYPES_LIST="
|
||||
CONDITION_VARIABLE_Ptr
|
||||
socklen_t
|
||||
struct_addrinfo
|
||||
struct_group_source_req
|
||||
@@ -2018,7 +2035,7 @@ simd_align_16_if_any="altivec neon sse"
|
||||
symver_if_any="symver_asm_label symver_gnu_asm"
|
||||
|
||||
# threading support
|
||||
atomics_gcc_if="sync_val_compare_and_swap"
|
||||
atomics_gcc_if_any="sync_val_compare_and_swap atomic_compare_exchange"
|
||||
atomics_suncc_if="atomic_cas_ptr machine_rw_barrier"
|
||||
atomics_win32_if="MemoryBarrier"
|
||||
atomics_native_if_any="$ATOMICS_LIST"
|
||||
@@ -2057,6 +2074,7 @@ amrwb_decoder_select="lsp"
|
||||
amv_decoder_select="sp5x_decoder exif"
|
||||
amv_encoder_select="aandcttables mpegvideoenc"
|
||||
ape_decoder_select="bswapdsp llauddsp"
|
||||
apng_decoder_select="zlib"
|
||||
asv1_decoder_select="blockdsp bswapdsp idctdsp"
|
||||
asv1_encoder_select="bswapdsp fdctdsp pixblockdsp"
|
||||
asv2_decoder_select="blockdsp bswapdsp idctdsp"
|
||||
@@ -2386,6 +2404,7 @@ avi_muxer_select="riffenc"
|
||||
avisynth_demuxer_deps="avisynth"
|
||||
avisynth_demuxer_select="riffdec"
|
||||
caf_demuxer_select="riffdec"
|
||||
dash_muxer_select="mp4_muxer"
|
||||
dirac_demuxer_select="dirac_parser"
|
||||
dts_demuxer_select="dca_parser"
|
||||
dtshd_demuxer_select="dca_parser"
|
||||
@@ -2410,7 +2429,7 @@ matroska_muxer_select="riffenc"
|
||||
mmf_muxer_select="riffenc"
|
||||
mov_demuxer_select="riffdec"
|
||||
mov_demuxer_suggest="zlib"
|
||||
mov_muxer_select="riffenc rtpenc_chain"
|
||||
mov_muxer_select="riffenc rtpenc_chain ac3_parser"
|
||||
mp3_demuxer_select="mpegaudio_parser"
|
||||
mp4_muxer_select="mov_muxer"
|
||||
mpegts_muxer_select="adts_muxer latm_muxer"
|
||||
@@ -2449,12 +2468,14 @@ xwma_demuxer_select="riffdec"
|
||||
# indevs / outdevs
|
||||
alsa_indev_deps="alsa_asoundlib_h snd_pcm_htimestamp"
|
||||
alsa_outdev_deps="alsa_asoundlib_h"
|
||||
avfoundation_indev_extralibs="-framework CoreVideo -framework Foundation -framework AVFoundation -framework CoreMedia"
|
||||
avfoundation_indev_extralibs="-framework CoreVideo -framework Foundation -framework AVFoundation -framework CoreMedia -framework CoreGraphics"
|
||||
avfoundation_indev_select="avfoundation"
|
||||
bktr_indev_deps_any="dev_bktr_ioctl_bt848_h machine_ioctl_bt848_h dev_video_bktr_ioctl_bt848_h dev_ic_bt8xx_h"
|
||||
caca_outdev_deps="libcaca"
|
||||
decklink_outdev_deps="decklink pthreads"
|
||||
decklink_outdev_extralibs="-lstdc++"
|
||||
decklink_indev_deps="decklink pthreads"
|
||||
decklink_indev_extralibs="-lstdc++"
|
||||
dshow_indev_deps="IBaseFilter"
|
||||
dshow_indev_extralibs="-lpsapi -lole32 -lstrmiids -luuid"
|
||||
dv1394_indev_deps="dv1394"
|
||||
@@ -2489,6 +2510,7 @@ vfwcap_indev_extralibs="-lavicap32"
|
||||
xv_outdev_deps="X11_extensions_Xvlib_h XvGetPortAttribute"
|
||||
xv_outdev_extralibs="-lXv -lX11 -lXext"
|
||||
x11grab_indev_deps="x11grab"
|
||||
x11grab_xcb_indev_deps="libxcb"
|
||||
|
||||
# protocols
|
||||
bluray_protocol_deps="libbluray"
|
||||
@@ -2528,11 +2550,11 @@ tcp_protocol_select="network"
|
||||
tls_protocol_deps_any="openssl gnutls"
|
||||
tls_protocol_select="tcp_protocol"
|
||||
udp_protocol_select="network"
|
||||
udplite_protocol_select="network"
|
||||
unix_protocol_deps="sys_un_h"
|
||||
unix_protocol_select="network"
|
||||
|
||||
# filters
|
||||
aconvert_filter_deps="swresample"
|
||||
amovie_filter_deps="avcodec avformat"
|
||||
aresample_filter_deps="swresample"
|
||||
ass_filter_deps="libass"
|
||||
@@ -2551,19 +2573,16 @@ drawtext_filter_deps="libfreetype"
|
||||
ebur128_filter_deps="gpl"
|
||||
flite_filter_deps="libflite"
|
||||
frei0r_filter_deps="frei0r dlopen"
|
||||
frei0r_filter_extralibs='$ldl'
|
||||
frei0r_src_filter_deps="frei0r dlopen"
|
||||
frei0r_src_filter_extralibs='$ldl'
|
||||
geq_filter_deps="gpl"
|
||||
histeq_filter_deps="gpl"
|
||||
hqdn3d_filter_deps="gpl"
|
||||
interlace_filter_deps="gpl"
|
||||
kerndeint_filter_deps="gpl"
|
||||
ladspa_filter_deps="ladspa dlopen"
|
||||
ladspa_filter_extralibs='$ldl'
|
||||
mcdeint_filter_deps="avcodec gpl"
|
||||
movie_filter_deps="avcodec avformat"
|
||||
mp_filter_deps="gpl avcodec swscale inline_asm"
|
||||
mp_filter_deps="gpl avcodec swscale"
|
||||
mpdecimate_filter_deps="gpl"
|
||||
mpdecimate_filter_select="pixelutils"
|
||||
mptestsrc_filter_deps="gpl"
|
||||
@@ -3036,8 +3055,9 @@ case "$toolchain" in
|
||||
add_ldflags -fprofile-arcs -ftest-coverage
|
||||
;;
|
||||
hardened)
|
||||
add_cflags -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fno-strict-overflow -fstack-protector-all
|
||||
add_ldflags -Wl,-z,relro -Wl,-z,now
|
||||
add_cppflags -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2
|
||||
add_cflags -fno-strict-overflow -fstack-protector-all
|
||||
add_ldflags -Wl,-z,relro -Wl,-z,now
|
||||
;;
|
||||
?*)
|
||||
die "Unknown toolchain $toolchain"
|
||||
@@ -3049,9 +3069,13 @@ set_default arch cc cxx doxygen pkg_config ranlib strip sysinclude \
|
||||
enabled cross_compile || host_cc_default=$cc
|
||||
set_default host_cc
|
||||
|
||||
pkg_config_fail_message=""
|
||||
if ! $pkg_config --version >/dev/null 2>&1; then
|
||||
warn "$pkg_config not found, library detection may fail."
|
||||
pkg_config=false
|
||||
elif is_in -static $cc $LDFLAGS && ! is_in --static $pkg_config $pkg_config_flags; then
|
||||
pkg_config_fail_message="
|
||||
Note: When building a static binary, add --pkg-config-flags=\"--static\"."
|
||||
fi
|
||||
|
||||
if test $doxygen != $doxygen_default && \
|
||||
@@ -3428,29 +3452,6 @@ probe_cc(){
|
||||
# 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)
|
||||
_DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< 2>&1 | awk '\''/including/ { sub(/^.*file: */, ""); gsub(/\\/, "/"); if (!match($$0, / /)) print "$@:", $$0 }'\'' > $(@:.o=.d)'
|
||||
_DEPFLAGS='$(CPPFLAGS) $(CFLAGS) -showIncludes -Zs'
|
||||
_cflags_speed="-O2"
|
||||
_cflags_size="-O1"
|
||||
if $_cc 2>&1 | grep -q Linker; then
|
||||
_ld_o='-out:$@'
|
||||
else
|
||||
_ld_o='-Fe$@'
|
||||
fi
|
||||
_cc_o='-Fo$@'
|
||||
_cc_e='-P -Fi$@'
|
||||
_flags_filter=msvc_flags
|
||||
_ld_lib='lib%.a'
|
||||
_ld_path='-libpath:'
|
||||
_flags='-nologo'
|
||||
_cflags='-D_USE_MATH_DEFINES -D_CRT_SECURE_NO_WARNINGS -Dinline=__inline -FIstdlib.h -Dstrtoll=_strtoi64'
|
||||
if [ $pfx = hostcc ]; then
|
||||
append _cflags -Dsnprintf=_snprintf
|
||||
fi
|
||||
disable stripping
|
||||
elif $_cc 2>&1 | grep -q Intel; then
|
||||
_type=icl
|
||||
_ident=$($cc 2>&1 | head -n1)
|
||||
@@ -3477,6 +3478,30 @@ probe_cc(){
|
||||
if [ $pfx = hostcc ]; then
|
||||
append _cflags -Dsnprintf=_snprintf
|
||||
fi
|
||||
disable stripping
|
||||
elif $_cc 2>&1 | grep -q Microsoft; then
|
||||
_type=msvc
|
||||
_ident=$($cc 2>&1 | head -n1)
|
||||
_DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< 2>&1 | awk '\''/including/ { sub(/^.*file: */, ""); gsub(/\\/, "/"); if (!match($$0, / /)) print "$@:", $$0 }'\'' > $(@:.o=.d)'
|
||||
_DEPFLAGS='$(CPPFLAGS) $(CFLAGS) -showIncludes -Zs'
|
||||
_cflags_speed="-O2"
|
||||
_cflags_size="-O1"
|
||||
if $_cc 2>&1 | grep -q Linker; then
|
||||
_ld_o='-out:$@'
|
||||
else
|
||||
_ld_o='-Fe$@'
|
||||
fi
|
||||
_cc_o='-Fo$@'
|
||||
_cc_e='-P -Fi$@'
|
||||
_flags_filter=msvc_flags
|
||||
_ld_lib='lib%.a'
|
||||
_ld_path='-libpath:'
|
||||
_flags='-nologo'
|
||||
_cflags='-D_USE_MATH_DEFINES -D_CRT_SECURE_NO_WARNINGS -Dinline=__inline -FIstdlib.h -Dstrtoll=_strtoi64'
|
||||
if [ $pfx = hostcc ]; then
|
||||
append _cflags -Dsnprintf=_snprintf
|
||||
fi
|
||||
disable stripping
|
||||
elif $_cc --version 2>/dev/null | grep -q ^cparser; then
|
||||
_type=cparser
|
||||
_ident=$($_cc --version | head -n1)
|
||||
@@ -3934,6 +3959,9 @@ case "$arch" in
|
||||
;;
|
||||
x86)
|
||||
check_64bit x86_32 x86_64 'sizeof(void *) > 4'
|
||||
# Treat x32 as x64 for now. Note it also needs spic=$shared
|
||||
test "$subarch" = "x86_32" && check_cpp_condition stddef.h 'defined(__x86_64__)' &&
|
||||
subarch=x86_64
|
||||
if test "$subarch" = "x86_64"; then
|
||||
spic=$shared
|
||||
fi
|
||||
@@ -4033,6 +4061,7 @@ case $target_os in
|
||||
enabled shared && ! enabled small && check_cmd $windres --version && enable gnu_windres
|
||||
check_ldflags -Wl,--nxcompat
|
||||
check_ldflags -Wl,--dynamicbase
|
||||
enabled x86_32 && check_ldflags -Wl,--large-address-aware
|
||||
shlibdir_default="$bindir_default"
|
||||
SLIBPREF=""
|
||||
SLIBSUF=".dll"
|
||||
@@ -4065,6 +4094,7 @@ case $target_os in
|
||||
# Cannot build both shared and static libs with MSVC or icl.
|
||||
disable static
|
||||
fi
|
||||
enabled x86_32 && check_ldflags -LARGEADDRESSAWARE
|
||||
shlibdir_default="$bindir_default"
|
||||
SLIBPREF=""
|
||||
SLIBSUF=".dll"
|
||||
@@ -4230,6 +4260,15 @@ probe_libc(){
|
||||
eval ${pfx}libc_type=solaris
|
||||
add_${pfx}cppflags -D__EXTENSIONS__ -D_XOPEN_SOURCE=600
|
||||
fi
|
||||
check_${pfx}cc <<EOF
|
||||
#include <time.h>
|
||||
void *v = localtime_r;
|
||||
EOF
|
||||
test "$?" != 0 && check_${pfx}cc -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 <<EOF && add_${pfx}cppflags -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600
|
||||
#include <time.h>
|
||||
void *v = localtime_r;
|
||||
EOF
|
||||
|
||||
}
|
||||
|
||||
probe_libc
|
||||
@@ -4373,8 +4412,8 @@ unsigned int endian = 'B' << 24 | 'I' << 16 | 'G' << 8 | 'E';
|
||||
EOF
|
||||
od -t x1 $TMPO | grep -q '42 *49 *47 *45' && enable bigendian
|
||||
|
||||
if [ "$cpu" = "power7" ] || [ "$cpu" = "power8" ] ;then
|
||||
if ! enabled bigendian ;then
|
||||
if [ "$cpu" = "power7" ] || [ "$cpu" = "power8" ] || enabled ppc64; then
|
||||
if ! enabled bigendian && enabled altivec ;then
|
||||
enable vsx
|
||||
fi
|
||||
fi
|
||||
@@ -4500,7 +4539,7 @@ elif enabled parisc; then
|
||||
|
||||
if enabled gcc; then
|
||||
case $($cc -dumpversion) in
|
||||
4.[3-8].*) check_cflags -fno-optimize-sibling-calls ;;
|
||||
4.[3-9].*) check_cflags -fno-optimize-sibling-calls ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
@@ -4608,6 +4647,7 @@ 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=
|
||||
@@ -4615,6 +4655,10 @@ elif check_func dlopen -ldl; then
|
||||
ldl=-ldl
|
||||
fi
|
||||
|
||||
frei0r_filter_extralibs='$ldl'
|
||||
frei0r_src_filter_extralibs='$ldl'
|
||||
ladspa_filter_extralibs='$ldl'
|
||||
|
||||
if ! disabled network; then
|
||||
check_func getaddrinfo $network_extralibs
|
||||
check_func getservbyport $network_extralibs
|
||||
@@ -4656,6 +4700,7 @@ if ! disabled network; then
|
||||
fi
|
||||
|
||||
check_builtin atomic_cas_ptr atomic.h "void **ptr; void *oldval, *newval; atomic_cas_ptr(ptr, oldval, newval)"
|
||||
check_builtin atomic_compare_exchange "" "int *ptr, *oldval; int newval; __atomic_compare_exchange_n(ptr, oldval, newval, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)"
|
||||
check_builtin machine_rw_barrier mbarrier.h "__machine_rw_barrier()"
|
||||
check_builtin MemoryBarrier windows.h "MemoryBarrier()"
|
||||
check_builtin sarestart signal.h "SA_RESTART"
|
||||
@@ -4666,13 +4711,14 @@ check_func ${malloc_prefix}memalign && enable memalign
|
||||
check_func ${malloc_prefix}posix_memalign && enable posix_memalign
|
||||
|
||||
check_func access
|
||||
check_func_headers time.h clock_gettime || { check_func_headers time.h clock_gettime -lrt && add_extralibs -lrt; }
|
||||
check_func_headers time.h clock_gettime || { check_func_headers time.h clock_gettime -lrt && add_extralibs -lrt && LIBRT="-lrt"; }
|
||||
check_func fcntl
|
||||
check_func fork
|
||||
check_func gethrtime
|
||||
check_func getopt
|
||||
check_func getrusage
|
||||
check_func gettimeofday
|
||||
check_func gmtime_r
|
||||
check_func isatty
|
||||
check_func localtime_r
|
||||
check_func mach_absolute_time
|
||||
@@ -4680,7 +4726,7 @@ check_func mkstemp
|
||||
check_func mmap
|
||||
check_func mprotect
|
||||
# Solaris has nanosleep in -lrt, OpenSolaris no longer needs that
|
||||
check_func_headers time.h nanosleep || { check_func_headers time.h nanosleep -lrt && add_extralibs -lrt; }
|
||||
check_func_headers time.h nanosleep || { check_func_headers time.h nanosleep -lrt && add_extralibs -lrt && LIBRT="-lrt"; }
|
||||
check_func sched_getaffinity
|
||||
check_func setrlimit
|
||||
check_struct "sys/stat.h" "struct stat" st_mtim.tv_nsec -D_BSD_SOURCE
|
||||
@@ -4699,15 +4745,16 @@ check_func_headers windows.h GetProcessAffinityMask
|
||||
check_func_headers windows.h GetProcessTimes
|
||||
check_func_headers windows.h GetSystemTimeAsFileTime
|
||||
check_func_headers windows.h MapViewOfFile
|
||||
check_func_headers windows.h MoveFileExA
|
||||
check_func_headers windows.h PeekNamedPipe
|
||||
check_func_headers windows.h SetConsoleTextAttribute
|
||||
check_func_headers windows.h Sleep
|
||||
check_func_headers windows.h VirtualAlloc
|
||||
check_struct windows.h "CONDITION_VARIABLE" Ptr
|
||||
check_func_headers glob.h glob
|
||||
enabled xlib &&
|
||||
check_func_headers "X11/Xlib.h X11/extensions/Xvlib.h" XvGetPortAttribute -lXv -lX11 -lXext
|
||||
|
||||
check_header cl/cl.h
|
||||
check_header direct.h
|
||||
check_header dlfcn.h
|
||||
check_header dxva.h
|
||||
@@ -4716,6 +4763,7 @@ check_header io.h
|
||||
check_header libcrystalhd/libcrystalhd_if.h
|
||||
check_header mach/mach_time.h
|
||||
check_header malloc.h
|
||||
check_header net/udplite.h
|
||||
check_header poll.h
|
||||
check_header sys/mman.h
|
||||
check_header sys/param.h
|
||||
@@ -4781,7 +4829,6 @@ disabled crystalhd || check_lib libcrystalhd/libcrystalhd_if.h DtsCrystalHDVersi
|
||||
atan2f_args=2
|
||||
ldexpf_args=2
|
||||
powf_args=2
|
||||
fminf_args=2
|
||||
|
||||
for func in $MATH_FUNCS; do
|
||||
eval check_mathfunc $func \${${func}_args:-1}
|
||||
@@ -4824,7 +4871,8 @@ 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
|
||||
enabled libopencore_amrwb && require libopencore_amrwb opencore-amrwb/dec_if.h D_IF_init -lopencore-amrwb
|
||||
enabled libopencv && require_pkg_config opencv opencv/cxcore.h cvCreateImageHeader
|
||||
enabled libopenjpeg && { check_lib openjpeg-1.5/openjpeg.h opj_version -lopenjpeg -DOPJ_STATIC ||
|
||||
enabled libopenjpeg && { check_lib openjpeg.h opj_version -lopenmj2 -DOPJ_STATIC ||
|
||||
check_lib openjpeg-1.5/openjpeg.h opj_version -lopenjpeg -DOPJ_STATIC ||
|
||||
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
|
||||
@@ -4833,9 +4881,8 @@ 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
|
||||
enabled libshine && require_pkg_config shine shine/layer3.h shine_encode_buffer
|
||||
enabled libsmbclient && { { check_pkg_config smbclient libsmbclient.h smbc_init &&
|
||||
require_pkg_config smbclient libsmbclient.h smbc_init; } ||
|
||||
require smbclient libsmbclient.h smbc_init -lsmbclient; }
|
||||
enabled libsmbclient && { use_pkg_config smbclient libsmbclient.h smbc_init ||
|
||||
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_pkg_config speex speex/speex.h speex_decoder_init -lspeex
|
||||
@@ -4860,10 +4907,10 @@ enabled libvpx && {
|
||||
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_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 &&
|
||||
{ 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 &&
|
||||
enabled libwebp && require_pkg_config "libwebp >= 0.2.0" webp/encode.h WebPGetEncoderVersion
|
||||
enabled libx264 && { use_pkg_config x264 "stdint.h x264.h" x264_encoder_encode ||
|
||||
{ require libx264 x264.h x264_encoder_encode -lx264 &&
|
||||
warn "using libx264 without pkg-config"; } } &&
|
||||
{ check_cpp_condition x264.h "X264_BUILD >= 118" ||
|
||||
die "ERROR: libx264 must be installed and version must be >= 0.118."; }
|
||||
enabled libx265 && require_pkg_config x265 x265.h x265_encoder_encode &&
|
||||
@@ -4909,21 +4956,26 @@ if enabled libdc1394; then
|
||||
enable libdc1394_1; } ||
|
||||
die "ERROR: No version of libdc1394 found "
|
||||
fi
|
||||
|
||||
SDL_CONFIG="${cross_prefix}sdl-config"
|
||||
if check_pkg_config sdl SDL_events.h SDL_PollEvent; then
|
||||
check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) >= 0x010201" $sdl_cflags &&
|
||||
check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) < 0x010300" $sdl_cflags &&
|
||||
enable sdl
|
||||
else
|
||||
if "${SDL_CONFIG}" --version > /dev/null 2>&1; then
|
||||
sdl_cflags=$("${SDL_CONFIG}" --cflags)
|
||||
sdl_libs=$("${SDL_CONFIG}" --libs)
|
||||
check_func_headers SDL_version.h SDL_Linked_Version $sdl_cflags $sdl_libs &&
|
||||
check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) >= 0x010201" $sdl_cflags &&
|
||||
check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) < 0x010300" $sdl_cflags &&
|
||||
enable sdl
|
||||
fi
|
||||
if ! disabled sdl; then
|
||||
SDL_CONFIG="${cross_prefix}sdl-config"
|
||||
if check_pkg_config sdl SDL_events.h SDL_PollEvent; then
|
||||
check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) >= 0x010201" $sdl_cflags &&
|
||||
check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) < 0x010300" $sdl_cflags &&
|
||||
enable sdl
|
||||
else
|
||||
if "${SDL_CONFIG}" --version > /dev/null 2>&1; then
|
||||
sdl_cflags=$("${SDL_CONFIG}" --cflags)
|
||||
sdl_libs=$("${SDL_CONFIG}" --libs)
|
||||
check_func_headers SDL_version.h SDL_Linked_Version $sdl_cflags $sdl_libs &&
|
||||
check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) >= 0x010201" $sdl_cflags &&
|
||||
check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) < 0x010300" $sdl_cflags &&
|
||||
enable sdl
|
||||
elif enabled sdl ; then
|
||||
die "ERROR: SDL not found"
|
||||
else
|
||||
disable sdl
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
enabled sdl && add_cflags $sdl_cflags && add_extralibs $sdl_libs
|
||||
|
||||
@@ -4942,6 +4994,7 @@ check_header linux/videodev2.h
|
||||
check_code cc linux/videodev2.h "struct v4l2_frmsizeenum vfse; vfse.discrete.width = 0;" && enable_safe struct_v4l2_frmivalenum_discrete
|
||||
|
||||
check_header sys/videoio.h
|
||||
check_code cc sys/videoio.h "struct v4l2_frmsizeenum vfse; vfse.discrete.width = 0;" && enable_safe struct_v4l2_frmivalenum_discrete
|
||||
|
||||
check_func_headers "windows.h vfw.h" capCreateCaptureWindow "$vfwcap_indev_extralibs"
|
||||
# check that WM_CAP_DRIVER_CONNECT is defined to the proper value
|
||||
@@ -4987,10 +5040,37 @@ fi
|
||||
enabled xlib &&
|
||||
check_lib X11/Xlib.h XOpenDisplay -lX11 || disable xlib
|
||||
|
||||
enabled x11grab &&
|
||||
require Xext X11/extensions/XShm.h XShmCreateImage -lXext &&
|
||||
require Xfixes X11/extensions/Xfixes.h XFixesGetCursorImage -lXfixes &&
|
||||
{ enabled xlib || die "ERROR: Xlib not found"; }
|
||||
if ! disabled libxcb; then
|
||||
check_pkg_config xcb xcb/xcb.h xcb_connect || {
|
||||
enabled libxcb && die "ERROR: libxcb not found";
|
||||
} && disable x11grab && enable libxcb
|
||||
|
||||
if enabled libxcb; then
|
||||
disabled libxcb_shm || {
|
||||
check_pkg_config xcb-shm xcb/shm.h xcb_shm_attach || {
|
||||
enabled libxcb_shm && die "ERROR: libxcb_shm not found";
|
||||
} && check_header sys/shm.h && enable libxcb_shm; }
|
||||
|
||||
disabled libxcb_xfixes || {
|
||||
check_pkg_config xcb-xfixes xcb/xfixes.h xcb_xfixes_get_cursor_image || {
|
||||
enabled libxcb_xfixes && die "ERROR: libxcb_xfixes not found";
|
||||
} && enable libxcb_xfixes; }
|
||||
|
||||
disabled libxcb_shape || {
|
||||
check_pkg_config xcb-shape xcb/shape.h xcb_shape_get_rectangles || {
|
||||
enabled libxcb_shape && die "ERROR: libxcb_shape not found";
|
||||
} && enable libxcb_shape; }
|
||||
|
||||
add_cflags $xcb_cflags $xcb_shm_cflags $xcb_xfixes_cflags $xcb_shape_cflags
|
||||
add_extralibs $xcb_libs $xcb_shm_libs $xcb_xfixes_libs $xcb_shape_libs
|
||||
fi
|
||||
fi
|
||||
|
||||
if enabled x11grab; then
|
||||
enabled xlib || die "ERROR: Xlib not found"
|
||||
require Xext X11/extensions/XShm.h XShmCreateImage -lXext
|
||||
require Xfixes X11/extensions/Xfixes.h XFixesGetCursorImage -lXfixes
|
||||
fi
|
||||
|
||||
check_func_headers "windows.h" CreateDIBSection "$gdigrab_indev_extralibs"
|
||||
|
||||
@@ -5301,7 +5381,6 @@ 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"
|
||||
@@ -5597,7 +5676,7 @@ cat > $TMPH <<EOF
|
||||
#define FFMPEG_CONFIG_H
|
||||
#define FFMPEG_CONFIGURATION "$(c_escape $FFMPEG_CONFIGURATION)"
|
||||
#define FFMPEG_LICENSE "$(c_escape $license)"
|
||||
#define CONFIG_THIS_YEAR 2014
|
||||
#define CONFIG_THIS_YEAR 2015
|
||||
#define FFMPEG_DATADIR "$(eval c_escape $datadir)"
|
||||
#define AVCONV_DATADIR "$(eval c_escape $datadir)"
|
||||
#define CC_IDENT "$(c_escape ${cc_ident:-Unknown compiler})"
|
||||
@@ -5625,6 +5704,7 @@ enabled getenv || echo "#define getenv(x) NULL" >> $TMPH
|
||||
|
||||
|
||||
mkdir -p doc
|
||||
mkdir -p tests
|
||||
echo "@c auto-generated by configure" > doc/config.texi
|
||||
|
||||
print_config ARCH_ "$config_files" $ARCH_LIST
|
||||
@@ -5711,7 +5791,7 @@ Cflags: -I\${includedir}
|
||||
EOF
|
||||
}
|
||||
|
||||
pkgconfig_generate libavutil "FFmpeg utility library" "$LIBAVUTIL_VERSION" "$LIBM"
|
||||
pkgconfig_generate libavutil "FFmpeg utility library" "$LIBAVUTIL_VERSION" "$LIBRT $LIBM"
|
||||
pkgconfig_generate libavcodec "FFmpeg codec library" "$LIBAVCODEC_VERSION" "$extralibs"
|
||||
pkgconfig_generate libavformat "FFmpeg container format library" "$LIBAVFORMAT_VERSION" "$extralibs"
|
||||
pkgconfig_generate libavdevice "FFmpeg device handling library" "$LIBAVDEVICE_VERSION" "$extralibs"
|
||||
|
@@ -15,6 +15,58 @@ libavutil: 2014-08-09
|
||||
|
||||
API changes, most recent first:
|
||||
|
||||
2014-11-21 - ab922f9 - lavu 54.15.100 - dict.h
|
||||
Add av_dict_get_string().
|
||||
|
||||
2014-11-18 - a54a51c - lavu 54.14.100 - float_dsp.h
|
||||
Add avpriv_float_dsp_alloc().
|
||||
|
||||
2014-11-16 - 6690d4c3 - lavf 56.13.100 - avformat.h
|
||||
Add AVStream.recommended_encoder_configuration with accessors.
|
||||
|
||||
2014-11-16 - bee5844d - lavu 54.13.100 - opt.h
|
||||
Add av_opt_serialize().
|
||||
|
||||
2014-11-16 - eec69332 - lavu 54.12.100 - opt.h
|
||||
Add av_opt_is_set_to_default().
|
||||
|
||||
2014-11-06 - 44fa267 / 5e80fb7 - lavc 56.11.100 / 56.6.0 - vorbis_parser.h
|
||||
Add a public API for parsing vorbis packets.
|
||||
|
||||
2014-10-15 - 17085a0 / 7ea1b34 - lavc 56.7.100 / 56.5.0 - avcodec.h
|
||||
Replace AVCodecContext.time_base used for decoding
|
||||
with AVCodecContext.framerate.
|
||||
|
||||
2014-10-15 - 51c810e / d565fef1 - lavc 56.6.100 / 56.4.0 - avcodec.h
|
||||
Add AV_HWACCEL_FLAG_IGNORE_LEVEL flag to av_vdpau_bind_context().
|
||||
|
||||
2014-10-13 - da21895 / 2df0c32e - lavc 56.5.100 / 56.3.0 - avcodec.h
|
||||
Add AVCodecContext.initial_padding. Deprecate the use of AVCodecContext.delay
|
||||
for audio encoding.
|
||||
|
||||
2014-10-08 - bb44f7d / 5a419b2 - lavu 54.10.100 / 54.4.0 - pixdesc.h
|
||||
Add API to return the name of frame and context color properties.
|
||||
|
||||
2014-10-06 - a61899a / e3e158e - lavc 56.3.100 / 56.2.0 - vdpau.h
|
||||
Add av_vdpau_bind_context(). This function should now be used for creating
|
||||
(or resetting) a AVVDPAUContext instead of av_vdpau_alloc_context().
|
||||
|
||||
2014-10-02 - cdd6f05 - lavc 56.2.100 - avcodec.h
|
||||
2014-10-02 - cdd6f05 - lavu 54.9.100 - frame.h
|
||||
Add AV_FRAME_DATA_SKIP_SAMPLES. Add lavc CODEC_FLAG2_SKIP_MANUAL and
|
||||
AVOption "skip_manual", which makes lavc export skip information via
|
||||
AV_FRAME_DATA_SKIP_SAMPLES AVFrame side data, instead of skipping and
|
||||
discarding samples automatically.
|
||||
|
||||
2014-10-02 - 0d92b0d - lavu 54.8.100 - avstring.h
|
||||
Add av_match_list()
|
||||
|
||||
2014-09-24 - ac68295 - libpostproc 53.1.100
|
||||
Add visualization support
|
||||
|
||||
2014-09-19 - 6edd6a4 - lavc 56.1.101 - dv_profile.h
|
||||
deprecate avpriv_dv_frame_profile2(), which was made public by accident.
|
||||
|
||||
|
||||
-------- 8< --------- FFmpeg 2.4 was cut here -------- 8< ---------
|
||||
|
||||
@@ -148,7 +200,7 @@ API changes, most recent first:
|
||||
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
|
||||
2014-06-10 - 5482780 - lavf 55.43.100 - avformat.h
|
||||
New field int64_t max_analyze_duration2 instead of deprecated
|
||||
int max_analyze_duration.
|
||||
|
||||
@@ -172,7 +224,7 @@ API changes, most recent first:
|
||||
Add strict_std_compliance and related AVOptions to support experimental
|
||||
muxing.
|
||||
|
||||
2014-05-26 - xxxxxxx - lavu 52.87.100 - threadmessage.h
|
||||
2014-05-26 - 55cc60c - lavu 52.87.100 - threadmessage.h
|
||||
Add thread message queue API.
|
||||
|
||||
2014-05-26 - c37d179 - lavf 55.41.100 - avformat.h
|
||||
@@ -182,7 +234,7 @@ API changes, most recent first:
|
||||
Add av_stream_get_side_data() to access stream-level side data
|
||||
in the same way as av_packet_get_side_data().
|
||||
|
||||
2014-05-xx - xxxxxxx - lavu 52.86.100 - fifo.h
|
||||
2014-05-20 - 7336e39 - lavu 52.86.100 - fifo.h
|
||||
Add av_fifo_alloc_array() function.
|
||||
|
||||
2014-05-19 - ef1d4ee / bddd8cb - lavu 52.85.100 / 53.15.0 - frame.h, display.h
|
||||
@@ -214,10 +266,10 @@ API changes, most recent first:
|
||||
2014-05-11 - 14aef38 / 66e6c8a - lavu 52.83.100 / 53.14.0 - pixfmt.h
|
||||
Add AV_PIX_FMT_VDA for new-style VDA acceleration.
|
||||
|
||||
2014-05-xx - xxxxxxx - lavu 52.82.0 - fifo.h
|
||||
2014-05-07 - 351f611 - lavu 52.82.100 - fifo.h
|
||||
Add av_fifo_freep() function.
|
||||
|
||||
2014-05-02 - ba52fb11 - lavu 52.81.0 - opt.h
|
||||
2014-05-02 - ba52fb11 - lavu 52.81.100 - opt.h
|
||||
Add av_opt_set_dict2() function.
|
||||
|
||||
2014-05-01 - e77b985 / a2941c8 - lavc 55.60.103 / 55.50.3 - avcodec.h
|
||||
@@ -236,10 +288,14 @@ API changes, most recent first:
|
||||
Deprecate CODEC_FLAG_INPUT_PRESERVED. Its functionality is replaced by passing
|
||||
reference-counted frames to encoders.
|
||||
|
||||
2014-04-30 - 617e866 - lavu 52.81.100 - pixdesc.h
|
||||
Add av_find_best_pix_fmt_of_2(), av_get_pix_fmt_loss()
|
||||
Deprecate avcodec_get_pix_fmt_loss(), avcodec_find_best_pix_fmt_of_2()
|
||||
|
||||
2014-04-29 - 1bf6396 - lavc 55.60.100 - avcodec.h
|
||||
Add AVCodecDescriptor.mime_types field.
|
||||
|
||||
2014-04-29 - xxxxxxx - lavu 52.80.0 - hash.h
|
||||
2014-04-29 - b804eb4 - lavu 52.80.100 - hash.h
|
||||
Add av_hash_final_bin(), av_hash_final_hex() and av_hash_final_b64().
|
||||
|
||||
2014-03-07 - 8b2a130 - lavc 55.50.0 / 55.53.100 - dxva2.h
|
||||
@@ -251,7 +307,7 @@ API changes, most recent first:
|
||||
2014-04-17 - a8d01a7 / 0983d48 - lavu 53.12.0 / 52.77.100 - crc.h
|
||||
Add AV_CRC_16_ANSI_LE crc variant.
|
||||
|
||||
2014-04-XX - xxxxxxx - lavf xx.xx.1xx - avformat.h
|
||||
2014-04-15 - ef818d8 - lavf 55.37.101 - avformat.h
|
||||
Add av_format_inject_global_side_data()
|
||||
|
||||
2014-04-12 - 4f698be - lavu 52.76.100 - log.h
|
||||
@@ -331,7 +387,7 @@ API changes, most recent first:
|
||||
2014-02-19 - f4c8d00 / 6bb8720 - lavu 52.64.101 / 53.3.1 - opt.h
|
||||
Deprecate unused AV_OPT_FLAG_METADATA.
|
||||
|
||||
2014-02-xx - xxxxxxx - lavd 55.10.100 - avdevice.h
|
||||
2014-02-16 - 81c3f81 - lavd 55.10.100 - avdevice.h
|
||||
Add avdevice_list_devices() and avdevice_free_list_devices()
|
||||
|
||||
2014-02-16 - db3c970 - lavf 55.33.100 - avio.h
|
||||
@@ -372,7 +428,7 @@ API changes, most recent first:
|
||||
2014-01-19 - 1a193c4 - lavf 55.25.100 - avformat.h
|
||||
Add avformat_get_mov_video_tags() and avformat_get_mov_audio_tags().
|
||||
|
||||
2014-01-19 - xxxxxxx - lavu 52.63.100 - rational.h
|
||||
2014-01-19 - 3532dd5 - lavu 52.63.100 - rational.h
|
||||
Add av_make_q() function.
|
||||
|
||||
2014-01-05 - 4cf4da9 / 5b4797a - lavu 52.62.100 / 53.2.0 - frame.h
|
||||
@@ -862,6 +918,9 @@ lavd 54.4.100 / 54.0.0, lavfi 3.5.0
|
||||
avresample_read() are now uint8_t** instead of void**.
|
||||
Libavresample is now stable.
|
||||
|
||||
2012-09-26 - 3ba0dab7 / 1384df64 - lavf 54.29.101 / 56.06.3 - avformat.h
|
||||
Add AVFormatContext.avoid_negative_ts.
|
||||
|
||||
2012-09-24 - 46a3595 / a42aada - lavc 54.59.100 / 54.28.0 - avcodec.h
|
||||
Add avcodec_free_frame(). This function must now
|
||||
be used for freeing an AVFrame.
|
||||
|
@@ -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.5.4
|
||||
|
||||
# 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
|
||||
|
@@ -13,7 +13,16 @@ bitstream filter using the option @code{--disable-bsf=BSF}.
|
||||
The option @code{-bsfs} of the ff* tools will display the list of
|
||||
all the supported bitstream filters included in your build.
|
||||
|
||||
Below is a description of the currently available bitstream filters.
|
||||
The ff* tools have a -bsf option applied per stream, taking a
|
||||
comma-separated list of filters, whose parameters follow the filter
|
||||
name after a '='.
|
||||
|
||||
@example
|
||||
ffmpeg -i INPUT -c:v copy -bsf:v filter1[=opt1=str1/opt2=str2][,filter2] OUTPUT
|
||||
@end example
|
||||
|
||||
Below is a description of the currently available bitstream filters,
|
||||
with their parameters, if any.
|
||||
|
||||
@section aac_adtstoasc
|
||||
|
||||
@@ -135,9 +144,16 @@ ffmpeg -i frame_%d.jpg -c:v copy rotated.avi
|
||||
Damages the contents of packets without damaging the container. Can be
|
||||
used for fuzzing or testing error resilience/concealment.
|
||||
|
||||
Parameters:
|
||||
A numeral string, whose value is related to how often output bytes will
|
||||
be modified. Therefore, values below or equal to 0 are forbidden, and
|
||||
the lower the more frequent bytes will be modified, with 1 meaning
|
||||
every byte is modified.
|
||||
|
||||
@example
|
||||
ffmpeg -i INPUT -c copy -bsf noise output.mkv
|
||||
ffmpeg -i INPUT -c copy -bsf noise[=1] output.mkv
|
||||
@end example
|
||||
applies the modification to every byte.
|
||||
|
||||
@section remove_extra
|
||||
|
||||
|
@@ -71,7 +71,9 @@ Force low delay.
|
||||
@item global_header
|
||||
Place global headers in extradata instead of every keyframe.
|
||||
@item bitexact
|
||||
Use only bitexact stuff (except (I)DCT).
|
||||
Only write platform-, build- and time-independent data. (except (I)DCT).
|
||||
This ensures that file and data checksums are reproducible and match between
|
||||
platforms. Its primary use is for regression testing.
|
||||
@item aic
|
||||
Apply H263 advanced intra coding / mpeg4 ac prediction.
|
||||
@item cbp
|
||||
@@ -1114,6 +1116,19 @@ Interlaced video, bottom coded first, top displayed first
|
||||
Set to 1 to disable processing alpha (transparency). This works like the
|
||||
@samp{gray} flag in the @option{flags} option which skips chroma information
|
||||
instead of alpha. Default is 0.
|
||||
|
||||
@item codec_whitelist @var{list} (@emph{input})
|
||||
"," separated List of allowed decoders. By default all are allowed.
|
||||
|
||||
@item dump_separator @var{string} (@emph{input})
|
||||
Separator used to separate the fields printed on the command line about the
|
||||
Stream parameters.
|
||||
For example to separate the fields with newlines and indention:
|
||||
@example
|
||||
ffprobe -dump_separator "
|
||||
" -i ~/videos/matrixbench_mpeg2.mpg
|
||||
@end example
|
||||
|
||||
@end table
|
||||
|
||||
@c man end CODEC OPTIONS
|
||||
|
@@ -190,6 +190,15 @@ The format for this option is a string containing 16 24-bits hexadecimal
|
||||
numbers (without 0x prefix) separated by comas, for example @code{0d00ee,
|
||||
ee450d, 101010, eaeaea, 0ce60b, ec14ed, ebff0b, 0d617a, 7b7b7b, d1d1d1,
|
||||
7b2a0e, 0d950c, 0f007b, cf0dec, cfa80c, 7c127b}.
|
||||
|
||||
@item ifo_palette
|
||||
Specify the IFO file from which the global palette is obtained.
|
||||
(experimental)
|
||||
|
||||
@item forced_subs_only
|
||||
Only decode subtitle entries marked as forced. Some titles have forced
|
||||
and non-forced subtitles in the same track. Setting this flag to @code{1}
|
||||
will only keep the forced subtitles. Default value is @code{0}.
|
||||
@end table
|
||||
|
||||
@section libzvbi-teletext
|
||||
|
@@ -29,6 +29,26 @@ the caller can decide which variant streams to actually receive.
|
||||
The total bitrate of the variant that the stream belongs to is
|
||||
available in a metadata key named "variant_bitrate".
|
||||
|
||||
@section apng
|
||||
|
||||
Animated Portable Network Graphics demuxer.
|
||||
|
||||
This demuxer is used to demux APNG files.
|
||||
All headers, but the PNG signature, up to (but not including) the first
|
||||
fcTL chunk are transmitted as extradata.
|
||||
Frames are then split as being all the chunks between two fcTL ones, or
|
||||
between the last fcTL and IEND chunks.
|
||||
|
||||
@table @option
|
||||
@item -ignore_loop @var{bool}
|
||||
Ignore the loop variable in the file if set.
|
||||
@item -max_fps @var{int}
|
||||
Maximum framerate in frames per second (0 for no limit).
|
||||
@item -default_fps @var{int}
|
||||
Default framerate in frames per second when none is specified in the file
|
||||
(0 meaning as fast as possible).
|
||||
@end table
|
||||
|
||||
@section asf
|
||||
|
||||
Advanced Systems Format demuxer.
|
||||
|
@@ -1745,6 +1745,10 @@ Enable calculation and printing SSIM stats after the encoding.
|
||||
Enable the use of Periodic Intra Refresh instead of IDR frames when set
|
||||
to 1.
|
||||
|
||||
@item avcintra-class (@emph{class})
|
||||
Configure the encoder to generate AVC-Intra.
|
||||
Valid values are 50,100 and 200
|
||||
|
||||
@item bluray-compat (@emph{bluray-compat})
|
||||
Configure the encoder to be compatible with the bluray standard.
|
||||
It is a shorthand for setting "bluray-compat=1 force-cfr=1".
|
||||
@@ -1882,6 +1886,34 @@ no-fast-pskip=1:subq=6:8x8dct=0:trellis=0 OUTPUT
|
||||
Encoding ffpresets for common usages are provided so they can be used with the
|
||||
general presets system (e.g. passing the @option{pre} option).
|
||||
|
||||
@section libx265
|
||||
|
||||
x265 H.265/HEVC encoder wrapper.
|
||||
|
||||
This encoder requires the presence of the libx265 headers and library
|
||||
during configuration. You need to explicitly configure the build with
|
||||
@option{--enable-libx265}.
|
||||
|
||||
@subsection Options
|
||||
|
||||
@table @option
|
||||
@item preset
|
||||
Set the x265 preset.
|
||||
|
||||
@item tune
|
||||
Set the x265 tune parameter.
|
||||
|
||||
@item x265-params
|
||||
Set x265 options using a list of @var{key}=@var{value} couples separated
|
||||
by ":". See @command{x265 --help} for a list of options.
|
||||
|
||||
For example to specify libx265 encoding options with @option{-x265-params}:
|
||||
|
||||
@example
|
||||
ffmpeg -i input -c:v libx265 -x265-params crf=26:psy-rd=1 output.mp4
|
||||
@end example
|
||||
@end table
|
||||
|
||||
@section libxvid
|
||||
|
||||
Xvid MPEG-4 Part 2 encoder wrapper.
|
||||
|
@@ -29,6 +29,7 @@ OBJS=$(addsuffix .o,$(EXAMPLES))
|
||||
|
||||
# the following examples make explicit use of the math library
|
||||
avcodec: LDLIBS += -lm
|
||||
decoding_encoding: LDLIBS += -lm
|
||||
muxing: LDLIBS += -lm
|
||||
resampling_audio: LDLIBS += -lm
|
||||
|
||||
|
@@ -288,6 +288,7 @@ static void audio_decode_example(const char *outfilename, const char *filename)
|
||||
avpkt.size = fread(inbuf, 1, AUDIO_INBUF_SIZE, f);
|
||||
|
||||
while (avpkt.size > 0) {
|
||||
int i, ch;
|
||||
int got_frame = 0;
|
||||
|
||||
if (!decoded_frame) {
|
||||
@@ -304,15 +305,15 @@ static void audio_decode_example(const char *outfilename, const char *filename)
|
||||
}
|
||||
if (got_frame) {
|
||||
/* if a frame has been decoded, output it */
|
||||
int data_size = av_samples_get_buffer_size(NULL, c->channels,
|
||||
decoded_frame->nb_samples,
|
||||
c->sample_fmt, 1);
|
||||
int data_size = av_get_bytes_per_sample(c->sample_fmt);
|
||||
if (data_size < 0) {
|
||||
/* This should not occur, checking just for paranoia */
|
||||
fprintf(stderr, "Failed to calculate data size\n");
|
||||
exit(1);
|
||||
}
|
||||
fwrite(decoded_frame->data[0], 1, data_size, outfile);
|
||||
for (i=0; i<decoded_frame->nb_samples; i++)
|
||||
for (ch=0; ch<c->channels; ch++)
|
||||
fwrite(decoded_frame->data[ch] + data_size*i, 1, data_size, outfile);
|
||||
}
|
||||
avpkt.size -= len;
|
||||
avpkt.data += len;
|
||||
@@ -650,7 +651,7 @@ int main(int argc, char **argv)
|
||||
video_encode_example("test.h264", AV_CODEC_ID_H264);
|
||||
} else if (!strcmp(output_type, "mp2")) {
|
||||
audio_encode_example("test.mp2");
|
||||
audio_decode_example("test.sw", "test.mp2");
|
||||
audio_decode_example("test.pcm", "test.mp2");
|
||||
} else if (!strcmp(output_type, "mpg")) {
|
||||
video_encode_example("test.mpg", AV_CODEC_ID_MPEG1VIDEO);
|
||||
video_decode_example("test%02d.pgm", "test.mpg");
|
||||
|
@@ -90,6 +90,7 @@ static int init_filters(const char *filters_descr)
|
||||
AVFilter *buffersink = avfilter_get_by_name("buffersink");
|
||||
AVFilterInOut *outputs = avfilter_inout_alloc();
|
||||
AVFilterInOut *inputs = avfilter_inout_alloc();
|
||||
AVRational time_base = fmt_ctx->streams[video_stream_index]->time_base;
|
||||
enum AVPixelFormat pix_fmts[] = { AV_PIX_FMT_GRAY8, AV_PIX_FMT_NONE };
|
||||
|
||||
filter_graph = avfilter_graph_alloc();
|
||||
@@ -102,7 +103,7 @@ static int init_filters(const char *filters_descr)
|
||||
snprintf(args, sizeof(args),
|
||||
"video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d",
|
||||
dec_ctx->width, dec_ctx->height, dec_ctx->pix_fmt,
|
||||
dec_ctx->time_base.num, dec_ctx->time_base.den,
|
||||
time_base.num, time_base.den,
|
||||
dec_ctx->sample_aspect_ratio.num, dec_ctx->sample_aspect_ratio.den);
|
||||
|
||||
ret = avfilter_graph_create_filter(&buffersrc_ctx, buffersrc, "in",
|
||||
|
@@ -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);
|
||||
|
@@ -306,7 +306,7 @@ static int decode_audio_frame(AVFrame *frame,
|
||||
|
||||
/** Read one audio frame from the input file into a temporary packet. */
|
||||
if ((error = av_read_frame(input_format_context, &input_packet)) < 0) {
|
||||
/** If we are the the end of the file, flush the decoder below. */
|
||||
/** If we are at the end of the file, flush the decoder below. */
|
||||
if (error == AVERROR_EOF)
|
||||
*finished = 1;
|
||||
else {
|
||||
|
@@ -116,6 +116,10 @@ static int open_output_file(const char *filename)
|
||||
|| dec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) {
|
||||
/* in this example, we choose transcoding to same codec */
|
||||
encoder = avcodec_find_encoder(dec_ctx->codec_id);
|
||||
if (!encoder) {
|
||||
av_log(NULL, AV_LOG_FATAL, "Neccessary encoder not found\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
/* In this example, we transcode to same properties (picture size,
|
||||
* sample rate etc.). These properties can be changed for output
|
||||
@@ -385,17 +389,9 @@ static int encode_write_frame(AVFrame *filt_frame, unsigned int stream_index, in
|
||||
|
||||
/* prepare packet for muxing */
|
||||
enc_pkt.stream_index = stream_index;
|
||||
enc_pkt.dts = av_rescale_q_rnd(enc_pkt.dts,
|
||||
ofmt_ctx->streams[stream_index]->codec->time_base,
|
||||
ofmt_ctx->streams[stream_index]->time_base,
|
||||
AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
|
||||
enc_pkt.pts = av_rescale_q_rnd(enc_pkt.pts,
|
||||
ofmt_ctx->streams[stream_index]->codec->time_base,
|
||||
ofmt_ctx->streams[stream_index]->time_base,
|
||||
AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
|
||||
enc_pkt.duration = av_rescale_q(enc_pkt.duration,
|
||||
ofmt_ctx->streams[stream_index]->codec->time_base,
|
||||
ofmt_ctx->streams[stream_index]->time_base);
|
||||
av_packet_rescale_ts(&enc_pkt,
|
||||
ofmt_ctx->streams[stream_index]->codec->time_base,
|
||||
ofmt_ctx->streams[stream_index]->time_base);
|
||||
|
||||
av_log(NULL, AV_LOG_DEBUG, "Muxing frame\n");
|
||||
/* mux encoded frame */
|
||||
@@ -509,14 +505,9 @@ int main(int argc, char **argv)
|
||||
ret = AVERROR(ENOMEM);
|
||||
break;
|
||||
}
|
||||
packet.dts = av_rescale_q_rnd(packet.dts,
|
||||
ifmt_ctx->streams[stream_index]->time_base,
|
||||
ifmt_ctx->streams[stream_index]->codec->time_base,
|
||||
AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
|
||||
packet.pts = av_rescale_q_rnd(packet.pts,
|
||||
ifmt_ctx->streams[stream_index]->time_base,
|
||||
ifmt_ctx->streams[stream_index]->codec->time_base,
|
||||
AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
|
||||
av_packet_rescale_ts(&packet,
|
||||
ifmt_ctx->streams[stream_index]->time_base,
|
||||
ifmt_ctx->streams[stream_index]->codec->time_base);
|
||||
dec_func = (type == AVMEDIA_TYPE_VIDEO) ? avcodec_decode_video2 :
|
||||
avcodec_decode_audio4;
|
||||
ret = dec_func(ifmt_ctx->streams[stream_index]->codec, frame,
|
||||
@@ -538,14 +529,9 @@ int main(int argc, char **argv)
|
||||
}
|
||||
} else {
|
||||
/* remux this frame without reencoding */
|
||||
packet.dts = av_rescale_q_rnd(packet.dts,
|
||||
ifmt_ctx->streams[stream_index]->time_base,
|
||||
ofmt_ctx->streams[stream_index]->time_base,
|
||||
AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
|
||||
packet.pts = av_rescale_q_rnd(packet.pts,
|
||||
ifmt_ctx->streams[stream_index]->time_base,
|
||||
ofmt_ctx->streams[stream_index]->time_base,
|
||||
AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
|
||||
av_packet_rescale_ts(&packet,
|
||||
ifmt_ctx->streams[stream_index]->time_base,
|
||||
ofmt_ctx->streams[stream_index]->time_base);
|
||||
|
||||
ret = av_interleaved_write_frame(ofmt_ctx, &packet);
|
||||
if (ret < 0)
|
||||
|
@@ -360,7 +360,7 @@ ffmpeg -i myfile.avi -target vcd -bf 2 /tmp/vcd.mpg
|
||||
@end example
|
||||
|
||||
@item -dframes @var{number} (@emph{output})
|
||||
Set the number of data frames to record. This is an alias for @code{-frames:d}.
|
||||
Set the number of data frames to output. This is an alias for @code{-frames:d}.
|
||||
|
||||
@item -frames[:@var{stream_specifier}] @var{framecount} (@emph{output,per-stream})
|
||||
Stop writing to the stream after @var{framecount} frames.
|
||||
@@ -467,7 +467,7 @@ attachments.
|
||||
|
||||
@table @option
|
||||
@item -vframes @var{number} (@emph{output})
|
||||
Set the number of video frames to record. This is an alias for @code{-frames:v}.
|
||||
Set the number of video frames to output. This is an alias for @code{-frames:v}.
|
||||
@item -r[:@var{stream_specifier}] @var{fps} (@emph{input/output,per-stream})
|
||||
Set frame rate (Hz value, fraction or abbreviation).
|
||||
|
||||
@@ -692,7 +692,7 @@ If this option is not specified, the default adapter is used.
|
||||
|
||||
@table @option
|
||||
@item -aframes @var{number} (@emph{output})
|
||||
Set the number of audio frames to record. This is an alias for @code{-frames:a}.
|
||||
Set the number of audio frames to output. This is an alias for @code{-frames:a}.
|
||||
@item -ar[:@var{stream_specifier}] @var{freq} (@emph{input/output,per-stream})
|
||||
Set the audio sampling frequency. For output streams it is set by
|
||||
default to the frequency of the corresponding input stream. For input
|
||||
@@ -1016,6 +1016,12 @@ processing (e.g. in case the format option @option{avoid_negative_ts}
|
||||
is enabled) the output timestamps may mismatch with the input
|
||||
timestamps even when this option is selected.
|
||||
|
||||
@item -start_at_zero
|
||||
When used with @option{copyts}, shift input timestamps so they start at zero.
|
||||
|
||||
This means that using e.g. @code{-ss 50} will make output timestamps start at
|
||||
50 seconds, regardless of what timestamp the input file started at.
|
||||
|
||||
@item -copytb @var{mode}
|
||||
Specify how to set the encoder timebase when stream copying. @var{mode} is an
|
||||
integer numeric value, and can assume one of the following values:
|
||||
|
@@ -37,10 +37,14 @@ Force displayed height.
|
||||
Set frame size (WxH or abbreviation), needed for videos which do
|
||||
not contain a header with the frame size like raw YUV. This option
|
||||
has been deprecated in favor of private options, try -video_size.
|
||||
@item -fs
|
||||
Start in fullscreen mode.
|
||||
@item -an
|
||||
Disable audio.
|
||||
@item -vn
|
||||
Disable video.
|
||||
@item -sn
|
||||
Disable subtitles.
|
||||
@item -ss @var{pos}
|
||||
Seek to a given position in seconds.
|
||||
@item -t @var{duration}
|
||||
@@ -109,15 +113,10 @@ duration, the codec parameters, the current position in the stream and
|
||||
the audio/video synchronisation drift. It is on by default, to
|
||||
explicitly disable it you need to specify @code{-nostats}.
|
||||
|
||||
@item -bug
|
||||
Work around bugs.
|
||||
@item -fast
|
||||
Non-spec-compliant optimizations.
|
||||
@item -genpts
|
||||
Generate pts.
|
||||
@item -rtp_tcp
|
||||
Force RTP/TCP protocol usage instead of RTP/UDP. It is only meaningful
|
||||
if you are streaming with the RTSP protocol.
|
||||
@item -sync @var{type}
|
||||
Set the master clock to audio (@code{type=audio}), video
|
||||
(@code{type=video}) or external (@code{type=ext}). Default is audio. The
|
||||
@@ -126,7 +125,8 @@ players use audio as master clock, but in some cases (streaming or high
|
||||
quality broadcast) it is necessary to change that. This option is mainly
|
||||
used for debugging purposes.
|
||||
@item -threads @var{count}
|
||||
Set the thread count.
|
||||
Set the thread count. By default, @command{ffplay} automatically detects a
|
||||
suitable number of threads to use.
|
||||
@item -ast @var{audio_stream_number}
|
||||
Select the desired audio stream number, counting from 0. The number
|
||||
refers to the list of all the input audio streams. If it is greater
|
||||
@@ -164,8 +164,20 @@ Force a specific video decoder.
|
||||
Force a specific subtitle decoder.
|
||||
|
||||
@item -autorotate
|
||||
Automatically rotate the video according to presentation metadata. Set by
|
||||
default, use -noautorotate to disable.
|
||||
Automatically rotate the video according to presentation metadata. Enabled by
|
||||
default, use @option{-noautorotate} to disable it.
|
||||
|
||||
@item -framedrop
|
||||
Drop video frames if video is out of sync. Enabled by default if the master
|
||||
clock is not set to video. Use this option to enable frame dropping for all
|
||||
master clock sources, use @option{-noframedrop} to disable it.
|
||||
|
||||
@item -infbuf
|
||||
Do not limit the input buffer size, read as much data as possible from the
|
||||
input as soon as possible. Enabled by default for realtime streams, where data
|
||||
may be dropped if not read in time. Use this option to enable infinite buffers
|
||||
for all inputs, use @option{-noinfbuf} to disable it.
|
||||
|
||||
@end table
|
||||
|
||||
@section While playing
|
||||
|
@@ -321,6 +321,12 @@ Show information related to program and library versions. This is the
|
||||
equivalent of setting both @option{-show_program_version} and
|
||||
@option{-show_library_versions} options.
|
||||
|
||||
@item -show_pixel_formats
|
||||
Show information about all pixel formats supported by FFmpeg.
|
||||
|
||||
Pixel format information for each format is printed within a section
|
||||
with name "PIXEL_FORMAT".
|
||||
|
||||
@item -bitexact
|
||||
Force bitexact output, useful to produce output which is not dependent
|
||||
on the specific build.
|
||||
|
@@ -10,8 +10,10 @@
|
||||
<xsd:sequence>
|
||||
<xsd:element name="program_version" type="ffprobe:programVersionType" minOccurs="0" maxOccurs="1" />
|
||||
<xsd:element name="library_versions" type="ffprobe:libraryVersionsType" minOccurs="0" maxOccurs="1" />
|
||||
<xsd:element name="pixel_formats" type="ffprobe:pixelFormatsType" minOccurs="0" maxOccurs="1" />
|
||||
<xsd:element name="packets" type="ffprobe:packetsType" minOccurs="0" maxOccurs="1" />
|
||||
<xsd:element name="frames" type="ffprobe:framesType" minOccurs="0" maxOccurs="1" />
|
||||
<xsd:element name="packets_and_frames" type="ffprobe:packetsAndFramesType" minOccurs="0" maxOccurs="1" />
|
||||
<xsd:element name="programs" type="ffprobe:programsType" minOccurs="0" maxOccurs="1" />
|
||||
<xsd:element name="streams" type="ffprobe:streamsType" minOccurs="0" maxOccurs="1" />
|
||||
<xsd:element name="chapters" type="ffprobe:chaptersType" minOccurs="0" maxOccurs="1" />
|
||||
@@ -35,6 +37,16 @@
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="packetsAndFramesType">
|
||||
<xsd:sequence>
|
||||
<xsd:choice minOccurs="0" maxOccurs="unbounded">
|
||||
<xsd:element name="packet" type="ffprobe:packetType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xsd:element name="frame" type="ffprobe:frameType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xsd:element name="subtitle" type="ffprobe:subtitleType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xsd:choice>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="packetType">
|
||||
<xsd:attribute name="codec_type" type="xsd:string" use="required" />
|
||||
<xsd:attribute name="stream_index" type="xsd:int" use="required" />
|
||||
@@ -166,6 +178,9 @@
|
||||
<xsd:attribute name="level" type="xsd:int"/>
|
||||
<xsd:attribute name="color_range" type="xsd:string"/>
|
||||
<xsd:attribute name="color_space" type="xsd:string"/>
|
||||
<xsd:attribute name="color_transfer" type="xsd:string"/>
|
||||
<xsd:attribute name="color_primaries" type="xsd:string"/>
|
||||
<xsd:attribute name="chroma_location" type="xsd:string"/>
|
||||
<xsd:attribute name="timecode" type="xsd:string"/>
|
||||
|
||||
<!-- audio attributes -->
|
||||
@@ -277,4 +292,45 @@
|
||||
<xsd:element name="library_version" type="ffprobe:libraryVersionType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="pixelFormatFlagsType">
|
||||
<xsd:attribute name="big_endian" type="xsd:int" use="required"/>
|
||||
<xsd:attribute name="palette" type="xsd:int" use="required"/>
|
||||
<xsd:attribute name="bitstream" type="xsd:int" use="required"/>
|
||||
<xsd:attribute name="hwaccel" type="xsd:int" use="required"/>
|
||||
<xsd:attribute name="planar" type="xsd:int" use="required"/>
|
||||
<xsd:attribute name="rgb" type="xsd:int" use="required"/>
|
||||
<xsd:attribute name="pseudopal" type="xsd:int" use="required"/>
|
||||
<xsd:attribute name="alpha" type="xsd:int" use="required"/>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="pixelFormatComponentType">
|
||||
<xsd:attribute name="index" type="xsd:int" use="required"/>
|
||||
<xsd:attribute name="bit_depth" type="xsd:int" use="required"/>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="pixelFormatComponentsType">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="component" type="ffprobe:pixelFormatComponentType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="pixelFormatType">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="flags" type="ffprobe:pixelFormatFlagsType" minOccurs="0" maxOccurs="1"/>
|
||||
<xsd:element name="components" type="ffprobe:pixelFormatComponentsType" minOccurs="0" maxOccurs="1"/>
|
||||
</xsd:sequence>
|
||||
|
||||
<xsd:attribute name="name" type="xsd:string" use="required"/>
|
||||
<xsd:attribute name="nb_components" type="xsd:int" use="required"/>
|
||||
<xsd:attribute name="log2_chroma_w" type="xsd:int"/>
|
||||
<xsd:attribute name="log2_chroma_h" type="xsd:int"/>
|
||||
<xsd:attribute name="bits_per_pixel" type="xsd:int"/>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="pixelFormatsType">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="pixel_format" type="ffprobe:pixelFormatType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
</xsd:schema>
|
||||
|
@@ -408,6 +408,12 @@ ignored, and the log is written to standard output.
|
||||
Set no-daemon mode. This option is currently ignored since now
|
||||
@command{ffserver} will always work in no-daemon mode, and is
|
||||
deprecated.
|
||||
|
||||
@item UseDefaults
|
||||
@item NoDefaults
|
||||
Control whether default codec options are used for the all streams or not.
|
||||
Each stream may overwrite this setting for its own. Default is @var{UseDefaults}.
|
||||
The lastest occurrence overrides previous if multiple definitions.
|
||||
@end table
|
||||
|
||||
@section Feed section
|
||||
@@ -571,6 +577,11 @@ deprecated in favor of @option{Metadata}.
|
||||
@item Metadata @var{key} @var{value}
|
||||
Set metadata value on the output stream.
|
||||
|
||||
@item UseDefaults
|
||||
@item NoDefaults
|
||||
Control whether default codec options are used for the stream or not.
|
||||
Default is @var{UseDefaults} unless disabled globally.
|
||||
|
||||
@item NoAudio
|
||||
@item NoVideo
|
||||
Suppress audio/video.
|
||||
@@ -589,8 +600,9 @@ Set sampling frequency for audio. When using low bitrates, you should
|
||||
lower this frequency to 22050 or 11025. The supported frequencies
|
||||
depend on the selected audio codec.
|
||||
|
||||
@item AVOptionAudio @var{option} @var{value} (@emph{encoding,audio})
|
||||
Set generic option for audio stream.
|
||||
@item AVOptionAudio [@var{codec}:]@var{option} @var{value} (@emph{encoding,audio})
|
||||
Set generic or private option for audio stream.
|
||||
Private option must be prefixed with codec name or codec must be defined before.
|
||||
|
||||
@item AVPresetAudio @var{preset} (@emph{encoding,audio})
|
||||
Set preset for audio stream.
|
||||
@@ -667,8 +679,9 @@ Set video @option{qdiff} encoding option.
|
||||
@item DarkMask @var{float} (@emph{encoding,video})
|
||||
Set @option{lumi_mask}/@option{dark_mask} encoding options.
|
||||
|
||||
@item AVOptionVideo @var{option} @var{value} (@emph{encoding,video})
|
||||
Set generic option for video stream.
|
||||
@item AVOptionVideo [@var{codec}:]@var{option} @var{value} (@emph{encoding,video})
|
||||
Set generic or private option for video stream.
|
||||
Private option must be prefixed with codec name or codec must be defined before.
|
||||
|
||||
@item AVPresetVideo @var{preset} (@emph{encoding,video})
|
||||
Set preset for video stream.
|
||||
|
@@ -103,7 +103,10 @@ Print detailed information about the filter name @var{filter_name}. Use the
|
||||
Show version.
|
||||
|
||||
@item -formats
|
||||
Show available formats.
|
||||
Show available formats (including devices).
|
||||
|
||||
@item -devices
|
||||
Show available devices.
|
||||
|
||||
@item -codecs
|
||||
Show all codecs known to libavcodec.
|
||||
@@ -138,6 +141,22 @@ Show channel names and standard channel layouts.
|
||||
@item -colors
|
||||
Show recognized color names.
|
||||
|
||||
@item -sources @var{device}[,@var{opt1}=@var{val1}[,@var{opt2}=@var{val2}]...]
|
||||
Show autodetected sources of the intput device.
|
||||
Some devices may provide system-dependent source names that cannot be autodetected.
|
||||
The returned list cannot be assumed to be always complete.
|
||||
@example
|
||||
ffmpeg -sources pulse,server=192.168.0.4
|
||||
@end example
|
||||
|
||||
@item -sinks @var{device}[,@var{opt1}=@var{val1}[,@var{opt2}=@var{val2}]...]
|
||||
Show autodetected sinks of the output device.
|
||||
Some devices may provide system-dependent sink names that cannot be autodetected.
|
||||
The returned list cannot be assumed to be always complete.
|
||||
@example
|
||||
ffmpeg -sinks pulse,server=192.168.0.4
|
||||
@end example
|
||||
|
||||
@item -loglevel [repeat+]@var{loglevel} | -v [repeat+]@var{loglevel}
|
||||
Set the logging level used by the library.
|
||||
Adding "repeat+" indicates that repeated log output should not be compressed
|
||||
|
214
doc/filters.texi
214
doc/filters.texi
@@ -282,6 +282,10 @@ sequential number of the input frame, starting from 0
|
||||
|
||||
@item pos
|
||||
the position in the file of the input frame, NAN if unknown
|
||||
|
||||
@item w
|
||||
@item h
|
||||
width and height of the input frame if video
|
||||
@end table
|
||||
|
||||
Additionally, these filters support an @option{enable} command that can be used
|
||||
@@ -309,41 +313,6 @@ build.
|
||||
|
||||
Below is a description of the currently available audio filters.
|
||||
|
||||
@section aconvert
|
||||
|
||||
Convert the input audio format to the specified formats.
|
||||
|
||||
@emph{This filter is deprecated. Use @ref{aformat} instead.}
|
||||
|
||||
The filter accepts a string of the form:
|
||||
"@var{sample_format}:@var{channel_layout}".
|
||||
|
||||
@var{sample_format} specifies the sample format, and can be a string or the
|
||||
corresponding numeric value defined in @file{libavutil/samplefmt.h}. Use 'p'
|
||||
suffix for a planar sample format.
|
||||
|
||||
@var{channel_layout} specifies the channel layout, and can be a string
|
||||
or the corresponding number value defined in @file{libavutil/channel_layout.h}.
|
||||
|
||||
The special parameter "auto", signifies that the filter will
|
||||
automatically select the output format depending on the output filter.
|
||||
|
||||
@subsection Examples
|
||||
|
||||
@itemize
|
||||
@item
|
||||
Convert input to float, planar, stereo:
|
||||
@example
|
||||
aconvert=fltp:stereo
|
||||
@end example
|
||||
|
||||
@item
|
||||
Convert input to unsigned 8-bit, automatically select out channel layout:
|
||||
@example
|
||||
aconvert=u8:auto
|
||||
@end example
|
||||
@end itemize
|
||||
|
||||
@section adelay
|
||||
|
||||
Delay one or more audio channels.
|
||||
@@ -1741,11 +1710,11 @@ The default is 0.707q and gives a Butterworth response.
|
||||
Mix channels with specific gain levels. The filter accepts the output
|
||||
channel layout followed by a set of channels definitions.
|
||||
|
||||
This filter is also designed to remap efficiently the channels of an audio
|
||||
This filter is also designed to efficiently remap the channels of an audio
|
||||
stream.
|
||||
|
||||
The filter accepts parameters of the form:
|
||||
"@var{l}:@var{outdef}:@var{outdef}:..."
|
||||
"@var{l}|@var{outdef}|@var{outdef}|..."
|
||||
|
||||
@table @option
|
||||
@item l
|
||||
@@ -1776,13 +1745,13 @@ avoiding clipping noise.
|
||||
For example, if you want to down-mix from stereo to mono, but with a bigger
|
||||
factor for the left channel:
|
||||
@example
|
||||
pan=1:c0=0.9*c0+0.1*c1
|
||||
pan=1c|c0=0.9*c0+0.1*c1
|
||||
@end example
|
||||
|
||||
A customized down-mix to stereo that works automatically for 3-, 4-, 5- and
|
||||
7-channels surround:
|
||||
@example
|
||||
pan=stereo: FL < FL + 0.5*FC + 0.6*BL + 0.6*SL : FR < FR + 0.5*FC + 0.6*BR + 0.6*SR
|
||||
pan=stereo| FL < FL + 0.5*FC + 0.6*BL + 0.6*SL | FR < FR + 0.5*FC + 0.6*BR + 0.6*SR
|
||||
@end example
|
||||
|
||||
Note that @command{ffmpeg} integrates a default down-mix (and up-mix) system
|
||||
@@ -1805,25 +1774,25 @@ remapping.
|
||||
For example, if you have a 5.1 source and want a stereo audio stream by
|
||||
dropping the extra channels:
|
||||
@example
|
||||
pan="stereo: c0=FL : c1=FR"
|
||||
pan="stereo| c0=FL | c1=FR"
|
||||
@end example
|
||||
|
||||
Given the same source, you can also switch front left and front right channels
|
||||
and keep the input channel layout:
|
||||
@example
|
||||
pan="5.1: c0=c1 : c1=c0 : c2=c2 : c3=c3 : c4=c4 : c5=c5"
|
||||
pan="5.1| c0=c1 | c1=c0 | c2=c2 | c3=c3 | c4=c4 | c5=c5"
|
||||
@end example
|
||||
|
||||
If the input is a stereo audio stream, you can mute the front left channel (and
|
||||
still keep the stereo channel layout) with:
|
||||
@example
|
||||
pan="stereo:c1=c1"
|
||||
pan="stereo|c1=c1"
|
||||
@end example
|
||||
|
||||
Still with a stereo audio stream input, you can copy the right channel in both
|
||||
front left and right:
|
||||
@example
|
||||
pan="stereo: c0=FR : c1=FR"
|
||||
pan="stereo| c0=FR | c1=FR"
|
||||
@end example
|
||||
|
||||
@section replaygain
|
||||
@@ -2552,6 +2521,26 @@ Same as the @ref{subtitles} filter, except that it doesn't require libavcodec
|
||||
and libavformat to work. On the other hand, it is limited to ASS (Advanced
|
||||
Substation Alpha) subtitles files.
|
||||
|
||||
This filter accepts the following option in addition to the common options from
|
||||
the @ref{subtitles} filter:
|
||||
|
||||
@table @option
|
||||
@item shaping
|
||||
Set the shaping engine
|
||||
|
||||
Available values are:
|
||||
@table @samp
|
||||
@item auto
|
||||
The default libass shaping engine, which is the best available.
|
||||
@item simple
|
||||
Fast, font-agnostic shaper that can do only substitutions
|
||||
@item complex
|
||||
Slower shaper using OpenType for substitutions and positioning
|
||||
@end table
|
||||
|
||||
The default is @code{auto}.
|
||||
@end table
|
||||
|
||||
@section bbox
|
||||
|
||||
Compute the bounding box for the non-black pixels in the input frame
|
||||
@@ -4185,7 +4174,7 @@ drawtext='fontfile=Linux Libertine O-40\:style=Semibold:text=FFmpeg'
|
||||
@item
|
||||
Print the date of a real-time encoding (see strftime(3)):
|
||||
@example
|
||||
drawtext='fontfile=FreeSans.ttf:text=%@{localtime:%a %b %d %Y@}'
|
||||
drawtext='fontfile=FreeSans.ttf:text=%@{localtime\:%a %b %d %Y@}'
|
||||
@end example
|
||||
|
||||
@item
|
||||
@@ -4458,6 +4447,10 @@ and VIVTC/VFM (VapourSynth project). The later is a light clone of TFM from
|
||||
which @code{fieldmatch} is based on. While the semantic and usage are very
|
||||
close, some behaviour and options names can differ.
|
||||
|
||||
The @ref{decimate} filter currently only works for constant frame rate input.
|
||||
Do not use @code{fieldmatch} and @ref{decimate} if your input has mixed
|
||||
telecined and progressive content with changing framerate.
|
||||
|
||||
The filter accepts the following options:
|
||||
|
||||
@table @option
|
||||
@@ -5124,6 +5117,22 @@ Modify RGB components depending on pixel position:
|
||||
@example
|
||||
geq=r='X/W*r(X,Y)':g='(1-X/W)*g(X,Y)':b='(H-Y)/H*b(X,Y)'
|
||||
@end example
|
||||
|
||||
@item
|
||||
Create a radial gradient that is the same size as the input (also see
|
||||
the @ref{vignette} filter):
|
||||
@example
|
||||
geq=lum=255*gauss((X/W-0.5)*3)*gauss((Y/H-0.5)*3)/gauss(0)/gauss(0),format=gray
|
||||
@end example
|
||||
|
||||
@item
|
||||
Create a linear gradient to use as a mask for another filter, then
|
||||
compose with @ref{overlay}. In this example the video will gradually
|
||||
become more blurry from the top to the bottom of the y-axis as defined
|
||||
by the linear gradient:
|
||||
@example
|
||||
ffmpeg -i input.mp4 -filter_complex "geq=lum=255*(Y/H),format=gray[grad];[0:v]boxblur=4[blur];[blur][grad]alphamerge[alpha];[0:v][alpha]overlay" output.mp4
|
||||
@end example
|
||||
@end itemize
|
||||
|
||||
@section gradfun
|
||||
@@ -5565,8 +5574,62 @@ value.
|
||||
|
||||
Detect video interlacing type.
|
||||
|
||||
This filter tries to detect if the input is interlaced or progressive,
|
||||
top or bottom field first.
|
||||
This filter tries to detect if the input frames as interlaced, progressive,
|
||||
top or bottom field first. It will also try and detect fields that are
|
||||
repeated between adjacent frames (a sign of telecine).
|
||||
|
||||
Single frame detection considers only immediately adjacent frames when classifying each frame.
|
||||
Multiple frame detection incorporates the classification history of previous frames.
|
||||
|
||||
The filter will log these metadata values:
|
||||
|
||||
@table @option
|
||||
@item single.current_frame
|
||||
Detected type of current frame using single-frame detection. One of:
|
||||
``tff'' (top field first), ``bff'' (bottom field first),
|
||||
``progressive'', or ``undetermined''
|
||||
|
||||
@item single.tff
|
||||
Cumulative number of frames detected as top field first using single-frame detection.
|
||||
|
||||
@item multiple.tff
|
||||
Cumulative number of frames detected as top field first using multiple-frame detection.
|
||||
|
||||
@item single.bff
|
||||
Cumulative number of frames detected as bottom field first using single-frame detection.
|
||||
|
||||
@item multiple.current_frame
|
||||
Detected type of current frame using multiple-frame detection. One of:
|
||||
``tff'' (top field first), ``bff'' (bottom field first),
|
||||
``progressive'', or ``undetermined''
|
||||
|
||||
@item multiple.bff
|
||||
Cumulative number of frames detected as bottom field first using multiple-frame detection.
|
||||
|
||||
@item single.progressive
|
||||
Cumulative number of frames detected as progressive using single-frame detection.
|
||||
|
||||
@item multiple.progressive
|
||||
Cumulative number of frames detected as progressive using multiple-frame detection.
|
||||
|
||||
@item single.undetermined
|
||||
Cumulative number of frames that could not be classified using single-frame detection.
|
||||
|
||||
@item multiple.undetermined
|
||||
Cumulative number of frames that could not be classified using multiple-frame detection.
|
||||
|
||||
@item repeated.current_frame
|
||||
Which field in the current frame is repeated from the last. One of ``neither'', ``top'', or ``bottom''.
|
||||
|
||||
@item repeated.neither
|
||||
Cumulative number of frames with no repeated field.
|
||||
|
||||
@item repeated.top
|
||||
Cumulative number of frames with the top field repeated from the previous frame's top field.
|
||||
|
||||
@item repeated.bottom
|
||||
Cumulative number of frames with the bottom field repeated from the previous frame's bottom field.
|
||||
@end table
|
||||
|
||||
The filter accepts the following options:
|
||||
|
||||
@@ -5575,6 +5638,13 @@ The filter accepts the following options:
|
||||
Set interlacing threshold.
|
||||
@item prog_thres
|
||||
Set progressive threshold.
|
||||
@item repeat_thres
|
||||
Threshold for repeated field detection.
|
||||
@item half_life
|
||||
Number of frames after which a given frame's contribution to the
|
||||
statistics is halved (i.e., it contributes only 0.5 to it's
|
||||
classification). The default of 0 means that all frames seen are given
|
||||
full weight of 1.0 forever.
|
||||
@end table
|
||||
|
||||
@section il
|
||||
@@ -6221,7 +6291,7 @@ values are assumed.
|
||||
|
||||
Refer to the official libopencv documentation for more precise
|
||||
information:
|
||||
@url{http://opencv.willowgarage.com/documentation/c/image_filtering.html}
|
||||
@url{http://docs.opencv.org/master/modules/imgproc/doc/filtering.html}
|
||||
|
||||
Several libopencv filters are supported; see the following subsections.
|
||||
|
||||
@@ -6713,6 +6783,9 @@ A description of the accepted parameters follows.
|
||||
@item y3
|
||||
Set coordinates expression for top left, top right, bottom left and bottom right corners.
|
||||
Default values are @code{0:0:W:0:0:H:W:H} with which perspective will remain unchanged.
|
||||
If the @code{sense} option is set to @code{source}, then the specified points will be sent
|
||||
to the corners of the destination. If the @code{sense} option is set to @code{destination},
|
||||
then the corners of the source will be sent to the specified coordinates.
|
||||
|
||||
The expressions can use the following variables:
|
||||
|
||||
@@ -6732,6 +6805,24 @@ It accepts the following values:
|
||||
@end table
|
||||
|
||||
Default value is @samp{linear}.
|
||||
|
||||
@item sense
|
||||
Set interpretation of coordinate options.
|
||||
|
||||
It accepts the following values:
|
||||
@table @samp
|
||||
@item 0, source
|
||||
|
||||
Send point in the source specified by the given coordinates to
|
||||
the corners of the destination.
|
||||
|
||||
@item 1, destination
|
||||
|
||||
Send the corners of the source to the point in the destination specified
|
||||
by the given coordinates.
|
||||
|
||||
Default value is @samp{source}.
|
||||
@end table
|
||||
@end table
|
||||
|
||||
@section phase
|
||||
@@ -8646,6 +8737,7 @@ ffmpeg -i INPUT -vf trim=duration=1
|
||||
@end itemize
|
||||
|
||||
|
||||
@anchor{unsharp}
|
||||
@section unsharp
|
||||
|
||||
Sharpen or blur the input video.
|
||||
@@ -8807,7 +8899,7 @@ Read a file with transform information for each frame and
|
||||
apply/compensate them. Together with the @ref{vidstabdetect}
|
||||
filter this can be used to deshake videos. See also
|
||||
@url{http://public.hronopik.de/vid.stab}. It is important to also use
|
||||
the unsharp filter, see below.
|
||||
the @ref{unsharp} filter, see below.
|
||||
|
||||
To enable compilation of this filter you need to configure FFmpeg with
|
||||
@code{--enable-libvidstab}.
|
||||
@@ -8817,7 +8909,7 @@ To enable compilation of this filter you need to configure FFmpeg with
|
||||
@table @option
|
||||
@item input
|
||||
Set path to the file used to read the transforms. Default value is
|
||||
@file{transforms.trf}).
|
||||
@file{transforms.trf}.
|
||||
|
||||
@item smoothing
|
||||
Set the number of frames (value*2 + 1) used for lowpass filtering the
|
||||
@@ -8825,9 +8917,9 @@ camera movements. Default value is 10.
|
||||
|
||||
For example a number of 10 means that 21 frames are used (10 in the
|
||||
past and 10 in the future) to smoothen the motion in the video. A
|
||||
larger values leads to a smoother video, but limits the acceleration
|
||||
of the camera (pan/tilt movements). 0 is a special case where a
|
||||
static camera is simulated.
|
||||
larger value leads to a smoother video, but limits the acceleration of
|
||||
the camera (pan/tilt movements). 0 is a special case where a static
|
||||
camera is simulated.
|
||||
|
||||
@item optalgo
|
||||
Set the camera path optimization algorithm.
|
||||
@@ -8864,7 +8956,7 @@ fill the border black
|
||||
Invert transforms if set to 1. Default value is 0.
|
||||
|
||||
@item relative
|
||||
Consider transforms as relative to previsou frame if set to 1,
|
||||
Consider transforms as relative to previous frame if set to 1,
|
||||
absolute if set to 0. Default value is 0.
|
||||
|
||||
@item zoom
|
||||
@@ -8930,7 +9022,7 @@ Use @command{ffmpeg} for a typical stabilization with default values:
|
||||
ffmpeg -i inp.mpeg -vf vidstabtransform,unsharp=5:5:0.8:3:3:0.4 inp_stabilized.mpeg
|
||||
@end example
|
||||
|
||||
Note the use of the unsharp filter which is always recommended.
|
||||
Note the use of the @ref{unsharp} filter which is always recommended.
|
||||
|
||||
@item
|
||||
Zoom in a bit more and load transform data from a given file:
|
||||
@@ -9104,6 +9196,20 @@ Only deinterlace frames marked as interlaced.
|
||||
Default value is @samp{all}.
|
||||
@end table
|
||||
|
||||
@section xbr
|
||||
Apply the xBR high-quality magnification filter which is designed for pixel
|
||||
art. It follows a set of edge-detection rules, see
|
||||
@url{http://www.libretro.com/forums/viewtopic.php?f=6&t=134}.
|
||||
|
||||
It accepts the following option:
|
||||
|
||||
@table @option
|
||||
@item n
|
||||
Set the scaling dimension: @code{2} for @code{2xBR}, @code{3} for
|
||||
@code{3xBR} and @code{4} for @code{4xBR}.
|
||||
Default is @code{3}.
|
||||
@end table
|
||||
|
||||
@anchor{yadif}
|
||||
@section yadif
|
||||
|
||||
|
@@ -55,6 +55,10 @@ Do not merge side data.
|
||||
Enable RTP MP4A-LATM payload.
|
||||
@item nobuffer
|
||||
Reduce the latency introduced by optional buffering
|
||||
@item bitexact
|
||||
Only write platform-, build- and time-independent data.
|
||||
This ensures that file and data checksums are reproducible and match between
|
||||
platforms. Its primary use is for regression testing.
|
||||
@end table
|
||||
|
||||
@item seek2any @var{integer} (@emph{input})
|
||||
@@ -168,6 +172,18 @@ The offset is added by the muxer to the output timestamps.
|
||||
Specifying a positive offset means that the corresponding streams are
|
||||
delayed bt the time duration specified in @var{offset}. Default value
|
||||
is @code{0} (meaning that no offset is applied).
|
||||
|
||||
@item format_whitelist @var{list} (@emph{input})
|
||||
"," separated List of allowed demuxers. By default all are allowed.
|
||||
|
||||
@item dump_separator @var{string} (@emph{input})
|
||||
Separator used to separate the fields printed on the command line about the
|
||||
Stream parameters.
|
||||
For example to separate the fields with newlines and indention:
|
||||
@example
|
||||
ffprobe -dump_separator "
|
||||
" -i ~/videos/matrixbench_mpeg2.mpg
|
||||
@end example
|
||||
@end table
|
||||
|
||||
@c man end FORMAT OPTIONS
|
||||
|
@@ -454,6 +454,7 @@ library:
|
||||
@item Sony Wave64 (W64) @tab X @tab X
|
||||
@item SoX native format @tab X @tab X
|
||||
@item SUN AU format @tab X @tab X
|
||||
@item SUP raw PGS subtitles @tab @tab X
|
||||
@item Text files @tab @tab X
|
||||
@item THP @tab @tab X
|
||||
@tab Used on the Nintendo GameCube.
|
||||
@@ -1030,6 +1031,7 @@ performance on systems without hardware floating point support).
|
||||
@item PJS (Phoenix) @tab @tab X @tab @tab X
|
||||
@item RealText @tab @tab X @tab @tab X
|
||||
@item SAMI @tab @tab X @tab @tab X
|
||||
@item Spruce format (STL) @tab @tab X @tab @tab X
|
||||
@item SSA/ASS @tab X @tab X @tab X @tab X
|
||||
@item SubRip (SRT) @tab X @tab X @tab X @tab X
|
||||
@item SubViewer v1 @tab @tab X @tab @tab X
|
||||
|
142
doc/indevs.texi
142
doc/indevs.texi
@@ -58,34 +58,94 @@ AVFoundation input device.
|
||||
AVFoundation is the currently recommended framework by Apple for streamgrabbing on OSX >= 10.7 as well as on iOS.
|
||||
The older QTKit framework has been marked deprecated since OSX version 10.7.
|
||||
|
||||
The filename passed as input is parsed to contain either a device name or index.
|
||||
The device index can also be given by using -video_device_index.
|
||||
A given device index will override any given device name.
|
||||
If the desired device consists of numbers only, use -video_device_index to identify it.
|
||||
The default device will be chosen if an empty string or the device name "default" is given.
|
||||
The available devices can be enumerated by using -list_devices.
|
||||
The pixel format can be set using -pixel_format.
|
||||
Available formats:
|
||||
monob, rgb555be, rgb555le, rgb565be, rgb565le, rgb24, bgr24, 0rgb, bgr0, 0bgr, rgb0,
|
||||
The input filename has to be given in the following syntax:
|
||||
@example
|
||||
-i "[[VIDEO]:[AUDIO]]"
|
||||
@end example
|
||||
The first entry selects the video input while the latter selects the audio input.
|
||||
The stream has to be specified by the device name or the device index as shown by the device list.
|
||||
Alternatively, the video and/or audio input device can be chosen by index using the
|
||||
@option{
|
||||
-video_device_index <INDEX>
|
||||
}
|
||||
and/or
|
||||
@option{
|
||||
-audio_device_index <INDEX>
|
||||
}
|
||||
, overriding any
|
||||
device name or index given in the input filename.
|
||||
|
||||
All available devices can be enumerated by using @option{-list_devices true}, listing
|
||||
all device names and corresponding indices.
|
||||
|
||||
There are two device name aliases:
|
||||
@table @code
|
||||
|
||||
@item default
|
||||
Select the AVFoundation default device of the corresponding type.
|
||||
|
||||
@item none
|
||||
Do not record the corresponding media type.
|
||||
This is equivalent to specifying an empty device name or index.
|
||||
|
||||
@end table
|
||||
|
||||
@subsection Options
|
||||
|
||||
AVFoundation supports the following options:
|
||||
|
||||
@table @option
|
||||
|
||||
@item -list_devices <TRUE|FALSE>
|
||||
If set to true, a list of all available input devices is given showing all
|
||||
device names and indices.
|
||||
|
||||
@item -video_device_index <INDEX>
|
||||
Specify the video device by its index. Overrides anything given in the input filename.
|
||||
|
||||
@item -audio_device_index <INDEX>
|
||||
Specify the audio device by its index. Overrides anything given in the input filename.
|
||||
|
||||
@item -pixel_format <FORMAT>
|
||||
Request the video device to use a specific pixel format.
|
||||
If the specified format is not supported, a list of available formats is given
|
||||
und the first one in this list is used instead. Available pixel formats are:
|
||||
@code{monob, rgb555be, rgb555le, rgb565be, rgb565le, rgb24, bgr24, 0rgb, bgr0, 0bgr, rgb0,
|
||||
bgr48be, uyvy422, yuva444p, yuva444p16le, yuv444p, yuv422p16, yuv422p10, yuv444p10,
|
||||
yuv420p, nv12, yuyv422, gray
|
||||
yuv420p, nv12, yuyv422, gray}
|
||||
|
||||
@end table
|
||||
|
||||
@subsection Examples
|
||||
|
||||
@itemize
|
||||
|
||||
@item
|
||||
Print the list of AVFoundation supported devices and exit:
|
||||
@example
|
||||
ffmpeg -f avfoundation -i "0" out.mpg
|
||||
$ ffmpeg -f avfoundation -list_devices true -i ""
|
||||
@end example
|
||||
|
||||
@item
|
||||
Record video from video device 0 and audio from audio device 0 into out.avi:
|
||||
@example
|
||||
ffmpeg -f avfoundation -video_device_index 0 -i "" out.mpg
|
||||
$ ffmpeg -f avfoundation -i "0:0" out.avi
|
||||
@end example
|
||||
|
||||
@item
|
||||
Record video from video device 2 and audio from audio device 1 into out.avi:
|
||||
@example
|
||||
ffmpeg -f avfoundation -pixel_format bgr0 -i "default" out.mpg
|
||||
$ ffmpeg -f avfoundation -video_device_index 2 -i ":1" out.avi
|
||||
@end example
|
||||
|
||||
@item
|
||||
Record video from the system default video device using the pixel format bgr0 and do not record any audio into out.avi:
|
||||
@example
|
||||
ffmpeg -f avfoundation -list_devices true -i ""
|
||||
$ ffmpeg -f avfoundation -pixel_format bgr0 -i "default:none" out.avi
|
||||
@end example
|
||||
|
||||
@end itemize
|
||||
|
||||
@section bktr
|
||||
|
||||
BSD video input device.
|
||||
@@ -922,4 +982,58 @@ 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
|
||||
|
||||
@section decklink
|
||||
|
||||
The decklink input device provides capture capabilities for Blackmagic
|
||||
DeckLink devices.
|
||||
|
||||
To enable this input device, you need the Blackmagic DeckLink SDK and you
|
||||
need to configure with the appropriate @code{--extra-cflags}
|
||||
and @code{--extra-ldflags}.
|
||||
On Windows, you need to run the IDL files through @command{widl}.
|
||||
|
||||
DeckLink is very picky about the formats it supports. Pixel format is always
|
||||
uyvy422, framerate and video size must be determined for your device with
|
||||
@command{-list_formats 1}. Audio sample rate is always 48 kHz and the number
|
||||
of channels currently is limited to 2 (stereo).
|
||||
|
||||
@subsection Options
|
||||
|
||||
@table @option
|
||||
|
||||
@item list_devices
|
||||
If set to @option{true}, print a list of devices and exit.
|
||||
Defaults to @option{false}.
|
||||
|
||||
@item list_formats
|
||||
If set to @option{true}, print a list of supported formats and exit.
|
||||
Defaults to @option{false}.
|
||||
|
||||
@end table
|
||||
|
||||
@subsection Examples
|
||||
|
||||
@itemize
|
||||
|
||||
@item
|
||||
List input devices:
|
||||
@example
|
||||
ffmpeg -f decklink -list_devices 1 -i dummy
|
||||
@end example
|
||||
|
||||
@item
|
||||
List supported formats:
|
||||
@example
|
||||
ffmpeg -f decklink -list_formats 1 -i 'Intensity Pro'
|
||||
@end example
|
||||
|
||||
@item
|
||||
Capture video clip at 1080i50 (format 11):
|
||||
@example
|
||||
ffmpeg -f decklink -i 'Intensity Pro@@11' -acodec copy -vcodec copy output.avi
|
||||
@end example
|
||||
|
||||
@end itemize
|
||||
|
||||
|
||||
@c man end INPUT DEVICES
|
||||
|
@@ -194,15 +194,19 @@ can not be smaller than one centi second.
|
||||
Apple HTTP Live Streaming muxer that segments MPEG-TS according to
|
||||
the HTTP Live Streaming (HLS) specification.
|
||||
|
||||
It creates a playlist file and numbered segment files. The output
|
||||
filename specifies the playlist filename; the segment filenames
|
||||
receive the same basename as the playlist, a sequential number and
|
||||
a .ts extension.
|
||||
It creates a playlist file, and one or more segment files. The output filename
|
||||
specifies the playlist filename.
|
||||
|
||||
By default, the muxer creates a file for each segment produced. These files
|
||||
have the same name as the playlist, followed by a sequential number and a
|
||||
.ts extension.
|
||||
|
||||
For example, to convert an input file with @command{ffmpeg}:
|
||||
@example
|
||||
ffmpeg -i in.nut out.m3u8
|
||||
@end example
|
||||
This example will produce the playlist, @file{out.m3u8}, and segment files:
|
||||
@file{out0.ts}, @file{out1.ts}, @file{out2.ts}, etc.
|
||||
|
||||
See also the @ref{segment} muxer, which provides a more generic and
|
||||
flexible implementation of a segmenter, and can be used to perform HLS
|
||||
@@ -220,6 +224,11 @@ Set the segment length in seconds. Default value is 2.
|
||||
Set the maximum number of playlist entries. If set to 0 the list file
|
||||
will contain all the segments. Default value is 5.
|
||||
|
||||
@item hls_ts_options @var{options_list}
|
||||
Set output format options using a :-separated list of key=value
|
||||
parameters. Values containing @code{:} special characters must be
|
||||
escaped.
|
||||
|
||||
@item hls_wrap @var{wrap}
|
||||
Set the number after which the segment filename number (the number
|
||||
specified in each segment file) wraps. If set to 0 the number will be
|
||||
@@ -233,6 +242,9 @@ to @var{wrap}.
|
||||
Start the playlist sequence number from @var{number}. Default value is
|
||||
0.
|
||||
|
||||
@item hls_allow_cache @var{allowcache}
|
||||
Explicitly set whether the client MAY (1) or MUST NOT (0) cache media segments.
|
||||
|
||||
@item hls_base_url @var{baseurl}
|
||||
Append @var{baseurl} to every entry in the playlist.
|
||||
Useful to generate playlists with absolute paths.
|
||||
@@ -241,6 +253,17 @@ Note that the playlist sequence number must be unique for each segment
|
||||
and it is not to be confused with the segment filename sequence number
|
||||
which can be cyclic, for example if the @option{wrap} option is
|
||||
specified.
|
||||
|
||||
@item hls_flags single_file
|
||||
If this flag is set, the muxer will store all segments in a single MPEG-TS
|
||||
file, and will use byte ranges in the playlist. HLS playlists generated with
|
||||
this way will have the version number 4.
|
||||
For example:
|
||||
@example
|
||||
ffmpeg -i in.nut -hls_flags single_file out.m3u8
|
||||
@end example
|
||||
Will produce the playlist, @file{out.m3u8}, and a single segment file,
|
||||
@file{out.ts}.
|
||||
@end table
|
||||
|
||||
@anchor{ico}
|
||||
@@ -536,7 +559,6 @@ a short portion of the file. With this option set, there is no initial
|
||||
mdat atom, and the moov atom only describes the tracks but has
|
||||
a zero duration.
|
||||
|
||||
Files written with this option set do not work in QuickTime.
|
||||
This option is implicitly set when writing ismv (Smooth Streaming) files.
|
||||
@item -movflags separate_moof
|
||||
Write a separate moof (movie fragment) atom for each track. Normally,
|
||||
@@ -557,6 +579,16 @@ 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.
|
||||
@item -movflags omit_tfhd_offset
|
||||
Do not write any absolute base_data_offset in tfhd atoms. This avoids
|
||||
tying fragments to absolute byte positions in the file/streams.
|
||||
@item -movflags default_base_moof
|
||||
Similarly to the omit_tfhd_offset, this flag avoids writing the
|
||||
absolute base_data_offset field in tfhd atoms, but does so by using
|
||||
the new default-base-is-moof flag instead. This flag is new from
|
||||
14496-12:2012. This may make the fragments easier to parse in certain
|
||||
circumstances (avoiding basing track fragment location calculations
|
||||
on the implicit end of the previous track fragment).
|
||||
@end table
|
||||
|
||||
@subsection Example
|
||||
@@ -569,29 +601,38 @@ ffmpeg -re @var{<normal input/transcoding options>} -movflags isml+frag_keyframe
|
||||
|
||||
@section mp3
|
||||
|
||||
The MP3 muxer writes a raw MP3 stream with an ID3v2 header at the beginning and
|
||||
optionally an ID3v1 tag at the end. ID3v2.3 and ID3v2.4 are supported, the
|
||||
@code{id3v2_version} option controls which one is used. Setting
|
||||
@code{id3v2_version} to 0 will disable the ID3v2 header completely. The legacy
|
||||
ID3v1 tag is not written by default, but may be enabled with the
|
||||
@code{write_id3v1} option.
|
||||
The MP3 muxer writes a raw MP3 stream with the following optional features:
|
||||
@itemize @bullet
|
||||
@item
|
||||
An ID3v2 metadata header at the beginning (enabled by default). Versions 2.3 and
|
||||
2.4 are supported, the @code{id3v2_version} private option controls which one is
|
||||
used (3 or 4). Setting @code{id3v2_version} to 0 disables the ID3v2 header
|
||||
completely.
|
||||
|
||||
The muxer may also write a Xing frame at the beginning, which contains the
|
||||
number of frames in the file. It is useful for computing duration of VBR files.
|
||||
The Xing frame is written if the output stream is seekable and if the
|
||||
@code{write_xing} option is set to 1 (the default).
|
||||
|
||||
The muxer supports writing ID3v2 attached pictures (APIC frames). The pictures
|
||||
are supplied to the muxer in form of a video stream with a single packet. There
|
||||
can be any number of those streams, each will correspond to a single APIC frame.
|
||||
The stream metadata tags @var{title} and @var{comment} map to APIC
|
||||
@var{description} and @var{picture type} respectively. See
|
||||
The muxer supports writing attached pictures (APIC frames) to the ID3v2 header.
|
||||
The pictures are supplied to the muxer in form of a video stream with a single
|
||||
packet. There can be any number of those streams, each will correspond to a
|
||||
single APIC frame. The stream metadata tags @var{title} and @var{comment} map
|
||||
to APIC @var{description} and @var{picture type} respectively. See
|
||||
@url{http://id3.org/id3v2.4.0-frames} for allowed picture types.
|
||||
|
||||
Note that the APIC frames must be written at the beginning, so the muxer will
|
||||
buffer the audio frames until it gets all the pictures. It is therefore advised
|
||||
to provide the pictures as soon as possible to avoid excessive buffering.
|
||||
|
||||
@item
|
||||
A Xing/LAME frame right after the ID3v2 header (if present). It is enabled by
|
||||
default, but will be written only if the output is seekable. The
|
||||
@code{write_xing} private option can be used to disable it. The frame contains
|
||||
various information that may be useful to the decoder, like the audio duration
|
||||
or encoder delay.
|
||||
|
||||
@item
|
||||
A legacy ID3v1 tag at the end of the file (disabled by default). It may be
|
||||
enabled with the @code{write_id3v1} private option, but as its capabilities are
|
||||
very limited, its usage is not recommended.
|
||||
@end itemize
|
||||
|
||||
Examples:
|
||||
|
||||
Write an mp3 with an ID3v2.3 header and an ID3v1 footer:
|
||||
|
@@ -26,6 +26,10 @@
|
||||
#include <string.h>
|
||||
#include <float.h>
|
||||
|
||||
// print_options is build for the host, os_support.h isn't needed and is setup
|
||||
// for the target. without this build breaks on mingw
|
||||
#define AVFORMAT_OS_SUPPORT_H
|
||||
|
||||
#include "libavformat/avformat.h"
|
||||
#include "libavformat/options_table.h"
|
||||
#include "libavcodec/avcodec.h"
|
||||
|
@@ -750,7 +750,7 @@ port will be used for the local RTP and RTCP ports.
|
||||
|
||||
@item
|
||||
If @option{localrtcpport} (the local RTCP port) is not set it will be
|
||||
set to the the local RTP port value plus 1.
|
||||
set to the local RTP port value plus 1.
|
||||
@end enumerate
|
||||
|
||||
@section rtsp
|
||||
|
@@ -14,9 +14,9 @@
|
||||
# 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.
|
||||
# General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# You should have received a copy of the GNU 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
|
||||
|
||||
|
@@ -16,16 +16,15 @@ outputs the modified frame. The most simple way of doing this is to take a
|
||||
similar filter. We'll pick edgedetect, but any other should do. You can look
|
||||
for others using the `./ffmpeg -v 0 -filters|grep ' V->V '` command.
|
||||
|
||||
- cp libavfilter/vf_{edgedetect,foobar}.c
|
||||
- sed -i s/edgedetect/foobar/g -i libavfilter/vf_foobar.c
|
||||
- sed -i s/EdgeDetect/Foobar/g -i libavfilter/vf_foobar.c
|
||||
- sed 's/edgedetect/foobar/g;s/EdgeDetect/Foobar/g' libavfilter/vf_edgedetect.c > libavfilter/vf_foobar.c
|
||||
- edit libavfilter/Makefile, and add an entry for "foobar" following the
|
||||
pattern of the other filters.
|
||||
- edit libavfilter/allfilters.c, and add an entry for "foobar" following the
|
||||
pattern of the other filters.
|
||||
- ./configure ...
|
||||
- make -j<whatever> ffmpeg
|
||||
- ./ffmpeg -i tests/lena.pnm -vf foobar foobar.png
|
||||
- ./ffmpeg -i http://samples.ffmpeg.org/image-samples/lena.pnm -vf foobar foobar.png
|
||||
Note here: you can obviously use a random local image instead of a remote URL.
|
||||
|
||||
If everything went right, you should get a foobar.png with Lena edge-detected.
|
||||
|
||||
|
187
ffmpeg.c
187
ffmpeg.c
@@ -475,6 +475,7 @@ static void ffmpeg_cleanup(int ret)
|
||||
}
|
||||
ost->bitstream_filters = NULL;
|
||||
av_frame_free(&ost->filtered_frame);
|
||||
av_frame_free(&ost->last_frame);
|
||||
|
||||
av_parser_close(ost->parser);
|
||||
|
||||
@@ -622,7 +623,11 @@ static void write_frame(AVFormatContext *s, AVPacket *pkt, OutputStream *ost)
|
||||
|
||||
while (bsfc) {
|
||||
AVPacket new_pkt = *pkt;
|
||||
int a = av_bitstream_filter_filter(bsfc, avctx, NULL,
|
||||
AVDictionaryEntry *bsf_arg = av_dict_get(ost->bsf_args,
|
||||
bsfc->filter->name,
|
||||
NULL, 0);
|
||||
int a = av_bitstream_filter_filter(bsfc, avctx,
|
||||
bsf_arg ? bsf_arg->value : NULL,
|
||||
&new_pkt.data, &new_pkt.size,
|
||||
pkt->data, pkt->size,
|
||||
pkt->flags & AV_PKT_FLAG_KEY);
|
||||
@@ -659,6 +664,17 @@ static void write_frame(AVFormatContext *s, AVPacket *pkt, OutputStream *ost)
|
||||
}
|
||||
|
||||
if (!(s->oformat->flags & AVFMT_NOTIMESTAMPS)) {
|
||||
if (pkt->dts != AV_NOPTS_VALUE &&
|
||||
pkt->pts != AV_NOPTS_VALUE &&
|
||||
pkt->dts > pkt->pts) {
|
||||
av_log(s, AV_LOG_WARNING, "Invalid DTS: %"PRId64" PTS: %"PRId64" in output stream %d:%d, replacing by guess\n",
|
||||
pkt->dts, pkt->pts,
|
||||
ost->file_index, ost->st->index);
|
||||
pkt->pts =
|
||||
pkt->dts = pkt->pts + pkt->dts + ost->last_mux_dts + 1
|
||||
- FFMIN3(pkt->pts, pkt->dts, ost->last_mux_dts + 1)
|
||||
- FFMAX3(pkt->pts, pkt->dts, ost->last_mux_dts + 1);
|
||||
}
|
||||
if(
|
||||
(avctx->codec_type == AVMEDIA_TYPE_AUDIO || avctx->codec_type == AVMEDIA_TYPE_VIDEO) &&
|
||||
pkt->dts != AV_NOPTS_VALUE &&
|
||||
@@ -681,15 +697,6 @@ static void write_frame(AVFormatContext *s, AVPacket *pkt, OutputStream *ost)
|
||||
pkt->dts = max;
|
||||
}
|
||||
}
|
||||
if (pkt->dts != AV_NOPTS_VALUE &&
|
||||
pkt->pts != AV_NOPTS_VALUE &&
|
||||
pkt->dts > pkt->pts) {
|
||||
av_log(s, AV_LOG_WARNING, "Invalid DTS: %"PRId64" PTS: %"PRId64" in output stream %d:%d\n",
|
||||
pkt->dts, pkt->pts,
|
||||
ost->file_index, ost->st->index);
|
||||
pkt->pts = AV_NOPTS_VALUE;
|
||||
pkt->dts = AV_NOPTS_VALUE;
|
||||
}
|
||||
}
|
||||
ost->last_mux_dts = pkt->dts;
|
||||
|
||||
@@ -872,14 +879,14 @@ static void do_subtitle_out(AVFormatContext *s,
|
||||
|
||||
static void do_video_out(AVFormatContext *s,
|
||||
OutputStream *ost,
|
||||
AVFrame *in_picture)
|
||||
AVFrame *next_picture)
|
||||
{
|
||||
int ret, format_video_sync;
|
||||
AVPacket pkt;
|
||||
AVCodecContext *enc = ost->enc_ctx;
|
||||
AVCodecContext *mux_enc = ost->st->codec;
|
||||
int nb_frames, i;
|
||||
double sync_ipts, delta;
|
||||
int nb_frames, nb0_frames, i;
|
||||
double sync_ipts, delta, delta0;
|
||||
double duration = 0;
|
||||
int frame_size = 0;
|
||||
InputStream *ist = NULL;
|
||||
@@ -890,10 +897,20 @@ static void do_video_out(AVFormatContext *s,
|
||||
if(ist && ist->st->start_time != AV_NOPTS_VALUE && ist->st->first_dts != AV_NOPTS_VALUE && ost->frame_rate.num)
|
||||
duration = 1/(av_q2d(ost->frame_rate) * av_q2d(enc->time_base));
|
||||
|
||||
sync_ipts = in_picture->pts;
|
||||
delta = sync_ipts - ost->sync_opts + duration;
|
||||
if (!ost->filters_script &&
|
||||
!ost->filters &&
|
||||
next_picture &&
|
||||
ist &&
|
||||
lrintf(av_frame_get_pkt_duration(next_picture) * av_q2d(ist->st->time_base) / av_q2d(enc->time_base)) > 0) {
|
||||
duration = lrintf(av_frame_get_pkt_duration(next_picture) * av_q2d(ist->st->time_base) / av_q2d(enc->time_base));
|
||||
}
|
||||
|
||||
sync_ipts = next_picture->pts;
|
||||
delta0 = sync_ipts - ost->sync_opts;
|
||||
delta = delta0 + duration;
|
||||
|
||||
/* by default, we output a single frame */
|
||||
nb0_frames = 0;
|
||||
nb_frames = 1;
|
||||
|
||||
format_video_sync = video_sync_method;
|
||||
@@ -913,19 +930,34 @@ static void do_video_out(AVFormatContext *s,
|
||||
}
|
||||
}
|
||||
|
||||
if (delta0 < 0 &&
|
||||
delta > 0 &&
|
||||
format_video_sync != VSYNC_PASSTHROUGH &&
|
||||
format_video_sync != VSYNC_DROP) {
|
||||
double cor = FFMIN(-delta0, duration);
|
||||
av_log(NULL, AV_LOG_WARNING, "Past duration %f too large\n", -delta0);
|
||||
sync_ipts += cor;
|
||||
duration -= cor;
|
||||
delta0 += cor;
|
||||
}
|
||||
|
||||
switch (format_video_sync) {
|
||||
case VSYNC_VSCFR:
|
||||
if (ost->frame_number == 0 && delta - duration >= 0.5) {
|
||||
av_log(NULL, AV_LOG_DEBUG, "Not duplicating %d initial frames\n", (int)lrintf(delta - duration));
|
||||
delta = duration;
|
||||
delta0 = 0;
|
||||
ost->sync_opts = lrint(sync_ipts);
|
||||
}
|
||||
case VSYNC_CFR:
|
||||
// FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
|
||||
if (delta < -1.1)
|
||||
nb_frames = 0;
|
||||
else if (delta > 1.1)
|
||||
else if (delta > 1.1) {
|
||||
nb_frames = lrintf(delta);
|
||||
if (delta0 > 1.1)
|
||||
nb0_frames = lrintf(delta0 - 0.6);
|
||||
}
|
||||
break;
|
||||
case VSYNC_VFR:
|
||||
if (delta <= -0.6)
|
||||
@@ -942,28 +974,36 @@ static void do_video_out(AVFormatContext *s,
|
||||
}
|
||||
|
||||
nb_frames = FFMIN(nb_frames, ost->max_frames - ost->frame_number);
|
||||
if (nb_frames == 0) {
|
||||
nb0_frames = FFMIN(nb0_frames, nb_frames);
|
||||
if (nb0_frames == 0 && ost->last_droped) {
|
||||
nb_frames_drop++;
|
||||
av_log(NULL, AV_LOG_VERBOSE,
|
||||
"*** dropping frame %d from stream %d at ts %"PRId64"\n",
|
||||
ost->frame_number, ost->st->index, in_picture->pts);
|
||||
return;
|
||||
} else if (nb_frames > 1) {
|
||||
ost->frame_number, ost->st->index, ost->last_frame->pts);
|
||||
}
|
||||
if (nb_frames > (nb0_frames && ost->last_droped) + (nb_frames > nb0_frames)) {
|
||||
if (nb_frames > dts_error_threshold * 30) {
|
||||
av_log(NULL, AV_LOG_ERROR, "%d frame duplication too large, skipping\n", nb_frames - 1);
|
||||
nb_frames_drop++;
|
||||
return;
|
||||
}
|
||||
nb_frames_dup += nb_frames - 1;
|
||||
nb_frames_dup += nb_frames - (nb0_frames && ost->last_droped) - (nb_frames > nb0_frames);
|
||||
av_log(NULL, AV_LOG_VERBOSE, "*** %d dup!\n", nb_frames - 1);
|
||||
}
|
||||
ost->last_droped = nb_frames == nb0_frames;
|
||||
|
||||
/* duplicates frame if needed */
|
||||
for (i = 0; i < nb_frames; i++) {
|
||||
AVFrame *in_picture;
|
||||
av_init_packet(&pkt);
|
||||
pkt.data = NULL;
|
||||
pkt.size = 0;
|
||||
|
||||
if (i < nb0_frames && ost->last_frame) {
|
||||
in_picture = ost->last_frame;
|
||||
} else
|
||||
in_picture = next_picture;
|
||||
|
||||
in_picture->pts = ost->sync_opts;
|
||||
|
||||
#if 1
|
||||
@@ -978,10 +1018,8 @@ static void do_video_out(AVFormatContext *s,
|
||||
/* raw pictures are written as AVPicture structure to
|
||||
avoid any copies. We support temporarily the older
|
||||
method. */
|
||||
mux_enc->coded_frame->interlaced_frame = in_picture->interlaced_frame;
|
||||
mux_enc->coded_frame->top_field_first = in_picture->top_field_first;
|
||||
if (mux_enc->coded_frame->interlaced_frame)
|
||||
mux_enc->field_order = mux_enc->coded_frame->top_field_first ? AV_FIELD_TB:AV_FIELD_BT;
|
||||
if (in_picture->interlaced_frame)
|
||||
mux_enc->field_order = in_picture->top_field_first ? AV_FIELD_TB:AV_FIELD_BT;
|
||||
else
|
||||
mux_enc->field_order = AV_FIELD_PROGRESSIVE;
|
||||
pkt.data = (uint8_t *)in_picture;
|
||||
@@ -1007,8 +1045,7 @@ static void do_video_out(AVFormatContext *s,
|
||||
mux_enc->field_order = AV_FIELD_PROGRESSIVE;
|
||||
|
||||
in_picture->quality = enc->global_quality;
|
||||
if (!enc->me_threshold)
|
||||
in_picture->pict_type = 0;
|
||||
in_picture->pict_type = 0;
|
||||
|
||||
pts_time = in_picture->pts != AV_NOPTS_VALUE ?
|
||||
in_picture->pts * av_q2d(enc->time_base) : NAN;
|
||||
@@ -1102,6 +1139,11 @@ static void do_video_out(AVFormatContext *s,
|
||||
if (vstats_filename && frame_size)
|
||||
do_video_stats(ost, frame_size);
|
||||
}
|
||||
|
||||
if (!ost->last_frame)
|
||||
ost->last_frame = av_frame_alloc();
|
||||
av_frame_unref(ost->last_frame);
|
||||
av_frame_ref(ost->last_frame, next_picture);
|
||||
}
|
||||
|
||||
static double psnr(double d)
|
||||
@@ -1270,7 +1312,6 @@ static void print_final_stats(int64_t total_size)
|
||||
if (data_size && total_size>0 && total_size >= data_size)
|
||||
percent = 100.0 * (total_size - data_size) / data_size;
|
||||
|
||||
av_log(NULL, AV_LOG_INFO, "\n");
|
||||
av_log(NULL, AV_LOG_INFO, "video:%1.0fkB audio:%1.0fkB subtitle:%1.0fkB other streams:%1.0fkB global headers:%1.0fkB muxing overhead: ",
|
||||
video_size / 1024.0,
|
||||
audio_size / 1024.0,
|
||||
@@ -1461,6 +1502,8 @@ static void print_report(int is_last_report, int64_t timer_start, int64_t cur_ti
|
||||
if (av_stream_get_end_pts(ost->st) != AV_NOPTS_VALUE)
|
||||
pts = FFMAX(pts, av_rescale_q(av_stream_get_end_pts(ost->st),
|
||||
ost->st->time_base, AV_TIME_BASE_Q));
|
||||
if (is_last_report)
|
||||
nb_frames_drop += ost->last_droped;
|
||||
}
|
||||
|
||||
secs = pts / AV_TIME_BASE;
|
||||
@@ -1496,10 +1539,11 @@ static void print_report(int is_last_report, int64_t timer_start, int64_t cur_ti
|
||||
av_bprintf(&buf_script, "drop_frames=%d\n", nb_frames_drop);
|
||||
|
||||
if (print_stats || is_last_report) {
|
||||
const char end = is_last_report ? '\n' : '\r';
|
||||
if (print_stats==1 && AV_LOG_INFO > av_log_get_level()) {
|
||||
fprintf(stderr, "%s \r", buf);
|
||||
fprintf(stderr, "%s %c", buf, end);
|
||||
} else
|
||||
av_log(NULL, AV_LOG_INFO, "%s \r", buf);
|
||||
av_log(NULL, AV_LOG_INFO, "%s %c", buf, end);
|
||||
|
||||
fflush(stderr);
|
||||
}
|
||||
@@ -1906,6 +1950,20 @@ static int decode_video(InputStream *ist, AVPacket *pkt, int *got_output)
|
||||
if (*got_output || ret<0 || pkt->size)
|
||||
decode_error_stat[ret<0] ++;
|
||||
|
||||
if (*got_output && ret >= 0) {
|
||||
if (ist->dec_ctx->width != decoded_frame->width ||
|
||||
ist->dec_ctx->height != decoded_frame->height ||
|
||||
ist->dec_ctx->pix_fmt != decoded_frame->format) {
|
||||
av_log(NULL, AV_LOG_DEBUG, "Frame parameters mismatch context %d,%d,%d != %d,%d,%d\n",
|
||||
decoded_frame->width,
|
||||
decoded_frame->height,
|
||||
decoded_frame->format,
|
||||
ist->dec_ctx->width,
|
||||
ist->dec_ctx->height,
|
||||
ist->dec_ctx->pix_fmt);
|
||||
}
|
||||
}
|
||||
|
||||
if (!*got_output || ret < 0) {
|
||||
if (!pkt->size) {
|
||||
for (i = 0; i < ist->nb_filters; i++)
|
||||
@@ -2122,11 +2180,11 @@ static int process_input_packet(InputStream *ist, const AVPacket *pkt)
|
||||
ret = decode_video (ist, &avpkt, &got_output);
|
||||
if (avpkt.duration) {
|
||||
duration = av_rescale_q(avpkt.duration, ist->st->time_base, AV_TIME_BASE_Q);
|
||||
} else if(ist->dec_ctx->time_base.num != 0 && ist->dec_ctx->time_base.den != 0) {
|
||||
} else if(ist->dec_ctx->framerate.num != 0 && ist->dec_ctx->framerate.den != 0) {
|
||||
int ticks= av_stream_get_parser(ist->st) ? av_stream_get_parser(ist->st)->repeat_pict+1 : ist->dec_ctx->ticks_per_frame;
|
||||
duration = ((int64_t)AV_TIME_BASE *
|
||||
ist->dec_ctx->time_base.num * ticks) /
|
||||
ist->dec_ctx->time_base.den;
|
||||
ist->dec_ctx->framerate.den * ticks) /
|
||||
ist->dec_ctx->framerate.num / ist->dec_ctx->ticks_per_frame;
|
||||
} else
|
||||
duration = 0;
|
||||
|
||||
@@ -2181,11 +2239,11 @@ static int process_input_packet(InputStream *ist, const AVPacket *pkt)
|
||||
ist->next_dts = av_rescale_q(next_dts + 1, av_inv_q(ist->framerate), time_base_q);
|
||||
} else if (pkt->duration) {
|
||||
ist->next_dts += av_rescale_q(pkt->duration, ist->st->time_base, AV_TIME_BASE_Q);
|
||||
} else if(ist->dec_ctx->time_base.num != 0) {
|
||||
} else if(ist->dec_ctx->framerate.num != 0) {
|
||||
int ticks= av_stream_get_parser(ist->st) ? av_stream_get_parser(ist->st)->repeat_pict + 1 : ist->dec_ctx->ticks_per_frame;
|
||||
ist->next_dts += ((int64_t)AV_TIME_BASE *
|
||||
ist->dec_ctx->time_base.num * ticks) /
|
||||
ist->dec_ctx->time_base.den;
|
||||
ist->dec_ctx->framerate.den * ticks) /
|
||||
ist->dec_ctx->framerate.num / ist->dec_ctx->ticks_per_frame;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -2463,7 +2521,7 @@ static int transcode_init(void)
|
||||
AVFormatContext *oc;
|
||||
OutputStream *ost;
|
||||
InputStream *ist;
|
||||
char error[1024];
|
||||
char error[1024] = {0};
|
||||
int want_sdp = 1;
|
||||
|
||||
for (i = 0; i < nb_filtergraphs; i++) {
|
||||
@@ -2621,6 +2679,26 @@ static int transcode_init(void)
|
||||
av_reduce(&enc_ctx->time_base.num, &enc_ctx->time_base.den,
|
||||
enc_ctx->time_base.num, enc_ctx->time_base.den, INT_MAX);
|
||||
|
||||
if (ist->st->nb_side_data) {
|
||||
ost->st->side_data = av_realloc_array(NULL, ist->st->nb_side_data,
|
||||
sizeof(*ist->st->side_data));
|
||||
if (!ost->st->side_data)
|
||||
return AVERROR(ENOMEM);
|
||||
|
||||
for (j = 0; j < ist->st->nb_side_data; j++) {
|
||||
const AVPacketSideData *sd_src = &ist->st->side_data[j];
|
||||
AVPacketSideData *sd_dst = &ost->st->side_data[j];
|
||||
|
||||
sd_dst->data = av_malloc(sd_src->size);
|
||||
if (!sd_dst->data)
|
||||
return AVERROR(ENOMEM);
|
||||
memcpy(sd_dst->data, sd_src->data, sd_src->size);
|
||||
sd_dst->size = sd_src->size;
|
||||
sd_dst->type = sd_src->type;
|
||||
ost->st->nb_side_data++;
|
||||
}
|
||||
}
|
||||
|
||||
ost->parser = av_parser_init(enc_ctx->codec_id);
|
||||
|
||||
switch (enc_ctx->codec_type) {
|
||||
@@ -2635,7 +2713,10 @@ static int transcode_init(void)
|
||||
enc_ctx->frame_size = dec_ctx->frame_size;
|
||||
enc_ctx->audio_service_type = dec_ctx->audio_service_type;
|
||||
enc_ctx->block_align = dec_ctx->block_align;
|
||||
enc_ctx->initial_padding = dec_ctx->delay;
|
||||
#if FF_API_AUDIOENC_DELAY
|
||||
enc_ctx->delay = dec_ctx->delay;
|
||||
#endif
|
||||
if((enc_ctx->block_align == 1 || enc_ctx->block_align == 1152 || enc_ctx->block_align == 576) && enc_ctx->codec_id == AV_CODEC_ID_MP3)
|
||||
enc_ctx->block_align= 0;
|
||||
if(enc_ctx->codec_id == AV_CODEC_ID_AC3)
|
||||
@@ -2882,10 +2963,11 @@ static int transcode_init(void)
|
||||
av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
|
||||
" It takes bits/s as argument, not kbits/s\n");
|
||||
} else {
|
||||
if (av_opt_set_dict(ost->enc_ctx, &ost->encoder_opts) < 0) {
|
||||
ret = av_opt_set_dict(ost->enc_ctx, &ost->encoder_opts);
|
||||
if (ret < 0) {
|
||||
av_log(NULL, AV_LOG_FATAL,
|
||||
"Error setting up codec context options.\n");
|
||||
exit_program(1);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3085,9 +3167,9 @@ static OutputStream *choose_output(void)
|
||||
OutputStream *ost = output_streams[i];
|
||||
int64_t opts = av_rescale_q(ost->st->cur_dts, ost->st->time_base,
|
||||
AV_TIME_BASE_Q);
|
||||
if (!ost->unavailable && !ost->finished && opts < opts_min) {
|
||||
if (!ost->finished && opts < opts_min) {
|
||||
opts_min = opts;
|
||||
ost_min = ost;
|
||||
ost_min = ost->unavailable ? NULL : ost;
|
||||
}
|
||||
}
|
||||
return ost_min;
|
||||
@@ -3465,13 +3547,14 @@ static int process_input(int file_index)
|
||||
if (pkt.dts != AV_NOPTS_VALUE)
|
||||
pkt.dts *= ist->ts_scale;
|
||||
|
||||
if (pkt.dts != AV_NOPTS_VALUE && ist->next_dts == AV_NOPTS_VALUE && !copy_ts
|
||||
if ((ist->dec_ctx->codec_type == AVMEDIA_TYPE_VIDEO ||
|
||||
ist->dec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) &&
|
||||
pkt.dts != AV_NOPTS_VALUE && ist->next_dts == AV_NOPTS_VALUE && !copy_ts
|
||||
&& (is->iformat->flags & AVFMT_TS_DISCONT) && ifile->last_ts != AV_NOPTS_VALUE) {
|
||||
int64_t pkt_dts = av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
|
||||
int64_t delta = pkt_dts - ifile->last_ts;
|
||||
if(delta < -1LL*dts_delta_threshold*AV_TIME_BASE ||
|
||||
(delta > 1LL*dts_delta_threshold*AV_TIME_BASE &&
|
||||
ist->dec_ctx->codec_type != AVMEDIA_TYPE_SUBTITLE)){
|
||||
if (delta < -1LL*dts_delta_threshold*AV_TIME_BASE ||
|
||||
delta > 1LL*dts_delta_threshold*AV_TIME_BASE){
|
||||
ifile->ts_offset -= delta;
|
||||
av_log(NULL, AV_LOG_DEBUG,
|
||||
"Inter stream timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
|
||||
@@ -3482,14 +3565,15 @@ static int process_input(int file_index)
|
||||
}
|
||||
}
|
||||
|
||||
if (pkt.dts != AV_NOPTS_VALUE && ist->next_dts != AV_NOPTS_VALUE &&
|
||||
if ((ist->dec_ctx->codec_type == AVMEDIA_TYPE_VIDEO ||
|
||||
ist->dec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) &&
|
||||
pkt.dts != AV_NOPTS_VALUE && ist->next_dts != AV_NOPTS_VALUE &&
|
||||
!copy_ts) {
|
||||
int64_t pkt_dts = av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
|
||||
int64_t delta = pkt_dts - ist->next_dts;
|
||||
if (is->iformat->flags & AVFMT_TS_DISCONT) {
|
||||
if (delta < -1LL*dts_delta_threshold*AV_TIME_BASE ||
|
||||
(delta > 1LL*dts_delta_threshold*AV_TIME_BASE &&
|
||||
ist->dec_ctx->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
|
||||
delta > 1LL*dts_delta_threshold*AV_TIME_BASE ||
|
||||
pkt_dts + AV_TIME_BASE/10 < FFMAX(ist->pts, ist->dts)) {
|
||||
ifile->ts_offset -= delta;
|
||||
av_log(NULL, AV_LOG_DEBUG,
|
||||
@@ -3501,7 +3585,7 @@ static int process_input(int file_index)
|
||||
}
|
||||
} else {
|
||||
if ( delta < -1LL*dts_error_threshold*AV_TIME_BASE ||
|
||||
(delta > 1LL*dts_error_threshold*AV_TIME_BASE && ist->dec_ctx->codec_type != AVMEDIA_TYPE_SUBTITLE)) {
|
||||
delta > 1LL*dts_error_threshold*AV_TIME_BASE) {
|
||||
av_log(NULL, AV_LOG_WARNING, "DTS %"PRId64", next:%"PRId64" st:%d invalid dropping\n", pkt.dts, ist->next_dts, pkt.stream_index);
|
||||
pkt.dts = AV_NOPTS_VALUE;
|
||||
}
|
||||
@@ -3509,7 +3593,7 @@ static int process_input(int file_index)
|
||||
int64_t pkt_pts = av_rescale_q(pkt.pts, ist->st->time_base, AV_TIME_BASE_Q);
|
||||
delta = pkt_pts - ist->next_dts;
|
||||
if ( delta < -1LL*dts_error_threshold*AV_TIME_BASE ||
|
||||
(delta > 1LL*dts_error_threshold*AV_TIME_BASE && ist->dec_ctx->codec_type != AVMEDIA_TYPE_SUBTITLE)) {
|
||||
delta > 1LL*dts_error_threshold*AV_TIME_BASE) {
|
||||
av_log(NULL, AV_LOG_WARNING, "PTS %"PRId64", next:%"PRId64" invalid dropping st:%d\n", pkt.pts, ist->next_dts, pkt.stream_index);
|
||||
pkt.pts = AV_NOPTS_VALUE;
|
||||
}
|
||||
@@ -3752,6 +3836,7 @@ static int transcode(void)
|
||||
av_dict_free(&ost->encoder_opts);
|
||||
av_dict_free(&ost->swr_opts);
|
||||
av_dict_free(&ost->resample_opts);
|
||||
av_dict_free(&ost->bsf_args);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3773,7 +3858,7 @@ static int64_t getutime(void)
|
||||
GetProcessTimes(proc, &c, &e, &k, &u);
|
||||
return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
|
||||
#else
|
||||
return av_gettime();
|
||||
return av_gettime_relative();
|
||||
#endif
|
||||
}
|
||||
|
||||
|
5
ffmpeg.h
5
ffmpeg.h
@@ -388,6 +388,8 @@ typedef struct OutputStream {
|
||||
AVCodec *enc;
|
||||
int64_t max_frames;
|
||||
AVFrame *filtered_frame;
|
||||
AVFrame *last_frame;
|
||||
int last_droped;
|
||||
|
||||
/* video only */
|
||||
AVRational frame_rate;
|
||||
@@ -420,6 +422,7 @@ typedef struct OutputStream {
|
||||
AVDictionary *encoder_opts;
|
||||
AVDictionary *swr_opts;
|
||||
AVDictionary *resample_opts;
|
||||
AVDictionary *bsf_args;
|
||||
char *apad;
|
||||
OSTFinished finished; /* no more packets should be written for this stream */
|
||||
int unavailable; /* true if the steram is unavailable (possibly temporarily) */
|
||||
@@ -481,6 +484,7 @@ extern int do_deinterlace;
|
||||
extern int do_hex_dump;
|
||||
extern int do_pkt_dump;
|
||||
extern int copy_ts;
|
||||
extern int start_at_zero;
|
||||
extern int copy_tb;
|
||||
extern int debug_ts;
|
||||
extern int exit_on_error;
|
||||
@@ -490,6 +494,7 @@ extern int stdin_interaction;
|
||||
extern int frame_bits_per_raw_sample;
|
||||
extern AVIOContext *progress_avio;
|
||||
extern float max_error_rate;
|
||||
extern int vdpau_api_ver;
|
||||
|
||||
extern const AVIOInterruptCB int_cb;
|
||||
|
||||
|
@@ -383,9 +383,8 @@ static int configure_output_video_filter(FilterGraph *fg, OutputFilter *ofilter,
|
||||
snprintf(name, sizeof(name), "pixel format for output stream %d:%d",
|
||||
ost->file_index, ost->index);
|
||||
ret = avfilter_graph_create_filter(&filter,
|
||||
avfilter_get_by_name("format"),
|
||||
"format", pix_fmts, NULL,
|
||||
fg->graph);
|
||||
avfilter_get_by_name("format"),
|
||||
"format", pix_fmts, NULL, fg->graph);
|
||||
av_freep(&pix_fmts);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
@@ -620,6 +619,7 @@ static int sub2video_prepare(InputStream *ist)
|
||||
ist->sub2video.frame = av_frame_alloc();
|
||||
if (!ist->sub2video.frame)
|
||||
return AVERROR(ENOMEM);
|
||||
ist->sub2video.last_pts = INT64_MIN;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -637,6 +637,7 @@ static int configure_input_video_filter(FilterGraph *fg, InputFilter *ifilter,
|
||||
AVBPrint args;
|
||||
char name[255];
|
||||
int ret, pad_idx = 0;
|
||||
int64_t tsoffset = 0;
|
||||
|
||||
if (ist->dec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) {
|
||||
av_log(NULL, AV_LOG_ERROR, "Cannot connect video filter to audio input\n");
|
||||
@@ -711,8 +712,14 @@ static int configure_input_video_filter(FilterGraph *fg, InputFilter *ifilter,
|
||||
|
||||
snprintf(name, sizeof(name), "trim for input stream %d:%d",
|
||||
ist->file_index, ist->st->index);
|
||||
if (copy_ts) {
|
||||
tsoffset = f->start_time == AV_NOPTS_VALUE ? 0 : f->start_time;
|
||||
if (!start_at_zero && f->ctx->start_time != AV_NOPTS_VALUE)
|
||||
tsoffset += f->ctx->start_time;
|
||||
}
|
||||
ret = insert_trim(((f->start_time == AV_NOPTS_VALUE) || !f->accurate_seek) ?
|
||||
AV_NOPTS_VALUE : 0, f->recording_time, &last_filter, &pad_idx, name);
|
||||
AV_NOPTS_VALUE : tsoffset, f->recording_time,
|
||||
&last_filter, &pad_idx, name);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
@@ -731,6 +738,7 @@ static int configure_input_audio_filter(FilterGraph *fg, InputFilter *ifilter,
|
||||
AVBPrint args;
|
||||
char name[255];
|
||||
int ret, pad_idx = 0;
|
||||
int64_t tsoffset = 0;
|
||||
|
||||
if (ist->dec_ctx->codec_type != AVMEDIA_TYPE_AUDIO) {
|
||||
av_log(NULL, AV_LOG_ERROR, "Cannot connect audio filter to non audio input\n");
|
||||
@@ -813,8 +821,14 @@ static int configure_input_audio_filter(FilterGraph *fg, InputFilter *ifilter,
|
||||
|
||||
snprintf(name, sizeof(name), "trim for input stream %d:%d",
|
||||
ist->file_index, ist->st->index);
|
||||
if (copy_ts) {
|
||||
tsoffset = f->start_time == AV_NOPTS_VALUE ? 0 : f->start_time;
|
||||
if (!start_at_zero && f->ctx->start_time != AV_NOPTS_VALUE)
|
||||
tsoffset += f->ctx->start_time;
|
||||
}
|
||||
ret = insert_trim(((f->start_time == AV_NOPTS_VALUE) || !f->accurate_seek) ?
|
||||
AV_NOPTS_VALUE : 0, f->recording_time, &last_filter, &pad_idx, name);
|
||||
AV_NOPTS_VALUE : tsoffset, f->recording_time,
|
||||
&last_filter, &pad_idx, name);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
|
67
ffmpeg_opt.c
67
ffmpeg_opt.c
@@ -91,6 +91,7 @@ int do_benchmark_all = 0;
|
||||
int do_hex_dump = 0;
|
||||
int do_pkt_dump = 0;
|
||||
int copy_ts = 0;
|
||||
int start_at_zero = 0;
|
||||
int copy_tb = -1;
|
||||
int debug_ts = 0;
|
||||
int exit_on_error = 0;
|
||||
@@ -508,7 +509,8 @@ static int opt_recording_timestamp(void *optctx, const char *opt, const char *ar
|
||||
char buf[128];
|
||||
int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
|
||||
struct tm time = *gmtime((time_t*)&recording_timestamp);
|
||||
strftime(buf, sizeof(buf), "creation_time=%FT%T%z", &time);
|
||||
if (!strftime(buf, sizeof(buf), "creation_time=%FT%T%z", &time))
|
||||
return -1;
|
||||
parse_option(o, "metadata", buf, options);
|
||||
|
||||
av_log(NULL, AV_LOG_WARNING, "%s is deprecated, set the 'creation_time' metadata "
|
||||
@@ -702,7 +704,7 @@ static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
|
||||
MATCH_PER_STREAM_OPT(fix_sub_duration, i, ist->fix_sub_duration, ic, st);
|
||||
MATCH_PER_STREAM_OPT(canvas_sizes, str, canvas_size, ic, st);
|
||||
if (canvas_size &&
|
||||
av_parse_video_size(&dec->width, &dec->height, canvas_size) < 0) {
|
||||
av_parse_video_size(&ist->dec_ctx->width, &ist->dec_ctx->height, canvas_size) < 0) {
|
||||
av_log(NULL, AV_LOG_FATAL, "Invalid canvas size: %s.\n", canvas_size);
|
||||
exit_program(1);
|
||||
}
|
||||
@@ -792,6 +794,7 @@ static int open_input_file(OptionsContext *o, const char *filename)
|
||||
char * video_codec_name = NULL;
|
||||
char * audio_codec_name = NULL;
|
||||
char *subtitle_codec_name = NULL;
|
||||
int scan_all_pmts_set = 0;
|
||||
|
||||
if (o->format) {
|
||||
if (!(file_iformat = av_find_input_format(o->format))) {
|
||||
@@ -862,12 +865,18 @@ static int open_input_file(OptionsContext *o, const char *filename)
|
||||
ic->flags |= AVFMT_FLAG_NONBLOCK;
|
||||
ic->interrupt_callback = int_cb;
|
||||
|
||||
if (!av_dict_get(o->g->format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE)) {
|
||||
av_dict_set(&o->g->format_opts, "scan_all_pmts", "1", AV_DICT_DONT_OVERWRITE);
|
||||
scan_all_pmts_set = 1;
|
||||
}
|
||||
/* open the input file with generic avformat function */
|
||||
err = avformat_open_input(&ic, filename, file_iformat, &o->g->format_opts);
|
||||
if (err < 0) {
|
||||
print_error(filename, err);
|
||||
exit_program(1);
|
||||
}
|
||||
if (scan_all_pmts_set)
|
||||
av_dict_set(&o->g->format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE);
|
||||
remove_avoptions(&o->g->format_opts, o->g->codec_opts);
|
||||
assert_avoptions(o->g->format_opts);
|
||||
|
||||
@@ -921,7 +930,7 @@ static int open_input_file(OptionsContext *o, const char *filename)
|
||||
f->start_time = o->start_time;
|
||||
f->recording_time = o->recording_time;
|
||||
f->input_ts_offset = o->input_ts_offset;
|
||||
f->ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
|
||||
f->ts_offset = o->input_ts_offset - (copy_ts ? (start_at_zero && ic->start_time != AV_NOPTS_VALUE ? ic->start_time : 0) : timestamp);
|
||||
f->nb_streams = ic->nb_streams;
|
||||
f->rate_emu = o->rate_emu;
|
||||
f->accurate_seek = o->accurate_seek;
|
||||
@@ -1129,8 +1138,11 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e
|
||||
|
||||
MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
|
||||
while (bsf) {
|
||||
char *arg = NULL;
|
||||
if (next = strchr(bsf, ','))
|
||||
*next++ = 0;
|
||||
if (arg = strchr(bsf, '='))
|
||||
*arg++ = 0;
|
||||
if (!(bsfc = av_bitstream_filter_init(bsf))) {
|
||||
av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf);
|
||||
exit_program(1);
|
||||
@@ -1139,6 +1151,7 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e
|
||||
bsfc_prev->next = bsfc;
|
||||
else
|
||||
ost->bitstream_filters = bsfc;
|
||||
av_dict_set(&ost->bsf_args, bsfc->filter->name, arg, 0);
|
||||
|
||||
bsfc_prev = bsfc;
|
||||
bsf = next;
|
||||
@@ -1276,6 +1289,8 @@ static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc, in
|
||||
av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
|
||||
exit_program(1);
|
||||
}
|
||||
if (frame_rate && video_sync_method == VSYNC_PASSTHROUGH)
|
||||
av_log(NULL, AV_LOG_ERROR, "Using -vsync 0 and -r can produce invalid output files\n");
|
||||
|
||||
MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
|
||||
if (frame_aspect_ratio) {
|
||||
@@ -1620,27 +1635,36 @@ static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const ch
|
||||
AVStream *st;
|
||||
OutputStream *ost;
|
||||
AVCodec *codec;
|
||||
AVCodecContext *avctx;
|
||||
const char *enc_config;
|
||||
|
||||
codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
|
||||
if (!codec) {
|
||||
av_log(s, AV_LOG_ERROR, "no encoder found for codec id %i\n", ic->streams[i]->codec->codec_id);
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
if (codec->type == AVMEDIA_TYPE_AUDIO)
|
||||
opt_audio_codec(o, "c:a", codec->name);
|
||||
else if (codec->type == AVMEDIA_TYPE_VIDEO)
|
||||
opt_video_codec(o, "c:v", codec->name);
|
||||
ost = new_output_stream(o, s, codec->type, -1);
|
||||
st = ost->st;
|
||||
avctx = st->codec;
|
||||
ost->enc = codec;
|
||||
|
||||
// FIXME: a more elegant solution is needed
|
||||
memcpy(st, ic->streams[i], sizeof(AVStream));
|
||||
st->cur_dts = 0;
|
||||
st->info = av_malloc(sizeof(*st->info));
|
||||
memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
|
||||
st->codec= avctx;
|
||||
avcodec_copy_context(st->codec, ic->streams[i]->codec);
|
||||
avcodec_get_context_defaults3(st->codec, codec);
|
||||
enc_config = av_stream_get_recommended_encoder_configuration(ic->streams[i]);
|
||||
if (enc_config) {
|
||||
AVDictionary *opts = NULL;
|
||||
av_dict_parse_string(&opts, enc_config, "=", ",", 0);
|
||||
av_opt_set_dict2(st->codec, &opts, AV_OPT_SEARCH_CHILDREN);
|
||||
av_dict_free(&opts);
|
||||
}
|
||||
|
||||
if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !ost->stream_copy)
|
||||
choose_sample_fmt(st, codec);
|
||||
else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !ost->stream_copy)
|
||||
choose_pixel_fmt(st, st->codec, codec, st->codec->pix_fmt);
|
||||
avcodec_copy_context(ost->enc_ctx, st->codec);
|
||||
if (enc_config)
|
||||
av_dict_parse_string(&ost->encoder_opts, enc_config, "=", ",", 0);
|
||||
}
|
||||
|
||||
avformat_close_input(&ic);
|
||||
@@ -1728,8 +1752,8 @@ static int open_output_file(OptionsContext *o, const char *filename)
|
||||
if (o->stop_time != INT64_MAX && o->recording_time == INT64_MAX) {
|
||||
int64_t start_time = o->start_time == AV_NOPTS_VALUE ? 0 : o->start_time;
|
||||
if (o->stop_time <= start_time) {
|
||||
av_log(NULL, AV_LOG_WARNING, "-to value smaller than -ss; ignoring -to.\n");
|
||||
o->stop_time = INT64_MAX;
|
||||
av_log(NULL, AV_LOG_ERROR, "-to value smaller than -ss; aborting.\n");
|
||||
exit_program(1);
|
||||
} else {
|
||||
o->recording_time = o->stop_time - start_time;
|
||||
}
|
||||
@@ -2807,7 +2831,7 @@ const OptionDef options[] = {
|
||||
"add metadata", "string=string" },
|
||||
{ "dframes", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
|
||||
OPT_OUTPUT, { .func_arg = opt_data_frames },
|
||||
"set the number of data frames to record", "number" },
|
||||
"set the number of data frames to output", "number" },
|
||||
{ "benchmark", OPT_BOOL | OPT_EXPERT, { &do_benchmark },
|
||||
"add timings for benchmarking" },
|
||||
{ "benchmark_all", OPT_BOOL | OPT_EXPERT, { &do_benchmark_all },
|
||||
@@ -2836,6 +2860,8 @@ const OptionDef options[] = {
|
||||
"audio drift threshold", "threshold" },
|
||||
{ "copyts", OPT_BOOL | OPT_EXPERT, { ©_ts },
|
||||
"copy timestamps" },
|
||||
{ "start_at_zero", OPT_BOOL | OPT_EXPERT, { &start_at_zero },
|
||||
"shift input timestamps to start at 0 when using copyts" },
|
||||
{ "copytb", HAS_ARG | OPT_INT | OPT_EXPERT, { ©_tb },
|
||||
"copy input stream time base when stream copying", "mode" },
|
||||
{ "shortest", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
|
||||
@@ -2856,7 +2882,7 @@ const OptionDef options[] = {
|
||||
{ "copypriorss", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(copy_prior_start) },
|
||||
"copy or discard frames before start time" },
|
||||
{ "frames", OPT_INT64 | HAS_ARG | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(max_frames) },
|
||||
"set the number of frames to record", "number" },
|
||||
"set the number of frames to output", "number" },
|
||||
{ "tag", OPT_STRING | HAS_ARG | OPT_SPEC |
|
||||
OPT_EXPERT | OPT_OUTPUT | OPT_INPUT, { .off = OFFSET(codec_tags) },
|
||||
"force codec tag/fourcc", "fourcc/tag" },
|
||||
@@ -2898,7 +2924,7 @@ const OptionDef options[] = {
|
||||
|
||||
/* video options */
|
||||
{ "vframes", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_frames },
|
||||
"set the number of video frames to record", "number" },
|
||||
"set the number of video frames to output", "number" },
|
||||
{ "r", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
|
||||
OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_rates) },
|
||||
"set frame rate (Hz value, fraction or abbreviation)", "rate" },
|
||||
@@ -2980,10 +3006,13 @@ const OptionDef options[] = {
|
||||
{ "hwaccel_device", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
|
||||
OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccel_devices) },
|
||||
"select a device for HW acceleration" "devicename" },
|
||||
#if HAVE_VDPAU_X11
|
||||
{ "vdpau_api_ver", HAS_ARG | OPT_INT | OPT_EXPERT, { &vdpau_api_ver }, "" },
|
||||
#endif
|
||||
|
||||
/* audio options */
|
||||
{ "aframes", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_frames },
|
||||
"set the number of audio frames to record", "number" },
|
||||
"set the number of audio frames to output", "number" },
|
||||
{ "aq", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_qscale },
|
||||
"set audio quality (codec-specific)", "quality", },
|
||||
{ "ar", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC |
|
||||
|
@@ -42,9 +42,11 @@ typedef struct VDPAUContext {
|
||||
VdpGetErrorString *get_error_string;
|
||||
VdpGetInformationString *get_information_string;
|
||||
VdpDeviceDestroy *device_destroy;
|
||||
#if 1 // for ffmpegs older vdpau API, not the oldest though
|
||||
VdpDecoderCreate *decoder_create;
|
||||
VdpDecoderDestroy *decoder_destroy;
|
||||
VdpDecoderRender *decoder_render;
|
||||
#endif
|
||||
VdpVideoSurfaceCreate *video_surface_create;
|
||||
VdpVideoSurfaceDestroy *video_surface_destroy;
|
||||
VdpVideoSurfaceGetBitsYCbCr *video_surface_get_bits;
|
||||
@@ -57,6 +59,8 @@ typedef struct VDPAUContext {
|
||||
VdpYCbCrFormat vdpau_format;
|
||||
} VDPAUContext;
|
||||
|
||||
int vdpau_api_ver = 2;
|
||||
|
||||
static void vdpau_uninit(AVCodecContext *s)
|
||||
{
|
||||
InputStream *ist = s->opaque;
|
||||
@@ -239,9 +243,11 @@ do {
|
||||
GET_CALLBACK(VDP_FUNC_ID_GET_ERROR_STRING, get_error_string);
|
||||
GET_CALLBACK(VDP_FUNC_ID_GET_INFORMATION_STRING, get_information_string);
|
||||
GET_CALLBACK(VDP_FUNC_ID_DEVICE_DESTROY, device_destroy);
|
||||
GET_CALLBACK(VDP_FUNC_ID_DECODER_CREATE, decoder_create);
|
||||
GET_CALLBACK(VDP_FUNC_ID_DECODER_DESTROY, decoder_destroy);
|
||||
GET_CALLBACK(VDP_FUNC_ID_DECODER_RENDER, decoder_render);
|
||||
if (vdpau_api_ver == 1) {
|
||||
GET_CALLBACK(VDP_FUNC_ID_DECODER_CREATE, decoder_create);
|
||||
GET_CALLBACK(VDP_FUNC_ID_DECODER_DESTROY, decoder_destroy);
|
||||
GET_CALLBACK(VDP_FUNC_ID_DECODER_RENDER, decoder_render);
|
||||
}
|
||||
GET_CALLBACK(VDP_FUNC_ID_VIDEO_SURFACE_CREATE, video_surface_create);
|
||||
GET_CALLBACK(VDP_FUNC_ID_VIDEO_SURFACE_DESTROY, video_surface_destroy);
|
||||
GET_CALLBACK(VDP_FUNC_ID_VIDEO_SURFACE_GET_BITS_Y_CB_CR, video_surface_get_bits);
|
||||
@@ -270,12 +276,16 @@ do {
|
||||
ctx->vdpau_format = vdpau_formats[i][0];
|
||||
ctx->pix_fmt = vdpau_formats[i][1];
|
||||
|
||||
vdpau_ctx = av_vdpau_alloc_context();
|
||||
if (!vdpau_ctx)
|
||||
goto fail;
|
||||
vdpau_ctx->render = ctx->decoder_render;
|
||||
if (vdpau_api_ver == 1) {
|
||||
vdpau_ctx = av_vdpau_alloc_context();
|
||||
if (!vdpau_ctx)
|
||||
goto fail;
|
||||
vdpau_ctx->render = ctx->decoder_render;
|
||||
|
||||
s->hwaccel_context = vdpau_ctx;
|
||||
s->hwaccel_context = vdpau_ctx;
|
||||
} else
|
||||
if (av_vdpau_bind_context(s, ctx->device, ctx->get_proc_address, 0))
|
||||
goto fail;
|
||||
|
||||
ctx->get_information_string(&vendor);
|
||||
av_log(NULL, AV_LOG_VERBOSE, "Using VDPAU -- %s -- on X11 display %s, "
|
||||
@@ -291,7 +301,7 @@ fail:
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
|
||||
int vdpau_init(AVCodecContext *s)
|
||||
static int vdpau_old_init(AVCodecContext *s)
|
||||
{
|
||||
InputStream *ist = s->opaque;
|
||||
int loglevel = (ist->hwaccel_id == HWACCEL_AUTO) ? AV_LOG_VERBOSE : AV_LOG_ERROR;
|
||||
@@ -333,3 +343,22 @@ int vdpau_init(AVCodecContext *s)
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int vdpau_init(AVCodecContext *s)
|
||||
{
|
||||
InputStream *ist = s->opaque;
|
||||
|
||||
if (vdpau_api_ver == 1)
|
||||
return vdpau_old_init(s);
|
||||
|
||||
if (!ist->hwaccel_ctx) {
|
||||
int ret = vdpau_alloc(s);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
|
||||
ist->hwaccel_get_buffer = vdpau_get_buffer;
|
||||
ist->hwaccel_retrieve_data = vdpau_retrieve_data;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
102
ffprobe.c
102
ffprobe.c
@@ -66,6 +66,9 @@ static int do_show_stream_disposition = 0;
|
||||
static int do_show_data = 0;
|
||||
static int do_show_program_version = 0;
|
||||
static int do_show_library_versions = 0;
|
||||
static int do_show_pixel_formats = 0;
|
||||
static int do_show_pixel_format_flags = 0;
|
||||
static int do_show_pixel_format_components = 0;
|
||||
|
||||
static int do_show_chapter_tags = 0;
|
||||
static int do_show_format_tags = 0;
|
||||
@@ -132,6 +135,11 @@ typedef enum {
|
||||
SECTION_ID_PACKET,
|
||||
SECTION_ID_PACKETS,
|
||||
SECTION_ID_PACKETS_AND_FRAMES,
|
||||
SECTION_ID_PIXEL_FORMAT,
|
||||
SECTION_ID_PIXEL_FORMAT_FLAGS,
|
||||
SECTION_ID_PIXEL_FORMAT_COMPONENT,
|
||||
SECTION_ID_PIXEL_FORMAT_COMPONENTS,
|
||||
SECTION_ID_PIXEL_FORMATS,
|
||||
SECTION_ID_PROGRAM_STREAM_DISPOSITION,
|
||||
SECTION_ID_PROGRAM_STREAM_TAGS,
|
||||
SECTION_ID_PROGRAM,
|
||||
@@ -165,6 +173,11 @@ static struct section sections[] = {
|
||||
[SECTION_ID_PACKETS] = { SECTION_ID_PACKETS, "packets", SECTION_FLAG_IS_ARRAY, { SECTION_ID_PACKET, -1} },
|
||||
[SECTION_ID_PACKETS_AND_FRAMES] = { SECTION_ID_PACKETS_AND_FRAMES, "packets_and_frames", SECTION_FLAG_IS_ARRAY, { SECTION_ID_PACKET, -1} },
|
||||
[SECTION_ID_PACKET] = { SECTION_ID_PACKET, "packet", 0, { -1 } },
|
||||
[SECTION_ID_PIXEL_FORMATS] = { SECTION_ID_PIXEL_FORMATS, "pixel_formats", SECTION_FLAG_IS_ARRAY, { SECTION_ID_PIXEL_FORMAT, -1 } },
|
||||
[SECTION_ID_PIXEL_FORMAT] = { SECTION_ID_PIXEL_FORMAT, "pixel_format", 0, { SECTION_ID_PIXEL_FORMAT_FLAGS, SECTION_ID_PIXEL_FORMAT_COMPONENTS, -1 } },
|
||||
[SECTION_ID_PIXEL_FORMAT_FLAGS] = { SECTION_ID_PIXEL_FORMAT_FLAGS, "flags", 0, { -1 }, .unique_name = "pixel_format_flags" },
|
||||
[SECTION_ID_PIXEL_FORMAT_COMPONENTS] = { SECTION_ID_PIXEL_FORMAT_COMPONENTS, "components", SECTION_FLAG_IS_ARRAY, {SECTION_ID_PIXEL_FORMAT_COMPONENT, -1 }, .unique_name = "pixel_format_components" },
|
||||
[SECTION_ID_PIXEL_FORMAT_COMPONENT] = { SECTION_ID_PIXEL_FORMAT_COMPONENT, "component", 0, { -1 } },
|
||||
[SECTION_ID_PROGRAM_STREAM_DISPOSITION] = { SECTION_ID_PROGRAM_STREAM_DISPOSITION, "disposition", 0, { -1 }, .unique_name = "program_stream_disposition" },
|
||||
[SECTION_ID_PROGRAM_STREAM_TAGS] = { SECTION_ID_PROGRAM_STREAM_TAGS, "tags", SECTION_FLAG_HAS_VARIABLE_FIELDS, { -1 }, .element_name = "tag", .unique_name = "program_stream_tags" },
|
||||
[SECTION_ID_PROGRAM] = { SECTION_ID_PROGRAM, "program", 0, { SECTION_ID_PROGRAM_TAGS, SECTION_ID_PROGRAM_STREAMS, -1 } },
|
||||
@@ -175,7 +188,8 @@ static struct section sections[] = {
|
||||
[SECTION_ID_PROGRAMS] = { SECTION_ID_PROGRAMS, "programs", SECTION_FLAG_IS_ARRAY, { SECTION_ID_PROGRAM, -1 } },
|
||||
[SECTION_ID_ROOT] = { SECTION_ID_ROOT, "root", SECTION_FLAG_IS_WRAPPER,
|
||||
{ SECTION_ID_CHAPTERS, SECTION_ID_FORMAT, SECTION_ID_FRAMES, SECTION_ID_PROGRAMS, SECTION_ID_STREAMS,
|
||||
SECTION_ID_PACKETS, SECTION_ID_ERROR, SECTION_ID_PROGRAM_VERSION, SECTION_ID_LIBRARY_VERSIONS, -1} },
|
||||
SECTION_ID_PACKETS, SECTION_ID_ERROR, SECTION_ID_PROGRAM_VERSION, SECTION_ID_LIBRARY_VERSIONS,
|
||||
SECTION_ID_PIXEL_FORMATS, -1} },
|
||||
[SECTION_ID_STREAMS] = { SECTION_ID_STREAMS, "streams", SECTION_FLAG_IS_ARRAY, { SECTION_ID_STREAM, -1 } },
|
||||
[SECTION_ID_STREAM] = { SECTION_ID_STREAM, "stream", 0, { SECTION_ID_STREAM_DISPOSITION, SECTION_ID_STREAM_TAGS, -1 } },
|
||||
[SECTION_ID_STREAM_DISPOSITION] = { SECTION_ID_STREAM_DISPOSITION, "disposition", 0, { -1 }, .unique_name = "stream_disposition" },
|
||||
@@ -2098,12 +2112,28 @@ static int show_stream(WriterContext *w, AVFormatContext *fmt_ctx, int stream_id
|
||||
else print_str_opt("pix_fmt", "unknown");
|
||||
print_int("level", dec_ctx->level);
|
||||
if (dec_ctx->color_range != AVCOL_RANGE_UNSPECIFIED)
|
||||
print_str ("color_range", dec_ctx->color_range == AVCOL_RANGE_MPEG ? "tv": "pc");
|
||||
print_str ("color_range", av_color_range_name(dec_ctx->color_range));
|
||||
else
|
||||
print_str_opt("color_range", "N/A");
|
||||
s = av_get_colorspace_name(dec_ctx->colorspace);
|
||||
if (s) print_str ("color_space", s);
|
||||
else print_str_opt("color_space", "unknown");
|
||||
|
||||
if (dec_ctx->color_trc != AVCOL_TRC_UNSPECIFIED)
|
||||
print_str("color_transfer", av_color_transfer_name(dec_ctx->color_trc));
|
||||
else
|
||||
print_str_opt("color_transfer", av_color_transfer_name(dec_ctx->color_trc));
|
||||
|
||||
if (dec_ctx->color_primaries != AVCOL_PRI_UNSPECIFIED)
|
||||
print_str("color_primaries", av_color_primaries_name(dec_ctx->color_primaries));
|
||||
else
|
||||
print_str_opt("color_primaries", av_color_primaries_name(dec_ctx->color_primaries));
|
||||
|
||||
if (dec_ctx->chroma_sample_location != AVCHROMA_LOC_UNSPECIFIED)
|
||||
print_str("chroma_location", av_chroma_location_name(dec_ctx->chroma_sample_location));
|
||||
else
|
||||
print_str_opt("chroma_location", av_chroma_location_name(dec_ctx->chroma_sample_location));
|
||||
|
||||
if (dec_ctx->timecode_frame_start >= 0) {
|
||||
char tcbuf[AV_TIMECODE_STR_SIZE];
|
||||
av_timecode_make_mpeg_tc_string(tcbuf, dec_ctx->timecode_frame_start);
|
||||
@@ -2356,12 +2386,19 @@ static int open_input_file(AVFormatContext **fmt_ctx_ptr, const char *filename)
|
||||
AVFormatContext *fmt_ctx = NULL;
|
||||
AVDictionaryEntry *t;
|
||||
AVDictionary **opts;
|
||||
int scan_all_pmts_set = 0;
|
||||
|
||||
if (!av_dict_get(format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE)) {
|
||||
av_dict_set(&format_opts, "scan_all_pmts", "1", AV_DICT_DONT_OVERWRITE);
|
||||
scan_all_pmts_set = 1;
|
||||
}
|
||||
if ((err = avformat_open_input(&fmt_ctx, filename,
|
||||
iformat, &format_opts)) < 0) {
|
||||
print_error(filename, err);
|
||||
return err;
|
||||
}
|
||||
if (scan_all_pmts_set)
|
||||
av_dict_set(&format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE);
|
||||
if ((t = av_dict_get(format_opts, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
|
||||
av_log(NULL, AV_LOG_ERROR, "Option %s not found.\n", t->key);
|
||||
return AVERROR_OPTION_NOT_FOUND;
|
||||
@@ -2557,6 +2594,58 @@ static void ffprobe_show_library_versions(WriterContext *w)
|
||||
writer_print_section_footer(w);
|
||||
}
|
||||
|
||||
#define PRINT_PIX_FMT_FLAG(flagname, name) \
|
||||
do { \
|
||||
print_int(name, !!(pixdesc->flags & AV_PIX_FMT_FLAG_##flagname)); \
|
||||
} while (0)
|
||||
|
||||
static void ffprobe_show_pixel_formats(WriterContext *w)
|
||||
{
|
||||
const AVPixFmtDescriptor *pixdesc = NULL;
|
||||
int i, n;
|
||||
|
||||
writer_print_section_header(w, SECTION_ID_PIXEL_FORMATS);
|
||||
while (pixdesc = av_pix_fmt_desc_next(pixdesc)) {
|
||||
writer_print_section_header(w, SECTION_ID_PIXEL_FORMAT);
|
||||
print_str("name", pixdesc->name);
|
||||
print_int("nb_components", pixdesc->nb_components);
|
||||
if ((pixdesc->nb_components >= 3) && !(pixdesc->flags & AV_PIX_FMT_FLAG_RGB)) {
|
||||
print_int ("log2_chroma_w", pixdesc->log2_chroma_w);
|
||||
print_int ("log2_chroma_h", pixdesc->log2_chroma_h);
|
||||
} else {
|
||||
print_str_opt("log2_chroma_w", "N/A");
|
||||
print_str_opt("log2_chroma_h", "N/A");
|
||||
}
|
||||
n = av_get_bits_per_pixel(pixdesc);
|
||||
if (n) print_int ("bits_per_pixel", n);
|
||||
else print_str_opt("bits_per_pixel", "N/A");
|
||||
if (do_show_pixel_format_flags) {
|
||||
writer_print_section_header(w, SECTION_ID_PIXEL_FORMAT_FLAGS);
|
||||
PRINT_PIX_FMT_FLAG(BE, "big_endian");
|
||||
PRINT_PIX_FMT_FLAG(PAL, "palette");
|
||||
PRINT_PIX_FMT_FLAG(BITSTREAM, "bitstream");
|
||||
PRINT_PIX_FMT_FLAG(HWACCEL, "hwaccel");
|
||||
PRINT_PIX_FMT_FLAG(PLANAR, "planar");
|
||||
PRINT_PIX_FMT_FLAG(RGB, "rgb");
|
||||
PRINT_PIX_FMT_FLAG(PSEUDOPAL, "pseudopal");
|
||||
PRINT_PIX_FMT_FLAG(ALPHA, "alpha");
|
||||
writer_print_section_footer(w);
|
||||
}
|
||||
if (do_show_pixel_format_components && (pixdesc->nb_components > 0)) {
|
||||
writer_print_section_header(w, SECTION_ID_PIXEL_FORMAT_COMPONENTS);
|
||||
for (i = 0; i < pixdesc->nb_components; i++) {
|
||||
writer_print_section_header(w, SECTION_ID_PIXEL_FORMAT_COMPONENT);
|
||||
print_int("index", i + 1);
|
||||
print_int("bit_depth", pixdesc->comp[i].depth_minus1 + 1);
|
||||
writer_print_section_footer(w);
|
||||
}
|
||||
writer_print_section_footer(w);
|
||||
}
|
||||
writer_print_section_footer(w);
|
||||
}
|
||||
writer_print_section_footer(w);
|
||||
}
|
||||
|
||||
static int opt_format(void *optctx, const char *opt, const char *arg)
|
||||
{
|
||||
iformat = av_find_input_format(arg);
|
||||
@@ -2890,6 +2979,7 @@ DEFINE_OPT_SHOW_SECTION(format, FORMAT);
|
||||
DEFINE_OPT_SHOW_SECTION(frames, FRAMES);
|
||||
DEFINE_OPT_SHOW_SECTION(library_versions, LIBRARY_VERSIONS);
|
||||
DEFINE_OPT_SHOW_SECTION(packets, PACKETS);
|
||||
DEFINE_OPT_SHOW_SECTION(pixel_formats, PIXEL_FORMATS);
|
||||
DEFINE_OPT_SHOW_SECTION(program_version, PROGRAM_VERSION);
|
||||
DEFINE_OPT_SHOW_SECTION(streams, STREAMS);
|
||||
DEFINE_OPT_SHOW_SECTION(programs, PROGRAMS);
|
||||
@@ -2928,6 +3018,7 @@ static const OptionDef real_options[] = {
|
||||
{ "show_program_version", 0, {(void*)&opt_show_program_version}, "show ffprobe version" },
|
||||
{ "show_library_versions", 0, {(void*)&opt_show_library_versions}, "show library versions" },
|
||||
{ "show_versions", 0, {(void*)&opt_show_versions}, "show program and library versions" },
|
||||
{ "show_pixel_formats", 0, {(void*)&opt_show_pixel_formats}, "show pixel format descriptions" },
|
||||
{ "show_private_data", OPT_BOOL, {(void*)&show_private_data}, "show private data" },
|
||||
{ "private", OPT_BOOL, {(void*)&show_private_data}, "same as show_private_data" },
|
||||
{ "bitexact", OPT_BOOL, {&do_bitexact}, "force bitexact output" },
|
||||
@@ -2984,6 +3075,9 @@ int main(int argc, char **argv)
|
||||
SET_DO_SHOW(FRAMES, frames);
|
||||
SET_DO_SHOW(LIBRARY_VERSIONS, library_versions);
|
||||
SET_DO_SHOW(PACKETS, packets);
|
||||
SET_DO_SHOW(PIXEL_FORMATS, pixel_formats);
|
||||
SET_DO_SHOW(PIXEL_FORMAT_FLAGS, pixel_format_flags);
|
||||
SET_DO_SHOW(PIXEL_FORMAT_COMPONENTS, pixel_format_components);
|
||||
SET_DO_SHOW(PROGRAM_VERSION, program_version);
|
||||
SET_DO_SHOW(PROGRAMS, programs);
|
||||
SET_DO_SHOW(STREAMS, streams);
|
||||
@@ -3048,10 +3142,12 @@ int main(int argc, char **argv)
|
||||
ffprobe_show_program_version(wctx);
|
||||
if (do_show_library_versions)
|
||||
ffprobe_show_library_versions(wctx);
|
||||
if (do_show_pixel_formats)
|
||||
ffprobe_show_pixel_formats(wctx);
|
||||
|
||||
if (!input_filename &&
|
||||
((do_show_format || do_show_programs || do_show_streams || do_show_chapters || do_show_packets || do_show_error) ||
|
||||
(!do_show_program_version && !do_show_library_versions))) {
|
||||
(!do_show_program_version && !do_show_library_versions && !do_show_pixel_formats))) {
|
||||
show_usage();
|
||||
av_log(NULL, AV_LOG_ERROR, "You have to specify one input file.\n");
|
||||
av_log(NULL, AV_LOG_ERROR, "Use -h to get full help or, even better, run 'man %s'.\n", program_name);
|
||||
|
1252
ffserver.c
1252
ffserver.c
File diff suppressed because it is too large
Load Diff
1260
ffserver_config.c
Normal file
1260
ffserver_config.c
Normal file
File diff suppressed because it is too large
Load Diff
133
ffserver_config.h
Normal file
133
ffserver_config.h
Normal file
@@ -0,0 +1,133 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2001, 2002 Fabrice Bellard
|
||||
*
|
||||
* 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 FFSERVER_CONFIG_H
|
||||
#define FFSERVER_CONFIG_H
|
||||
|
||||
#include "libavutil/dict.h"
|
||||
#include "libavformat/avformat.h"
|
||||
#include "libavformat/network.h"
|
||||
|
||||
#define FFSERVER_MAX_STREAMS 20
|
||||
|
||||
/* each generated stream is described here */
|
||||
enum FFServerStreamType {
|
||||
STREAM_TYPE_LIVE,
|
||||
STREAM_TYPE_STATUS,
|
||||
STREAM_TYPE_REDIRECT,
|
||||
};
|
||||
|
||||
enum FFServerIPAddressAction {
|
||||
IP_ALLOW = 1,
|
||||
IP_DENY,
|
||||
};
|
||||
|
||||
typedef struct FFServerIPAddressACL {
|
||||
struct FFServerIPAddressACL *next;
|
||||
enum FFServerIPAddressAction action;
|
||||
/* These are in host order */
|
||||
struct in_addr first;
|
||||
struct in_addr last;
|
||||
} FFServerIPAddressACL;
|
||||
|
||||
/* description of each stream of the ffserver.conf file */
|
||||
typedef struct FFServerStream {
|
||||
enum FFServerStreamType stream_type;
|
||||
char filename[1024]; /* stream filename */
|
||||
struct FFServerStream *feed; /* feed we are using (can be null if coming from file) */
|
||||
AVDictionary *in_opts; /* input parameters */
|
||||
AVDictionary *metadata; /* metadata to set on the stream */
|
||||
AVInputFormat *ifmt; /* if non NULL, force input format */
|
||||
AVOutputFormat *fmt;
|
||||
FFServerIPAddressACL *acl;
|
||||
char dynamic_acl[1024];
|
||||
int nb_streams;
|
||||
int prebuffer; /* Number of milliseconds early to start */
|
||||
int64_t max_time; /* Number of milliseconds to run */
|
||||
int send_on_key;
|
||||
AVStream *streams[FFSERVER_MAX_STREAMS];
|
||||
int feed_streams[FFSERVER_MAX_STREAMS]; /* index of streams in the feed */
|
||||
char feed_filename[1024]; /* file name of the feed storage, or
|
||||
input file name for a stream */
|
||||
pid_t pid; /* Of ffmpeg process */
|
||||
time_t pid_start; /* Of ffmpeg process */
|
||||
char **child_argv;
|
||||
struct FFServerStream *next;
|
||||
unsigned bandwidth; /* bandwidth, in kbits/s */
|
||||
/* RTSP options */
|
||||
char *rtsp_option;
|
||||
/* multicast specific */
|
||||
int is_multicast;
|
||||
struct in_addr multicast_ip;
|
||||
int multicast_port; /* first port used for multicast */
|
||||
int multicast_ttl;
|
||||
int loop; /* if true, send the stream in loops (only meaningful if file) */
|
||||
|
||||
/* feed specific */
|
||||
int feed_opened; /* true if someone is writing to the feed */
|
||||
int is_feed; /* true if it is a feed */
|
||||
int readonly; /* True if writing is prohibited to the file */
|
||||
int truncate; /* True if feeder connection truncate the feed file */
|
||||
int conns_served;
|
||||
int64_t bytes_served;
|
||||
int64_t feed_max_size; /* maximum storage size, zero means unlimited */
|
||||
int64_t feed_write_index; /* current write position in feed (it wraps around) */
|
||||
int64_t feed_size; /* current size of feed */
|
||||
struct FFServerStream *next_feed;
|
||||
} FFServerStream;
|
||||
|
||||
typedef struct FFServerConfig {
|
||||
char *filename;
|
||||
FFServerStream *first_feed; /* contains only feeds */
|
||||
FFServerStream *first_stream; /* contains all streams, including feeds */
|
||||
unsigned int nb_max_http_connections;
|
||||
unsigned int nb_max_connections;
|
||||
uint64_t max_bandwidth;
|
||||
int debug;
|
||||
char logfilename[1024];
|
||||
struct sockaddr_in http_addr;
|
||||
struct sockaddr_in rtsp_addr;
|
||||
int errors;
|
||||
int warnings;
|
||||
int use_defaults;
|
||||
// Following variables MUST NOT be used outside configuration parsing code.
|
||||
enum AVCodecID guessed_audio_codec_id;
|
||||
enum AVCodecID guessed_video_codec_id;
|
||||
AVDictionary *video_opts; /* AVOptions for video encoder */
|
||||
AVDictionary *audio_opts; /* AVOptions for audio encoder */
|
||||
AVCodecContext *dummy_actx; /* Used internally to test audio AVOptions. */
|
||||
AVCodecContext *dummy_vctx; /* Used internally to test video AVOptions. */
|
||||
int no_audio;
|
||||
int no_video;
|
||||
int line_num;
|
||||
int stream_use_defaults;
|
||||
} FFServerConfig;
|
||||
|
||||
void ffserver_get_arg(char *buf, int buf_size, const char **pp);
|
||||
|
||||
void ffserver_parse_acl_row(FFServerStream *stream, FFServerStream* feed,
|
||||
FFServerIPAddressACL *ext_acl,
|
||||
const char *p, const char *filename, int line_num);
|
||||
|
||||
int ffserver_parse_ffconfig(const char *filename, FFServerConfig *config);
|
||||
|
||||
void ffserver_free_child_args(void *argsp);
|
||||
|
||||
#endif /* FFSERVER_CONFIG_H */
|
@@ -339,21 +339,25 @@ static inline void mcdc(uint16_t *dst, const uint16_t *src, int log2w,
|
||||
}
|
||||
}
|
||||
|
||||
static int decode_p_block(FourXContext *f, uint16_t *dst, uint16_t *src,
|
||||
static int decode_p_block(FourXContext *f, uint16_t *dst, const uint16_t *src,
|
||||
int log2w, int log2h, int stride)
|
||||
{
|
||||
const int index = size2index[log2h][log2w];
|
||||
const int h = 1 << log2h;
|
||||
int code = get_vlc2(&f->gb,
|
||||
block_type_vlc[1 - (f->version > 1)][index].table,
|
||||
BLOCK_TYPE_VLC_BITS, 1);
|
||||
uint16_t *start = f->last_frame_buffer;
|
||||
uint16_t *end = start + stride * (f->avctx->height - h + 1) - (1 << log2w);
|
||||
int ret;
|
||||
int scale = 1;
|
||||
int index, h, code, ret, scale = 1;
|
||||
uint16_t *start, *end;
|
||||
unsigned dc = 0;
|
||||
|
||||
av_assert0(code >= 0 && code <= 6 && log2w >= 0);
|
||||
av_assert0(log2w >= 0 && log2h >= 0);
|
||||
|
||||
index = size2index[log2h][log2w];
|
||||
av_assert0(index >= 0);
|
||||
|
||||
h = 1 << log2h;
|
||||
code = get_vlc2(&f->gb, block_type_vlc[1 - (f->version > 1)][index].table,
|
||||
BLOCK_TYPE_VLC_BITS, 1);
|
||||
av_assert0(code >= 0 && code <= 6);
|
||||
|
||||
start = f->last_frame_buffer;
|
||||
end = start + stride * (f->avctx->height - h + 1) - (1 << log2w);
|
||||
|
||||
if (code == 1) {
|
||||
log2h--;
|
||||
|
@@ -11,6 +11,7 @@ HEADERS = avcodec.h \
|
||||
vda.h \
|
||||
vdpau.h \
|
||||
version.h \
|
||||
vorbis_parser.h \
|
||||
xvmc.h \
|
||||
|
||||
OBJS = allcodecs.o \
|
||||
@@ -31,6 +32,8 @@ OBJS = allcodecs.o \
|
||||
resample.o \
|
||||
resample2.o \
|
||||
utils.o \
|
||||
vorbis_parser.o \
|
||||
xiph.o \
|
||||
|
||||
# subsystems
|
||||
OBJS-$(CONFIG_AANDCTTABLES) += aandcttab.o
|
||||
@@ -70,7 +73,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_ME_CMP) += me_cmp.o
|
||||
OBJS-$(CONFIG_MPEG_ER) += mpeg_er.o
|
||||
OBJS-$(CONFIG_MPEGAUDIO) += mpegaudio.o mpegaudiodata.o \
|
||||
mpegaudiodecheader.o
|
||||
@@ -133,6 +136,7 @@ OBJS-$(CONFIG_AMV_ENCODER) += mjpegenc.o mjpeg.o mjpegenc_common.o \
|
||||
OBJS-$(CONFIG_ANM_DECODER) += anm.o
|
||||
OBJS-$(CONFIG_ANSI_DECODER) += ansi.o cga_data.o
|
||||
OBJS-$(CONFIG_APE_DECODER) += apedec.o
|
||||
OBJS-$(CONFIG_APNG_DECODER) += png.o pngdec.o pngdsp.o
|
||||
OBJS-$(CONFIG_SSA_DECODER) += assdec.o ass.o ass_split.o
|
||||
OBJS-$(CONFIG_SSA_ENCODER) += assenc.o ass.o
|
||||
OBJS-$(CONFIG_ASS_DECODER) += assdec.o ass.o ass_split.o
|
||||
@@ -276,7 +280,7 @@ OBJS-$(CONFIG_INTERPLAY_VIDEO_DECODER) += interplayvideo.o
|
||||
OBJS-$(CONFIG_JACOSUB_DECODER) += jacosubdec.o ass.o
|
||||
OBJS-$(CONFIG_JPEG2000_ENCODER) += j2kenc.o mqcenc.o mqc.o jpeg2000.o \
|
||||
jpeg2000dwt.o
|
||||
OBJS-$(CONFIG_JPEG2000_DECODER) += jpeg2000dec.o jpeg2000.o \
|
||||
OBJS-$(CONFIG_JPEG2000_DECODER) += jpeg2000dec.o jpeg2000.o jpeg2000dsp.o \
|
||||
jpeg2000dwt.o mqcdec.o mqc.o
|
||||
OBJS-$(CONFIG_JPEGLS_DECODER) += jpeglsdec.o jpegls.o
|
||||
OBJS-$(CONFIG_JPEGLS_ENCODER) += jpeglsenc.o jpegls.o
|
||||
@@ -429,6 +433,7 @@ OBJS-$(CONFIG_SONIC_LS_ENCODER) += sonic.o
|
||||
OBJS-$(CONFIG_SP5X_DECODER) += sp5xdec.o
|
||||
OBJS-$(CONFIG_SRT_DECODER) += srtdec.o ass.o
|
||||
OBJS-$(CONFIG_SRT_ENCODER) += srtenc.o ass_split.o
|
||||
OBJS-$(CONFIG_STL_DECODER) += textdec.o ass.o
|
||||
OBJS-$(CONFIG_SUBRIP_DECODER) += srtdec.o ass.o
|
||||
OBJS-$(CONFIG_SUBRIP_ENCODER) += srtenc.o ass_split.o
|
||||
OBJS-$(CONFIG_SUBVIEWER1_DECODER) += textdec.o ass.o
|
||||
@@ -444,7 +449,6 @@ OBJS-$(CONFIG_TAK_DECODER) += takdec.o tak.o
|
||||
OBJS-$(CONFIG_TARGA_DECODER) += targa.o
|
||||
OBJS-$(CONFIG_TARGA_ENCODER) += targaenc.o rle.o
|
||||
OBJS-$(CONFIG_TARGA_Y216_DECODER) += targa_y216dec.o
|
||||
OBJS-$(CONFIG_THEORA_DECODER) += xiph.o
|
||||
OBJS-$(CONFIG_TIERTEXSEQVIDEO_DECODER) += tiertexseqv.o
|
||||
OBJS-$(CONFIG_TIFF_DECODER) += tiff.o lzw.o faxcompr.o tiff_data.o tiff_common.o
|
||||
OBJS-$(CONFIG_TIFF_ENCODER) += tiffenc.o rle.o lzwenc.o tiff_data.o
|
||||
@@ -473,7 +477,9 @@ OBJS-$(CONFIG_V410_ENCODER) += v410enc.o
|
||||
OBJS-$(CONFIG_V210X_DECODER) += v210x.o
|
||||
OBJS-$(CONFIG_VB_DECODER) += vb.o
|
||||
OBJS-$(CONFIG_VBLE_DECODER) += vble.o
|
||||
OBJS-$(CONFIG_VC1_DECODER) += vc1dec.o vc1.o vc1data.o vc1dsp.o \
|
||||
OBJS-$(CONFIG_VC1_DECODER) += vc1dec.o vc1_block.o vc1_loopfilter.o \
|
||||
vc1_mc.o vc1_pred.o vc1.o vc1data.o \
|
||||
vc1dsp.o \
|
||||
msmpeg4dec.o msmpeg4.o msmpeg4data.o \
|
||||
wmv2dsp.o
|
||||
OBJS-$(CONFIG_VCR1_DECODER) += vcr1.o
|
||||
@@ -481,7 +487,7 @@ OBJS-$(CONFIG_VMDAUDIO_DECODER) += vmdaudio.o
|
||||
OBJS-$(CONFIG_VMDVIDEO_DECODER) += vmdvideo.o
|
||||
OBJS-$(CONFIG_VMNC_DECODER) += vmnc.o
|
||||
OBJS-$(CONFIG_VORBIS_DECODER) += vorbisdec.o vorbisdsp.o vorbis.o \
|
||||
vorbis_data.o xiph.o
|
||||
vorbis_data.o
|
||||
OBJS-$(CONFIG_VORBIS_ENCODER) += vorbisenc.o vorbis.o \
|
||||
vorbis_data.o
|
||||
OBJS-$(CONFIG_VP3_DECODER) += vp3.o
|
||||
@@ -673,20 +679,18 @@ OBJS-$(CONFIG_VC1_VDPAU_HWACCEL) += vdpau_vc1.o
|
||||
OBJS-$(CONFIG_ADTS_MUXER) += mpeg4audio.o
|
||||
OBJS-$(CONFIG_CAF_DEMUXER) += mpeg4audio.o mpegaudiodata.o \
|
||||
ac3tab.o
|
||||
OBJS-$(CONFIG_FLAC_DEMUXER) += flac.o flacdata.o vorbis_data.o \
|
||||
vorbis_parser.o xiph.o
|
||||
OBJS-$(CONFIG_FLAC_DEMUXER) += flac.o flacdata.o vorbis_data.o
|
||||
OBJS-$(CONFIG_FLAC_MUXER) += flac.o flacdata.o vorbis_data.o
|
||||
OBJS-$(CONFIG_FLV_DEMUXER) += mpeg4audio.o
|
||||
OBJS-$(CONFIG_GXF_DEMUXER) += mpeg12data.o
|
||||
OBJS-$(CONFIG_IFF_DEMUXER) += iff.o
|
||||
OBJS-$(CONFIG_ISMV_MUXER) += mpeg4audio.o mpegaudiodata.o
|
||||
OBJS-$(CONFIG_LATM_MUXER) += mpeg4audio.o
|
||||
OBJS-$(CONFIG_MATROSKA_AUDIO_MUXER) += xiph.o mpeg4audio.o vorbis_data.o \
|
||||
OBJS-$(CONFIG_MATROSKA_AUDIO_MUXER) += mpeg4audio.o vorbis_data.o \
|
||||
flac.o flacdata.o
|
||||
OBJS-$(CONFIG_MATROSKA_DEMUXER) += mpeg4audio.o mpegaudiodata.o \
|
||||
vorbis_parser.o xiph.o
|
||||
OBJS-$(CONFIG_MATROSKA_DEMUXER) += mpeg4audio.o mpegaudiodata.o
|
||||
OBJS-$(CONFIG_MATROSKA_MUXER) += mpeg4audio.o mpegaudiodata.o \
|
||||
flac.o flacdata.o vorbis_data.o xiph.o
|
||||
flac.o flacdata.o vorbis_data.o
|
||||
OBJS-$(CONFIG_MP2_MUXER) += mpegaudiodata.o mpegaudiodecheader.o
|
||||
OBJS-$(CONFIG_MP3_MUXER) += mpegaudiodata.o mpegaudiodecheader.o
|
||||
OBJS-$(CONFIG_MOV_DEMUXER) += mpeg4audio.o mpegaudiodata.o ac3tab.o
|
||||
@@ -695,21 +699,19 @@ OBJS-$(CONFIG_MPEGTS_MUXER) += mpeg4audio.o
|
||||
OBJS-$(CONFIG_MPEGTS_DEMUXER) += mpeg4audio.o mpegaudiodata.o
|
||||
OBJS-$(CONFIG_MXF_MUXER) += dnxhddata.o
|
||||
OBJS-$(CONFIG_NUT_MUXER) += mpegaudiodata.o
|
||||
OBJS-$(CONFIG_OGA_MUXER) += xiph.o flac.o flacdata.o
|
||||
OBJS-$(CONFIG_OGG_DEMUXER) += xiph.o flac.o flacdata.o \
|
||||
mpeg12data.o vorbis_parser.o \
|
||||
OBJS-$(CONFIG_OGA_MUXER) += flac.o flacdata.o
|
||||
OBJS-$(CONFIG_OGG_DEMUXER) += mpeg12data.o \
|
||||
dirac.o vorbis_data.o
|
||||
OBJS-$(CONFIG_OGG_MUXER) += xiph.o flac.o flacdata.o \
|
||||
OBJS-$(CONFIG_OGG_MUXER) += flac.o flacdata.o \
|
||||
vorbis_data.o
|
||||
OBJS-$(CONFIG_RTP_MUXER) += mpeg4audio.o xiph.o
|
||||
OBJS-$(CONFIG_RTP_MUXER) += mpeg4audio.o
|
||||
OBJS-$(CONFIG_RTPDEC) += mjpeg.o
|
||||
OBJS-$(CONFIG_SPDIF_DEMUXER) += aacadtsdec.o mpeg4audio.o
|
||||
OBJS-$(CONFIG_SPDIF_MUXER) += dca.o
|
||||
OBJS-$(CONFIG_TAK_DEMUXER) += tak.o
|
||||
OBJS-$(CONFIG_WEBM_MUXER) += mpeg4audio.o mpegaudiodata.o \
|
||||
xiph.o flac.o flacdata.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
|
||||
@@ -753,7 +755,7 @@ OBJS-$(CONFIG_LIBVO_AACENC_ENCODER) += libvo-aacenc.o mpeg4audio.o
|
||||
OBJS-$(CONFIG_LIBVO_AMRWBENC_ENCODER) += libvo-amrwbenc.o
|
||||
OBJS-$(CONFIG_LIBVORBIS_DECODER) += libvorbisdec.o
|
||||
OBJS-$(CONFIG_LIBVORBIS_ENCODER) += libvorbisenc.o \
|
||||
vorbis_data.o vorbis_parser.o xiph.o
|
||||
vorbis_data.o
|
||||
OBJS-$(CONFIG_LIBVPX_VP8_DECODER) += libvpxdec.o
|
||||
OBJS-$(CONFIG_LIBVPX_VP8_ENCODER) += libvpxenc.o
|
||||
OBJS-$(CONFIG_LIBVPX_VP9_DECODER) += libvpxdec.o libvpx.o
|
||||
@@ -809,7 +811,6 @@ 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
|
||||
OBJS-$(CONFIG_VORBIS_PARSER) += vorbis_parser.o xiph.o
|
||||
OBJS-$(CONFIG_VP3_PARSER) += vp3_parser.o
|
||||
OBJS-$(CONFIG_VP8_PARSER) += vp8_parser.o
|
||||
OBJS-$(CONFIG_VP9_PARSER) += vp9_parser.o
|
||||
|
@@ -245,6 +245,7 @@ typedef struct SingleChannelElement {
|
||||
* channel element - generic struct for SCE/CPE/CCE/LFE
|
||||
*/
|
||||
typedef struct ChannelElement {
|
||||
int present;
|
||||
// CPE specific
|
||||
int common_window; ///< Set if channels share a common 'IndividualChannelStream' in bitstream.
|
||||
int ms_mode; ///< Signals mid/side stereo flags coding mode (used by encoder)
|
||||
@@ -274,6 +275,7 @@ struct AACContext {
|
||||
ChannelElement *che[4][MAX_ELEM_ID];
|
||||
ChannelElement *tag_che_map[4][MAX_ELEM_ID];
|
||||
int tags_mapped;
|
||||
int warned_remapping_once;
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
@@ -293,7 +295,7 @@ struct AACContext {
|
||||
FFTContext mdct_ld;
|
||||
FFTContext mdct_ltp;
|
||||
FmtConvertContext fmt_conv;
|
||||
AVFloatDSPContext fdsp;
|
||||
AVFloatDSPContext *fdsp;
|
||||
int random_state;
|
||||
/** @} */
|
||||
|
||||
|
@@ -621,6 +621,12 @@ static ChannelElement *get_che(AACContext *ac, int type, int elem_id)
|
||||
* If we seem to have encountered such a stream, transfer
|
||||
* the LFE[0] element to the SCE[1]'s mapping */
|
||||
if (ac->tags_mapped == tags_per_config[ac->oc[1].m4ac.chan_config] - 1 && (type == TYPE_LFE || type == TYPE_SCE)) {
|
||||
if (!ac->warned_remapping_once && (type != TYPE_LFE || elem_id != 0)) {
|
||||
av_log(ac->avctx, AV_LOG_WARNING,
|
||||
"This stream seems to incorrectly report its last channel as %s[%d], mapping to LFE[0]\n",
|
||||
type == TYPE_SCE ? "SCE" : "LFE", elem_id);
|
||||
ac->warned_remapping_once++;
|
||||
}
|
||||
ac->tags_mapped++;
|
||||
return ac->tag_che_map[type][elem_id] = ac->che[TYPE_LFE][0];
|
||||
}
|
||||
@@ -630,6 +636,22 @@ static ChannelElement *get_che(AACContext *ac, int type, int elem_id)
|
||||
return ac->tag_che_map[TYPE_CPE][elem_id] = ac->che[TYPE_CPE][1];
|
||||
}
|
||||
case 4:
|
||||
/* Some streams incorrectly code 4.0 audio as
|
||||
* SCE[0] CPE[0] LFE[0]
|
||||
* instead of
|
||||
* SCE[0] CPE[0] SCE[1].
|
||||
* If we seem to have encountered such a stream, transfer
|
||||
* the SCE[1] element to the LFE[0]'s mapping */
|
||||
if (ac->tags_mapped == tags_per_config[ac->oc[1].m4ac.chan_config] - 1 && (type == TYPE_LFE || type == TYPE_SCE)) {
|
||||
if (!ac->warned_remapping_once && (type != TYPE_SCE || elem_id != 1)) {
|
||||
av_log(ac->avctx, AV_LOG_WARNING,
|
||||
"This stream seems to incorrectly report its last channel as %s[%d], mapping to SCE[1]\n",
|
||||
type == TYPE_SCE ? "SCE" : "LFE", elem_id);
|
||||
ac->warned_remapping_once++;
|
||||
}
|
||||
ac->tags_mapped++;
|
||||
return ac->tag_che_map[type][elem_id] = ac->che[TYPE_SCE][1];
|
||||
}
|
||||
if (ac->tags_mapped == 2 &&
|
||||
ac->oc[1].m4ac.chan_config == 4 &&
|
||||
type == TYPE_SCE) {
|
||||
@@ -681,6 +703,7 @@ static void decode_channel_map(uint8_t layout_map[][3],
|
||||
syn_ele = TYPE_LFE;
|
||||
break;
|
||||
default:
|
||||
// AAC_CHANNEL_OFF has no channel map
|
||||
av_assert0(0);
|
||||
}
|
||||
layout_map[0][0] = syn_ele;
|
||||
@@ -1114,7 +1137,10 @@ static av_cold int aac_decode_init(AVCodecContext *avctx)
|
||||
ff_aac_sbr_init();
|
||||
|
||||
ff_fmt_convert_init(&ac->fmt_conv, avctx);
|
||||
avpriv_float_dsp_init(&ac->fdsp, avctx->flags & CODEC_FLAG_BITEXACT);
|
||||
ac->fdsp = avpriv_float_dsp_alloc(avctx->flags & CODEC_FLAG_BITEXACT);
|
||||
if (!ac->fdsp) {
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
|
||||
ac->random_state = 0x1f2e3d4c;
|
||||
|
||||
@@ -1490,13 +1516,12 @@ static void decode_mid_side_stereo(ChannelElement *cpe, GetBitContext *gb,
|
||||
int ms_present)
|
||||
{
|
||||
int idx;
|
||||
int max_idx = cpe->ch[0].ics.num_window_groups * cpe->ch[0].ics.max_sfb;
|
||||
if (ms_present == 1) {
|
||||
for (idx = 0;
|
||||
idx < cpe->ch[0].ics.num_window_groups * cpe->ch[0].ics.max_sfb;
|
||||
idx++)
|
||||
for (idx = 0; idx < max_idx; idx++)
|
||||
cpe->ms_mask[idx] = get_bits1(gb);
|
||||
} else if (ms_present == 2) {
|
||||
memset(cpe->ms_mask, 1, sizeof(cpe->ms_mask[0]) * cpe->ch[0].ics.num_window_groups * cpe->ch[0].ics.max_sfb);
|
||||
memset(cpe->ms_mask, 1, max_idx * sizeof(cpe->ms_mask[0]));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1618,9 +1643,9 @@ static int decode_spectrum_and_dequant(AACContext *ac, float coef[1024],
|
||||
cfo[k] = ac->random_state;
|
||||
}
|
||||
|
||||
band_energy = ac->fdsp.scalarproduct_float(cfo, cfo, off_len);
|
||||
band_energy = ac->fdsp->scalarproduct_float(cfo, cfo, off_len);
|
||||
scale = sf[idx] / sqrtf(band_energy);
|
||||
ac->fdsp.vector_fmul_scalar(cfo, cfo, scale, off_len);
|
||||
ac->fdsp->vector_fmul_scalar(cfo, cfo, scale, off_len);
|
||||
}
|
||||
} else {
|
||||
const float *vq = ff_aac_codebook_vector_vals[cbt_m1];
|
||||
@@ -1766,7 +1791,7 @@ static int decode_spectrum_and_dequant(AACContext *ac, float coef[1024],
|
||||
}
|
||||
} while (len -= 2);
|
||||
|
||||
ac->fdsp.vector_fmul_scalar(cfo, cfo, sf[idx], off_len);
|
||||
ac->fdsp->vector_fmul_scalar(cfo, cfo, sf[idx], off_len);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1979,7 +2004,7 @@ static void apply_mid_side_stereo(AACContext *ac, ChannelElement *cpe)
|
||||
cpe->ch[0].band_type[idx] < NOISE_BT &&
|
||||
cpe->ch[1].band_type[idx] < NOISE_BT) {
|
||||
for (group = 0; group < ics->group_len[g]; group++) {
|
||||
ac->fdsp.butterflies_float(ch0 + group * 128 + offsets[i],
|
||||
ac->fdsp->butterflies_float(ch0 + group * 128 + offsets[i],
|
||||
ch1 + group * 128 + offsets[i],
|
||||
offsets[i+1] - offsets[i]);
|
||||
}
|
||||
@@ -2018,7 +2043,7 @@ static void apply_intensity_stereo(AACContext *ac,
|
||||
c *= 1 - 2 * cpe->ms_mask[idx];
|
||||
scale = c * sce1->sf[idx];
|
||||
for (group = 0; group < ics->group_len[g]; group++)
|
||||
ac->fdsp.vector_fmul_scalar(coef1 + group * 128 + offsets[i],
|
||||
ac->fdsp->vector_fmul_scalar(coef1 + group * 128 + offsets[i],
|
||||
coef0 + group * 128 + offsets[i],
|
||||
scale,
|
||||
offsets[i + 1] - offsets[i]);
|
||||
@@ -2268,7 +2293,12 @@ static int decode_extension_payload(AACContext *ac, GetBitContext *gb, int cnt,
|
||||
{
|
||||
int crc_flag = 0;
|
||||
int res = cnt;
|
||||
switch (get_bits(gb, 4)) { // extension type
|
||||
int type = get_bits(gb, 4);
|
||||
|
||||
if (ac->avctx->debug & FF_DEBUG_STARTCODE)
|
||||
av_log(ac->avctx, AV_LOG_DEBUG, "extension type: %d len:%d\n", type, cnt);
|
||||
|
||||
switch (type) { // extension type
|
||||
case EXT_SBR_DATA_CRC:
|
||||
crc_flag++;
|
||||
case EXT_SBR_DATA:
|
||||
@@ -2381,15 +2411,15 @@ static void windowing_and_mdct_ltp(AACContext *ac, float *out,
|
||||
const float *swindow_prev = ics->use_kb_window[1] ? ff_aac_kbd_short_128 : ff_sine_128;
|
||||
|
||||
if (ics->window_sequence[0] != LONG_STOP_SEQUENCE) {
|
||||
ac->fdsp.vector_fmul(in, in, lwindow_prev, 1024);
|
||||
ac->fdsp->vector_fmul(in, in, lwindow_prev, 1024);
|
||||
} else {
|
||||
memset(in, 0, 448 * sizeof(float));
|
||||
ac->fdsp.vector_fmul(in + 448, in + 448, swindow_prev, 128);
|
||||
ac->fdsp->vector_fmul(in + 448, in + 448, swindow_prev, 128);
|
||||
}
|
||||
if (ics->window_sequence[0] != LONG_START_SEQUENCE) {
|
||||
ac->fdsp.vector_fmul_reverse(in + 1024, in + 1024, lwindow, 1024);
|
||||
ac->fdsp->vector_fmul_reverse(in + 1024, in + 1024, lwindow, 1024);
|
||||
} else {
|
||||
ac->fdsp.vector_fmul_reverse(in + 1024 + 448, in + 1024 + 448, swindow, 128);
|
||||
ac->fdsp->vector_fmul_reverse(in + 1024 + 448, in + 1024 + 448, swindow, 128);
|
||||
memset(in + 1024 + 576, 0, 448 * sizeof(float));
|
||||
}
|
||||
ac->mdct_ltp.mdct_calc(&ac->mdct_ltp, out, in);
|
||||
@@ -2442,17 +2472,17 @@ static void update_ltp(AACContext *ac, SingleChannelElement *sce)
|
||||
if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) {
|
||||
memcpy(saved_ltp, saved, 512 * sizeof(float));
|
||||
memset(saved_ltp + 576, 0, 448 * sizeof(float));
|
||||
ac->fdsp.vector_fmul_reverse(saved_ltp + 448, ac->buf_mdct + 960, &swindow[64], 64);
|
||||
ac->fdsp->vector_fmul_reverse(saved_ltp + 448, ac->buf_mdct + 960, &swindow[64], 64);
|
||||
for (i = 0; i < 64; i++)
|
||||
saved_ltp[i + 512] = ac->buf_mdct[1023 - i] * swindow[63 - i];
|
||||
} else if (ics->window_sequence[0] == LONG_START_SEQUENCE) {
|
||||
memcpy(saved_ltp, ac->buf_mdct + 512, 448 * sizeof(float));
|
||||
memset(saved_ltp + 576, 0, 448 * sizeof(float));
|
||||
ac->fdsp.vector_fmul_reverse(saved_ltp + 448, ac->buf_mdct + 960, &swindow[64], 64);
|
||||
ac->fdsp->vector_fmul_reverse(saved_ltp + 448, ac->buf_mdct + 960, &swindow[64], 64);
|
||||
for (i = 0; i < 64; i++)
|
||||
saved_ltp[i + 512] = ac->buf_mdct[1023 - i] * swindow[63 - i];
|
||||
} else { // LONG_STOP or ONLY_LONG
|
||||
ac->fdsp.vector_fmul_reverse(saved_ltp, ac->buf_mdct + 512, &lwindow[512], 512);
|
||||
ac->fdsp->vector_fmul_reverse(saved_ltp, ac->buf_mdct + 512, &lwindow[512], 512);
|
||||
for (i = 0; i < 512; i++)
|
||||
saved_ltp[i + 512] = ac->buf_mdct[1023 - i] * lwindow[511 - i];
|
||||
}
|
||||
@@ -2493,19 +2523,19 @@ static void imdct_and_windowing(AACContext *ac, SingleChannelElement *sce)
|
||||
*/
|
||||
if ((ics->window_sequence[1] == ONLY_LONG_SEQUENCE || ics->window_sequence[1] == LONG_STOP_SEQUENCE) &&
|
||||
(ics->window_sequence[0] == ONLY_LONG_SEQUENCE || ics->window_sequence[0] == LONG_START_SEQUENCE)) {
|
||||
ac->fdsp.vector_fmul_window( out, saved, buf, lwindow_prev, 512);
|
||||
ac->fdsp->vector_fmul_window( out, saved, buf, lwindow_prev, 512);
|
||||
} else {
|
||||
memcpy( out, saved, 448 * sizeof(float));
|
||||
|
||||
if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) {
|
||||
ac->fdsp.vector_fmul_window(out + 448 + 0*128, saved + 448, buf + 0*128, swindow_prev, 64);
|
||||
ac->fdsp.vector_fmul_window(out + 448 + 1*128, buf + 0*128 + 64, buf + 1*128, swindow, 64);
|
||||
ac->fdsp.vector_fmul_window(out + 448 + 2*128, buf + 1*128 + 64, buf + 2*128, swindow, 64);
|
||||
ac->fdsp.vector_fmul_window(out + 448 + 3*128, buf + 2*128 + 64, buf + 3*128, swindow, 64);
|
||||
ac->fdsp.vector_fmul_window(temp, buf + 3*128 + 64, buf + 4*128, swindow, 64);
|
||||
ac->fdsp->vector_fmul_window(out + 448 + 0*128, saved + 448, buf + 0*128, swindow_prev, 64);
|
||||
ac->fdsp->vector_fmul_window(out + 448 + 1*128, buf + 0*128 + 64, buf + 1*128, swindow, 64);
|
||||
ac->fdsp->vector_fmul_window(out + 448 + 2*128, buf + 1*128 + 64, buf + 2*128, swindow, 64);
|
||||
ac->fdsp->vector_fmul_window(out + 448 + 3*128, buf + 2*128 + 64, buf + 3*128, swindow, 64);
|
||||
ac->fdsp->vector_fmul_window(temp, buf + 3*128 + 64, buf + 4*128, swindow, 64);
|
||||
memcpy( out + 448 + 4*128, temp, 64 * sizeof(float));
|
||||
} else {
|
||||
ac->fdsp.vector_fmul_window(out + 448, saved + 448, buf, swindow_prev, 64);
|
||||
ac->fdsp->vector_fmul_window(out + 448, saved + 448, buf, swindow_prev, 64);
|
||||
memcpy( out + 576, buf + 64, 448 * sizeof(float));
|
||||
}
|
||||
}
|
||||
@@ -2513,9 +2543,9 @@ static void imdct_and_windowing(AACContext *ac, SingleChannelElement *sce)
|
||||
// buffer update
|
||||
if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) {
|
||||
memcpy( saved, temp + 64, 64 * sizeof(float));
|
||||
ac->fdsp.vector_fmul_window(saved + 64, buf + 4*128 + 64, buf + 5*128, swindow, 64);
|
||||
ac->fdsp.vector_fmul_window(saved + 192, buf + 5*128 + 64, buf + 6*128, swindow, 64);
|
||||
ac->fdsp.vector_fmul_window(saved + 320, buf + 6*128 + 64, buf + 7*128, swindow, 64);
|
||||
ac->fdsp->vector_fmul_window(saved + 64, buf + 4*128 + 64, buf + 5*128, swindow, 64);
|
||||
ac->fdsp->vector_fmul_window(saved + 192, buf + 5*128 + 64, buf + 6*128, swindow, 64);
|
||||
ac->fdsp->vector_fmul_window(saved + 320, buf + 6*128 + 64, buf + 7*128, swindow, 64);
|
||||
memcpy( saved + 448, buf + 7*128 + 64, 64 * sizeof(float));
|
||||
} else if (ics->window_sequence[0] == LONG_START_SEQUENCE) {
|
||||
memcpy( saved, buf + 512, 448 * sizeof(float));
|
||||
@@ -2540,10 +2570,10 @@ static void imdct_and_windowing_ld(AACContext *ac, SingleChannelElement *sce)
|
||||
if (ics->use_kb_window[1]) {
|
||||
// AAC LD uses a low overlap sine window instead of a KBD window
|
||||
memcpy(out, saved, 192 * sizeof(float));
|
||||
ac->fdsp.vector_fmul_window(out + 192, saved + 192, buf, ff_sine_128, 64);
|
||||
ac->fdsp->vector_fmul_window(out + 192, saved + 192, buf, ff_sine_128, 64);
|
||||
memcpy( out + 320, buf + 64, 192 * sizeof(float));
|
||||
} else {
|
||||
ac->fdsp.vector_fmul_window(out, saved, buf, ff_sine_512, 256);
|
||||
ac->fdsp->vector_fmul_window(out, saved, buf, ff_sine_512, 256);
|
||||
}
|
||||
|
||||
// buffer update
|
||||
@@ -2716,7 +2746,7 @@ static void spectral_to_sample(AACContext *ac)
|
||||
for (type = 3; type >= 0; type--) {
|
||||
for (i = 0; i < MAX_ELEM_ID; i++) {
|
||||
ChannelElement *che = ac->che[type][i];
|
||||
if (che) {
|
||||
if (che && che->present) {
|
||||
if (type <= TYPE_CPE)
|
||||
apply_channel_coupling(ac, che, type, i, BEFORE_TNS, apply_dependent_coupling);
|
||||
if (ac->oc[1].m4ac.object_type == AOT_AAC_LTP) {
|
||||
@@ -2748,6 +2778,9 @@ static void spectral_to_sample(AACContext *ac)
|
||||
}
|
||||
if (type <= TYPE_CCE)
|
||||
apply_channel_coupling(ac, che, type, i, AFTER_IMDCT, apply_independent_coupling);
|
||||
che->present = 0;
|
||||
} else if (che) {
|
||||
av_log(ac->avctx, AV_LOG_VERBOSE, "ChannelElement %d.%d missing \n", type, i);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2852,6 +2885,7 @@ static int aac_decode_er_frame(AVCodecContext *avctx, void *data,
|
||||
elem_type, elem_id);
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
che->present = 1;
|
||||
if (aot != AOT_ER_AAC_ELD)
|
||||
skip_bits(gb, 4);
|
||||
switch (elem_type) {
|
||||
@@ -2915,6 +2949,9 @@ static int aac_decode_frame_int(AVCodecContext *avctx, void *data,
|
||||
while ((elem_type = get_bits(gb, 3)) != TYPE_END) {
|
||||
elem_id = get_bits(gb, 4);
|
||||
|
||||
if (avctx->debug & FF_DEBUG_STARTCODE)
|
||||
av_log(avctx, AV_LOG_DEBUG, "Elem type:%x id:%x\n", elem_type, elem_id);
|
||||
|
||||
if (elem_type < TYPE_DSE) {
|
||||
if (!(che=get_che(ac, elem_type, elem_id))) {
|
||||
av_log(ac->avctx, AV_LOG_ERROR, "channel element %d.%d is not allocated\n",
|
||||
@@ -2923,6 +2960,7 @@ static int aac_decode_frame_int(AVCodecContext *avctx, void *data,
|
||||
goto fail;
|
||||
}
|
||||
samples = 1024;
|
||||
che->present = 1;
|
||||
}
|
||||
|
||||
switch (elem_type) {
|
||||
@@ -3131,6 +3169,7 @@ static av_cold int aac_decode_close(AVCodecContext *avctx)
|
||||
ff_mdct_end(&ac->mdct_small);
|
||||
ff_mdct_end(&ac->mdct_ld);
|
||||
ff_mdct_end(&ac->mdct_ltp);
|
||||
av_freep(&ac->fdsp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -3440,6 +3479,18 @@ static const AVClass aac_decoder_class = {
|
||||
.version = LIBAVUTIL_VERSION_INT,
|
||||
};
|
||||
|
||||
static const AVProfile profiles[] = {
|
||||
{ FF_PROFILE_AAC_MAIN, "Main" },
|
||||
{ FF_PROFILE_AAC_LOW, "LC" },
|
||||
{ FF_PROFILE_AAC_SSR, "SSR" },
|
||||
{ FF_PROFILE_AAC_LTP, "LTP" },
|
||||
{ FF_PROFILE_AAC_HE, "HE-AAC" },
|
||||
{ FF_PROFILE_AAC_HE_V2, "HE-AACv2" },
|
||||
{ FF_PROFILE_AAC_LD, "LD" },
|
||||
{ FF_PROFILE_AAC_ELD, "ELD" },
|
||||
{ FF_PROFILE_UNKNOWN },
|
||||
};
|
||||
|
||||
AVCodec ff_aac_decoder = {
|
||||
.name = "aac",
|
||||
.long_name = NULL_IF_CONFIG_SMALL("AAC (Advanced Audio Coding)"),
|
||||
@@ -3456,6 +3507,7 @@ AVCodec ff_aac_decoder = {
|
||||
.channel_layouts = aac_channel_layout,
|
||||
.flush = flush,
|
||||
.priv_class = &aac_decoder_class,
|
||||
.profiles = profiles,
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -3478,4 +3530,5 @@ AVCodec ff_aac_latm_decoder = {
|
||||
.capabilities = CODEC_CAP_CHANNEL_CONF | CODEC_CAP_DR1,
|
||||
.channel_layouts = aac_channel_layout,
|
||||
.flush = flush,
|
||||
.profiles = profiles,
|
||||
};
|
||||
|
@@ -252,7 +252,7 @@ static void apply_window_and_mdct(AACEncContext *s, SingleChannelElement *sce,
|
||||
int i;
|
||||
float *output = sce->ret_buf;
|
||||
|
||||
apply_window[sce->ics.window_sequence[0]](&s->fdsp, sce, audio);
|
||||
apply_window[sce->ics.window_sequence[0]](s->fdsp, sce, audio);
|
||||
|
||||
if (sce->ics.window_sequence[0] != EIGHT_SHORT_SEQUENCE)
|
||||
s->mdct1024.mdct_calc(&s->mdct1024, sce->coeffs, output);
|
||||
@@ -567,6 +567,10 @@ static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
|
||||
ics->group_len[w] = wi[ch].grouping[w];
|
||||
|
||||
apply_window_and_mdct(s, &cpe->ch[ch], overlap);
|
||||
if (isnan(cpe->ch->coeffs[0])) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Input contains NaN\n");
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
}
|
||||
start_ch += chans;
|
||||
}
|
||||
@@ -678,6 +682,7 @@ static av_cold int aac_encode_end(AVCodecContext *avctx)
|
||||
ff_psy_preprocess_end(s->psypp);
|
||||
av_freep(&s->buffer.samples);
|
||||
av_freep(&s->cpe);
|
||||
av_freep(&s->fdsp);
|
||||
ff_af_queue_close(&s->afq);
|
||||
return 0;
|
||||
}
|
||||
@@ -686,7 +691,9 @@ static av_cold int dsp_init(AVCodecContext *avctx, AACEncContext *s)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
avpriv_float_dsp_init(&s->fdsp, avctx->flags & CODEC_FLAG_BITEXACT);
|
||||
s->fdsp = avpriv_float_dsp_alloc(avctx->flags & CODEC_FLAG_BITEXACT);
|
||||
if (!s->fdsp)
|
||||
return AVERROR(ENOMEM);
|
||||
|
||||
// window init
|
||||
ff_kbd_window_init(ff_aac_kbd_long_1024, 4.0, 1024);
|
||||
@@ -746,10 +753,10 @@ static av_cold int aac_encode_init(AVCodecContext *avctx)
|
||||
|
||||
s->chan_map = aac_chan_configs[s->channels-1];
|
||||
|
||||
if (ret = dsp_init(avctx, s))
|
||||
if ((ret = dsp_init(avctx, s)) < 0)
|
||||
goto fail;
|
||||
|
||||
if (ret = alloc_buffers(avctx, s))
|
||||
if ((ret = alloc_buffers(avctx, s)) < 0)
|
||||
goto fail;
|
||||
|
||||
avctx->extradata_size = 5;
|
||||
@@ -761,7 +768,8 @@ static av_cold int aac_encode_init(AVCodecContext *avctx)
|
||||
lengths[1] = ff_aac_num_swb_128[i];
|
||||
for (i = 0; i < s->chan_map[0]; i++)
|
||||
grouping[i] = s->chan_map[i + 1] == TYPE_CPE;
|
||||
if (ret = ff_psy_init(&s->psy, avctx, 2, sizes, lengths, s->chan_map[0], grouping))
|
||||
if ((ret = ff_psy_init(&s->psy, avctx, 2, sizes, lengths,
|
||||
s->chan_map[0], grouping)) < 0)
|
||||
goto fail;
|
||||
s->psypp = ff_psy_preprocess_init(avctx);
|
||||
s->coder = &ff_aac_coders[s->options.aac_coder];
|
||||
@@ -776,7 +784,7 @@ static av_cold int aac_encode_init(AVCodecContext *avctx)
|
||||
for (i = 0; i < 428; i++)
|
||||
ff_aac_pow34sf_tab[i] = sqrt(ff_aac_pow2sf_tab[i] * sqrt(ff_aac_pow2sf_tab[i]));
|
||||
|
||||
avctx->delay = 1024;
|
||||
avctx->initial_padding = 1024;
|
||||
ff_af_queue_init(avctx, &s->afq);
|
||||
|
||||
return 0;
|
||||
|
@@ -67,7 +67,7 @@ typedef struct AACEncContext {
|
||||
PutBitContext pb;
|
||||
FFTContext mdct1024; ///< long (1024 samples) frame transform context
|
||||
FFTContext mdct128; ///< short (128 samples) frame transform context
|
||||
AVFloatDSPContext fdsp;
|
||||
AVFloatDSPContext *fdsp;
|
||||
float *planar_samples[6]; ///< saved preprocessed input
|
||||
|
||||
int samplerate_index; ///< MPEG-4 samplerate index
|
||||
|
@@ -326,7 +326,7 @@ static int check_n_master(AVCodecContext *avctx, int n_master, int bs_xover_band
|
||||
static int sbr_make_f_master(AACContext *ac, SpectralBandReplication *sbr,
|
||||
SpectrumParameters *spectrum)
|
||||
{
|
||||
unsigned int temp, max_qmf_subbands;
|
||||
unsigned int temp, max_qmf_subbands = 0;
|
||||
unsigned int start_min, stop_min;
|
||||
int k;
|
||||
const int8_t *sbr_offset_ptr;
|
||||
@@ -556,7 +556,8 @@ static int sbr_hf_calc_npatches(AACContext *ac, SpectralBandReplication *sbr)
|
||||
k = sbr->n_master;
|
||||
} while (sb != sbr->kx[1] + sbr->m[1]);
|
||||
|
||||
if (sbr->num_patches > 1 && sbr->patch_num_subbands[sbr->num_patches-1] < 3)
|
||||
if (sbr->num_patches > 1 &&
|
||||
sbr->patch_num_subbands[sbr->num_patches - 1] < 3)
|
||||
sbr->num_patches--;
|
||||
|
||||
return 0;
|
||||
@@ -1611,8 +1612,14 @@ static void sbr_hf_assemble(float Y1[38][64][2],
|
||||
memcpy(q_temp[i + 2*ch_data->t_env[0]], sbr->q_m[0], m_max * sizeof(sbr->q_m[0][0]));
|
||||
}
|
||||
} else if (h_SL) {
|
||||
memcpy(g_temp[2*ch_data->t_env[0]], g_temp[2*ch_data->t_env_num_env_old], 4*sizeof(g_temp[0]));
|
||||
memcpy(q_temp[2*ch_data->t_env[0]], q_temp[2*ch_data->t_env_num_env_old], 4*sizeof(q_temp[0]));
|
||||
for (i = 0; i < 4; i++) {
|
||||
memcpy(g_temp[i + 2 * ch_data->t_env[0]],
|
||||
g_temp[i + 2 * ch_data->t_env_num_env_old],
|
||||
sizeof(g_temp[0]));
|
||||
memcpy(q_temp[i + 2 * ch_data->t_env[0]],
|
||||
q_temp[i + 2 * ch_data->t_env_num_env_old],
|
||||
sizeof(q_temp[0]));
|
||||
}
|
||||
}
|
||||
|
||||
for (e = 0; e < ch_data->bs_num_env; e++) {
|
||||
@@ -1693,7 +1700,7 @@ void ff_sbr_apply(AACContext *ac, SpectralBandReplication *sbr, int id_aac,
|
||||
}
|
||||
for (ch = 0; ch < nch; ch++) {
|
||||
/* decode channel */
|
||||
sbr_qmf_analysis(&ac->fdsp, &sbr->mdct_ana, &sbr->dsp, ch ? R : L, sbr->data[ch].analysis_filterbank_samples,
|
||||
sbr_qmf_analysis(ac->fdsp, &sbr->mdct_ana, &sbr->dsp, ch ? R : L, sbr->data[ch].analysis_filterbank_samples,
|
||||
(float*)sbr->qmf_filter_scratch,
|
||||
sbr->data[ch].W, sbr->data[ch].Ypos);
|
||||
sbr->c.sbr_lf_gen(ac, sbr, sbr->X_low,
|
||||
@@ -1739,13 +1746,13 @@ void ff_sbr_apply(AACContext *ac, SpectralBandReplication *sbr, int id_aac,
|
||||
nch = 2;
|
||||
}
|
||||
|
||||
sbr_qmf_synthesis(&sbr->mdct, &sbr->dsp, &ac->fdsp,
|
||||
sbr_qmf_synthesis(&sbr->mdct, &sbr->dsp, ac->fdsp,
|
||||
L, sbr->X[0], sbr->qmf_filter_scratch,
|
||||
sbr->data[0].synthesis_filterbank_samples,
|
||||
&sbr->data[0].synthesis_filterbank_samples_offset,
|
||||
downsampled);
|
||||
if (nch == 2)
|
||||
sbr_qmf_synthesis(&sbr->mdct, &sbr->dsp, &ac->fdsp,
|
||||
sbr_qmf_synthesis(&sbr->mdct, &sbr->dsp, ac->fdsp,
|
||||
R, sbr->X[1], sbr->qmf_filter_scratch,
|
||||
sbr->data[1].synthesis_filterbank_samples,
|
||||
&sbr->data[1].synthesis_filterbank_samples_offset,
|
||||
|
@@ -376,7 +376,8 @@ function ff_fft_calc_neon, export=1
|
||||
ld1 {v30.16b}, [x10]
|
||||
mov x7, #-8
|
||||
movrel x12, pmmp
|
||||
ldr x3, [x3, x2, lsl #3]
|
||||
ldr x4, [x3, x2, lsl #3]
|
||||
add x3, x3, x4
|
||||
movrel x13, mppm
|
||||
movrel x14, X(ff_cos_16)
|
||||
ld1 {v31.16b}, [x11]
|
||||
@@ -416,21 +417,21 @@ function ff_fft_permute_neon, export=1
|
||||
endfunc
|
||||
|
||||
const fft_tab_neon
|
||||
.quad fft4_neon
|
||||
.quad fft8_neon
|
||||
.quad fft16_neon
|
||||
.quad fft32_neon
|
||||
.quad fft64_neon
|
||||
.quad fft128_neon
|
||||
.quad fft256_neon
|
||||
.quad fft512_neon
|
||||
.quad fft1024_neon
|
||||
.quad fft2048_neon
|
||||
.quad fft4096_neon
|
||||
.quad fft8192_neon
|
||||
.quad fft16384_neon
|
||||
.quad fft32768_neon
|
||||
.quad fft65536_neon
|
||||
.quad fft4_neon - fft_tab_neon
|
||||
.quad fft8_neon - fft_tab_neon
|
||||
.quad fft16_neon - fft_tab_neon
|
||||
.quad fft32_neon - fft_tab_neon
|
||||
.quad fft64_neon - fft_tab_neon
|
||||
.quad fft128_neon - fft_tab_neon
|
||||
.quad fft256_neon - fft_tab_neon
|
||||
.quad fft512_neon - fft_tab_neon
|
||||
.quad fft1024_neon - fft_tab_neon
|
||||
.quad fft2048_neon - fft_tab_neon
|
||||
.quad fft4096_neon - fft_tab_neon
|
||||
.quad fft8192_neon - fft_tab_neon
|
||||
.quad fft16384_neon - fft_tab_neon
|
||||
.quad fft32768_neon - fft_tab_neon
|
||||
.quad fft65536_neon - fft_tab_neon
|
||||
endconst
|
||||
|
||||
const pmmp, align=4
|
||||
|
@@ -78,6 +78,7 @@ av_cold void ff_h264dsp_init_aarch64(H264DSPContext *c, const int bit_depth,
|
||||
c->h264_v_loop_filter_luma = ff_h264_v_loop_filter_luma_neon;
|
||||
c->h264_h_loop_filter_luma = ff_h264_h_loop_filter_luma_neon;
|
||||
c->h264_v_loop_filter_chroma = ff_h264_v_loop_filter_chroma_neon;
|
||||
if (chroma_format_idc <= 1)
|
||||
c->h264_h_loop_filter_chroma = ff_h264_h_loop_filter_chroma_neon;
|
||||
|
||||
c->weight_h264_pixels_tab[0] = ff_weight_h264_pixels_16_neon;
|
||||
|
@@ -438,8 +438,8 @@ function fft_b15_calc_neon
|
||||
uzp1 v12.4s, v4.4s, v5.4s // exp[11 - 14].re
|
||||
uzp2 v13.4s, v4.4s, v5.4s // exp[11 - 14].im
|
||||
zip1 v14.4s, v6.4s, v7.4s // exp[5,10].re/exp[5,10].im
|
||||
add x5, x5, x3, lsl #3
|
||||
ldr x5, [x5]
|
||||
ldr x6, [x5, x3, lsl #3]
|
||||
add x5, x5, x6
|
||||
mov x10, x0
|
||||
blr x5
|
||||
ldp x20, x30, [sp]
|
||||
@@ -452,13 +452,13 @@ function fft_b15_calc_neon
|
||||
endfunc
|
||||
|
||||
const fft_tab_neon
|
||||
.quad fft15_neon
|
||||
.quad fft30_neon
|
||||
.quad fft60_neon
|
||||
.quad fft120_neon
|
||||
.quad fft240_neon
|
||||
.quad fft480_neon
|
||||
.quad fft960_neon
|
||||
.quad fft15_neon - fft_tab_neon
|
||||
.quad fft30_neon - fft_tab_neon
|
||||
.quad fft60_neon - fft_tab_neon
|
||||
.quad fft120_neon - fft_tab_neon
|
||||
.quad fft240_neon - fft_tab_neon
|
||||
.quad fft480_neon - fft_tab_neon
|
||||
.quad fft960_neon - fft_tab_neon
|
||||
endconst
|
||||
|
||||
function ff_celt_imdct_half_neon, export=1
|
||||
|
@@ -195,7 +195,7 @@ static av_cold int ac3_decode_init(AVCodecContext *avctx)
|
||||
#if (USE_FIXED)
|
||||
s->fdsp = avpriv_alloc_fixed_dsp(avctx->flags & CODEC_FLAG_BITEXACT);
|
||||
#else
|
||||
avpriv_float_dsp_init(&s->fdsp, avctx->flags & CODEC_FLAG_BITEXACT);
|
||||
s->fdsp = avpriv_float_dsp_alloc(avctx->flags & CODEC_FLAG_BITEXACT);
|
||||
#endif
|
||||
|
||||
ff_ac3dsp_init(&s->ac3dsp, avctx->flags & CODEC_FLAG_BITEXACT);
|
||||
@@ -688,7 +688,7 @@ static inline void do_imdct(AC3DecodeContext *s, int channels)
|
||||
s->fdsp->vector_fmul_window_scaled(s->outptr[ch - 1], s->delay[ch - 1],
|
||||
s->tmp_output, s->window, 128, 8);
|
||||
#else
|
||||
s->fdsp.vector_fmul_window(s->outptr[ch - 1], s->delay[ch - 1],
|
||||
s->fdsp->vector_fmul_window(s->outptr[ch - 1], s->delay[ch - 1],
|
||||
s->tmp_output, s->window, 128);
|
||||
#endif
|
||||
for (i = 0; i < 128; i++)
|
||||
@@ -700,7 +700,7 @@ static inline void do_imdct(AC3DecodeContext *s, int channels)
|
||||
s->fdsp->vector_fmul_window_scaled(s->outptr[ch - 1], s->delay[ch - 1],
|
||||
s->tmp_output, s->window, 128, 8);
|
||||
#else
|
||||
s->fdsp.vector_fmul_window(s->outptr[ch - 1], s->delay[ch - 1],
|
||||
s->fdsp->vector_fmul_window(s->outptr[ch - 1], s->delay[ch - 1],
|
||||
s->tmp_output, s->window, 128);
|
||||
#endif
|
||||
memcpy(s->delay[ch - 1], s->tmp_output + 128, 128 * sizeof(FFTSample));
|
||||
@@ -1635,9 +1635,7 @@ static av_cold int ac3_decode_end(AVCodecContext *avctx)
|
||||
AC3DecodeContext *s = avctx->priv_data;
|
||||
ff_mdct_end(&s->imdct_512);
|
||||
ff_mdct_end(&s->imdct_256);
|
||||
#if (USE_FIXED)
|
||||
av_freep(&s->fdsp);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@@ -218,7 +218,7 @@ typedef struct AC3DecodeContext {
|
||||
#if USE_FIXED
|
||||
AVFixedDSPContext *fdsp;
|
||||
#else
|
||||
AVFloatDSPContext fdsp;
|
||||
AVFloatDSPContext *fdsp;
|
||||
#endif
|
||||
AC3DSPContext ac3dsp;
|
||||
FmtConvertContext fmt_conv; ///< optimized conversion functions
|
||||
|
@@ -2035,6 +2035,7 @@ av_cold int ff_ac3_encode_close(AVCodecContext *avctx)
|
||||
av_freep(&s->qmant_buffer);
|
||||
av_freep(&s->cpl_coord_exp_buffer);
|
||||
av_freep(&s->cpl_coord_mant_buffer);
|
||||
av_freep(&s->fdsp);
|
||||
for (blk = 0; blk < s->num_blocks; blk++) {
|
||||
AC3Block *block = &s->blocks[blk];
|
||||
av_freep(&block->mdct_coef);
|
||||
@@ -2434,7 +2435,7 @@ av_cold int ff_ac3_encode_init(AVCodecContext *avctx)
|
||||
return ret;
|
||||
|
||||
avctx->frame_size = AC3_BLOCK_SIZE * s->num_blocks;
|
||||
avctx->delay = AC3_BLOCK_SIZE;
|
||||
avctx->initial_padding = AC3_BLOCK_SIZE;
|
||||
|
||||
s->bitstream_mode = avctx->audio_service_type;
|
||||
if (s->bitstream_mode == AV_AUDIO_SERVICE_TYPE_KARAOKE)
|
||||
|
@@ -80,12 +80,14 @@ typedef int64_t CoefSumType;
|
||||
#define AC3ENC_OPT_NOT_INDICATED 0
|
||||
#define AC3ENC_OPT_MODE_ON 2
|
||||
#define AC3ENC_OPT_MODE_OFF 1
|
||||
#define AC3ENC_OPT_DSUREX_DPLIIZ 3
|
||||
|
||||
/* specific option values */
|
||||
#define AC3ENC_OPT_LARGE_ROOM 1
|
||||
#define AC3ENC_OPT_SMALL_ROOM 2
|
||||
#define AC3ENC_OPT_DOWNMIX_LTRT 1
|
||||
#define AC3ENC_OPT_DOWNMIX_LORO 2
|
||||
#define AC3ENC_OPT_DOWNMIX_DPLII 3 // reserved value in A/52, but used by encoders to indicate DPL2
|
||||
#define AC3ENC_OPT_ADCONV_STANDARD 0
|
||||
#define AC3ENC_OPT_ADCONV_HDCD 1
|
||||
|
||||
@@ -163,7 +165,7 @@ typedef struct AC3EncodeContext {
|
||||
AVCodecContext *avctx; ///< parent AVCodecContext
|
||||
PutBitContext pb; ///< bitstream writer context
|
||||
AudioDSPContext adsp;
|
||||
AVFloatDSPContext fdsp;
|
||||
AVFloatDSPContext *fdsp;
|
||||
MECmpContext mecc;
|
||||
AC3DSPContext ac3dsp; ///< AC-3 optimized functions
|
||||
FFTContext mdct; ///< FFT context for MDCT calculation
|
||||
|
@@ -139,7 +139,9 @@ static CoefType calc_cpl_coord(CoefSumType energy_ch, CoefSumType energy_cpl)
|
||||
av_cold int ff_ac3_float_encode_init(AVCodecContext *avctx)
|
||||
{
|
||||
AC3EncodeContext *s = avctx->priv_data;
|
||||
avpriv_float_dsp_init(&s->fdsp, avctx->flags & CODEC_FLAG_BITEXACT);
|
||||
s->fdsp = avpriv_float_dsp_alloc(avctx->flags & CODEC_FLAG_BITEXACT);
|
||||
if (!s->fdsp)
|
||||
return AVERROR(ENOMEM);
|
||||
return ff_ac3_encode_init(avctx);
|
||||
}
|
||||
|
||||
|
@@ -46,18 +46,20 @@ static const AVOption ac3_options[] = {
|
||||
{"off", "Not Dolby Surround Encoded", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_MODE_OFF }, INT_MIN, INT_MAX, AC3ENC_PARAM, "dsur_mode"},
|
||||
{"original", "Original Bit Stream", OFFSET(original), AV_OPT_TYPE_INT, {.i64 = AC3ENC_OPT_NONE }, AC3ENC_OPT_NONE, 1, AC3ENC_PARAM},
|
||||
/* extended bitstream information */
|
||||
{"dmix_mode", "Preferred Stereo Downmix Mode", OFFSET(preferred_stereo_downmix), AV_OPT_TYPE_INT, {.i64 = AC3ENC_OPT_NONE }, AC3ENC_OPT_NONE, AC3ENC_OPT_DOWNMIX_LORO, AC3ENC_PARAM, "dmix_mode"},
|
||||
{"dmix_mode", "Preferred Stereo Downmix Mode", OFFSET(preferred_stereo_downmix), AV_OPT_TYPE_INT, {.i64 = AC3ENC_OPT_NONE }, AC3ENC_OPT_NONE, AC3ENC_OPT_DOWNMIX_DPLII, AC3ENC_PARAM, "dmix_mode"},
|
||||
{"notindicated", "Not Indicated (default)", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_NOT_INDICATED }, INT_MIN, INT_MAX, AC3ENC_PARAM, "dmix_mode"},
|
||||
{"ltrt", "Lt/Rt Downmix Preferred", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_DOWNMIX_LTRT }, INT_MIN, INT_MAX, AC3ENC_PARAM, "dmix_mode"},
|
||||
{"loro", "Lo/Ro Downmix Preferred", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_DOWNMIX_LORO }, INT_MIN, INT_MAX, AC3ENC_PARAM, "dmix_mode"},
|
||||
{"dplii", "Dolby Pro Logic II Downmix Preferred", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_DOWNMIX_DPLII }, INT_MIN, INT_MAX, AC3ENC_PARAM, "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, AC3ENC_PARAM},
|
||||
{"ltrt_surmixlev", "Lt/Rt Surround Mix Level", OFFSET(ltrt_surround_mix_level), AV_OPT_TYPE_FLOAT, {.dbl = -1.0 }, -1.0, 2.0, AC3ENC_PARAM},
|
||||
{"loro_cmixlev", "Lo/Ro Center Mix Level", OFFSET(loro_center_mix_level), AV_OPT_TYPE_FLOAT, {.dbl = -1.0 }, -1.0, 2.0, AC3ENC_PARAM},
|
||||
{"loro_surmixlev", "Lo/Ro Surround Mix Level", OFFSET(loro_surround_mix_level), AV_OPT_TYPE_FLOAT, {.dbl = -1.0 }, -1.0, 2.0, AC3ENC_PARAM},
|
||||
{"dsurex_mode", "Dolby Surround EX Mode", OFFSET(dolby_surround_ex_mode), AV_OPT_TYPE_INT, {.i64 = AC3ENC_OPT_NONE }, AC3ENC_OPT_NONE, AC3ENC_OPT_MODE_ON, AC3ENC_PARAM, "dsurex_mode"},
|
||||
{"dsurex_mode", "Dolby Surround EX Mode", OFFSET(dolby_surround_ex_mode), AV_OPT_TYPE_INT, {.i64 = AC3ENC_OPT_NONE }, AC3ENC_OPT_NONE, AC3ENC_OPT_DSUREX_DPLIIZ, AC3ENC_PARAM, "dsurex_mode"},
|
||||
{"notindicated", "Not Indicated (default)", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_NOT_INDICATED }, INT_MIN, INT_MAX, AC3ENC_PARAM, "dsurex_mode"},
|
||||
{"on", "Dolby Surround EX Encoded", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_MODE_ON }, INT_MIN, INT_MAX, AC3ENC_PARAM, "dsurex_mode"},
|
||||
{"off", "Not Dolby Surround EX Encoded", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_MODE_OFF }, INT_MIN, INT_MAX, AC3ENC_PARAM, "dsurex_mode"},
|
||||
{"dpliiz", "Dolby Pro Logic IIz-encoded", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_DSUREX_DPLIIZ }, INT_MIN, INT_MAX, AC3ENC_PARAM, "dsurex_mode"},
|
||||
{"dheadphone_mode", "Dolby Headphone Mode", OFFSET(dolby_headphone_mode), AV_OPT_TYPE_INT, {.i64 = AC3ENC_OPT_NONE }, AC3ENC_OPT_NONE, AC3ENC_OPT_MODE_ON, AC3ENC_PARAM, "dheadphone_mode"},
|
||||
{"notindicated", "Not Indicated (default)", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_NOT_INDICATED }, INT_MIN, INT_MAX, AC3ENC_PARAM, "dheadphone_mode"},
|
||||
{"on", "Dolby Headphone Encoded", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_MODE_ON }, INT_MIN, INT_MAX, AC3ENC_PARAM, "dheadphone_mode"},
|
||||
|
@@ -108,7 +108,7 @@ static void apply_mdct(AC3EncodeContext *s)
|
||||
const SampleType *input_samples = &s->planar_samples[ch][blk * AC3_BLOCK_SIZE];
|
||||
|
||||
#if CONFIG_AC3ENC_FLOAT
|
||||
s->fdsp.vector_fmul(s->windowed_samples, input_samples,
|
||||
s->fdsp->vector_fmul(s->windowed_samples, input_samples,
|
||||
s->mdct_window, AC3_WINDOW_SIZE);
|
||||
#else
|
||||
s->ac3dsp.apply_window_int16(s->windowed_samples, input_samples,
|
||||
@@ -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];
|
||||
@@ -443,7 +443,7 @@ int AC3_NAME(encode_frame)(AVCodecContext *avctx, AVPacket *avpkt,
|
||||
ff_ac3_output_frame(s, avpkt->data);
|
||||
|
||||
if (frame->pts != AV_NOPTS_VALUE)
|
||||
avpkt->pts = frame->pts - ff_samples_to_time_base(avctx, avctx->delay);
|
||||
avpkt->pts = frame->pts - ff_samples_to_time_base(avctx, avctx->initial_padding);
|
||||
|
||||
*got_packet_ptr = 1;
|
||||
return 0;
|
||||
|
@@ -43,14 +43,12 @@ static void adx_encode(ADXContext *c, uint8_t *adx, const int16_t *wav,
|
||||
int s0, s1, s2, d;
|
||||
int max = 0;
|
||||
int min = 0;
|
||||
int data[BLOCK_SAMPLES];
|
||||
|
||||
s1 = prev->s1;
|
||||
s2 = prev->s2;
|
||||
for (i = 0, j = 0; j < 32; i += channels, j++) {
|
||||
s0 = wav[i];
|
||||
d = ((s0 << COEFF_BITS) - c->coeff[0] * s1 - c->coeff[1] * s2) >> COEFF_BITS;
|
||||
data[j] = d;
|
||||
if (max < d)
|
||||
max = d;
|
||||
if (min > d)
|
||||
@@ -58,10 +56,10 @@ static void adx_encode(ADXContext *c, uint8_t *adx, const int16_t *wav,
|
||||
s2 = s1;
|
||||
s1 = s0;
|
||||
}
|
||||
prev->s1 = s1;
|
||||
prev->s2 = s2;
|
||||
|
||||
if (max == 0 && min == 0) {
|
||||
prev->s1 = s1;
|
||||
prev->s2 = s2;
|
||||
memset(adx, 0, BLOCK_SIZE);
|
||||
return;
|
||||
}
|
||||
@@ -77,8 +75,23 @@ static void adx_encode(ADXContext *c, uint8_t *adx, const int16_t *wav,
|
||||
AV_WB16(adx, scale);
|
||||
|
||||
init_put_bits(&pb, adx + 2, 16);
|
||||
for (i = 0; i < BLOCK_SAMPLES; i++)
|
||||
put_sbits(&pb, 4, av_clip(data[i] / scale, -8, 7));
|
||||
|
||||
s1 = prev->s1;
|
||||
s2 = prev->s2;
|
||||
for (i = 0, j = 0; j < 32; i += channels, j++) {
|
||||
d = ((wav[i] << COEFF_BITS) - c->coeff[0] * s1 - c->coeff[1] * s2) >> COEFF_BITS;
|
||||
|
||||
d = av_clip(ROUNDED_DIV(d, scale), -8, 7);
|
||||
|
||||
put_sbits(&pb, 4, d);
|
||||
|
||||
s0 = ((d << COEFF_BITS) * scale + c->coeff[0] * s1 + c->coeff[1] * s2) >> COEFF_BITS;
|
||||
s2 = s1;
|
||||
s1 = s0;
|
||||
}
|
||||
prev->s1 = s1;
|
||||
prev->s2 = s2;
|
||||
|
||||
flush_put_bits(&pb);
|
||||
}
|
||||
|
||||
|
@@ -429,10 +429,9 @@ static void write_element(AlacEncodeContext *s,
|
||||
|
||||
// write extra bits if needed
|
||||
if (s->extra_bits) {
|
||||
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->predictor_buf[j][i] & mask);
|
||||
put_bits(pb, s->extra_bits, s->predictor_buf[j][i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -444,7 +443,7 @@ 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];
|
||||
int32_t *residual = s->predictor_buf[i];
|
||||
for (j = s->frame_size - 1; j > 0; j--)
|
||||
residual[j] -= residual[j - 1];
|
||||
}
|
||||
|
@@ -105,6 +105,7 @@ void avcodec_register_all(void)
|
||||
REGISTER_ENCDEC (AMV, amv);
|
||||
REGISTER_DECODER(ANM, anm);
|
||||
REGISTER_DECODER(ANSI, ansi);
|
||||
REGISTER_DECODER(APNG, apng);
|
||||
REGISTER_ENCDEC (ASV1, asv1);
|
||||
REGISTER_ENCDEC (ASV2, asv2);
|
||||
REGISTER_DECODER(AURA, aura);
|
||||
@@ -490,6 +491,7 @@ void avcodec_register_all(void)
|
||||
REGISTER_DECODER(REALTEXT, realtext);
|
||||
REGISTER_DECODER(SAMI, sami);
|
||||
REGISTER_ENCDEC (SRT, srt);
|
||||
REGISTER_DECODER(STL, stl);
|
||||
REGISTER_ENCDEC (SUBRIP, subrip);
|
||||
REGISTER_DECODER(SUBVIEWER, subviewer);
|
||||
REGISTER_DECODER(SUBVIEWER1, subviewer1);
|
||||
|
@@ -24,14 +24,14 @@
|
||||
#include "asm.h"
|
||||
|
||||
void put_pixels_clamped_mvi_asm(const int16_t *block, uint8_t *pixels,
|
||||
int line_size);
|
||||
ptrdiff_t line_size);
|
||||
void add_pixels_clamped_mvi_asm(const int16_t *block, uint8_t *pixels,
|
||||
int line_size);
|
||||
ptrdiff_t line_size);
|
||||
|
||||
void (*put_pixels_clamped_axp_p)(const int16_t *block, uint8_t *pixels,
|
||||
int line_size);
|
||||
ptrdiff_t line_size);
|
||||
void (*add_pixels_clamped_axp_p)(const int16_t *block, uint8_t *pixels,
|
||||
int line_size);
|
||||
ptrdiff_t line_size);
|
||||
|
||||
#if 0
|
||||
/* These functions were the base for the optimized assembler routines,
|
||||
|
@@ -23,9 +23,9 @@
|
||||
#include <stdint.h>
|
||||
|
||||
extern void (*put_pixels_clamped_axp_p)(const int16_t *block, uint8_t *pixels,
|
||||
int line_size);
|
||||
ptrdiff_t line_size);
|
||||
extern void (*add_pixels_clamped_axp_p)(const int16_t *block, uint8_t *pixels,
|
||||
int line_size);
|
||||
ptrdiff_t line_size);
|
||||
|
||||
void ff_simple_idct_axp(int16_t *block);
|
||||
void ff_simple_idct_put_axp(uint8_t *dest, int line_size, int16_t *block);
|
||||
|
@@ -33,7 +33,7 @@
|
||||
|
||||
/************************************************************************
|
||||
* void put_pixels_clamped_mvi_asm(const int16_t *block, uint8_t *pixels,
|
||||
* int line_size)
|
||||
* ptrdiff_t line_size)
|
||||
*/
|
||||
.align 6
|
||||
.globl put_pixels_clamped_mvi_asm
|
||||
@@ -83,7 +83,7 @@ put_pixels_clamped_mvi_asm:
|
||||
|
||||
/************************************************************************
|
||||
* void add_pixels_clamped_mvi_asm(const int16_t *block, uint8_t *pixels,
|
||||
* int line_size)
|
||||
* ptrdiff_t line_size)
|
||||
*/
|
||||
.align 6
|
||||
.globl add_pixels_clamped_mvi_asm
|
||||
|
@@ -47,8 +47,10 @@ static av_cold int decode_init(AVCodecContext *avctx)
|
||||
return AVERROR(ENOMEM);
|
||||
|
||||
bytestream2_init(&s->gb, avctx->extradata, avctx->extradata_size);
|
||||
if (bytestream2_get_bytes_left(&s->gb) < 16 * 8 + 4 * 256)
|
||||
if (bytestream2_get_bytes_left(&s->gb) < 16 * 8 + 4 * 256) {
|
||||
av_frame_free(&s->frame);
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
bytestream2_skipu(&s->gb, 16 * 8);
|
||||
for (i = 0; i < 256; i++)
|
||||
|
@@ -90,9 +90,11 @@ static av_cold int decode_init(AVCodecContext *avctx)
|
||||
s->fg = DEFAULT_FG_COLOR;
|
||||
s->bg = DEFAULT_BG_COLOR;
|
||||
|
||||
if (!avctx->width || !avctx->height)
|
||||
ff_set_dimensions(avctx, 80 << 3, 25 << 4);
|
||||
|
||||
if (!avctx->width || !avctx->height) {
|
||||
int ret = ff_set_dimensions(avctx, 80 << 3, 25 << 4);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
41
libavcodec/apng.h
Normal file
41
libavcodec/apng.h
Normal file
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
* APNG common header
|
||||
* Copyright (c) 2014 Benoit Fouet
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file
|
||||
* APNG common header
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_APNG_H
|
||||
#define AVCODEC_APNG_H
|
||||
|
||||
enum {
|
||||
APNG_DISPOSE_OP_NONE = 0,
|
||||
APNG_DISPOSE_OP_BACKGROUND = 1,
|
||||
APNG_DISPOSE_OP_PREVIOUS = 2,
|
||||
};
|
||||
|
||||
enum {
|
||||
APNG_BLEND_OP_SOURCE = 0,
|
||||
APNG_BLEND_OP_OVER = 1,
|
||||
};
|
||||
|
||||
#endif /* AVCODEC_APNG_H */
|
@@ -24,7 +24,7 @@
|
||||
void ff_flac_lpc_16_arm(int32_t *samples, const int coeffs[32], int order,
|
||||
int qlevel, int len);
|
||||
|
||||
av_cold void ff_flacdsp_init_arm(FLACDSPContext *c, enum AVSampleFormat fmt,
|
||||
av_cold void ff_flacdsp_init_arm(FLACDSPContext *c, enum AVSampleFormat fmt, int channels,
|
||||
int bps)
|
||||
{
|
||||
if (bps <= 16 && CONFIG_FLAC_DECODER)
|
||||
|
@@ -107,8 +107,10 @@ av_cold void ff_h264dsp_init_arm(H264DSPContext *c, const int bit_depth,
|
||||
{
|
||||
int cpu_flags = av_get_cpu_flags();
|
||||
|
||||
#if HAVE_ARMV6
|
||||
if (have_setend(cpu_flags))
|
||||
c->startcode_find_candidate = ff_startcode_find_candidate_armv6;
|
||||
#endif
|
||||
if (have_neon(cpu_flags))
|
||||
h264dsp_init_neon(c, bit_depth, chroma_format_idc);
|
||||
}
|
||||
|
@@ -22,7 +22,7 @@
|
||||
#include "config.h"
|
||||
#include "libavutil/arm/asm.S"
|
||||
|
||||
@ void ff_add_pixels_clamped_arm(int16_t *block, uint8_t *dest, int stride)
|
||||
@ void ff_add_pixels_clamped_arm(int16_t *block, uint8_t *dest, ptrdiff_t stride)
|
||||
function ff_add_pixels_clamped_arm, export=1, align=5
|
||||
push {r4-r10}
|
||||
mov r10, #8
|
||||
|
@@ -30,7 +30,7 @@
|
||||
#include "idctdsp_arm.h"
|
||||
|
||||
void ff_add_pixels_clamped_arm(const int16_t *block, uint8_t *dest,
|
||||
int line_size);
|
||||
ptrdiff_t line_size);
|
||||
|
||||
/* XXX: those functions should be suppressed ASAP when all IDCTs are
|
||||
* converted */
|
||||
|
@@ -27,7 +27,7 @@
|
||||
#include "idctdsp_arm.h"
|
||||
|
||||
void ff_add_pixels_clamped_armv6(const int16_t *block, uint8_t *pixels,
|
||||
int line_size);
|
||||
ptrdiff_t line_size);
|
||||
|
||||
av_cold void ff_idctdsp_init_armv6(IDCTDSPContext *c, AVCodecContext *avctx,
|
||||
unsigned high_bit_depth)
|
||||
|
@@ -27,9 +27,9 @@
|
||||
#include "idct.h"
|
||||
#include "idctdsp_arm.h"
|
||||
|
||||
void ff_add_pixels_clamped_neon(const int16_t *, uint8_t *, int);
|
||||
void ff_put_pixels_clamped_neon(const int16_t *, uint8_t *, int);
|
||||
void ff_put_signed_pixels_clamped_neon(const int16_t *, uint8_t *, int);
|
||||
void ff_add_pixels_clamped_neon(const int16_t *, uint8_t *, ptrdiff_t);
|
||||
void ff_put_pixels_clamped_neon(const int16_t *, uint8_t *, ptrdiff_t);
|
||||
void ff_put_signed_pixels_clamped_neon(const int16_t *, uint8_t *, ptrdiff_t);
|
||||
|
||||
av_cold void ff_idctdsp_init_neon(IDCTDSPContext *c, AVCodecContext *avctx,
|
||||
unsigned high_bit_depth)
|
||||
|
@@ -26,17 +26,17 @@
|
||||
#include "libavcodec/mpegvideo.h"
|
||||
|
||||
int ff_pix_abs16_armv6(MpegEncContext *s, uint8_t *blk1, uint8_t *blk2,
|
||||
int line_size, int h);
|
||||
ptrdiff_t stride, int h);
|
||||
int ff_pix_abs16_x2_armv6(MpegEncContext *s, uint8_t *blk1, uint8_t *blk2,
|
||||
int line_size, int h);
|
||||
ptrdiff_t stride, int h);
|
||||
int ff_pix_abs16_y2_armv6(MpegEncContext *s, uint8_t *blk1, uint8_t *blk2,
|
||||
int line_size, int h);
|
||||
ptrdiff_t stride, int h);
|
||||
|
||||
int ff_pix_abs8_armv6(MpegEncContext *s, uint8_t *blk1, uint8_t *blk2,
|
||||
int line_size, int h);
|
||||
ptrdiff_t stride, int h);
|
||||
|
||||
int ff_sse16_armv6(MpegEncContext *s, uint8_t *blk1, uint8_t *blk2,
|
||||
int line_size, int h);
|
||||
ptrdiff_t stride, int h);
|
||||
|
||||
av_cold void ff_me_cmp_init_arm(MECmpContext *c, AVCodecContext *avctx)
|
||||
{
|
||||
|
@@ -28,8 +28,10 @@ av_cold void ff_vc1dsp_init_arm(VC1DSPContext *dsp)
|
||||
{
|
||||
int cpu_flags = av_get_cpu_flags();
|
||||
|
||||
#if HAVE_ARMV6
|
||||
if (have_setend(cpu_flags))
|
||||
dsp->startcode_find_candidate = ff_startcode_find_candidate_armv6;
|
||||
#endif
|
||||
if (have_neon(cpu_flags))
|
||||
ff_vc1dsp_init_neon(dsp);
|
||||
}
|
||||
|
@@ -23,9 +23,10 @@
|
||||
#include "libavutil/arm/asm.S"
|
||||
|
||||
function ff_prefetch_arm, export=1
|
||||
1:
|
||||
subs r2, r2, #1
|
||||
pld [r0]
|
||||
add r0, r0, r1
|
||||
bne X(ff_prefetch_arm)
|
||||
bne 1b
|
||||
bx lr
|
||||
endfunc
|
||||
|
@@ -34,16 +34,39 @@ int ff_ass_subtitle_header(AVCodecContext *avctx,
|
||||
{
|
||||
avctx->subtitle_header = av_asprintf(
|
||||
"[Script Info]\r\n"
|
||||
"; Script generated by FFmpeg/Lavc%s\r\n"
|
||||
"ScriptType: v4.00+\r\n"
|
||||
"PlayResX: 384\r\n"
|
||||
"PlayResY: 288\r\n"
|
||||
"\r\n"
|
||||
"[V4+ Styles]\r\n"
|
||||
"Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, AlphaLevel, Encoding\r\n"
|
||||
"Style: Default,%s,%d,&H%x,&H%x,&H%x,&H%x,%d,%d,%d,1,1,0,%d,10,10,10,0,0\r\n"
|
||||
|
||||
/* ASSv4 header */
|
||||
"Format: Name, "
|
||||
"Fontname, Fontsize, "
|
||||
"PrimaryColour, SecondaryColour, OutlineColour, BackColour, "
|
||||
"Bold, Italic, Underline, StrikeOut, "
|
||||
"ScaleX, ScaleY, "
|
||||
"Spacing, Angle, "
|
||||
"BorderStyle, Outline, Shadow, "
|
||||
"Alignment, MarginL, MarginR, MarginV, "
|
||||
"Encoding\r\n"
|
||||
|
||||
"Style: "
|
||||
"Default," /* Name */
|
||||
"%s,%d," /* Font{name,size} */
|
||||
"&H%x,&H%x,&H%x,&H%x," /* {Primary,Secondary,Outline,Back}Colour */
|
||||
"%d,%d,%d,0," /* Bold, Italic, Underline, StrikeOut */
|
||||
"100,100," /* Scale{X,Y} */
|
||||
"0,0," /* Spacing, Angle */
|
||||
"1,1,0," /* BorderStyle, Outline, Shadow */
|
||||
"%d,10,10,10," /* Alignment, Margin[LRV] */
|
||||
"0\r\n" /* Encoding */
|
||||
|
||||
"\r\n"
|
||||
"[Events]\r\n"
|
||||
"Format: Layer, Start, End, Style, Text\r\n",
|
||||
"Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text\r\n",
|
||||
!(avctx->flags & CODEC_FLAG_BITEXACT) ? AV_STRINGIFY(LIBAVCODEC_VERSION) : "",
|
||||
font, font_size, color, color, back_color, back_color,
|
||||
-bold, -italic, -underline, alignment);
|
||||
|
||||
@@ -104,7 +127,7 @@ int ff_ass_bprint_dialog(AVBPrint *buf, const char *dialog,
|
||||
insert_ts(buf, ts_start);
|
||||
insert_ts(buf, duration == -1 ? -1 : ts_start + duration);
|
||||
if (raw != 2)
|
||||
av_bprintf(buf, "Default,");
|
||||
av_bprintf(buf, "Default,,0,0,0,,");
|
||||
}
|
||||
|
||||
dlen = strcspn(dialog, "\n");
|
||||
@@ -151,6 +174,15 @@ err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ff_ass_add_rect_bprint(AVSubtitle *sub, AVBPrint *buf,
|
||||
int ts_start, int duration)
|
||||
{
|
||||
av_bprintf(buf, "\r\n");
|
||||
if (!av_bprint_is_complete(buf))
|
||||
return AVERROR(ENOMEM);
|
||||
return ff_ass_add_rect(sub, buf->str, ts_start, duration, 0);
|
||||
}
|
||||
|
||||
void ff_ass_bprint_text_event(AVBPrint *buf, const char *p, int size,
|
||||
const char *linebreaks, int keep_ass_markup)
|
||||
{
|
||||
@@ -187,5 +219,4 @@ void ff_ass_bprint_text_event(AVBPrint *buf, const char *p, int size,
|
||||
av_bprint_chars(buf, *p, 1);
|
||||
}
|
||||
}
|
||||
av_bprintf(buf, "\r\n");
|
||||
}
|
||||
|
@@ -91,6 +91,13 @@ int ff_ass_subtitle_header_default(AVCodecContext *avctx);
|
||||
int ff_ass_add_rect(AVSubtitle *sub, const char *dialog,
|
||||
int ts_start, int duration, int raw);
|
||||
|
||||
/**
|
||||
* Same as ff_ass_add_rect_bprint, but taking an AVBPrint buffer instead of a
|
||||
* string, and assuming raw=0.
|
||||
*/
|
||||
int ff_ass_add_rect_bprint(AVSubtitle *sub, AVBPrint *buf,
|
||||
int ts_start, int duration);
|
||||
|
||||
/**
|
||||
* Add an ASS dialog line to an AVBPrint buffer.
|
||||
*
|
||||
|
@@ -44,7 +44,7 @@ typedef struct {
|
||||
int size;
|
||||
int offset;
|
||||
int offset_count;
|
||||
ASSFields fields[10];
|
||||
ASSFields fields[24];
|
||||
} ASSSection;
|
||||
|
||||
static const ASSSection ass_sections[] = {
|
||||
@@ -64,15 +64,29 @@ static const ASSSection ass_sections[] = {
|
||||
.size = sizeof(ASSStyle),
|
||||
.offset = offsetof(ASS, styles),
|
||||
.offset_count = offsetof(ASS, styles_count),
|
||||
.fields = {{"Name", ASS_STR, offsetof(ASSStyle, name) },
|
||||
{"Fontname", ASS_STR, offsetof(ASSStyle, font_name) },
|
||||
{"Fontsize", ASS_INT, offsetof(ASSStyle, font_size) },
|
||||
{"PrimaryColour",ASS_COLOR,offsetof(ASSStyle, primary_color)},
|
||||
{"BackColour", ASS_COLOR,offsetof(ASSStyle, back_color) },
|
||||
{"Bold", ASS_INT, offsetof(ASSStyle, bold) },
|
||||
{"Italic", ASS_INT, offsetof(ASSStyle, italic) },
|
||||
{"Underline", ASS_INT, offsetof(ASSStyle, underline) },
|
||||
{"Alignment", ASS_INT, offsetof(ASSStyle, alignment) },
|
||||
.fields = {{"Name", ASS_STR, offsetof(ASSStyle, name) },
|
||||
{"Fontname", ASS_STR, offsetof(ASSStyle, font_name) },
|
||||
{"Fontsize", ASS_INT, offsetof(ASSStyle, font_size) },
|
||||
{"PrimaryColour", ASS_COLOR, offsetof(ASSStyle, primary_color) },
|
||||
{"SecondaryColour", ASS_COLOR, offsetof(ASSStyle, secondary_color)},
|
||||
{"OutlineColour", ASS_COLOR, offsetof(ASSStyle, outline_color) },
|
||||
{"BackColour", ASS_COLOR, offsetof(ASSStyle, back_color) },
|
||||
{"Bold", ASS_INT, offsetof(ASSStyle, bold) },
|
||||
{"Italic", ASS_INT, offsetof(ASSStyle, italic) },
|
||||
{"Underline", ASS_INT, offsetof(ASSStyle, underline) },
|
||||
{"StrikeOut", ASS_INT, offsetof(ASSStyle, strikeout) },
|
||||
{"ScaleX", ASS_FLT, offsetof(ASSStyle, scalex) },
|
||||
{"ScaleY", ASS_FLT, offsetof(ASSStyle, scaley) },
|
||||
{"Spacing", ASS_FLT, offsetof(ASSStyle, spacing) },
|
||||
{"Angle", ASS_FLT, offsetof(ASSStyle, angle) },
|
||||
{"BorderStyle", ASS_INT, offsetof(ASSStyle, border_style) },
|
||||
{"Outline", ASS_FLT, offsetof(ASSStyle, outline) },
|
||||
{"Shadow", ASS_FLT, offsetof(ASSStyle, shadow) },
|
||||
{"Alignment", ASS_INT, offsetof(ASSStyle, alignment) },
|
||||
{"MarginL", ASS_INT, offsetof(ASSStyle, margin_l) },
|
||||
{"MarginR", ASS_INT, offsetof(ASSStyle, margin_r) },
|
||||
{"MarginV", ASS_INT, offsetof(ASSStyle, margin_v) },
|
||||
{"Encoding", ASS_INT, offsetof(ASSStyle, encoding) },
|
||||
{0},
|
||||
}
|
||||
},
|
||||
@@ -82,14 +96,24 @@ static const ASSSection ass_sections[] = {
|
||||
.size = sizeof(ASSStyle),
|
||||
.offset = offsetof(ASS, styles),
|
||||
.offset_count = offsetof(ASS, styles_count),
|
||||
.fields = {{"Name", ASS_STR, offsetof(ASSStyle, name) },
|
||||
{"Fontname", ASS_STR, offsetof(ASSStyle, font_name) },
|
||||
{"Fontsize", ASS_INT, offsetof(ASSStyle, font_size) },
|
||||
{"PrimaryColour",ASS_COLOR,offsetof(ASSStyle, primary_color)},
|
||||
{"BackColour", ASS_COLOR,offsetof(ASSStyle, back_color) },
|
||||
{"Bold", ASS_INT, offsetof(ASSStyle, bold) },
|
||||
{"Italic", ASS_INT, offsetof(ASSStyle, italic) },
|
||||
{"Alignment", ASS_ALGN, offsetof(ASSStyle, alignment) },
|
||||
.fields = {{"Name", ASS_STR, offsetof(ASSStyle, name) },
|
||||
{"Fontname", ASS_STR, offsetof(ASSStyle, font_name) },
|
||||
{"Fontsize", ASS_INT, offsetof(ASSStyle, font_size) },
|
||||
{"PrimaryColour", ASS_COLOR, offsetof(ASSStyle, primary_color) },
|
||||
{"SecondaryColour", ASS_COLOR, offsetof(ASSStyle, secondary_color)},
|
||||
{"TertiaryColour", ASS_COLOR, offsetof(ASSStyle, outline_color) },
|
||||
{"BackColour", ASS_COLOR, offsetof(ASSStyle, back_color) },
|
||||
{"Bold", ASS_INT, offsetof(ASSStyle, bold) },
|
||||
{"Italic", ASS_INT, offsetof(ASSStyle, italic) },
|
||||
{"BorderStyle", ASS_INT, offsetof(ASSStyle, border_style) },
|
||||
{"Outline", ASS_FLT, offsetof(ASSStyle, outline) },
|
||||
{"Shadow", ASS_FLT, offsetof(ASSStyle, shadow) },
|
||||
{"Alignment", ASS_ALGN, offsetof(ASSStyle, alignment) },
|
||||
{"MarginL", ASS_INT, offsetof(ASSStyle, margin_l) },
|
||||
{"MarginR", ASS_INT, offsetof(ASSStyle, margin_r) },
|
||||
{"MarginV", ASS_INT, offsetof(ASSStyle, margin_v) },
|
||||
{"AlphaLevel", ASS_INT, offsetof(ASSStyle, alpha_level) },
|
||||
{"Encoding", ASS_INT, offsetof(ASSStyle, encoding) },
|
||||
{0},
|
||||
}
|
||||
},
|
||||
@@ -99,11 +123,16 @@ static const ASSSection ass_sections[] = {
|
||||
.size = sizeof(ASSDialog),
|
||||
.offset = offsetof(ASS, dialogs),
|
||||
.offset_count = offsetof(ASS, dialogs_count),
|
||||
.fields = {{"Layer", ASS_INT, offsetof(ASSDialog, layer) },
|
||||
{"Start", ASS_TIMESTAMP, offsetof(ASSDialog, start) },
|
||||
{"End", ASS_TIMESTAMP, offsetof(ASSDialog, end) },
|
||||
{"Style", ASS_STR, offsetof(ASSDialog, style) },
|
||||
{"Text", ASS_STR, offsetof(ASSDialog, text) },
|
||||
.fields = {{"Layer", ASS_INT, offsetof(ASSDialog, layer) },
|
||||
{"Start", ASS_TIMESTAMP, offsetof(ASSDialog, start) },
|
||||
{"End", ASS_TIMESTAMP, offsetof(ASSDialog, end) },
|
||||
{"Style", ASS_STR, offsetof(ASSDialog, style) },
|
||||
{"Name", ASS_STR, offsetof(ASSDialog, name) },
|
||||
{"MarginL", ASS_INT, offsetof(ASSDialog, margin_l)},
|
||||
{"MarginR", ASS_INT, offsetof(ASSDialog, margin_r)},
|
||||
{"MarginV", ASS_INT, offsetof(ASSDialog, margin_v)},
|
||||
{"Effect", ASS_STR, offsetof(ASSDialog, effect) },
|
||||
{"Text", ASS_STR, offsetof(ASSDialog, text) },
|
||||
{0},
|
||||
}
|
||||
},
|
||||
@@ -200,6 +229,20 @@ static inline const char *skip_space(const char *buf)
|
||||
return buf;
|
||||
}
|
||||
|
||||
static int *get_default_field_orders(const ASSSection *section)
|
||||
{
|
||||
int i;
|
||||
int *order = av_malloc(FF_ARRAY_ELEMS(section->fields) * sizeof(*order));
|
||||
|
||||
if (!order)
|
||||
return NULL;
|
||||
for (i = 0; section->fields[i].name; i++)
|
||||
order[i] = i;
|
||||
while (i < FF_ARRAY_ELEMS(section->fields))
|
||||
order[i] = -1;
|
||||
return order;
|
||||
}
|
||||
|
||||
static const char *ass_split_section(ASSSplitContext *ctx, const char *buf)
|
||||
{
|
||||
const ASSSection *section = &ass_sections[ctx->current_section];
|
||||
@@ -217,7 +260,7 @@ static const char *ass_split_section(ASSSplitContext *ctx, const char *buf)
|
||||
} else if (section->format_header && !order) {
|
||||
len = strlen(section->format_header);
|
||||
if (strncmp(buf, section->format_header, len) || buf[len] != ':')
|
||||
return NULL;
|
||||
goto next_line;
|
||||
buf += len + 1;
|
||||
while (!is_eol(*buf)) {
|
||||
buf = skip_space(buf);
|
||||
@@ -240,6 +283,15 @@ static const char *ass_split_section(ASSSplitContext *ctx, const char *buf)
|
||||
if (!strncmp(buf, section->fields_header, len) && buf[len] == ':') {
|
||||
uint8_t *ptr, *struct_ptr = realloc_section_array(ctx);
|
||||
if (!struct_ptr) return NULL;
|
||||
|
||||
/* No format header line found so far, assume default */
|
||||
if (!order) {
|
||||
order = get_default_field_orders(section);
|
||||
if (!order)
|
||||
return NULL;
|
||||
ctx->field_order[ctx->current_section] = order;
|
||||
}
|
||||
|
||||
buf += len + 1;
|
||||
for (i=0; !is_eol(*buf) && i < *number; i++) {
|
||||
int last = i == *number - 1;
|
||||
@@ -269,6 +321,7 @@ static const char *ass_split_section(ASSSplitContext *ctx, const char *buf)
|
||||
}
|
||||
}
|
||||
}
|
||||
next_line:
|
||||
buf += strcspn(buf, "\n");
|
||||
buf += !!*buf;
|
||||
}
|
||||
|
@@ -41,13 +41,28 @@ typedef struct {
|
||||
char *font_name; /**< font face (case sensitive) */
|
||||
int font_size; /**< font height */
|
||||
int primary_color; /**< color that a subtitle will normally appear in */
|
||||
int secondary_color;
|
||||
int outline_color; /**< color for outline in ASS, called tertiary in SSA */
|
||||
int back_color; /**< color of the subtitle outline or shadow */
|
||||
int bold; /**< whether text is bold (1) or not (0) */
|
||||
int italic; /**< whether text is italic (1) or not (0) */
|
||||
int underline; /**< whether text is underlined (1) or not (0) */
|
||||
int strikeout;
|
||||
float scalex;
|
||||
float scaley;
|
||||
float spacing;
|
||||
float angle;
|
||||
int border_style;
|
||||
float outline;
|
||||
float shadow;
|
||||
int alignment; /**< position of the text (left, center, top...),
|
||||
defined after the layout of the numpad
|
||||
(1-3 sub, 4-6 mid, 7-9 top) */
|
||||
int margin_l;
|
||||
int margin_r;
|
||||
int margin_v;
|
||||
int alpha_level;
|
||||
int encoding;
|
||||
} ASSStyle;
|
||||
|
||||
/**
|
||||
@@ -58,6 +73,11 @@ typedef struct {
|
||||
int start; /**< start time of the dialog in centiseconds */
|
||||
int end; /**< end time of the dialog in centiseconds */
|
||||
char *style; /**< name of the ASSStyle to use with this dialog */
|
||||
char *name;
|
||||
int margin_l;
|
||||
int margin_r;
|
||||
int margin_v;
|
||||
char *effect;
|
||||
char *text; /**< actual text which will be displayed as a subtitle,
|
||||
can include style override control codes (see
|
||||
ff_ass_split_override_codes()) */
|
||||
|
@@ -26,8 +26,10 @@
|
||||
#include "libavutil/attributes.h"
|
||||
#include "libavutil/mem.h"
|
||||
|
||||
#include "aandcttab.h"
|
||||
#include "asv.h"
|
||||
#include "avcodec.h"
|
||||
#include "dct.h"
|
||||
#include "fdctdsp.h"
|
||||
#include "internal.h"
|
||||
#include "mathops.h"
|
||||
@@ -50,7 +52,7 @@ static inline void asv1_put_level(PutBitContext *pb, int level)
|
||||
}
|
||||
}
|
||||
|
||||
static inline void asv2_put_level(PutBitContext *pb, int level)
|
||||
static inline void asv2_put_level(ASV1Context *a, PutBitContext *pb, int level)
|
||||
{
|
||||
unsigned int index = level + 31;
|
||||
|
||||
@@ -58,6 +60,10 @@ static inline void asv2_put_level(PutBitContext *pb, int level)
|
||||
put_bits(pb, ff_asv2_level_tab[index][1], ff_asv2_level_tab[index][0]);
|
||||
} else {
|
||||
put_bits(pb, ff_asv2_level_tab[31][1], ff_asv2_level_tab[31][0]);
|
||||
if (level < -128 || level > 127) {
|
||||
av_log(a->avctx, AV_LOG_WARNING, "Cliping level %d, increase qscale\n", level);
|
||||
level = av_clip_int8(level);
|
||||
}
|
||||
asv2_put_bits(pb, 8, level & 0xFF);
|
||||
}
|
||||
}
|
||||
@@ -150,13 +156,13 @@ static inline void asv2_encode_block(ASV1Context *a, int16_t block[64])
|
||||
|
||||
if (ccp) {
|
||||
if (ccp & 8)
|
||||
asv2_put_level(&a->pb, block[index + 0]);
|
||||
asv2_put_level(a, &a->pb, block[index + 0]);
|
||||
if (ccp & 4)
|
||||
asv2_put_level(&a->pb, block[index + 8]);
|
||||
asv2_put_level(a, &a->pb, block[index + 8]);
|
||||
if (ccp & 2)
|
||||
asv2_put_level(&a->pb, block[index + 1]);
|
||||
asv2_put_level(a, &a->pb, block[index + 1]);
|
||||
if (ccp & 1)
|
||||
asv2_put_level(&a->pb, block[index + 9]);
|
||||
asv2_put_level(a, &a->pb, block[index + 9]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -331,8 +337,13 @@ static av_cold int encode_init(AVCodecContext *avctx)
|
||||
((uint32_t *) avctx->extradata)[1] = av_le2ne32(AV_RL32("ASUS"));
|
||||
|
||||
for (i = 0; i < 64; i++) {
|
||||
int q = 32 * scale * ff_mpeg1_default_intra_matrix[i];
|
||||
a->q_intra_matrix[i] = ((a->inv_qscale << 16) + q / 2) / q;
|
||||
if (a->fdsp.fdct == ff_fdct_ifast) {
|
||||
int q = 32LL * scale * ff_mpeg1_default_intra_matrix[i] * ff_aanscales[i];
|
||||
a->q_intra_matrix[i] = (((int64_t)a->inv_qscale << 30) + q / 2) / q;
|
||||
} else {
|
||||
int q = 32 * scale * ff_mpeg1_default_intra_matrix[i];
|
||||
a->q_intra_matrix[i] = ((a->inv_qscale << 16) + q / 2) / q;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@@ -80,7 +80,7 @@ typedef struct {
|
||||
DECLARE_ALIGNED(32, float, high)[512];
|
||||
float* bands[3];
|
||||
FFTContext mdct_ctx[3];
|
||||
AVFloatDSPContext fdsp;
|
||||
AVFloatDSPContext *fdsp;
|
||||
} AT1Ctx;
|
||||
|
||||
/** size of the transform in samples in the long mode for each QMF band */
|
||||
@@ -140,7 +140,7 @@ static int at1_imdct_block(AT1SUCtx* su, AT1Ctx *q)
|
||||
at1_imdct(q, &q->spec[pos], &su->spectrum[0][ref_pos + start_pos], nbits, band_num);
|
||||
|
||||
/* overlap and window */
|
||||
q->fdsp.vector_fmul_window(&q->bands[band_num][start_pos], prev_buf,
|
||||
q->fdsp->vector_fmul_window(&q->bands[band_num][start_pos], prev_buf,
|
||||
&su->spectrum[0][ref_pos + start_pos], ff_sine_32, 16);
|
||||
|
||||
prev_buf = &su->spectrum[0][ref_pos+start_pos + 16];
|
||||
@@ -324,6 +324,8 @@ static av_cold int atrac1_decode_end(AVCodecContext * avctx)
|
||||
ff_mdct_end(&q->mdct_ctx[1]);
|
||||
ff_mdct_end(&q->mdct_ctx[2]);
|
||||
|
||||
av_freep(&q->fdsp);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -359,7 +361,7 @@ static av_cold int atrac1_decode_init(AVCodecContext *avctx)
|
||||
|
||||
ff_atrac_generate_tables();
|
||||
|
||||
avpriv_float_dsp_init(&q->fdsp, avctx->flags & CODEC_FLAG_BITEXACT);
|
||||
q->fdsp = avpriv_float_dsp_alloc(avctx->flags & CODEC_FLAG_BITEXACT);
|
||||
|
||||
q->bands[0] = q->low;
|
||||
q->bands[1] = q->mid;
|
||||
|
@@ -109,7 +109,7 @@ typedef struct ATRAC3Context {
|
||||
AtracGCContext gainc_ctx;
|
||||
FFTContext mdct_ctx;
|
||||
FmtConvertContext fmt_conv;
|
||||
AVFloatDSPContext fdsp;
|
||||
AVFloatDSPContext *fdsp;
|
||||
} ATRAC3Context;
|
||||
|
||||
static DECLARE_ALIGNED(32, float, mdct_window)[MDCT_SIZE];
|
||||
@@ -142,7 +142,7 @@ static void imlt(ATRAC3Context *q, float *input, float *output, int odd_band)
|
||||
q->mdct_ctx.imdct_calc(&q->mdct_ctx, output, input);
|
||||
|
||||
/* Perform windowing on the output. */
|
||||
q->fdsp.vector_fmul(output, output, mdct_window, MDCT_SIZE);
|
||||
q->fdsp->vector_fmul(output, output, mdct_window, MDCT_SIZE);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -190,8 +190,9 @@ static av_cold int atrac3_decode_close(AVCodecContext *avctx)
|
||||
{
|
||||
ATRAC3Context *q = avctx->priv_data;
|
||||
|
||||
av_free(q->units);
|
||||
av_free(q->decoded_bytes_buffer);
|
||||
av_freep(&q->units);
|
||||
av_freep(&q->decoded_bytes_buffer);
|
||||
av_freep(&q->fdsp);
|
||||
|
||||
ff_mdct_end(&q->mdct_ctx);
|
||||
|
||||
@@ -915,11 +916,11 @@ static av_cold int atrac3_decode_init(AVCodecContext *avctx)
|
||||
}
|
||||
|
||||
ff_atrac_init_gain_compensation(&q->gainc_ctx, 4, 3);
|
||||
avpriv_float_dsp_init(&q->fdsp, avctx->flags & CODEC_FLAG_BITEXACT);
|
||||
q->fdsp = avpriv_float_dsp_alloc(avctx->flags & CODEC_FLAG_BITEXACT);
|
||||
ff_fmt_convert_init(&q->fmt_conv, avctx);
|
||||
|
||||
q->units = av_mallocz_array(avctx->channels, sizeof(*q->units));
|
||||
if (!q->units) {
|
||||
if (!q->units || !q->fdsp) {
|
||||
atrac3_decode_close(avctx);
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
|
@@ -1575,7 +1575,7 @@ static void decode_tones_amplitude(GetBitContext *gb, Atrac3pChanUnitCtx *ctx,
|
||||
{
|
||||
int mode, sb, j, i, diff, maxdiff, fi, delta, pred;
|
||||
Atrac3pWaveParam *wsrc, *wref;
|
||||
int refwaves[48];
|
||||
int refwaves[48] = { 0 };
|
||||
Atrac3pWavesData *dst = ctx->channels[ch_num].tones_info;
|
||||
Atrac3pWavesData *ref = ctx->channels[0].tones_info;
|
||||
|
||||
|
@@ -47,7 +47,7 @@
|
||||
|
||||
typedef struct ATRAC3PContext {
|
||||
GetBitContext gb;
|
||||
AVFloatDSPContext fdsp;
|
||||
AVFloatDSPContext *fdsp;
|
||||
|
||||
DECLARE_ALIGNED(32, float, samples)[2][ATRAC3P_FRAME_SAMPLES]; ///< quantized MDCT spectrum
|
||||
DECLARE_ALIGNED(32, float, mdct_buf)[2][ATRAC3P_FRAME_SAMPLES]; ///< output of the IMDCT
|
||||
@@ -67,7 +67,10 @@ typedef struct ATRAC3PContext {
|
||||
|
||||
static av_cold int atrac3p_decode_close(AVCodecContext *avctx)
|
||||
{
|
||||
av_free(((ATRAC3PContext *)(avctx->priv_data))->ch_units);
|
||||
ATRAC3PContext *ctx = avctx->priv_data;
|
||||
|
||||
av_freep(&ctx->ch_units);
|
||||
av_freep(&ctx->fdsp);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -150,8 +153,6 @@ static av_cold int atrac3p_decode_init(AVCodecContext *avctx)
|
||||
|
||||
ff_atrac3p_init_vlcs();
|
||||
|
||||
avpriv_float_dsp_init(&ctx->fdsp, avctx->flags & CODEC_FLAG_BITEXACT);
|
||||
|
||||
/* initialize IPQF */
|
||||
ff_mdct_init(&ctx->ipqf_dct_ctx, 5, 1, 32.0 / 32768.0);
|
||||
|
||||
@@ -167,8 +168,9 @@ static av_cold int atrac3p_decode_init(AVCodecContext *avctx)
|
||||
ctx->my_channel_layout = avctx->channel_layout;
|
||||
|
||||
ctx->ch_units = av_mallocz_array(ctx->num_channel_blocks, sizeof(*ctx->ch_units));
|
||||
ctx->fdsp = avpriv_float_dsp_alloc(avctx->flags & CODEC_FLAG_BITEXACT);
|
||||
|
||||
if (!ctx->ch_units) {
|
||||
if (!ctx->ch_units || !ctx->fdsp) {
|
||||
atrac3p_decode_close(avctx);
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
@@ -265,7 +267,7 @@ static void reconstruct_frame(ATRAC3PContext *ctx, Atrac3pChanUnitCtx *ch_unit,
|
||||
for (ch = 0; ch < num_channels; ch++) {
|
||||
for (sb = 0; sb < ch_unit->num_subbands; sb++) {
|
||||
/* inverse transform and windowing */
|
||||
ff_atrac3p_imdct(&ctx->fdsp, &ctx->mdct_ctx,
|
||||
ff_atrac3p_imdct(ctx->fdsp, &ctx->mdct_ctx,
|
||||
&ctx->samples[ch][sb * ATRAC3P_SUBBAND_SAMPLES],
|
||||
&ctx->mdct_buf[ch][sb * ATRAC3P_SUBBAND_SAMPLES],
|
||||
(ch_unit->channels[ch].wnd_shape_prev[sb] << 1) +
|
||||
@@ -299,7 +301,7 @@ static void reconstruct_frame(ATRAC3PContext *ctx, Atrac3pChanUnitCtx *ch_unit,
|
||||
for (sb = 0; sb < ch_unit->num_subbands; sb++)
|
||||
if (ch_unit->channels[ch].tones_info[sb].num_wavs ||
|
||||
ch_unit->channels[ch].tones_info_prev[sb].num_wavs) {
|
||||
ff_atrac3p_generate_tones(ch_unit, &ctx->fdsp, ch, sb,
|
||||
ff_atrac3p_generate_tones(ch_unit, ctx->fdsp, ch, sb,
|
||||
&ctx->time_buf[ch][sb * 128]);
|
||||
}
|
||||
}
|
||||
|
@@ -28,8 +28,8 @@
|
||||
av_cold void ff_af_queue_init(AVCodecContext *avctx, AudioFrameQueue *afq)
|
||||
{
|
||||
afq->avctx = avctx;
|
||||
afq->remaining_delay = avctx->delay;
|
||||
afq->remaining_samples = avctx->delay;
|
||||
afq->remaining_delay = avctx->initial_padding;
|
||||
afq->remaining_samples = avctx->initial_padding;
|
||||
afq->frame_count = 0;
|
||||
}
|
||||
|
||||
|
@@ -42,11 +42,6 @@
|
||||
|
||||
#include "version.h"
|
||||
|
||||
#if FF_API_FAST_MALLOC
|
||||
// to provide fast_*alloc
|
||||
#include "libavutil/mem.h"
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @defgroup libavc Encoding/Decoding Library
|
||||
* @{
|
||||
@@ -324,6 +319,7 @@ enum AVCodecID {
|
||||
AV_CODEC_ID_HEVC = MKBETAG('H','2','6','5'),
|
||||
#define AV_CODEC_ID_H265 AV_CODEC_ID_HEVC
|
||||
AV_CODEC_ID_VP7 = MKBETAG('V','P','7','0'),
|
||||
AV_CODEC_ID_APNG = MKBETAG('A','P','N','G'),
|
||||
|
||||
/* various PCM "codecs" */
|
||||
AV_CODEC_ID_FIRST_AUDIO = 0x10000, ///< A dummy id pointing at the start of audio codecs
|
||||
@@ -514,6 +510,7 @@ enum AVCodecID {
|
||||
AV_CODEC_ID_JACOSUB = MKBETAG('J','S','U','B'),
|
||||
AV_CODEC_ID_SAMI = MKBETAG('S','A','M','I'),
|
||||
AV_CODEC_ID_REALTEXT = MKBETAG('R','T','X','T'),
|
||||
AV_CODEC_ID_STL = MKBETAG('S','p','T','L'),
|
||||
AV_CODEC_ID_SUBVIEWER1 = MKBETAG('S','b','V','1'),
|
||||
AV_CODEC_ID_SUBVIEWER = MKBETAG('S','u','b','V'),
|
||||
AV_CODEC_ID_SUBRIP = MKBETAG('S','R','i','p'),
|
||||
@@ -552,7 +549,7 @@ enum AVCodecID {
|
||||
/**
|
||||
* This struct describes the properties of a single codec described by an
|
||||
* AVCodecID.
|
||||
* @see avcodec_get_descriptor()
|
||||
* @see avcodec_descriptor_get()
|
||||
*/
|
||||
typedef struct AVCodecDescriptor {
|
||||
enum AVCodecID id;
|
||||
@@ -768,6 +765,7 @@ typedef struct RcOverride{
|
||||
#define CODEC_FLAG2_CHUNKS 0x00008000 ///< Input bitstream might be truncated at a packet boundaries instead of only at frame boundaries.
|
||||
#define CODEC_FLAG2_SHOW_ALL 0x00400000 ///< Show all frames before the first keyframe
|
||||
#define CODEC_FLAG2_EXPORT_MVS 0x10000000 ///< Export motion vectors through frame side data
|
||||
#define CODEC_FLAG2_SKIP_MANUAL 0x20000000 ///< Do not skip samples and export skip information as frame side data
|
||||
|
||||
/* Unsupported options :
|
||||
* Syntax Arithmetic coding (SAC)
|
||||
@@ -1350,8 +1348,11 @@ typedef struct AVCodecContext {
|
||||
* of which frame timestamps are represented. For fixed-fps content,
|
||||
* timebase should be 1/framerate and timestamp increments should be
|
||||
* identically 1.
|
||||
* This often, but not always is the inverse of the frame rate or field rate
|
||||
* for video.
|
||||
* - encoding: MUST be set by user.
|
||||
* - decoding: Set by libavcodec.
|
||||
* - decoding: the use of this field for decoding is deprecated.
|
||||
* Use framerate instead.
|
||||
*/
|
||||
AVRational time_base;
|
||||
|
||||
@@ -1377,16 +1378,7 @@ typedef struct AVCodecContext {
|
||||
* encoded input.
|
||||
*
|
||||
* Audio:
|
||||
* For encoding, this is the number of "priming" samples added by the
|
||||
* encoder to the beginning of the stream. The decoded output will be
|
||||
* delayed by this many samples relative to the input to the encoder (or
|
||||
* more, if the decoder adds its own padding).
|
||||
* The timestamps on the output packets are adjusted by the encoder so
|
||||
* that they always refer to the first sample of the data actually
|
||||
* contained in the packet, including any added padding.
|
||||
* E.g. if the timebase is 1/samplerate and the timestamp of the first
|
||||
* input sample is 0, the timestamp of the first output packet will be
|
||||
* -delay.
|
||||
* For encoding, this field is unused (see initial_padding).
|
||||
*
|
||||
* For decoding, this is the number of samples the decoder needs to
|
||||
* output before the decoder's output is valid. When seeking, you should
|
||||
@@ -1480,6 +1472,10 @@ typedef struct AVCodecContext {
|
||||
* @param fmt is the list of formats which are supported by the codec,
|
||||
* it is terminated by -1 as 0 is a valid format, the formats are ordered by quality.
|
||||
* The first is always the native one.
|
||||
* @note The callback may be called again immediately if initialization for
|
||||
* the selected (hardware-accelerated) pixel format failed.
|
||||
* @warning Behavior is undefined if the callback returns a value not
|
||||
* in the fmt list of formats.
|
||||
* @return the chosen format
|
||||
* - encoding: unused
|
||||
* - decoding: Set by user, if not set the native format will be chosen.
|
||||
@@ -1800,21 +1796,19 @@ typedef struct AVCodecContext {
|
||||
*/
|
||||
int noise_reduction;
|
||||
|
||||
#if FF_API_MPV_OPT
|
||||
/**
|
||||
* Motion estimation threshold below which no motion estimation is
|
||||
* performed, but instead the user specified motion vectors are used.
|
||||
*
|
||||
* - encoding: Set by user.
|
||||
* - decoding: unused
|
||||
* @deprecated this field is unused
|
||||
*/
|
||||
attribute_deprecated
|
||||
int me_threshold;
|
||||
|
||||
/**
|
||||
* Macroblock threshold below which the user specified macroblock types will be used.
|
||||
* - encoding: Set by user.
|
||||
* - decoding: unused
|
||||
* @deprecated this field is unused
|
||||
*/
|
||||
attribute_deprecated
|
||||
int mb_threshold;
|
||||
#endif
|
||||
|
||||
/**
|
||||
* precision of the intra DC coefficient - 8
|
||||
@@ -1837,13 +1831,13 @@ typedef struct AVCodecContext {
|
||||
*/
|
||||
int skip_bottom;
|
||||
|
||||
#if FF_API_MPV_OPT
|
||||
/**
|
||||
* Border processing masking, raises the quantizer for mbs on the borders
|
||||
* of the picture.
|
||||
* - encoding: Set by user.
|
||||
* - decoding: unused
|
||||
* @deprecated use encoder private options instead
|
||||
*/
|
||||
attribute_deprecated
|
||||
float border_masking;
|
||||
#endif
|
||||
|
||||
/**
|
||||
* minimum MB lagrange multipler
|
||||
@@ -2277,16 +2271,18 @@ typedef struct AVCodecContext {
|
||||
*/
|
||||
int max_qdiff;
|
||||
|
||||
#if FF_API_MPV_OPT
|
||||
/**
|
||||
* ratecontrol qmin qmax limiting method
|
||||
* 0-> clipping, 1-> use a nice continuous function to limit qscale within qmin/qmax.
|
||||
* - encoding: Set by user.
|
||||
* - decoding: unused
|
||||
* @deprecated use encoder private options instead
|
||||
*/
|
||||
attribute_deprecated
|
||||
float rc_qsquish;
|
||||
|
||||
attribute_deprecated
|
||||
float rc_qmod_amp;
|
||||
attribute_deprecated
|
||||
int rc_qmod_freq;
|
||||
#endif
|
||||
|
||||
/**
|
||||
* decoder bitstream buffer size
|
||||
@@ -2303,12 +2299,13 @@ typedef struct AVCodecContext {
|
||||
int rc_override_count;
|
||||
RcOverride *rc_override;
|
||||
|
||||
#if FF_API_MPV_OPT
|
||||
/**
|
||||
* rate control equation
|
||||
* - encoding: Set by user
|
||||
* - decoding: unused
|
||||
* @deprecated use encoder private options instead
|
||||
*/
|
||||
attribute_deprecated
|
||||
const char *rc_eq;
|
||||
#endif
|
||||
|
||||
/**
|
||||
* maximum bitrate
|
||||
@@ -2324,14 +2321,16 @@ typedef struct AVCodecContext {
|
||||
*/
|
||||
int rc_min_rate;
|
||||
|
||||
#if FF_API_MPV_OPT
|
||||
/**
|
||||
* @deprecated use encoder private options instead
|
||||
*/
|
||||
attribute_deprecated
|
||||
float rc_buffer_aggressivity;
|
||||
|
||||
/**
|
||||
* initial complexity for pass1 ratecontrol
|
||||
* - encoding: Set by user.
|
||||
* - decoding: unused
|
||||
*/
|
||||
attribute_deprecated
|
||||
float rc_initial_cplx;
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Ratecontrol attempt to use, at maximum, <value> of what can be used without an underflow.
|
||||
@@ -2375,19 +2374,19 @@ typedef struct AVCodecContext {
|
||||
*/
|
||||
int context_model;
|
||||
|
||||
#if FF_API_MPV_OPT
|
||||
/**
|
||||
* minimum Lagrange multiplier
|
||||
* - encoding: Set by user.
|
||||
* - decoding: unused
|
||||
* @deprecated use encoder private options instead
|
||||
*/
|
||||
attribute_deprecated
|
||||
int lmin;
|
||||
|
||||
/**
|
||||
* maximum Lagrange multiplier
|
||||
* - encoding: Set by user.
|
||||
* - decoding: unused
|
||||
* @deprecated use encoder private options instead
|
||||
*/
|
||||
attribute_deprecated
|
||||
int lmax;
|
||||
#endif
|
||||
|
||||
/**
|
||||
* frame skip threshold
|
||||
@@ -2980,6 +2979,31 @@ typedef struct AVCodecContext {
|
||||
*/
|
||||
int side_data_only_packets;
|
||||
|
||||
/**
|
||||
* Audio only. The number of "priming" samples (padding) inserted by the
|
||||
* encoder at the beginning of the audio. I.e. this number of leading
|
||||
* decoded samples must be discarded by the caller to get the original audio
|
||||
* without leading padding.
|
||||
*
|
||||
* - decoding: unused
|
||||
* - encoding: Set by libavcodec. The timestamps on the output packets are
|
||||
* adjusted by the encoder so that they always refer to the
|
||||
* first sample of the data actually contained in the packet,
|
||||
* including any added padding. E.g. if the timebase is
|
||||
* 1/samplerate and the timestamp of the first input sample is
|
||||
* 0, the timestamp of the first output packet will be
|
||||
* -initial_padding.
|
||||
*/
|
||||
int initial_padding;
|
||||
|
||||
/**
|
||||
* - decoding: For codecs that store a framerate value in the compressed
|
||||
* bitstream, the decoder may export it here. { 0, 1} when
|
||||
* unknown.
|
||||
* - encoding: unused
|
||||
*/
|
||||
AVRational framerate;
|
||||
|
||||
/**
|
||||
* Timebase in which pkt_dts/pts and AVPacket.dts/pts are.
|
||||
* Code outside libavcodec should access this field using:
|
||||
@@ -3079,6 +3103,24 @@ typedef struct AVCodecContext {
|
||||
* - decoding: unused.
|
||||
*/
|
||||
uint16_t *chroma_intra_matrix;
|
||||
|
||||
/**
|
||||
* dump format separator.
|
||||
* can be ", " or "\n " or anything else
|
||||
* Code outside libavcodec should access this field using AVOptions
|
||||
* (NO direct access).
|
||||
* - encoding: Set by user.
|
||||
* - decoding: Set by user.
|
||||
*/
|
||||
uint8_t *dump_separator;
|
||||
|
||||
/**
|
||||
* ',' separated list of allowed decoders.
|
||||
* If NULL then all are allowed
|
||||
* - encoding: unused
|
||||
* - decoding: set by user through AVOPtions (NO direct access)
|
||||
*/
|
||||
char *codec_whitelist;
|
||||
} AVCodecContext;
|
||||
|
||||
AVRational av_codec_get_pkt_timebase (const AVCodecContext *avctx);
|
||||
@@ -3210,7 +3252,8 @@ int av_codec_get_max_lowres(const AVCodec *codec);
|
||||
struct MpegEncContext;
|
||||
|
||||
/**
|
||||
* AVHWAccel.
|
||||
* @defgroup lavc_hwaccel AVHWAccel
|
||||
* @{
|
||||
*/
|
||||
typedef struct AVHWAccel {
|
||||
/**
|
||||
@@ -3346,6 +3389,17 @@ typedef struct AVHWAccel {
|
||||
int priv_data_size;
|
||||
} AVHWAccel;
|
||||
|
||||
/**
|
||||
* Hardware acceleration should be used for decoding even if the codec level
|
||||
* used is unknown or higher than the maximum supported level reported by the
|
||||
* hardware driver.
|
||||
*/
|
||||
#define AV_HWACCEL_FLAG_IGNORE_LEVEL (1 << 0)
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
/**
|
||||
* @defgroup lavc_picture AVPicture
|
||||
*
|
||||
@@ -5116,16 +5170,26 @@ enum AVLockOp {
|
||||
|
||||
/**
|
||||
* Register a user provided lock manager supporting the operations
|
||||
* specified by AVLockOp. mutex points to a (void *) where the
|
||||
* lockmgr should store/get a pointer to a user allocated mutex. It's
|
||||
* NULL upon AV_LOCK_CREATE and != NULL for all other ops.
|
||||
* specified by AVLockOp. The "mutex" argument to the function points
|
||||
* to a (void *) where the lockmgr should store/get a pointer to a user
|
||||
* allocated mutex. It is NULL upon AV_LOCK_CREATE and equal to the
|
||||
* value left by the last call for all other ops. If the lock manager is
|
||||
* unable to perform the op then it should leave the mutex in the same
|
||||
* state as when it was called and return a non-zero value. However,
|
||||
* when called with AV_LOCK_DESTROY the mutex will always be assumed to
|
||||
* have been successfully destroyed. If av_lockmgr_register succeeds
|
||||
* it will return a non-negative value, if it fails it will return a
|
||||
* negative value and destroy all mutex and unregister all callbacks.
|
||||
* av_lockmgr_register is not thread-safe, it must be called from a
|
||||
* single thread before any calls which make use of locking are used.
|
||||
*
|
||||
* @param cb User defined callback. Note: FFmpeg may invoke calls to this
|
||||
* callback during the call to av_lockmgr_register().
|
||||
* Thus, the application must be prepared to handle that.
|
||||
* If cb is set to NULL the lockmgr will be unregistered.
|
||||
* Also note that during unregistration the previously registered
|
||||
* lockmgr callback may also be invoked.
|
||||
* @param cb User defined callback. av_lockmgr_register invokes calls
|
||||
* to this callback and the previously registered callback.
|
||||
* The callback will be used to create more than one mutex
|
||||
* each of which must be backed by its own underlying locking
|
||||
* mechanism (i.e. do not use a single static object to
|
||||
* implement your lock manager). If cb is set to NULL the
|
||||
* lockmgr will be unregistered.
|
||||
*/
|
||||
int av_lockmgr_register(int (*cb)(void **mutex, enum AVLockOp op));
|
||||
|
||||
|
@@ -34,8 +34,7 @@
|
||||
|
||||
void av_destruct_packet(AVPacket *pkt)
|
||||
{
|
||||
av_free(pkt->data);
|
||||
pkt->data = NULL;
|
||||
av_freep(&pkt->data);
|
||||
pkt->size = 0;
|
||||
}
|
||||
|
||||
@@ -273,7 +272,7 @@ void av_packet_free_side_data(AVPacket *pkt)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < pkt->side_data_elems; i++)
|
||||
av_free(pkt->side_data[i].data);
|
||||
av_freep(&pkt->side_data[i].data);
|
||||
av_freep(&pkt->side_data);
|
||||
pkt->side_data_elems = 0;
|
||||
}
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user