Compare commits
520 Commits
refactorin
...
Applicatio
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d518d055be | ||
|
|
899ccc41ff | ||
|
|
06e0a0bd84 | ||
|
|
08602905f0 | ||
|
|
0530f56e0b | ||
|
|
a4c6a0c575 | ||
|
|
d35a26afcf | ||
|
|
196294886d | ||
|
|
b112192abd | ||
|
|
822d219c06 | ||
|
|
dc13bd5e13 | ||
|
|
0839ebf4c4 | ||
|
|
1c3c1382d1 | ||
|
|
a584c8908d | ||
|
|
a899240c6b | ||
|
|
d8ac1c1e89 | ||
|
|
fb0a66b079 | ||
|
|
c91c8abb75 | ||
|
|
3b1c2b8e5b | ||
|
|
540c8f8f9c | ||
|
|
e2b499ff8b | ||
|
|
a49facdf69 | ||
|
|
9b7b423f2a | ||
|
|
2d3be73e68 | ||
|
|
7ced892738 | ||
|
|
94d2efb924 | ||
|
|
fcdda32a3b | ||
|
|
9d8211fb4f | ||
|
|
2191e921fd | ||
|
|
e27d5801b5 | ||
|
|
9e04f34b43 | ||
|
|
41e66adea0 | ||
|
|
e750a3a1f7 | ||
|
|
88eb1b4b1e | ||
|
|
40e8161ee5 | ||
|
|
6b5172c136 | ||
|
|
f5565c3177 | ||
|
|
08d749b515 | ||
|
|
d65f9d10e1 | ||
|
|
d884e9477c | ||
|
|
021437c673 | ||
|
|
ae9281aa4a | ||
|
|
0569e5b524 | ||
|
|
2044fc12c2 | ||
|
|
173cd374fd | ||
|
|
161d2ac3ef | ||
|
|
4587d29380 | ||
|
|
cd50b3e744 | ||
|
|
ed2e894dda | ||
|
|
a620dfa18d | ||
|
|
27c64c000d | ||
|
|
579812c905 | ||
|
|
e44fbe218e | ||
|
|
ae479cef24 | ||
|
|
4ce87b54d4 | ||
|
|
3837bd71c6 | ||
|
|
6993db7d34 | ||
|
|
785ee3c8e0 | ||
|
|
d4b8700ba9 | ||
|
|
7598e6c39c | ||
|
|
d8fae4d641 | ||
|
|
b0501506aa | ||
|
|
501638e298 | ||
|
|
4b4ce3bb27 | ||
|
|
9015986f09 | ||
|
|
a35bd53fef | ||
|
|
042fd1a353 | ||
|
|
23d6d018ee | ||
|
|
a23aca3b2d | ||
|
|
cde8ebe01a | ||
|
|
bd0a7d2327 | ||
|
|
edae3ef86e | ||
|
|
c220a5404c | ||
|
|
169648d1e9 | ||
|
|
3c6b2441cf | ||
|
|
443a7b8cc8 | ||
|
|
4379af7908 | ||
|
|
100256529b | ||
|
|
4415ac60d0 | ||
|
|
84b4a003c6 | ||
|
|
a7ebd365ef | ||
|
|
235cdda4d1 | ||
|
|
637d2115ac | ||
|
|
72c6a1715a | ||
|
|
17074d01a1 | ||
|
|
e68bf3bc8e | ||
|
|
f22aad4c03 | ||
|
|
51d34999ee | ||
|
|
294cc23d84 | ||
|
|
3148e66263 | ||
|
|
079b88eb12 | ||
|
|
68556dbd6a | ||
|
|
5cd17e333a | ||
|
|
7e511e09b2 | ||
|
|
5dec81039a | ||
|
|
62c210067d | ||
|
|
11fae84a48 | ||
|
|
67a576f0d8 | ||
|
|
cf4980fc0e | ||
|
|
01797e3b94 | ||
|
|
a9e06e0a91 | ||
|
|
946842ac87 | ||
|
|
d4fa45e498 | ||
|
|
26925bd149 | ||
|
|
79c3d3a396 | ||
|
|
c9acd9c847 | ||
|
|
0d30802c02 | ||
|
|
727f86bc4b | ||
|
|
f1e85c3987 | ||
|
|
962e348183 | ||
|
|
56a98102b4 | ||
|
|
67fc6bb623 | ||
|
|
f7120a0c3d | ||
|
|
6a692aac63 | ||
|
|
a520629b6f | ||
|
|
4a310c8af7 | ||
|
|
f31b8e6867 | ||
|
|
34c5e9b147 | ||
|
|
fde698f778 | ||
|
|
1557017613 | ||
|
|
4a55b39829 | ||
|
|
3a34c2ab29 | ||
|
|
eb39599102 | ||
|
|
2e1c399005 | ||
|
|
bcfff134ad | ||
|
|
2f329dd44f | ||
|
|
1ffb8e8fec | ||
|
|
47aaa52f44 | ||
|
|
9b09dbb2b0 | ||
|
|
cdc60f7575 | ||
|
|
2a377bf65a | ||
|
|
4ee96a0c70 | ||
|
|
d7c51af4d8 | ||
|
|
3850e34f9d | ||
|
|
303b6727c2 | ||
|
|
dd28daf9aa | ||
|
|
5649bec858 | ||
|
|
1fb16353a7 | ||
|
|
4b65a04953 | ||
|
|
c595018a42 | ||
|
|
ddc1dba82a | ||
|
|
304ea85e94 | ||
|
|
3619d5caa1 | ||
|
|
3493f9845d | ||
|
|
4c2d411d7c | ||
|
|
dbd5a248df | ||
|
|
6d84610037 | ||
|
|
e342d7351c | ||
|
|
ee96bb69fb | ||
|
|
86f77a9019 | ||
|
|
dc6dff18c6 | ||
|
|
88d7b9cc51 | ||
|
|
46e4bcc34f | ||
|
|
42249e5007 | ||
|
|
b701e1cfe7 | ||
|
|
99f97927c3 | ||
|
|
cc938b8cb2 | ||
|
|
08fb51a42b | ||
|
|
c4b87e8526 | ||
|
|
5611eebafb | ||
|
|
b558147ba0 | ||
|
|
af633f74e8 | ||
|
|
59bc433af9 | ||
|
|
5b5e415834 | ||
|
|
b7259ad554 | ||
|
|
7d7a4efd09 | ||
|
|
88a21bdf44 | ||
|
|
4dcdcce3ff | ||
|
|
5a05e9d500 | ||
|
|
213e64339b | ||
|
|
af714cbdcd | ||
|
|
f36f1dc975 | ||
|
|
0c456f7fb2 | ||
|
|
ca468bc85b | ||
|
|
a33bd84d54 | ||
|
|
92b88c61ac | ||
|
|
bab0ebc50d | ||
|
|
9ca1cd57ca | ||
|
|
069e430ae4 | ||
|
|
02b7a19dfe | ||
|
|
94c420c85b | ||
|
|
ea185dfce6 | ||
|
|
3bc52cf369 | ||
|
|
41a9199800 | ||
|
|
5de2633cc5 | ||
|
|
62610f6114 | ||
|
|
6f47b64c6d | ||
|
|
86b7c0bc08 | ||
|
|
19d707d927 | ||
|
|
86c305de39 | ||
|
|
cd6717b4ee | ||
|
|
60916dd1fe | ||
|
|
91186164a8 | ||
|
|
5b33c563e2 | ||
|
|
77922b4ec8 | ||
|
|
423ba3b1d5 | ||
|
|
52bf301299 | ||
|
|
a20680186f | ||
|
|
276f61d09f | ||
|
|
e2d0e02efd | ||
|
|
862924d526 | ||
|
|
b6cdb35d3d | ||
|
|
a568c01505 | ||
|
|
5950ef6506 | ||
|
|
a0579e7834 | ||
|
|
856763adba | ||
|
|
0b3bc44566 | ||
|
|
f87ee28c0a | ||
|
|
f2b70a17c3 | ||
|
|
b5bac8ab36 | ||
|
|
102e588cfd | ||
|
|
d8e2777321 | ||
|
|
33931eee91 | ||
|
|
3f9180b5c0 | ||
|
|
4cfa2b978a | ||
|
|
6b63039e51 | ||
|
|
164f9fe0a6 | ||
|
|
0a12e90cb5 | ||
|
|
04ee4fa925 | ||
|
|
ec7da49c42 | ||
|
|
09d696b9c5 | ||
|
|
9041c04c52 | ||
|
|
181e5dd4b0 | ||
|
|
630f7bbfcf | ||
|
|
d2e26bb194 | ||
|
|
529e7a235b | ||
|
|
f4c9a045f2 | ||
|
|
f368c6448a | ||
|
|
4a7088e8b0 | ||
|
|
c98bbdffd1 | ||
|
|
48db9dad9c | ||
|
|
f372f318d6 | ||
|
|
6fef57061c | ||
|
|
04541ba0dd | ||
|
|
fdbbf21270 | ||
|
|
155a8c1bc1 | ||
|
|
36e0f91201 | ||
|
|
590a83fdc5 | ||
|
|
67b051577c | ||
|
|
61cf7cdf37 | ||
|
|
0d053c69bf | ||
|
|
67c4958b65 | ||
|
|
0fba2e0643 | ||
|
|
012d1cfeb8 | ||
|
|
db856a5cd3 | ||
|
|
d6cea2efee | ||
|
|
2c2c6a32e0 | ||
|
|
a692f3bb8c | ||
|
|
ecbc0967fd | ||
|
|
5fb0e4a5b8 | ||
|
|
e4c764483f | ||
|
|
16690444c2 | ||
|
|
596163833d | ||
|
|
42cc3b0ebc | ||
|
|
cbb224784f | ||
|
|
28a7d4bd33 | ||
|
|
bb14c0739c | ||
|
|
e6a6fc62e3 | ||
|
|
4cac44220e | ||
|
|
5e0b0db076 | ||
|
|
60712faceb | ||
|
|
53f612a22b | ||
|
|
e0473f8619 | ||
|
|
7ecca09acc | ||
|
|
793f549770 | ||
|
|
f863490fea | ||
|
|
38b3aec21d | ||
|
|
e7db0285ef | ||
|
|
e20cb65f34 | ||
|
|
2bda800f9e | ||
|
|
3421356529 | ||
|
|
a2b0d69931 | ||
|
|
ff8ecee321 | ||
|
|
fa77da1742 | ||
|
|
e9979ffd0e | ||
|
|
45a8b68328 | ||
|
|
832e699b52 | ||
|
|
92698a3685 | ||
|
|
da98113f10 | ||
|
|
33264f9a98 | ||
|
|
02f86a8725 | ||
|
|
7d719ca802 | ||
|
|
078dc8d1e0 | ||
|
|
703360538d | ||
|
|
3d1beab793 | ||
|
|
4ca32b4d22 | ||
|
|
915970c1aa | ||
|
|
4c3c8ccb37 | ||
|
|
5a51022496 | ||
|
|
ae4c544f6f | ||
|
|
40faa0eb2c | ||
|
|
9e288db02d | ||
|
|
2ed43d34a1 | ||
|
|
ad694e0477 | ||
|
|
72c75b7772 | ||
|
|
8958d7df24 | ||
|
|
c88f51af7c | ||
|
|
9ffa5e6d79 | ||
|
|
e6dc4cb368 | ||
|
|
7f56a6f0f1 | ||
|
|
d79c3cb16c | ||
|
|
a153154910 | ||
|
|
0120221193 | ||
|
|
8b48e2d4a3 | ||
|
|
0c6a4327d3 | ||
|
|
960ae4650b | ||
|
|
9a86cb15da | ||
|
|
735d1ab7cc | ||
|
|
0ab3c46794 | ||
|
|
0defb20de9 | ||
|
|
26f17f6bf0 | ||
|
|
668592c6e7 | ||
|
|
f69dd4083c | ||
|
|
5eceeba1f5 | ||
|
|
65778d9f0f | ||
|
|
aa80c88cc4 | ||
|
|
ec09e5e54c | ||
|
|
94b1b432ec | ||
|
|
8f788c1d13 | ||
|
|
4d7a3a6dd6 | ||
|
|
0156e1e417 | ||
|
|
118ce7d1d9 | ||
|
|
9dc38dd769 | ||
|
|
11726f8764 | ||
|
|
3ab863f0d5 | ||
|
|
6435a4ebdb | ||
|
|
b965270152 | ||
|
|
55c1ee1c7b | ||
|
|
9675c27073 | ||
|
|
b4e74ad93c | ||
|
|
1834b9a96e | ||
|
|
b8a83d2b68 | ||
|
|
ec69039673 | ||
|
|
fe684e7eb3 | ||
|
|
456635ac2c | ||
|
|
209e4fccb5 | ||
|
|
3404da90de | ||
|
|
414d6579a1 | ||
|
|
673d0f79ed | ||
|
|
7cf9980c1f | ||
|
|
e8d6b75c36 | ||
|
|
9f01d93689 | ||
|
|
984df727b9 | ||
|
|
6f5584eee1 | ||
|
|
74a0be8d8b | ||
|
|
c92aa046c9 | ||
|
|
42a40132a1 | ||
|
|
b09224eee3 | ||
|
|
4724bb8b4d | ||
|
|
d33d59c234 | ||
|
|
8ec829f1b6 | ||
|
|
80e0b44f18 | ||
|
|
e4e8207552 | ||
|
|
020eb7bea1 | ||
|
|
cb89fe494c | ||
|
|
388d983390 | ||
|
|
478589576b | ||
|
|
6766aec23d | ||
|
|
3e5598b2a4 | ||
|
|
b1c5738a6e | ||
|
|
79a0a88912 | ||
|
|
359220c9ce | ||
|
|
a2b2d50586 | ||
|
|
66cfda93ce | ||
|
|
7c237457f6 | ||
|
|
df840cdf26 | ||
|
|
d961c39bd8 | ||
|
|
f99275fabe | ||
|
|
b279de93be | ||
|
|
d0753238c0 | ||
|
|
243dff060b | ||
|
|
78a1d89f40 | ||
|
|
3d53f18644 | ||
|
|
2fd4a6c711 | ||
|
|
425efbbbbe | ||
|
|
8d2c091641 | ||
|
|
723988783c | ||
|
|
d3aa4cb6e4 | ||
|
|
d9ecb0751b | ||
|
|
8e054c9a52 | ||
|
|
6665d7fb41 | ||
|
|
1c741db4fd | ||
|
|
92e561d10f | ||
|
|
e84bbd0ac8 | ||
|
|
8d9c04ab8f | ||
|
|
8e2d00e30b | ||
|
|
9dc324c468 | ||
|
|
ab8c2381ae | ||
|
|
74cf8fa64d | ||
|
|
0b5be0aa3d | ||
|
|
2c88d42bd5 | ||
|
|
ef61b5adf2 | ||
|
|
f3d6aa2dc3 | ||
|
|
3c90778b2d | ||
|
|
a9b53833ed | ||
|
|
4a5cbe22ea | ||
|
|
53133bd07d | ||
|
|
6707f48a19 | ||
|
|
8034bd3423 | ||
|
|
243545e4f0 | ||
|
|
cfef990488 | ||
|
|
1e4dc2803e | ||
|
|
9674c1fe6a | ||
|
|
35af0b4af8 | ||
|
|
6bb4769193 | ||
|
|
5f6cc24d62 | ||
|
|
463e9f8453 | ||
|
|
dc80cd7352 | ||
|
|
9d9010b017 | ||
|
|
dbc6793d3f | ||
|
|
76ceba1640 | ||
|
|
0f1f490cfc | ||
|
|
2a93b292e3 | ||
|
|
28816933a3 | ||
|
|
d85742fcb1 | ||
|
|
d68e3ad873 | ||
|
|
0e3f823288 | ||
|
|
4cc55c1e71 | ||
|
|
67890f6e58 | ||
|
|
5becbfc25e | ||
|
|
4d1b876722 | ||
|
|
e05d4a5120 | ||
|
|
62a6a93d99 | ||
|
|
3086e18529 | ||
|
|
e6f89c5336 | ||
|
|
94f9c53ca4 | ||
|
|
6bae786fa8 | ||
|
|
d198819b03 | ||
|
|
cc849dd090 | ||
|
|
14ff0d088e | ||
|
|
8a5f3217ab | ||
|
|
b43c82a697 | ||
|
|
f874d52901 | ||
|
|
1ea8ed36a1 | ||
|
|
38f6ab61d1 | ||
|
|
c7002c08ef | ||
|
|
8f68095d67 | ||
|
|
646fbd0288 | ||
|
|
ee9f3a4b1b | ||
|
|
aada055669 | ||
|
|
b6a4be7f01 | ||
|
|
de9abfd108 | ||
|
|
08b6b94bd3 | ||
|
|
98a2b68389 | ||
|
|
9cf0415590 | ||
|
|
085a178ab4 | ||
|
|
dbee17e590 | ||
|
|
2d44d6e2b1 | ||
|
|
5957d784c8 | ||
|
|
bcd643f27a | ||
|
|
8a56722c36 | ||
|
|
194880b170 | ||
|
|
5994a8172e | ||
|
|
3de068e389 | ||
|
|
7d2676f4a0 | ||
|
|
caac06125f | ||
|
|
86ab24b0fd | ||
|
|
b5a6cd8557 | ||
|
|
bc796a104f | ||
|
|
aba3aaf852 | ||
|
|
6fc5a7eab5 | ||
|
|
8b9fc20160 | ||
|
|
640d446755 | ||
|
|
57a346a99f | ||
|
|
6ceb498924 | ||
|
|
7d1d20ab23 | ||
|
|
4ca81a4b6f | ||
|
|
a6ac89e1ad | ||
|
|
93fb8a9388 | ||
|
|
6edd85105a | ||
|
|
f248ea0d64 | ||
|
|
6bb2cedaaa | ||
|
|
2a94842ed5 | ||
|
|
285493dc9b | ||
|
|
aac49a1052 | ||
|
|
d6c6f4b88d | ||
|
|
a5490e5609 | ||
|
|
018de76858 | ||
|
|
3963244907 | ||
|
|
9792a1b1cd | ||
|
|
6d71034c43 | ||
|
|
885fb4d0eb | ||
|
|
b34d0c0bb5 | ||
|
|
716c03967a | ||
|
|
adbdc888eb | ||
|
|
67257981b1 | ||
|
|
e844edc049 | ||
|
|
be60096748 | ||
|
|
91b268c272 | ||
|
|
323903cc4e | ||
|
|
7f9acd934c | ||
|
|
ccf1c9cda5 | ||
|
|
436cccdb3c | ||
|
|
3d113980ac | ||
|
|
fab234a0ca | ||
|
|
de5076402c | ||
|
|
464b1932ad | ||
|
|
048a3d7464 | ||
|
|
9aca0ee731 | ||
|
|
f540402274 | ||
|
|
ccf21435d5 | ||
|
|
b9ccc837ef | ||
|
|
901c3ecfd2 | ||
|
|
7038cc063d | ||
|
|
754b8eeed8 | ||
|
|
b4aff4564b | ||
|
|
e5e7c6dad2 | ||
|
|
8a20fca86e | ||
|
|
ad861ecce2 | ||
|
|
5bb59c18fa | ||
|
|
a76a3d15b2 | ||
|
|
5beb03dc62 | ||
|
|
54e3d416b6 | ||
|
|
0ce898669a | ||
|
|
00e8696417 | ||
|
|
65681183e2 | ||
|
|
df419e2f77 | ||
|
|
91bd4db97d | ||
|
|
20a6397a72 | ||
|
|
0eb1d1ef8f |
4
.arcconfig
Normal file
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"project.name" : "Kdenlive",
|
||||
"phabricator.uri" : "https://phabricator.kde.org/"
|
||||
}
|
||||
4
.gitlab-ci.yml
Normal file
@@ -0,0 +1,4 @@
|
||||
include:
|
||||
- https://invent.kde.org/sysadmin/ci-tooling/raw/master/invent/ci-before.yml
|
||||
- https://invent.kde.org/sysadmin/ci-tooling/raw/master/invent/ci-applications-linux.yml
|
||||
- https://invent.kde.org/sysadmin/ci-tooling/raw/master/invent/ci-applications-freebsd.yml
|
||||
26
AUTHORS
@@ -1,23 +1,23 @@
|
||||
Active Kdenlive authors
|
||||
|
||||
Vincent Pinon <vpinon@april.org>
|
||||
Bugs fixing, release
|
||||
2012-present
|
||||
Jean-Baptiste Mardelle <jb@kdenlive.org>
|
||||
MLT and KDE SC 4 porting, main developer
|
||||
Main developer and maintainer, MLT and KDE SC 4 / KF5 port,
|
||||
2005-present
|
||||
Laurent Montel <montel@kde.org>
|
||||
Bugs fixing, code clean up, review
|
||||
2013-present
|
||||
Till Theato <root@ttill.de>
|
||||
Bug fixing, etc.
|
||||
2010-present
|
||||
Steve Guilford <s.guilford@dbplugins.com>
|
||||
Bug fixing
|
||||
2014
|
||||
Vincent Pinon <vpinon@kde.org>
|
||||
Interim maintainer, Windows cross-build, KF5 port, profiles updates, etc.
|
||||
2012-present
|
||||
|
||||
Former Kdenlive authors
|
||||
|
||||
Laurent Montel <montel@kde.org>
|
||||
Bugs fixing, code clean up, review
|
||||
2013-2017
|
||||
Till Theato <root@ttill.de>
|
||||
Bug fixing, etc.
|
||||
2010-2015
|
||||
Steve Guilford <s.guilford@dbplugins.com>
|
||||
Bug fixing
|
||||
2014
|
||||
Simon A. Eugster (Granjow) <simon.eu@gmail.com>
|
||||
Colour and audio scopes, titler, manual, bug fixing, etc.
|
||||
2009-2012
|
||||
|
||||
@@ -4,9 +4,9 @@ project(Kdenlive)
|
||||
# stable release. An additional number can be used for bugfix-only releases.
|
||||
|
||||
# KDE Application Version, managed by release script
|
||||
set (KDE_APPLICATIONS_VERSION_MAJOR "17")
|
||||
set (KDE_APPLICATIONS_VERSION_MINOR "03")
|
||||
set (KDE_APPLICATIONS_VERSION_MICRO "70")
|
||||
set (KDE_APPLICATIONS_VERSION_MAJOR "18")
|
||||
set (KDE_APPLICATIONS_VERSION_MINOR "12")
|
||||
set (KDE_APPLICATIONS_VERSION_MICRO "3")
|
||||
|
||||
set(KDENLIVE_VERSION ${KDE_APPLICATIONS_VERSION_MAJOR}.${KDE_APPLICATIONS_VERSION_MINOR}.${KDE_APPLICATIONS_VERSION_MICRO})
|
||||
cmake_minimum_required(VERSION 3.0)
|
||||
@@ -18,20 +18,20 @@ if (POLICY CMP0053)
|
||||
endif()
|
||||
# Minimum versions of main dependencies.
|
||||
set(MLT_MIN_MAJOR_VERSION 6)
|
||||
set(MLT_MIN_MINOR_VERSION 0)
|
||||
set(MLT_MIN_MINOR_VERSION 10)
|
||||
set(MLT_MIN_PATCH_VERSION 0)
|
||||
set(MLT_MIN_VERSION ${MLT_MIN_MAJOR_VERSION}.${MLT_MIN_MINOR_VERSION}.${MLT_MIN_PATCH_VERSION})
|
||||
|
||||
set(QT_MIN_VERSION 5.5.0)
|
||||
set(QT_MIN_VERSION 5.6.0)
|
||||
|
||||
find_package(ECM 5.21.0 REQUIRED CONFIG)
|
||||
find_package(ECM 5.18.0 REQUIRED CONFIG)
|
||||
set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake/modules)
|
||||
include(KDECompilerSettings NO_POLICY_SCOPE)
|
||||
include(FeatureSummary)
|
||||
include(ECMInstallIcons)
|
||||
include(GenerateExportHeader)
|
||||
include(KDEInstallDirs)
|
||||
include(KDECMakeSettings)
|
||||
include(KDECompilerSettings)
|
||||
include(ECMOptionalAddSubdirectory)
|
||||
include(ECMMarkNonGuiExecutable)
|
||||
include(ECMAddAppIcon)
|
||||
@@ -43,7 +43,6 @@ add_definitions(-DTRANSLATION_DOMAIN=\"kdenlive\")
|
||||
|
||||
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${ECM_MODULE_PATH})
|
||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS}")
|
||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
|
||||
# To be switched on when releasing.
|
||||
option(RELEASE_BUILD "Remove Git revision from program version (use for stable releases)" ON)
|
||||
|
||||
@@ -79,7 +78,7 @@ include(CheckIncludeFiles)
|
||||
check_include_files(malloc.h HAVE_MALLOC_H)
|
||||
check_include_files(pthread.h HAVE_PTHREAD_H)
|
||||
|
||||
find_package(Qt5 REQUIRED COMPONENTS Core DBus Widgets Script Svg Quick )
|
||||
find_package(Qt5 REQUIRED COMPONENTS Core DBus Widgets Svg Quick Concurrent)
|
||||
find_package(Qt5 OPTIONAL_COMPONENTS WebKitWidgets QUIET)
|
||||
|
||||
find_package(KF5 5.23.0 OPTIONAL_COMPONENTS XmlGui QUIET)
|
||||
@@ -91,8 +90,11 @@ else()
|
||||
endif()
|
||||
|
||||
find_package(KF5 REQUIRED COMPONENTS Archive Bookmarks CoreAddons Config ConfigWidgets
|
||||
DBusAddons KIO WidgetsAddons NotifyConfig NewStuff XmlGui Notifications GuiAddons TextWidgets IconThemes Crash
|
||||
OPTIONAL_COMPONENTS DocTools FileMetaData)
|
||||
DBusAddons KIO WidgetsAddons NotifyConfig NewStuff XmlGui Notifications GuiAddons TextWidgets IconThemes
|
||||
OPTIONAL_COMPONENTS DocTools FileMetaData Crash Purpose)
|
||||
if(WIN32)
|
||||
find_package(DrMinGW)
|
||||
endif(WIN32)
|
||||
|
||||
if (KF5FileMetaData_FOUND)
|
||||
message(STATUS "Found KF5 FileMetadata to extract file metadata")
|
||||
@@ -101,6 +103,13 @@ else()
|
||||
message(STATUS "KF5 FileMetadata not found, file metadata will not be available")
|
||||
endif()
|
||||
|
||||
if (KF5Purpose_FOUND)
|
||||
message(STATUS "Found KF5 Purpose, filesharing enabled")
|
||||
set(KF5_PURPOSE TRUE)
|
||||
else()
|
||||
message(STATUS "KF5 Purpose not found, filesharing disabled")
|
||||
endif()
|
||||
|
||||
# Search MLT package.
|
||||
find_package(MLT ${MLT_MIN_VERSION} REQUIRED)
|
||||
set_package_properties(MLT PROPERTIES
|
||||
@@ -109,21 +118,29 @@ set_package_properties(MLT PROPERTIES
|
||||
TYPE RUNTIME
|
||||
PURPOSE "Required to do video processing")
|
||||
|
||||
set(MLT_PREFIX ${MLT_ROOT_DIR})
|
||||
if(NOT WIN32)
|
||||
set(MLT_PREFIX ${MLT_ROOT_DIR})
|
||||
else()
|
||||
set(MLT_PREFIX "..")
|
||||
endif()
|
||||
|
||||
add_subdirectory(data)
|
||||
if(KF5DocTools_FOUND)
|
||||
add_subdirectory(doc)
|
||||
endif()
|
||||
#add_subdirectory(plugins)
|
||||
ecm_optional_add_subdirectory(po)
|
||||
add_subdirectory(renderer)
|
||||
add_subdirectory(src)
|
||||
add_subdirectory(thumbnailer)
|
||||
#add_subdirectory(testingArea)
|
||||
|
||||
ki18n_install(po)
|
||||
if (KF5DocTools_FOUND)
|
||||
kdoctools_install(po)
|
||||
endif()
|
||||
|
||||
install( FILES kdenlive.categories DESTINATION ${KDE_INSTALL_CONFDIR} )
|
||||
include(GNUInstallDirs)
|
||||
install( FILES AUTHORS COPYING README DESTINATION ${CMAKE_INSTALL_DOCDIR})
|
||||
|
||||
configure_file(config-kdenlive.h.cmake config-kdenlive.h @ONLY)
|
||||
feature_summary(WHAT ALL INCLUDE_QUIET_PACKAGES FATAL_ON_MISSING_REQUIRED_PACKAGES)
|
||||
|
||||
35
README
@@ -1,36 +1,14 @@
|
||||
About Kdenlive
|
||||
==============
|
||||
# About Kdenlive
|
||||
|
||||
Kdenlive is a video editing application,
|
||||
based on MLT Framework and KDE Frameworks 5
|
||||
Kdenlive (https://kdenlive.org) is a Free and Open Source video editing application, based on MLT Framework and KDE Frameworks 5. It is distributed under the GNU General Public Licence Version 2.
|
||||
|
||||
Please check the project page for more information:
|
||||
https://kdenlive.org
|
||||
# Builing from source
|
||||
|
||||
Building from source
|
||||
====================
|
||||
Instructions to build Kdenlive are available on the KDE wiki : https://community.kde.org/Kdenlive/Development
|
||||
|
||||
You will first need to install development headers dependencies
|
||||
from your system (mainly KDE and MLT).
|
||||
# Contributing to Kdenlive
|
||||
|
||||
Then in the directory where you extracted the source archive
|
||||
(with custom /install/path):
|
||||
|
||||
mkdir build
|
||||
cd build
|
||||
cmake .. -DCMAKE_INSTALL_PREFIX=/install/path
|
||||
make -j4
|
||||
make install
|
||||
|
||||
and then run
|
||||
/install/path/bin/kdenlive
|
||||
|
||||
Alternately, to get kdenlive with an up-to-date multimedia stack
|
||||
(isolated from your system), you can use the build-kdenlive.sh from:
|
||||
https://github.com/mltframework/mlt-scripts/
|
||||
|
||||
Contributing
|
||||
============
|
||||
Please note that Kdenlive's Github repo is just a mirror: see https://community.kde.org/Infrastructure/Github_Mirror for detailed explanations on how to submit patches.
|
||||
|
||||
We welcome all feedback and offers for help!
|
||||
|
||||
@@ -49,4 +27,3 @@ We welcome all feedback and offers for help!
|
||||
we don't test every (any?) other video editor, so give precise explanations
|
||||
* Code! Help fixing bugs, improving usability, optimizing, porting...
|
||||
register on KDE infrastructure, study its guidelines, and pick from roadmap:
|
||||
http://community.kde.org/Kdenlive/Roadmap
|
||||
|
||||
25
cmake/modules/FindDrMinGW.cmake
Normal file
@@ -0,0 +1,25 @@
|
||||
# cmake macro to find DrMinGW Windows crash handler
|
||||
#
|
||||
# copyright (c) 2018, Vincent Pinon <vpinon@kde.org>
|
||||
#
|
||||
# once done this will define:
|
||||
#
|
||||
# DRMINGW_FOUND - system has DrMinGW
|
||||
# DRMINGW_INCLUDE_DIR - the DrMinGW include directory
|
||||
# DRMINGW_LIBRARY - the libraries needed to use DrMinGW
|
||||
#
|
||||
# redistribution and use is allowed according to the terms of the bsd license.
|
||||
|
||||
if (DRMINGW_INCLUDE_DIR AND DRMINGW_LIBRARY)
|
||||
# already in cache, be silent
|
||||
set (DRMINGW_FIND_QUIETLY true)
|
||||
endif (DRMINGW_INCLUDE_DIR AND DRMINGW_LIBRARY)
|
||||
|
||||
find_path (DRMINGW_INCLUDE_DIR exchndl.h)
|
||||
find_library (DRMINGW_LIBRARY exchndl)
|
||||
|
||||
include (FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args (DrMinGW DEFAULT_MSG DRMINGW_INCLUDE_DIR DRMINGW_LIBRARY)
|
||||
|
||||
mark_as_advanced(DRMINGW_INCLUDE_DIR DRMINGW_LIBRARY)
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||
|
||||
find_package(PkgConfig QUIET)
|
||||
pkg_check_modules(PC_MLT QUIET mlt++)
|
||||
pkg_check_modules(PC_MLT mlt++)
|
||||
|
||||
find_path(MLT_INCLUDE_DIR
|
||||
NAMES framework/mlt.h
|
||||
|
||||
@@ -1,52 +0,0 @@
|
||||
# - Try to find OpenGLES
|
||||
# Once done this will define
|
||||
#
|
||||
# OPENGLES_FOUND - system has OpenGLES and EGL
|
||||
# OPENGL_EGL_FOUND - system has EGL
|
||||
# OPENGLES_INCLUDE_DIR - the GLES include directory
|
||||
# OPENGLES_LIBRARY - the GLES library
|
||||
# OPENGLES_EGL_INCLUDE_DIR - the EGL include directory
|
||||
# OPENGLES_EGL_LIBRARY - the EGL library
|
||||
# OPENGLES_LIBRARIES - all libraries needed for OpenGLES
|
||||
# OPENGLES_INCLUDES - all includes needed for OpenGLES
|
||||
|
||||
FIND_PATH(OPENGLES_INCLUDE_DIR GLES2/gl2.h
|
||||
/usr/openwin/share/include
|
||||
/opt/graphics/OpenGL/include /usr/X11R6/include
|
||||
/usr/include
|
||||
)
|
||||
|
||||
FIND_LIBRARY(OPENGLES_LIBRARY
|
||||
NAMES GLESv2
|
||||
PATHS /opt/graphics/OpenGL/lib
|
||||
/usr/openwin/lib
|
||||
/usr/shlib /usr/X11R6/lib
|
||||
/usr/lib
|
||||
)
|
||||
|
||||
FIND_PATH(OPENGLES_EGL_INCLUDE_DIR EGL/egl.h
|
||||
/usr/openwin/share/include
|
||||
/opt/graphics/OpenGL/include /usr/X11R6/include
|
||||
/usr/include
|
||||
)
|
||||
|
||||
FIND_LIBRARY(OPENGLES_EGL_LIBRARY
|
||||
NAMES EGL
|
||||
PATHS /usr/shlib /usr/X11R6/lib
|
||||
/usr/lib
|
||||
)
|
||||
|
||||
SET(OPENGL_EGL_FOUND "NO")
|
||||
IF(OPENGLES_EGL_LIBRARY AND OPENGLES_EGL_INCLUDE_DIR)
|
||||
SET(OPENGL_EGL_FOUND "YES")
|
||||
ENDIF()
|
||||
|
||||
SET(OPENGLES_FOUND "NO")
|
||||
IF(OPENGLES_LIBRARY AND OPENGLES_INCLUDE_DIR AND
|
||||
OPENGLES_EGL_LIBRARY AND OPENGLES_EGL_INCLUDE_DIR)
|
||||
SET(OPENGLES_LIBRARIES ${OPENGLES_LIBRARY} ${OPENGLES_LIBRARIES}
|
||||
${OPENGLES_EGL_LIBRARY})
|
||||
SET(OPENGLES_INCLUDES ${OPENGLES_INCLUDE_DIR} ${OPENGLES_EGL_INCLUDE_DIR})
|
||||
SET(OPENGLES_FOUND "YES")
|
||||
ENDIF()
|
||||
|
||||
@@ -1,50 +0,0 @@
|
||||
# Find QJSON - JSON handling library for Qt
|
||||
#
|
||||
# This module defines
|
||||
# QJSON_FOUND - whether the qsjon library was found
|
||||
# QJSON_LIBRARIES - the qjson library
|
||||
# QJSON_INCLUDE_DIR - the include path of the qjson library
|
||||
#
|
||||
# Copyright (c) 2010 Pino Toscano, <toscano.pino@tiscali.it>
|
||||
#
|
||||
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
|
||||
|
||||
|
||||
|
||||
if (QJSON_INCLUDE_DIR AND QJSON_LIBRARIES)
|
||||
|
||||
# Already in cache
|
||||
set (QJSON_FOUND TRUE)
|
||||
|
||||
else (QJSON_INCLUDE_DIR AND QJSON_LIBRARIES)
|
||||
|
||||
if (NOT WIN32)
|
||||
# use pkg-config to get the values of QJSON_INCLUDE_DIRS
|
||||
# and QJSON_LIBRARY_DIRS to add as hints to the find commands.
|
||||
include (FindPkgConfig)
|
||||
pkg_check_modules (PC_QJSON REQUIRED QJson>=0.5)
|
||||
endif (NOT WIN32)
|
||||
|
||||
find_library (QJSON_LIBRARIES
|
||||
NAMES
|
||||
qjson
|
||||
PATHS
|
||||
${PC_QJSON_LIBRARY_DIRS}
|
||||
${LIB_INSTALL_DIR}
|
||||
${KDE4_LIB_DIR}
|
||||
)
|
||||
|
||||
find_path (QJSON_INCLUDE_DIR
|
||||
NAMES
|
||||
qjson/parser.h
|
||||
PATHS
|
||||
${PC_QJSON_INCLUDE_DIRS}
|
||||
${INCLUDE_INSTALL_DIR}
|
||||
${KDE4_INCLUDE_DIR}
|
||||
)
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(QJSON DEFAULT_MSG QJSON_LIBRARIES QJSON_INCLUDE_DIR)
|
||||
|
||||
endif (QJSON_INCLUDE_DIR AND QJSON_LIBRARIES)
|
||||
@@ -26,20 +26,15 @@ install(FILES
|
||||
timeline_vthumbs.png
|
||||
kdenliveeffectscategory.rc
|
||||
kdenlivetranscodingrc
|
||||
# Qml are now embedded as Qt resources from /src/uiresources.qrc
|
||||
# kdenlivemonitor.qml
|
||||
# kdenliveclipmonitor.qml
|
||||
# kdenlivemonitoreffectscene.qml
|
||||
# kdenlivemonitorcornerscene.qml
|
||||
# kdenlivemonitorsplit.qml
|
||||
|
||||
DESTINATION ${DATA_INSTALL_DIR}/kdenlive)
|
||||
install(FILES kdenlive.notifyrc DESTINATION ${KNOTIFYRC_INSTALL_DIR})
|
||||
install(FILES kdenlive_projectprofiles.knsrc kdenlive_renderprofiles.knsrc kdenlive_wipes.knsrc kdenlive_titles.knsrc DESTINATION ${CONFIG_INSTALL_DIR})
|
||||
install(FILES kdenlive_renderprofiles.knsrc kdenlive_wipes.knsrc kdenlive_titles.knsrc DESTINATION ${CONFIG_INSTALL_DIR})
|
||||
install(FILES profiles.xml DESTINATION ${DATA_INSTALL_DIR}/kdenlive/export)
|
||||
install(FILES org.kde.kdenlive.appdata.xml DESTINATION ${KDE_INSTALL_METAINFODIR})
|
||||
install(FILES org.kde.kdenlive.desktop DESTINATION ${XDG_APPS_INSTALL_DIR})
|
||||
|
||||
find_package(SharedMimeInfo REQUIRED)
|
||||
install(FILES kdenlive.xml westley.xml DESTINATION ${XDG_MIME_INSTALL_DIR})
|
||||
install(FILES org.kde.kdenlive.xml westley.xml DESTINATION ${XDG_MIME_INSTALL_DIR})
|
||||
update_xdg_mimetypes(${XDG_MIME_INSTALL_DIR})
|
||||
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
function get_files
|
||||
{
|
||||
echo kdenlive.xml
|
||||
echo org.kde.kdenlive.xml
|
||||
}
|
||||
|
||||
function po_for_file
|
||||
{
|
||||
case "$1" in
|
||||
kdenlive.xml)
|
||||
org.kde.kdenlive.xml)
|
||||
echo kdenlive_xml_mimetypes.po
|
||||
;;
|
||||
esac
|
||||
@@ -15,7 +15,7 @@ function po_for_file
|
||||
function tags_for_file
|
||||
{
|
||||
case "$1" in
|
||||
kdenlive.xml)
|
||||
org.kde.kdenlive.xml)
|
||||
echo comment
|
||||
;;
|
||||
esac
|
||||
|
||||
@@ -99,7 +99,7 @@ The rest:
|
||||
- works with MLT filters that use mlt_geometry for keyframe support (includes all frei0r filters)
|
||||
- same attributes as "keyframe"
|
||||
- "geometry":
|
||||
- a rectangle: postion + dimension + additional value
|
||||
- a rectangle: position + dimension + additional value
|
||||
- works with MLT filters using mlt_geometry
|
||||
- the rect can be edited on the project monitor
|
||||
- additional attributes:
|
||||
@@ -110,7 +110,7 @@ The rest:
|
||||
- url/path
|
||||
- represented by button to open "file open" dialog
|
||||
- additional attributes:
|
||||
- "filter": Filter for file extensions. Example : "*.cpp *.cc *.C|C++ Source Files\n*.h *.H|Header files" or as using mimetype: "image/png text/html"
|
||||
- "filter": Filter for file extensions. Example : "*.cpp *.cc *.C|C++ Source Files\n*.h *.H|Header files" or as using MIME type: "image/png text/html"
|
||||
- "wipe":
|
||||
- special GUI for the wipe transition makes it possible to select a direction of a slide
|
||||
- "addedgeometry":
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
<!DOCTYPE kpartgui>
|
||||
<group>
|
||||
<effect tag="qtblend" id="qtblend">
|
||||
<name>Transform</name>
|
||||
<description>Position, scale and opacity.</description>
|
||||
@@ -17,5 +18,27 @@
|
||||
<name>Distort</name>
|
||||
</parameter>
|
||||
</effect>
|
||||
<effect tag="qtblend" id="qtblend" version="2">
|
||||
<name>Transform</name>
|
||||
<description>Position, scale and opacity.</description>
|
||||
<author>Jean-Baptiste Mardelle</author>
|
||||
<parameter type="animatedrect" name="rect" default="0 0 %width %height 1">
|
||||
<name>Rectangle</name>
|
||||
</parameter>
|
||||
<parameter type="animated" name="rotation" max="360" min="-360" default="0" notintimeline="1">
|
||||
<name>Rotation</name>
|
||||
</parameter>
|
||||
<parameter type="list" name="compositing" default="0" paramlist="0;11;12;13;14;15;16;17;18;19;20;21;22;23;24;25;26;27;28;29;6;8">
|
||||
<paramlistdisplay>Alpha blend,Xor,Plus,Multiply,Screen,Overlay,Darken,Lighten,Color dodge,Color burn,Hard light,Soft light,Difference,Exclusion,Bitwise or,Bitwise and,Bitwise xor,Bitwise nor,Bitwise nand,Bitwise not xor,Destination in,Destination out</paramlistdisplay>
|
||||
<name>Compositing</name>
|
||||
</parameter>
|
||||
<parameter type="bool" name="distort" default="0" min="0" max="1">
|
||||
<name>Distort</name>
|
||||
</parameter>
|
||||
<parameter type="bool" name="rotate_center" default="1" min="0" max="1">
|
||||
<name>Rotate from center</name>
|
||||
</parameter>
|
||||
</effect>
|
||||
</group>
|
||||
|
||||
|
||||
|
||||
@@ -4,12 +4,13 @@ DNxHD=vcodec=dnxhd vb=145000k acodec=pcm_s16le threads=%threads;mov
|
||||
MPEG=qscale=4 ab=192k vcodec=mpeg2video acodec=mp2 threads=%threads;mpg
|
||||
|
||||
[proxy]
|
||||
x264=-vf scale=640:-1 -g 5 -crf 25 -ab 128k -vcodec libx264 -acodec libvorbis -preset veryfast;mov
|
||||
MPEG=-vf scale=640:-1 -g 5 -qscale 6 -ab 128k -vcodec mpeg2video -acodec mp2;mpg
|
||||
x264=-vf scale=960:-2 -g 1 -bf 0 -vb 0 -crf 20 -vcodec libx264 -ab 128k -acodec aac -preset veryfast;mov
|
||||
MPEG2=-vf scale=960:-2 -g 1 -bf 0 -vb 0 -qscale 6 -ab 128k -vcodec mpeg2video -acodec ac3;mpg
|
||||
MJPEG=-vf yadif,scale=960:-2 -qscale 3 -vcodec mjpeg -acodec pcm_s16le;mkv
|
||||
|
||||
[screengrab]
|
||||
X264 mute=-crf 25 -vcodec libx264 -preset veryfast -threads 0;mov
|
||||
X264 with audio=-i pulse -crf 25 -ab 192k -vcodec libx264 -acodec libvorbis -preset veryfast -threads 0;mov
|
||||
X264 with audio=-f pulse -i default -crf 25 -ab 192k -vcodec libx264 -acodec libvorbis -preset veryfast -threads 0;mov
|
||||
|
||||
[video4linux]
|
||||
x264=crf=25 ab=192k vcodec=libx264 acodec=libvorbis ab=192k preset=veryfast threads=%threads;mov
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
[Global]
|
||||
IconName=kdenlive
|
||||
Comment=Kdenlive
|
||||
Comment[ast]=Kdenlive
|
||||
Comment[ar]=كدينلايڤ
|
||||
Comment[bs]=Kdenlive
|
||||
Comment[ca]=Kdenlive
|
||||
Comment[ca@valencia]=Kdenlive
|
||||
@@ -12,6 +12,7 @@ Comment[el]=Kdenlive
|
||||
Comment[en_GB]=Kdenlive
|
||||
Comment[es]=Kdenlive
|
||||
Comment[et]=Kdenlive
|
||||
Comment[eu]=Kdenlive
|
||||
Comment[fi]=Kdenlive
|
||||
Comment[fr]=Kdenlive
|
||||
Comment[ga]=Kdenlive
|
||||
@@ -20,6 +21,7 @@ Comment[hu]=Kdenlive
|
||||
Comment[it]=Kdenlive
|
||||
Comment[ja]=Kdenlive
|
||||
Comment[km]=Kdenlive
|
||||
Comment[ko]=Kdenlive
|
||||
Comment[lt]=Kdenlive
|
||||
Comment[lv]=Kdenlive
|
||||
Comment[mr]=के-डि-एनलाइव्ह
|
||||
@@ -55,13 +57,15 @@ Name[el]=Η αποτύπωση ολοκληρώθηκε
|
||||
Name[en_GB]=Rendering finished
|
||||
Name[es]=Procesamiento finalizado
|
||||
Name[et]=Renderdamine on valmis
|
||||
Name[eu]=Errendatzea amaitu da
|
||||
Name[fi]=Renderöinti valmistui
|
||||
Name[fr]=Rendu terminé
|
||||
Name[gl]=Renderizado finalizado
|
||||
Name[gl]=Rematou a renderización
|
||||
Name[hu]=A renderelés befejeződött
|
||||
Name[it]=Esportazione terminata
|
||||
Name[ja]=レンダリングが完了しました
|
||||
Name[km]=បានបញ្ចប់ការបង្ហាញ
|
||||
Name[ko]=렌더링 완료됨
|
||||
Name[lt]=Atvaizdavimas baigtas
|
||||
Name[lv]=Renderēšana pabeigta
|
||||
Name[mr]=रेंडरींग पूर्ण झाले
|
||||
@@ -72,6 +76,7 @@ Name[pl]=Ukończono renderowanie
|
||||
Name[pt]=A geração terminou
|
||||
Name[pt_BR]=A renderização terminou
|
||||
Name[ro]=Randare încheiată
|
||||
Name[ru]=Рендеринг завершён
|
||||
Name[sk]=Renderovanie ukončené
|
||||
Name[sl]=Izrisovanje končano
|
||||
Name[sv]=Återgivning klar
|
||||
@@ -79,36 +84,39 @@ Name[tr]=Hazırlama tamamlandı
|
||||
Name[uk]=Обробку завершено
|
||||
Name[x-test]=xxRendering finishedxx
|
||||
Name[zh_CN]=渲染结束
|
||||
Name[zh_TW]=已完成導出
|
||||
Name[zh_TW]=已完成輸出
|
||||
Comment=Rendering is over
|
||||
Comment[ar]=قد انتهى التّصيير
|
||||
Comment[bs]=Iscrtavanje je gotovo
|
||||
Comment[ca]=La renderització ja ha acabat
|
||||
Comment[ca@valencia]=La renderització ja ha acabat
|
||||
Comment[cs]=Renderování je hotové
|
||||
Comment[cs]=Renderování je u konce
|
||||
Comment[da]=Renderingen er slut
|
||||
Comment[de]=Das Rendern ist beendet
|
||||
Comment[el]=Η αποτύπωση τελείωσε
|
||||
Comment[en_GB]=Rendering is over
|
||||
Comment[es]=El procesamiento ha finalizado
|
||||
Comment[et]=Renderdamine on valmis
|
||||
Comment[eu]=Errendatzea bukatu da
|
||||
Comment[fi]=Renderöinti on tehty
|
||||
Comment[fr]=Le rendu est terminé
|
||||
Comment[gl]=Rematou o renderizado
|
||||
Comment[gl]=Rematou a renderización
|
||||
Comment[hu]=A renderelésnek vége
|
||||
Comment[it]=L'esportazione è terminata
|
||||
Comment[ja]=レンダリングが終了しました
|
||||
Comment[km]=ការបង្ហាញបានចប់
|
||||
Comment[ko]=렌더링이 끝났음
|
||||
Comment[lt]=Atvaizdavimas baigtas
|
||||
Comment[lv]=Renderēšana ir beigusies
|
||||
Comment[mr]=रेंडरींग पूर्ण झाले आहे
|
||||
Comment[nb]=Ferdig med opptegning
|
||||
Comment[nl]=Weergave uitwerken is gereed
|
||||
Comment[nn]=Videorendering er ferdig
|
||||
Comment[pl]=Ukończono zostało zakończone
|
||||
Comment[pl]=Renderowanie zostało zakończone
|
||||
Comment[pt]=A geração terminou
|
||||
Comment[pt_BR]=A renderização foi terminada
|
||||
Comment[ro]=Randarea s-a încheiat
|
||||
Comment[ru]=Рендеринг завершён
|
||||
Comment[sk]=Renderovanie je skončené
|
||||
Comment[sl]=Izrisovanje je končano
|
||||
Comment[sv]=Återgivningen är gjord
|
||||
@@ -116,7 +124,7 @@ Comment[tr]=Hazırlama bitti
|
||||
Comment[uk]=Виконання обробки завершено
|
||||
Comment[x-test]=xxRendering is overxx
|
||||
Comment[zh_CN]=渲染结束
|
||||
Comment[zh_TW]=導出已結束
|
||||
Comment[zh_TW]=輸出已結束
|
||||
Action=Popup
|
||||
|
||||
[Event/RenderStarted]
|
||||
@@ -132,13 +140,15 @@ Name[el]=Η αποτύπωση ξεκίνησε
|
||||
Name[en_GB]=Rendering started
|
||||
Name[es]=Procesamiento inciado
|
||||
Name[et]=Renderdamist on alustatud
|
||||
Name[eu]=Errendatzea hasi da
|
||||
Name[fi]=Renderöinti aloitettu
|
||||
Name[fr]=Rendu démarré
|
||||
Name[gl]=Iniciado o renderizado
|
||||
Name[gl]=Comezou a renderización
|
||||
Name[hu]=A renderelés elkezdődött
|
||||
Name[it]=Esportazione avviata
|
||||
Name[ja]=レンダリングを開始しました
|
||||
Name[km]=ការបង្ហាញបានចាប់ផ្ដើម
|
||||
Name[ko]=렌더링 시작됨
|
||||
Name[lt]=Atvaizdavimas pradėtas
|
||||
Name[lv]=Renderēšana sākta
|
||||
Name[mr]=रेंडरींग सुरु झाले
|
||||
@@ -149,6 +159,7 @@ Name[pl]=Rozpoczęto renderowanie
|
||||
Name[pt]=A geração foi iniciada
|
||||
Name[pt_BR]=A renderização iniciou
|
||||
Name[ro]=Randarea începută
|
||||
Name[ru]=Рендеринг запущен
|
||||
Name[sk]=Renderovanie spustené
|
||||
Name[sl]=Izrisovanje začeto
|
||||
Name[sv]=Återgivning startad
|
||||
@@ -156,26 +167,28 @@ Name[tr]=Hazırlama başladı
|
||||
Name[uk]=Обробку розпочато
|
||||
Name[x-test]=xxRendering startedxx
|
||||
Name[zh_CN]=渲染开始
|
||||
Name[zh_TW]=導出已開始
|
||||
Name[zh_TW]=輸出已開始
|
||||
Comment=Rendering was started
|
||||
Comment[ar]=قد بدأ التّصيير
|
||||
Comment[bs]=Iscrtavanje je započelo
|
||||
Comment[ca]=La renderització ja ha començat
|
||||
Comment[ca@valencia]=La renderització ja ha començat
|
||||
Comment[cs]=Renderování bylo začato
|
||||
Comment[cs]=Vykreslování bylo zahájeno
|
||||
Comment[da]=Renderingen blev startet
|
||||
Comment[de]=Das Rendern wurde gestartet
|
||||
Comment[el]=Η αποτύπωση ξεκίνησε
|
||||
Comment[en_GB]=Rendering was started
|
||||
Comment[es]=El procesamiento ha sido iniciado
|
||||
Comment[et]=Renderdamist on alustatud
|
||||
Comment[eu]=Errendatzea abiarazia izan da
|
||||
Comment[fi]=Renderöinti aloitettiin
|
||||
Comment[fr]=Le rendu a démarré
|
||||
Comment[gl]=Vaise iniciar o renderizado
|
||||
Comment[gl]=Comezou a renderización
|
||||
Comment[hu]=A renderelés elkezdődött
|
||||
Comment[it]=L'esportazione è stata avviata
|
||||
Comment[ja]=レンダリングを開始しました
|
||||
Comment[km]=ការបង្ហាញត្រូវបានចាប់ផ្ដើម
|
||||
Comment[ko]=렌더링이 시작됨
|
||||
Comment[lt]=Atvaizdavimas buvo pradėtas
|
||||
Comment[lv]=Renderēšana tika palaista
|
||||
Comment[mr]=रेंडरींग सुरु झाले होते
|
||||
@@ -186,6 +199,7 @@ Comment[pl]=Renderowanie zostało rozpoczęte
|
||||
Comment[pt]=A geração foi iniciada
|
||||
Comment[pt_BR]=A renderização foi iniciada
|
||||
Comment[ro]=Randarea a început
|
||||
Comment[ru]=Рендеринг запущен
|
||||
Comment[sk]=Renderovanie bolo spustené
|
||||
Comment[sl]=Izrisovanje se je začelo
|
||||
Comment[sv]=Återgivningen har startats
|
||||
@@ -193,7 +207,7 @@ Comment[tr]=Hazırlama başlatıldı
|
||||
Comment[uk]=Було розпочато обробку
|
||||
Comment[x-test]=xxRendering was startedxx
|
||||
Comment[zh_CN]=渲染开始
|
||||
Comment[zh_TW]=導出已開始
|
||||
Comment[zh_TW]=輸出已開始
|
||||
Action=Popup
|
||||
|
||||
[Event/FrameCaptured]
|
||||
@@ -203,12 +217,13 @@ Name[bs]=Kadar uhvaćen
|
||||
Name[ca]=S'ha capturat un fotograma
|
||||
Name[ca@valencia]=S'ha capturat un fotograma
|
||||
Name[cs]=Snímek zachycen
|
||||
Name[da]=Billed indfanget
|
||||
Name[da]=Billede indfanget
|
||||
Name[de]=Bild aufgenommen
|
||||
Name[el]=Σύλληψη πλαισίου
|
||||
Name[en_GB]=Frame captured
|
||||
Name[es]=Fotograma capturado
|
||||
Name[et]=Kaader on salvestatud
|
||||
Name[eu]=Bilbe atzematea
|
||||
Name[fi]=Ruutu kaapattu
|
||||
Name[fr]=Cadre capturé
|
||||
Name[gl]=Fotograma capturado
|
||||
@@ -216,6 +231,7 @@ Name[hu]=Képkocka rögzítve
|
||||
Name[it]=Fotogramma acquisito
|
||||
Name[ja]=フレームをキャプチャしました
|
||||
Name[km]=បានចាប់យកស៊ុម
|
||||
Name[ko]=프레임 캡처됨
|
||||
Name[lt]=Kadras išsaugotas
|
||||
Name[lv]=Kadrs notverts
|
||||
Name[mr]=फ्रेम पकडली
|
||||
@@ -226,6 +242,7 @@ Name[pl]=Przechwycono klatkę
|
||||
Name[pt]=Imagem capturada
|
||||
Name[pt_BR]=Imagem capturada
|
||||
Name[ro]=Cadru captat
|
||||
Name[ru]=Кадр получен
|
||||
Name[sk]=Snímka zachytená
|
||||
Name[sl]=Sličica zajeta
|
||||
Name[sv]=Ram lagrad
|
||||
@@ -240,12 +257,13 @@ Comment[bs]=Kadar je uhvaćen na disk
|
||||
Comment[ca]=S'ha capturat i desat un fotograma al disc
|
||||
Comment[ca@valencia]=S'ha capturat i guardat un fotograma al disc
|
||||
Comment[cs]=Snímek byl zachycen na disk
|
||||
Comment[da]=Et billed blev indfanget til disken
|
||||
Comment[da]=Et billede blev indfanget til disken
|
||||
Comment[de]=Ein Bild wurde aufgenommen und auf die Festplatte gespeichert
|
||||
Comment[el]=Έγινε σύλληψη πλαισίου στο δίσκο
|
||||
Comment[en_GB]=A frame was captured to disk
|
||||
Comment[es]=Un fotograma fue capturado al disco
|
||||
Comment[et]=Kaader on kettale salvestatud
|
||||
Comment[eu]=Bilbe bat atzeman da diskora
|
||||
Comment[fi]=Ruutu kaapattiin levylle
|
||||
Comment[fr]=Un cadre a été capturé sur le disque
|
||||
Comment[gl]=Capturouse un fotograma para o disco
|
||||
@@ -253,6 +271,7 @@ Comment[hu]=Egy képkocka rögzítésre került a lemezre
|
||||
Comment[it]=È stato acquisito un fotogramma sul disco
|
||||
Comment[ja]=フレームをディスクにキャプチャしました
|
||||
Comment[km]=ស៊ុមត្រូវបានចាប់យកទៅកាន់ថាស
|
||||
Comment[ko]=프레임이 디스크에 캡처됨
|
||||
Comment[lt]=Kadras buvo išsaugotas į diską
|
||||
Comment[lv]=Kadrs tika notverts diskā
|
||||
Comment[mr]=फ्रेम डिस्कवर पकडली
|
||||
@@ -263,6 +282,7 @@ Comment[pl]=Klatka została przechwycona na dysk
|
||||
Comment[pt]=Foi capturada uma imagem para o disco
|
||||
Comment[pt_BR]=Foi capturada uma imagem para o disco
|
||||
Comment[ro]=Un cadru a fost captat pe disc
|
||||
Comment[ru]=Выполнен захват кадра с сохранением на диск
|
||||
Comment[sk]=Snímka bola uložená na disk
|
||||
Comment[sl]=Sličica je bila zajeta na disk
|
||||
Comment[sv]=En ram har lagrats på disk
|
||||
@@ -287,6 +307,7 @@ Name[el]=Έτοιμο για σύλληψη
|
||||
Name[en_GB]=Ready to capture
|
||||
Name[es]=Listo para capturar
|
||||
Name[et]=Salvestamiseks valmis
|
||||
Name[eu]=Atzemateko prest
|
||||
Name[fi]=Valmiina kaappaamaan
|
||||
Name[fr]=Prêt pour la capture
|
||||
Name[gl]=Listo para a captura
|
||||
@@ -294,6 +315,7 @@ Name[hu]=Kezdődhet a rögzítés
|
||||
Name[it]=Pronto per la registrazione
|
||||
Name[ja]=キャプチャ準備完了
|
||||
Name[km]=រួចរាល់ដើម្បីចាប់យក
|
||||
Name[ko]=캡처 준비
|
||||
Name[lt]=Pasiruošęs išsaugoti
|
||||
Name[lv]=Gatavs notveršanai
|
||||
Name[mr]=पकडण्याकरिता तयार
|
||||
@@ -304,6 +326,7 @@ Name[pl]=Gotowy do przechwycenia
|
||||
Name[pt]=Pronto para capturar
|
||||
Name[pt_BR]=Pronto para capturar
|
||||
Name[ro]=Gata de captare
|
||||
Name[ru]=Готов к захвату
|
||||
Name[sk]=Pripravené na zachytenie
|
||||
Name[sl]=Pripravljen na zajem
|
||||
Name[sv]=Klar att lagra
|
||||
@@ -328,6 +351,7 @@ Name[el]=Σφάλμα
|
||||
Name[en_GB]=Error
|
||||
Name[es]=Error
|
||||
Name[et]=Tõrge
|
||||
Name[eu]=Errorea
|
||||
Name[fi]=Virhe
|
||||
Name[fr]=Erreur
|
||||
Name[ga]=Earráid
|
||||
@@ -336,6 +360,7 @@ Name[hu]=Hiba
|
||||
Name[it]=Errore
|
||||
Name[ja]=エラー
|
||||
Name[km]=កំហុស
|
||||
Name[ko]=오류
|
||||
Name[lt]=Klaida
|
||||
Name[lv]=Kļūda
|
||||
Name[mr]=त्रुटी
|
||||
@@ -355,27 +380,30 @@ Name[tr]=Hata
|
||||
Name[ug]=خاتالىق
|
||||
Name[uk]=Помилка
|
||||
Name[x-test]=xxErrorxx
|
||||
Name[zh_CN]=错误
|
||||
Name[zh_CN]=误差
|
||||
Name[zh_TW]=錯誤
|
||||
Comment=An error occurred in Kdenlive
|
||||
Comment[ar]=حدث خطأ في «كدينلايڤ»
|
||||
Comment[bs]=Desila se greška u KDenlive
|
||||
Comment[ca]=S'ha produït un error al Kdenlive
|
||||
Comment[ca@valencia]=S'ha produït un error al Kdenlive
|
||||
Comment[cs]=V Kdenlive došlo k chybě
|
||||
Comment[da]=En fejl opstod i Kdenlive
|
||||
Comment[da]=Der opstod en fejl i Kdenlive
|
||||
Comment[de]=In Kdenlive ist ein Fehler aufgetreten
|
||||
Comment[el]=Εμφανίστηκε σφάλμα στο Kdenlive
|
||||
Comment[en_GB]=An error occurred in Kdenlive
|
||||
Comment[es]=Ha ocurrido un error en Kdenlive
|
||||
Comment[et]=Kdenlive'is tekkis tõrge
|
||||
Comment[eu]=Errore bat gertatu da Kdenliven
|
||||
Comment[fi]=Kdenlivessä ilmeni virhe
|
||||
Comment[fr]=Une erreur est survenue dans Kdenlive
|
||||
Comment[ga]=Tharla earráid in Kdenlive
|
||||
Comment[gl]=Aconteceu un erro en Kdenlive
|
||||
Comment[gl]=Ocorreu un erro en Kdenlive
|
||||
Comment[hu]=Hiba történt a Kdenlive-ban
|
||||
Comment[it]=Si è verificato un errore in Kdenlive
|
||||
Comment[ja]=Kdenlive 内でエラーが発生
|
||||
Comment[km]=មានកំហុសបានកើតឡើងនៅក្នុង Kdenlive
|
||||
Comment[ko]=Kdenlive에서 오류가 발생함
|
||||
Comment[lt]=Įvyko Kdenlive klaida
|
||||
Comment[lv]=Programmā Kdenlive radās kļūda
|
||||
Comment[mr]=के-डि-एनलाइव्ह मध्ये त्रुटी निर्माण झाली
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
[KNewStuff2]
|
||||
ProvidersUrl=https://kdenlive.org/data/mltprofilesources.xml
|
||||
TargetDir=kdenlive/profiles
|
||||
Uncompress=archive
|
||||
|
||||
[KNewStuff3]
|
||||
ProvidersUrl=https://kdenlive.org/data/mltprofilesources.xml
|
||||
TargetDir=kdenlive/profiles
|
||||
Uncompress=archive
|
||||
|
||||
@@ -1,17 +1,34 @@
|
||||
[KNewStuff2]
|
||||
ProvidersUrl=https://kdenlive.org/data/rendersources.xml
|
||||
TargetDir=kdenlive/export
|
||||
Uncompress=archive
|
||||
|
||||
[KNewStuff3]
|
||||
Name=Kdenlive Render Profiles
|
||||
Name[ar]=لاحات «كدينلايڤ» للتّصيير
|
||||
Name[ca]=Perfils de renderització del Kdenlive
|
||||
Name[ca@valencia]=Perfils de renderització del Kdenlive
|
||||
Name[cs]=Profily renderování Kdenlive
|
||||
Name[da]=Kdenlive-renderingsprofiler
|
||||
Name[de]=Kdenlive-Render-Profile
|
||||
Name[el]=Προφίλ αποτύπωσης του Kdenlive
|
||||
Name[en_GB]=Kdenlive Render Profiles
|
||||
Name[es]=Perfiles de procesamiento de Kdenlive
|
||||
Name[eu]=Kdenlive errendatze profilak
|
||||
Name[fi]=Kdenliven hahmonnusprofiilit
|
||||
Name[fr]=Profils de rendu Kdenlive
|
||||
Name[gl]=Perfís de renderización de Kdenlive
|
||||
Name[it]=Profilo di resa di Kdenlive
|
||||
Name[ko]=Kdenlive 렌더 속성
|
||||
Name[nl]=Renderprofielen van Kdenlive
|
||||
Name[nn]=Render-profilar for Kdenlive
|
||||
Name[pl]=Profile renderowania Kdenlive
|
||||
Name[pt]=Perfis de Visualização do Kdenlive
|
||||
Name[pt_BR]=Perfis de visualização do Kdenlive
|
||||
Name[ru]=Профили рендеринга Kdenlive
|
||||
Name[sk]=Vykresľovacie profily Kdenline
|
||||
Name[sl]=Izrisovalni profili za Kdenlive
|
||||
Name[sv]=Kdenlive-återgivningsprofiler
|
||||
Name[tr]=Kdenlive İşleme Profilleri
|
||||
Name[uk]=Профілі обробки Kdenlive
|
||||
Name[x-test]=xxKdenlive Render Profilesxx
|
||||
Name[zh_CN]=Kdenlive 渲染配置文件
|
||||
Name[zh_TW]=Kdenlive 繪製設定檔
|
||||
ProvidersUrl=http://download.kde.org/ocs/providers.xml
|
||||
Categories=Kdenlive Export Profiles
|
||||
TargetDir=kdenlive/export
|
||||
|
||||
@@ -1,17 +1,34 @@
|
||||
[KNewStuff2]
|
||||
ProvidersUrl=https://kdenlive.org/data/titletemplates.xml
|
||||
TargetDir=kdenlive/titles
|
||||
Uncompress=archive
|
||||
|
||||
[KNewStuff3]
|
||||
Name=Kdenlive Title Templates
|
||||
Name[ar]=قوالب «كدينلايڤ» للعناوين
|
||||
Name[ca]=Plantilles de títol del Kdenlive
|
||||
Name[ca@valencia]=Plantilles de títol del Kdenlive
|
||||
Name[cs]=Šablony titulků Kdenlive
|
||||
Name[da]=Kdenlive-titelskabeloner
|
||||
Name[de]=Kdenlive-Titelvorlagen
|
||||
Name[el]=Πρότυπα τίτλων του Kdenlive
|
||||
Name[en_GB]=Kdenlive Title Templates
|
||||
Name[es]=Plantillas de título de Kdenlive
|
||||
Name[eu]=Kdenlive titulu txantiloiak
|
||||
Name[fi]=Kdenliven otsikkopohjat
|
||||
Name[fr]=Modèles de titre Kdenlive
|
||||
Name[gl]=Modelos de título de Kdenlive
|
||||
Name[it]=Modelli di titolo di Kdenlive
|
||||
Name[ko]=Kdenlive 타이틀 속성
|
||||
Name[nl]=Titelsjablonen van Kdenlive
|
||||
Name[nn]=Tittelmalar for Kdenlive
|
||||
Name[pl]=Szablony tytułów Kdenlive
|
||||
Name[pt]=Perfis de Títulos do Kdenlive
|
||||
Name[pt_BR]=Modelos de títulos do Kdenlive
|
||||
Name[ru]=Шаблоны титров Kdenlive
|
||||
Name[sk]=Šablóny dlaždíc Kdenlive
|
||||
Name[sl]=Predloge naslovov za Kdenlive
|
||||
Name[sv]=Kdenlive-titelmallar
|
||||
Name[tr]=Kdenlive Başlık Şablonları
|
||||
Name[uk]=Шаблони титрів Kdenlive
|
||||
Name[x-test]=xxKdenlive Title Templatesxx
|
||||
Name[zh_CN]=Kdenlive 标题模板
|
||||
Name[zh_TW]=Kdenlive 標題範本
|
||||
ProvidersUrl=http://download.kde.org/ocs/providers.xml
|
||||
Categories=Kdenlive Title Templates
|
||||
TargetDir=kdenlive/titles
|
||||
|
||||
@@ -1,18 +1,35 @@
|
||||
[KNewStuff2]
|
||||
ProvidersUrl=http://download.kde.org/khotnewstuff/kdenlive-providers.xml
|
||||
TargetDir=kdenlive/lumas
|
||||
Uncompress=archive
|
||||
|
||||
[KNewStuff3]
|
||||
Name=Kdenlive Transition Wipes
|
||||
Name[ar]=أشرطة «كدينلايڤ» الانتقاليّة
|
||||
Name[ca]=Cortinetes de transició del Kdenlive
|
||||
Name[ca@valencia]=Cortinetes de transició del Kdenlive
|
||||
Name[cs]=Přechod stírání Kdenlive
|
||||
Name[da]=Kdenlive-overgangsvifter
|
||||
Name[de]=Kdenlive-Übergangs-Wipes
|
||||
Name[el]=Μετάβαση με σκούπισμα στο Kdenlive
|
||||
Name[en_GB]=Kdenlive Transition Wipes
|
||||
Name[es]=Barridos de transición de Kdenlive
|
||||
Name[eu]=Kdenlive trantsizio gortinak
|
||||
Name[fi]=Kdenliven siirtymäpyyhkäisyt
|
||||
Name[fr]=Transitions par balayage de Kdenlive
|
||||
Name[gl]=Borrados de transición de Kdenlive
|
||||
Name[it]=Tendine di transizione di Kdenlive
|
||||
Name[ko]=Kdenlive 트랜지션 전환
|
||||
Name[nl]=Overgangsvegen van Kdenlive
|
||||
Name[nn]=Overgangseffektar for Kdenlive
|
||||
Name[pl]=Przejścia Kdenlive
|
||||
Name[pt]=Varrimentos de Transição do Kdenlive
|
||||
Name[pt_BR]=Limpeza de transição do Kdenlive
|
||||
Name[ru]=Эффекты смены кадров Kdenlive
|
||||
Name[sk]=Zahladenia prechodov Kdenlive
|
||||
Name[sl]=Obrisi prehodov za Kdenlive
|
||||
Name[sv]=Kdenlive-övergångar
|
||||
Name[tr]=Kdenlive Geçiş Ekranları
|
||||
Name[uk]=Перехідні витирання Kdenlive
|
||||
Name[x-test]=xxKdenlive Transition Wipesxx
|
||||
Name[zh_CN]=Kdenlive 过渡擦除
|
||||
Name[zh_TW]=Kdenlive 過渡 Wipes
|
||||
ProvidersUrl=http://download.kde.org/ocs/providers.xml
|
||||
Categories=Kdenlive FX
|
||||
TargetDir=kdenlive/lumas
|
||||
TargetDir=kdenlive/lumas/HD
|
||||
Uncompress=archive
|
||||
|
||||
@@ -48,12 +48,12 @@ Item {
|
||||
height: root.profile.y * root.scaley
|
||||
anchors.centerIn: parent
|
||||
visible: root.showSafezone
|
||||
|
||||
property color overlayColor: 'cyan'
|
||||
Rectangle {
|
||||
id: safezone
|
||||
objectName: "safezone"
|
||||
color: "transparent"
|
||||
border.color: "cyan"
|
||||
border.color: frame.overlayColor
|
||||
width: parent.width * 0.9
|
||||
height: parent.height * 0.9
|
||||
anchors.centerIn: parent
|
||||
@@ -61,11 +61,51 @@ Item {
|
||||
id: safetext
|
||||
objectName: "safetext"
|
||||
color: "transparent"
|
||||
border.color: "cyan"
|
||||
border.color: frame.overlayColor
|
||||
width: frame.width * 0.8
|
||||
height: frame.height * 0.8
|
||||
anchors.centerIn: parent
|
||||
}
|
||||
Rectangle {
|
||||
color: frame.overlayColor
|
||||
width: frame.width / 20
|
||||
height: 1
|
||||
anchors.centerIn: parent
|
||||
}
|
||||
Rectangle {
|
||||
color: frame.overlayColor
|
||||
height: frame.width / 20
|
||||
width: 1
|
||||
anchors.centerIn: parent
|
||||
}
|
||||
Rectangle {
|
||||
color: frame.overlayColor
|
||||
height: frame.height / 11
|
||||
width: 1
|
||||
y: 0
|
||||
x: parent.width / 2
|
||||
}
|
||||
Rectangle {
|
||||
color: frame.overlayColor
|
||||
height: frame.height / 11
|
||||
width: 1
|
||||
y: parent.height -height
|
||||
x: parent.width / 2
|
||||
}
|
||||
Rectangle {
|
||||
color: frame.overlayColor
|
||||
width: frame.width / 11
|
||||
height: 1
|
||||
y: parent.height / 2
|
||||
x: 0
|
||||
}
|
||||
Rectangle {
|
||||
color: frame.overlayColor
|
||||
width: frame.width / 11
|
||||
height: 1
|
||||
y: parent.height / 2
|
||||
x: parent.width -width
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
<group list="volume,normalise,gain,ladspa.1049,ladspa.1048,ladspa.1413,mute">
|
||||
<text>Audio correction</text>
|
||||
</group>
|
||||
<group list="audiobalance,audiopan,gain,swapchannels,ladspa.1406,channelcopy">
|
||||
<group list="audiobalance,audiopan,swapchannels,ladspa.1406,channelcopy">
|
||||
<text>Audio channels</text>
|
||||
</group>
|
||||
<group list="audiowave,audiospectrum,frei0r.pr0be,frei0r.pr0file,frei0r.rgbparade,frei0r.timeout,frei0r.vectorscope">
|
||||
|
||||
@@ -47,11 +47,12 @@ Item {
|
||||
height: root.profile.y * root.scaley
|
||||
anchors.centerIn: parent
|
||||
visible: root.showSafezone
|
||||
property color overlayColor: 'cyan'
|
||||
Rectangle {
|
||||
id: safezone
|
||||
objectName: "safezone"
|
||||
color: "transparent"
|
||||
border.color: "cyan"
|
||||
border.color: frame.overlayColor
|
||||
width: parent.width * 0.9
|
||||
height: parent.height * 0.9
|
||||
anchors.centerIn: parent
|
||||
@@ -59,11 +60,51 @@ Item {
|
||||
id: safetext
|
||||
objectName: "safetext"
|
||||
color: "transparent"
|
||||
border.color: "cyan"
|
||||
border.color: frame.overlayColor
|
||||
width: frame.width * 0.8
|
||||
height: frame.height * 0.8
|
||||
anchors.centerIn: parent
|
||||
}
|
||||
Rectangle {
|
||||
color: frame.overlayColor
|
||||
width: frame.width / 20
|
||||
height: 1
|
||||
anchors.centerIn: parent
|
||||
}
|
||||
Rectangle {
|
||||
color: frame.overlayColor
|
||||
height: frame.width / 20
|
||||
width: 1
|
||||
anchors.centerIn: parent
|
||||
}
|
||||
Rectangle {
|
||||
color: frame.overlayColor
|
||||
height: frame.height / 11
|
||||
width: 1
|
||||
y: 0
|
||||
x: parent.width / 2
|
||||
}
|
||||
Rectangle {
|
||||
color: frame.overlayColor
|
||||
height: frame.height / 11
|
||||
width: 1
|
||||
y: parent.height -height
|
||||
x: parent.width / 2
|
||||
}
|
||||
Rectangle {
|
||||
color: frame.overlayColor
|
||||
width: frame.width / 11
|
||||
height: 1
|
||||
y: parent.height / 2
|
||||
x: 0
|
||||
}
|
||||
Rectangle {
|
||||
color: frame.overlayColor
|
||||
width: frame.width / 11
|
||||
height: 1
|
||||
y: parent.height / 2
|
||||
x: parent.width -width
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ Item {
|
||||
property string comment
|
||||
property string framenum
|
||||
property rect framesize
|
||||
property rect adjustedFrame
|
||||
property point profile
|
||||
property point center
|
||||
property double zoom
|
||||
@@ -16,6 +17,7 @@ Item {
|
||||
property double scaley
|
||||
property double offsetx : 0
|
||||
property double offsety : 0
|
||||
property double lockratio : -1
|
||||
onScalexChanged: canvas.requestPaint()
|
||||
onScaleyChanged: canvas.requestPaint()
|
||||
onOffsetxChanged: canvas.requestPaint()
|
||||
@@ -224,7 +226,7 @@ Item {
|
||||
color: "transparent"
|
||||
border.color: "#ffff0000"
|
||||
Rectangle {
|
||||
id: "tlhandle"
|
||||
id: tlhandle
|
||||
anchors {
|
||||
top: parent.top
|
||||
left: parent.left
|
||||
@@ -240,24 +242,45 @@ Item {
|
||||
anchors.centerIn: parent
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.SizeFDiagCursor
|
||||
onEntered: { tlhandle.color = '#ffff00'}
|
||||
onExited: { tlhandle.color = '#ff0000'}
|
||||
onEntered: {
|
||||
if (!pressed) {
|
||||
tlhandle.color = '#ffff00'
|
||||
}
|
||||
}
|
||||
onExited: {
|
||||
if (!pressed) {
|
||||
tlhandle.color = '#ff0000'
|
||||
}
|
||||
}
|
||||
onPressed: {
|
||||
oldMouseX = mouseX
|
||||
oldMouseY = mouseY
|
||||
effectsize.visible = true
|
||||
tlhandle.color = '#ffff00'
|
||||
}
|
||||
onPositionChanged: {
|
||||
if (pressed) {
|
||||
framesize.x = (framerect.x + (mouseX - oldMouseX) - frame.x) / root.scalex;
|
||||
framesize.width = (framerect.width - (mouseX - oldMouseX)) / root.scalex;
|
||||
framesize.y = (framerect.y + (mouseY - oldMouseY) - frame.y) / root.scaley;
|
||||
framesize.height = (framerect.height - (mouseY - oldMouseY)) / root.scaley;
|
||||
if (root.lockratio > 0) {
|
||||
var delta = Math.max(mouseX - oldMouseX, mouseY - oldMouseY)
|
||||
var newwidth = framerect.width - delta
|
||||
adjustedFrame = framesize
|
||||
adjustedFrame.width = Math.round(newwidth / root.scalex);
|
||||
adjustedFrame.height = Math.round(adjustedFrame.width / root.lockratio)
|
||||
adjustedFrame.y = (framerect.y - frame.y) / root.scaley + framesize.height - adjustedFrame.height;
|
||||
adjustedFrame.x = (framerect.x - frame.x) / root.scalex + framesize.width - adjustedFrame.width;
|
||||
framesize = adjustedFrame
|
||||
} else {
|
||||
framesize.x = (framerect.x + (mouseX - oldMouseX) - frame.x) / root.scalex;
|
||||
framesize.width = (framerect.width - (mouseX - oldMouseX)) / root.scalex;
|
||||
framesize.y = (framerect.y + (mouseY - oldMouseY) - frame.y) / root.scaley;
|
||||
framesize.height = (framerect.height - (mouseY - oldMouseY)) / root.scaley;
|
||||
}
|
||||
root.effectChanged()
|
||||
}
|
||||
}
|
||||
onReleased: {
|
||||
effectsize.visible = false
|
||||
tlhandle.color = '#ff0000'
|
||||
}
|
||||
}
|
||||
Text {
|
||||
@@ -273,7 +296,7 @@ Item {
|
||||
}
|
||||
}
|
||||
Rectangle {
|
||||
id: "trhandle"
|
||||
id: trhandle
|
||||
anchors {
|
||||
top: parent.top
|
||||
right: parent.right
|
||||
@@ -289,28 +312,48 @@ Item {
|
||||
anchors.centerIn: parent
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.SizeBDiagCursor
|
||||
onEntered: { trhandle.color = '#ffff00'}
|
||||
onExited: { trhandle.color = '#ff0000'}
|
||||
onEntered: {
|
||||
if (!pressed) {
|
||||
trhandle.color = '#ffff00'
|
||||
}
|
||||
}
|
||||
onExited: {
|
||||
if (!pressed) {
|
||||
trhandle.color = '#ff0000'
|
||||
}
|
||||
}
|
||||
onPressed: {
|
||||
oldMouseX = mouseX
|
||||
oldMouseY = mouseY
|
||||
effectsize.visible = true
|
||||
trhandle.color = '#ffff00'
|
||||
}
|
||||
onPositionChanged: {
|
||||
if (pressed) {
|
||||
framesize.width = (framerect.width + (mouseX - oldMouseX)) / root.scalex;
|
||||
framesize.y = (framerect.y + (mouseY - oldMouseY) - frame.y) / root.scaley;
|
||||
framesize.height = (framerect.height - (mouseY - oldMouseY)) / root.scaley;
|
||||
if (root.lockratio > 0) {
|
||||
var delta = Math.max(oldMouseX - mouseX, mouseY - oldMouseY)
|
||||
var newwidth = framerect.width - delta
|
||||
adjustedFrame = framesize
|
||||
adjustedFrame.width = Math.round(newwidth / root.scalex);
|
||||
adjustedFrame.height = Math.round(adjustedFrame.width / root.lockratio)
|
||||
adjustedFrame.y = (framerect.y - frame.y) / root.scaley + framesize.height - adjustedFrame.height;
|
||||
framesize = adjustedFrame
|
||||
} else {
|
||||
framesize.width = (framerect.width + (mouseX - oldMouseX)) / root.scalex;
|
||||
framesize.y = (framerect.y + (mouseY - oldMouseY) - frame.y) / root.scaley;
|
||||
framesize.height = (framerect.height - (mouseY - oldMouseY)) / root.scaley;
|
||||
}
|
||||
root.effectChanged()
|
||||
}
|
||||
}
|
||||
onReleased: {
|
||||
effectsize.visible = false
|
||||
trhandle.color = '#ff0000'
|
||||
}
|
||||
}
|
||||
}
|
||||
Rectangle {
|
||||
id: "blhandle"
|
||||
id: blhandle
|
||||
anchors {
|
||||
bottom: parent.bottom
|
||||
left: parent.left
|
||||
@@ -326,28 +369,46 @@ Item {
|
||||
anchors.centerIn: parent
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.SizeBDiagCursor
|
||||
onEntered: { blhandle.color = '#ffff00'}
|
||||
onExited: { blhandle.color = '#ff0000'}
|
||||
onEntered: {
|
||||
if (!pressed) {
|
||||
blhandle.color = '#ffff00'
|
||||
}
|
||||
}
|
||||
onExited: {
|
||||
if (!pressed) {
|
||||
blhandle.color = '#ff0000'
|
||||
}
|
||||
}
|
||||
onPressed: {
|
||||
oldMouseX = mouseX
|
||||
oldMouseY = mouseY
|
||||
effectsize.visible = true
|
||||
blhandle.color = '#ffff00'
|
||||
}
|
||||
onPositionChanged: {
|
||||
if (pressed) {
|
||||
framesize.x = (framerect.x + (mouseX - oldMouseX) - frame.x) / root.scalex;
|
||||
framesize.width = (framerect.width - (mouseX - oldMouseX)) / root.scalex;
|
||||
framesize.height = (framerect.height + (mouseY - oldMouseY)) / root.scaley;
|
||||
if (root.lockratio > 0) {
|
||||
var delta = Math.max(mouseX - oldMouseX, oldMouseY - mouseY)
|
||||
var newwidth = framerect.width - delta
|
||||
framesize.x = (framerect.x + (framerect.width - newwidth) - frame.x) / root.scalex;
|
||||
framesize.width = Math.round(newwidth / root.scalex);
|
||||
framesize.height = Math.round(framesize.width / root.lockratio)
|
||||
} else {
|
||||
framesize.x = (framerect.x + (mouseX - oldMouseX) - frame.x) / root.scalex;
|
||||
framesize.width = (framerect.width - (mouseX - oldMouseX)) / root.scalex;
|
||||
framesize.height = (framerect.height + (mouseY - oldMouseY)) / root.scaley;
|
||||
}
|
||||
root.effectChanged()
|
||||
}
|
||||
}
|
||||
onReleased: {
|
||||
effectsize.visible = false
|
||||
blhandle.color = '#ff0000'
|
||||
}
|
||||
}
|
||||
}
|
||||
Rectangle {
|
||||
id: "brhandle"
|
||||
id: brhandle
|
||||
anchors {
|
||||
bottom: parent.bottom
|
||||
right: parent.right
|
||||
@@ -363,22 +424,39 @@ Item {
|
||||
anchors.centerIn: parent
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.SizeFDiagCursor
|
||||
onEntered: { brhandle.color = '#ffff00'}
|
||||
onExited: { brhandle.color = '#ff0000'}
|
||||
onEntered: {
|
||||
if (!pressed) {
|
||||
brhandle.color = '#ffff00'
|
||||
}
|
||||
}
|
||||
onExited: {
|
||||
if (!pressed) {
|
||||
brhandle.color = '#ff0000'
|
||||
}
|
||||
}
|
||||
onPressed: {
|
||||
oldMouseX = mouseX
|
||||
oldMouseY = mouseY
|
||||
effectsize.visible = true
|
||||
brhandle.color = '#ffff00'
|
||||
}
|
||||
onPositionChanged: {
|
||||
if (pressed) {
|
||||
framesize.width = (framerect.width + (mouseX - oldMouseX)) / root.scalex;
|
||||
framesize.height = (framerect.height + (mouseY - oldMouseY)) / root.scaley;
|
||||
if (root.lockratio > 0) {
|
||||
var delta = Math.max(oldMouseX - mouseX, oldMouseY - mouseY)
|
||||
var newwidth = framerect.width - delta
|
||||
framesize.width = Math.round(newwidth / root.scalex);
|
||||
framesize.height = Math.round(framesize.width / root.lockratio)
|
||||
} else {
|
||||
framesize.width = (framerect.width + (mouseX - oldMouseX)) / root.scalex;
|
||||
framesize.height = (framerect.height + (mouseY - oldMouseY)) / root.scaley;
|
||||
}
|
||||
root.effectChanged()
|
||||
}
|
||||
}
|
||||
onReleased: {
|
||||
effectsize.visible = false
|
||||
brhandle.color = '#ff0000'
|
||||
}
|
||||
}
|
||||
Text {
|
||||
|
||||
@@ -1,12 +1,14 @@
|
||||
.\" This file was generated by kdemangen.pl
|
||||
.TH KDENLIVE 1 "Nov 2008" "K Desktop Environment" "An open source video editor."
|
||||
.TH Kdenlive 1 "Aug 2018" "KDE" "An open source video editor."
|
||||
.SH NAME
|
||||
kdenlive \- An open source non\-linear video editor.
|
||||
.SH SYNOPSIS
|
||||
kdenlive [Qt\-options] [KDE\-options] [options] [file]
|
||||
.SH DESCRIPTION
|
||||
Kdenlive is an open source non\-linear video editor which supports a
|
||||
large number of formats for editing, including DV, AVCHD (experimental support) and HDV. Kdenlive relies on several other open source projects, such as FFmpeg and MLT video framework.
|
||||
large number of formats for editing.
|
||||
It relies on several other open source projects,
|
||||
such as FFmpeg and MLT video framework.
|
||||
.SH OPTIONS
|
||||
.SS
|
||||
.SS Arguments:
|
||||
@@ -17,6 +19,9 @@ Document to open
|
||||
.TP
|
||||
.B \-\-mlt\-path <path>
|
||||
Set the path for MLT environnement
|
||||
.TP
|
||||
.B \-\-mlt\-log <verbose/debug>
|
||||
Set MLT log level
|
||||
.SS
|
||||
.SS Generic options:
|
||||
.TP
|
||||
@@ -46,7 +51,7 @@ End of options
|
||||
.SS
|
||||
.SS KDE options:
|
||||
.TP
|
||||
.B \-\-caption <caption>
|
||||
.B \-\-qwindowtitle <caption>
|
||||
Use 'caption' as name in the titlebar
|
||||
.TP
|
||||
.B \-\-icon <icon>
|
||||
@@ -148,11 +153,9 @@ the result of calling melt, ffmpeg, etc. This can be used for debugging.
|
||||
.SH SEE ALSO
|
||||
.BR kdenlive_render (1).
|
||||
Please see the homepage at
|
||||
.BR http://www.kdenlive.org/
|
||||
.BR https://www.kdenlive.org/
|
||||
.br
|
||||
.SH AUTHORS
|
||||
.nf
|
||||
Jean\-Baptiste Mardelle <jb@kdenlive.org>
|
||||
.br
|
||||
Marco Gittler <g.marco@freenet.de>
|
||||
.br
|
||||
|
||||
@@ -4,25 +4,30 @@
|
||||
<metadata_license>CC0-1.0</metadata_license>
|
||||
<project_license>GPL-2.0+</project_license>
|
||||
<name>Kdenlive</name>
|
||||
<name xml:lang="ast">Kdenlive</name>
|
||||
<name xml:lang="ar">كدينلايڤ</name>
|
||||
<name xml:lang="bs">Kdenlive</name>
|
||||
<name xml:lang="ca">Kdenlive</name>
|
||||
<name xml:lang="ca-valencia">Kdenlive</name>
|
||||
<name xml:lang="cs">Kdenlive</name>
|
||||
<name xml:lang="da">Kdenlive</name>
|
||||
<name xml:lang="de">Kdenlive</name>
|
||||
<name xml:lang="el">Kdenlive</name>
|
||||
<name xml:lang="en-GB">Kdenlive</name>
|
||||
<name xml:lang="es">Kdenlive</name>
|
||||
<name xml:lang="et">Kdenlive</name>
|
||||
<name xml:lang="eu">Kdenlive</name>
|
||||
<name xml:lang="fi">Kdenlive</name>
|
||||
<name xml:lang="fr">Kdenlive</name>
|
||||
<name xml:lang="gl">Kdenlive</name>
|
||||
<name xml:lang="id">Kdenlive</name>
|
||||
<name xml:lang="it">Kdenlive</name>
|
||||
<name xml:lang="ko">Kdenlive</name>
|
||||
<name xml:lang="nl">Kdenlive</name>
|
||||
<name xml:lang="nn">Kdenlive</name>
|
||||
<name xml:lang="pl">Kdenlive</name>
|
||||
<name xml:lang="pt">Kdenlive</name>
|
||||
<name xml:lang="pt-BR">Kdenlive</name>
|
||||
<name xml:lang="ru">Kdenlive</name>
|
||||
<name xml:lang="sk">Kdenlive</name>
|
||||
<name xml:lang="sl">Kdenlive</name>
|
||||
<name xml:lang="sv">Kdenlive</name>
|
||||
@@ -36,21 +41,26 @@
|
||||
<summary xml:lang="bs">Video uređivač</summary>
|
||||
<summary xml:lang="ca">Editor de vídeo</summary>
|
||||
<summary xml:lang="ca-valencia">Editor de vídeo</summary>
|
||||
<summary xml:lang="cs">Editor videí</summary>
|
||||
<summary xml:lang="cs">Editor videa</summary>
|
||||
<summary xml:lang="da">Videoredigering</summary>
|
||||
<summary xml:lang="de">Video-Editor</summary>
|
||||
<summary xml:lang="el">Επεξεργαστής βίντεο</summary>
|
||||
<summary xml:lang="en-GB">Video Editor</summary>
|
||||
<summary xml:lang="es">Editor de video</summary>
|
||||
<summary xml:lang="et">Videoredaktor</summary>
|
||||
<summary xml:lang="eu">Bideo editorea</summary>
|
||||
<summary xml:lang="fi">Videoeditori</summary>
|
||||
<summary xml:lang="fr">Éditeur vidéo</summary>
|
||||
<summary xml:lang="gl">Editor de vídeo</summary>
|
||||
<summary xml:lang="id">Editor Video</summary>
|
||||
<summary xml:lang="it">Editor video</summary>
|
||||
<summary xml:lang="ko">동영상 편집기</summary>
|
||||
<summary xml:lang="nl">Videobewerker</summary>
|
||||
<summary xml:lang="nn">Videoredigering</summary>
|
||||
<summary xml:lang="pl">Edytor wideo</summary>
|
||||
<summary xml:lang="pt">Editor de Vídeo</summary>
|
||||
<summary xml:lang="pt-BR">Editor de Vídeo</summary>
|
||||
<summary xml:lang="ru">Видеоредактор</summary>
|
||||
<summary xml:lang="sk">Editor videa</summary>
|
||||
<summary xml:lang="sl">Urejevalnik videa</summary>
|
||||
<summary xml:lang="sv">Videoeditor</summary>
|
||||
@@ -61,16 +71,23 @@
|
||||
<summary xml:lang="zh-TW">影像編輯器</summary>
|
||||
<description>
|
||||
<p>Kdenlive is a non linear video editor. It is based on the MLT framework and accepts many audio and video formats, allows you to add effects, transitions and render into the format of your choice.</p>
|
||||
<p xml:lang="ar">«كدينلايڤ» هو محرّر فيديوهات غير خطّي. بُني على إطار عمل MLT ويقبل العديد من نُسق الصّوت والفيديو. كما ويسمح بإضافة التّأثيرات والانتقالات.</p>
|
||||
<p xml:lang="ca">El Kdenlive és un editor no lineal de vídeo. Està basat en l'entorn de treball MLT i accepta molts formats d'àudio i vídeo, permetent afegir efectes, transicions i representacions en el format de la vostra elecció.</p>
|
||||
<p xml:lang="ca-valencia">El Kdenlive és un editor no lineal de vídeo. Està basat en l'entorn de treball MLT i accepta molts formats d'àudio i vídeo, permetent afegir efectes, transicions i representacions en el format de la vostra elecció.</p>
|
||||
<p xml:lang="cs">Kdenlive je nelineární video editor. Je založený na frameworku MLT a přehrává mnoho zvukových a video formátů, umožňuje přidat efekty, přechody a renderuje do formátu podle vašeho výběru.</p>
|
||||
<p xml:lang="da">Kdenlive er et ikke-lineært videoredigeringsprogram. Det er baseret på MLT-framework og accepterer mange lyd- og videoformater, som giver dig mulighed for at tilføje effekter, overgange og rendere i det format du ønsker.</p>
|
||||
<p xml:lang="de">Kdenlive ist ein Video-Editor für nichtlinearen Schnitt. Es basiert auf MLT und verarbeitet viele Audio- und Video-Formate. Sie können Effekte und Übergänge benutzen und in Formate Ihrer Wahl umwandeln.</p>
|
||||
<p xml:lang="el">Το Kdenlive είναι ένας μη γραμμικός επεξεργαστής βίντεο. Βασίζεται στο πλαίσιο εργασίας MLT και δέχεται πολλούς τύπους ήχου και βίντεο, επιτρέπει την προσθήκη εφέ, μεταβάσεων και αποτύπωσης στον τύπο αποθήκευσης της επιλογής σας.</p>
|
||||
<p xml:lang="en-GB">Kdenlive is a non linear video editor. It is based on the MLT framework and accepts many audio and video formats, allows you to add effects, transitions and render into the format of your choice.</p>
|
||||
<p xml:lang="es">Kdenlive es un editor no lineal de video. Está basado en la infraestructura MLT y acepta numerosos formatos de audio y video, permitiendo agregar efectos, transiciones y procesar el video final en el formato deseado.</p>
|
||||
<p xml:lang="et">Kdenline on mittelineaarne videoredaktor. See tugineb MLT raamistikule ja võimaldab tarvitada paljusid heli- ja videovorminguid, lisada efekte ja üleminekuid ning renderdada tulemuse vajalikku vormingusse.</p>
|
||||
<p xml:lang="eu">Kdenlive bideo editore ez-linear bat da. MLT azpiegituran oinarritua dago eta audio eta bideo formatu asko onartzen ditu, efektuak gehitzeko aukera eskaintzen dizu, trantsizioak eta zuk nahi duzun formatuan errendatzea.</p>
|
||||
<p xml:lang="fi">Kdenlive on epälineaarinen videoeditori. Se perustuu MLT-frameworkiin ja toimii monen eri ääni- ja videoformaatin kanssa. Voit lisätä efektejä ja siirtymiä, sekä renderöidä projektin haluamaasi tiedostomuotoon.</p>
|
||||
<p xml:lang="fr">Kdenlive est un éditeur vidéo non-linéaire. Il est basé sur le moteur MLT et accèpte de nombreux formats audio et vidéos, permet d'ajouter des effets et transitions, et exporte le rendu dans le format de votre choix.</p>
|
||||
<p xml:lang="fr">Kdenlive est un éditeur vidéo non-linéaire. Il utilise le moteur MLT et accèpte de nombreux formats audio et vidéos, permet d'ajouter des effets et transitions, et exporte le rendu dans le format de votre choix.</p>
|
||||
<p xml:lang="gl">Kdenlive é un editor de vídeo non lineal. Está baseado na infraestrutura MLT e permite moitos formatos de son e vídeo, e permite engadir efectos, engadir transicións, e exportar en calquera formato.</p>
|
||||
<p xml:lang="id">Kdenlive adalah sebuah editor video non linier. Ia berdasarkan pada MLT framework dan menerima berbagai format audio dan video, yang memungkinkan kamu untuk menambahkan efek, transisi, dan render ke dalam format yang kamu pilih.</p>
|
||||
<p xml:lang="it">Kdenlive è un editor video non lineare. È basato sull'infrastruttura MLT e accetta numerosi formati audio e video, consente di aggiungere effetti, transizioni e produrre il formato che si desidera.</p>
|
||||
<p xml:lang="ko">Kdenlive는 비선형 동영상 편집기입니다. MLT 프레임워크를 사용하며 여러 음악 및 동영상 형식을 지원하고, 효과 및 트랜지션을 추가할 수 있으며, 원하는 형식으로 렌더링할 수 있습니다.</p>
|
||||
<p xml:lang="nl">Kdenlive is een niet lineaire videobewerker. Het is gebaseerd op het MLT-framework en accepteert vele audio- en video-formaten, biedt de mogelijkheid effecten en overgangen toe te voegen en om te zetten naar het formaat van uw keuze.</p>
|
||||
<p xml:lang="nn">Kdenlive er eit program for ikkje-lineær videoredigering. Det er basert på MLT-rammeverket og støttar mange ulike video- og lydformat. Du kan leggja til spesialeffektar og overgangar, og eksportera til ulike filformat.</p>
|
||||
<p xml:lang="pl">Kdenlive jest nieliniowym edytorem wideo. Oparty jest na szkielecie MLT i może pracować na wielu formatach obrazu i dźwięku, umożliwia dodawanie efektów, przejść i renderowanie ich do dowolnego formatu.</p>
|
||||
@@ -92,18 +109,23 @@
|
||||
<p xml:lang="cs">Vlastnosti:</p>
|
||||
<p xml:lang="da">Funktioner:</p>
|
||||
<p xml:lang="de">Funktionen:</p>
|
||||
<p xml:lang="el">Χαρακτηριστικά:</p>
|
||||
<p xml:lang="en-GB">Features:</p>
|
||||
<p xml:lang="es">Características:</p>
|
||||
<p xml:lang="et">Omadused:</p>
|
||||
<p xml:lang="eu">Eginbideak:</p>
|
||||
<p xml:lang="fi">Ominaisuuksia:</p>
|
||||
<p xml:lang="fr">Fonctionnalités :</p>
|
||||
<p xml:lang="gl">Funcionalidades:</p>
|
||||
<p xml:lang="id">Fitur:</p>
|
||||
<p xml:lang="it">Funzionalità:</p>
|
||||
<p xml:lang="ko">기능:</p>
|
||||
<p xml:lang="nl">Mogelijkheden:</p>
|
||||
<p xml:lang="nn">Funksjonar:</p>
|
||||
<p xml:lang="pl">Możliwości:</p>
|
||||
<p xml:lang="pt">Funcionalidades:</p>
|
||||
<p xml:lang="pt-BR">Funcionalidades:</p>
|
||||
<p xml:lang="ru">Возможности:</p>
|
||||
<p xml:lang="sk">Funkcie:</p>
|
||||
<p xml:lang="sl">Zmožnosti:</p>
|
||||
<p xml:lang="sv">Funktioner:</p>
|
||||
@@ -114,16 +136,23 @@
|
||||
<p xml:lang="zh-TW">功能:</p>
|
||||
<ul>
|
||||
<li>Intuitive multitrack interface.</li>
|
||||
<li xml:lang="ar">واجهة متعدّدة المسارات بديهيّة.</li>
|
||||
<li xml:lang="ca">Interfície multipista intuïtiva.</li>
|
||||
<li xml:lang="ca-valencia">Interfície multipista intuïtiva.</li>
|
||||
<li xml:lang="cs">Intuitivní vícepohledové rozhraní.</li>
|
||||
<li xml:lang="da">Intuitiv multispor-grænseflade.</li>
|
||||
<li xml:lang="de">Intuitive Mehrspur-Benutzeroberfläche.</li>
|
||||
<li xml:lang="el">Διαισθητική πολυκάναλη διεπαφή.</li>
|
||||
<li xml:lang="en-GB">Intuitive multitrack interface.</li>
|
||||
<li xml:lang="es">Interfaz multipista intuitiva.</li>
|
||||
<li xml:lang="et">Hõlpsasti mõistetav mitme paneeliga liides</li>
|
||||
<li xml:lang="eu">Intuiziozko aztarna-anitzeko interfazea.</li>
|
||||
<li xml:lang="fi">Selkeä moniraitainen käyttöliittymä</li>
|
||||
<li xml:lang="fr">Interface multipiste intuitive.</li>
|
||||
<li xml:lang="gl">Interface intuitiva con varias pistas.</li>
|
||||
<li xml:lang="id">Antarmuka multitrack yang intuitif.</li>
|
||||
<li xml:lang="it">Interfaccia multitraccia intuitiva.</li>
|
||||
<li xml:lang="ko">사용하기 편한 다중 트랙 인터페이스.</li>
|
||||
<li xml:lang="nl">Intuïtief interface met meerdere tracks.</li>
|
||||
<li xml:lang="nn">Intuitivt fleirsporsgrensesnitt.</li>
|
||||
<li xml:lang="pl">Intuicyjny interfejs wielościeżkowy.</li>
|
||||
@@ -141,14 +170,20 @@
|
||||
<li xml:lang="ar">تأثيرات وانتقالات عديدة.</li>
|
||||
<li xml:lang="ca">Molts efectes i transicions.</li>
|
||||
<li xml:lang="ca-valencia">Molts efectes i transicions.</li>
|
||||
<li xml:lang="cs">Spousta efektů a přechodů.</li>
|
||||
<li xml:lang="da">Mange effekter og overgange.</li>
|
||||
<li xml:lang="de">Viele Effekte und Übergänge.</li>
|
||||
<li xml:lang="el">Πολλά εφέ και μεταβάσεις.</li>
|
||||
<li xml:lang="en-GB">Many effects and transitions.</li>
|
||||
<li xml:lang="es">Muchos efectos y transiciones.</li>
|
||||
<li xml:lang="et">Palju efekte ja üleminekuid</li>
|
||||
<li xml:lang="eu">Efektu eta trantsizio ugari.</li>
|
||||
<li xml:lang="fi">Monia erilaisia efektejä ja siirtymiä</li>
|
||||
<li xml:lang="fr">Nombreux effets et transitions.</li>
|
||||
<li xml:lang="gl">Moitos efectos e transicións.</li>
|
||||
<li xml:lang="id">Banyak efek dan transisi.</li>
|
||||
<li xml:lang="it">Numerosi effetti e transizioni.</li>
|
||||
<li xml:lang="ko">다양한 효과와 트랜지션.</li>
|
||||
<li xml:lang="nl">Veel effecten en overgangen.</li>
|
||||
<li xml:lang="nn">Mange effektar og overgangar.</li>
|
||||
<li xml:lang="pl">Wiele efektów i przejść.</li>
|
||||
@@ -166,14 +201,20 @@
|
||||
<li xml:lang="ar">نطاقات الألوان</li>
|
||||
<li xml:lang="ca">Àmbits de color</li>
|
||||
<li xml:lang="ca-valencia">Àmbits de color</li>
|
||||
<li xml:lang="cs">Rozsahy barev</li>
|
||||
<li xml:lang="da">Farveskoper</li>
|
||||
<li xml:lang="de">Farbbereiche</li>
|
||||
<li xml:lang="el">Εμβέλειες χρωμάτων</li>
|
||||
<li xml:lang="en-GB">Colour scopes</li>
|
||||
<li xml:lang="es">Indicadores de color</li>
|
||||
<li xml:lang="et">Värviskoobid</li>
|
||||
<li xml:lang="eu">Kolore esparruak</li>
|
||||
<li xml:lang="fi">Väriavaruuksien säätömahdollisuus</li>
|
||||
<li xml:lang="fr">Graphes des couleurs</li>
|
||||
<li xml:lang="gl">Ámbitos de cores.</li>
|
||||
<li xml:lang="id">Cakupan warna</li>
|
||||
<li xml:lang="it">Diagrammi di colore</li>
|
||||
<li xml:lang="ko">색상 범위</li>
|
||||
<li xml:lang="nl">Kleurreeksen</li>
|
||||
<li xml:lang="nn">Fargeskop</li>
|
||||
<li xml:lang="pl">Zakresy barw</li>
|
||||
@@ -191,14 +232,20 @@
|
||||
<li xml:lang="ar">مُرشد DVD أساسيّ</li>
|
||||
<li xml:lang="ca">Assistent bàsic per als DVD</li>
|
||||
<li xml:lang="ca-valencia">Assistent bàsic per als DVD</li>
|
||||
<li xml:lang="cs">Základní průvodce DVD</li>
|
||||
<li xml:lang="da">Grundlæggende dvd-guide</li>
|
||||
<li xml:lang="de">Einfacher DVD-Assistent</li>
|
||||
<li xml:lang="el">Βασικός οδηγός DVD</li>
|
||||
<li xml:lang="en-GB">Basic DVD Wizard</li>
|
||||
<li xml:lang="es">Asistente básico de DVD</li>
|
||||
<li xml:lang="et">Lihtne DVD nõustaja</li>
|
||||
<li xml:lang="eu">Oinarrizko DVD morroia</li>
|
||||
<li xml:lang="fi">Yksinkertainen DVD:n luonti</li>
|
||||
<li xml:lang="fr">Assistant DVD de base</li>
|
||||
<li xml:lang="gl">Asistente básico para DVD</li>
|
||||
<li xml:lang="id">Dasar Asisten DVD</li>
|
||||
<li xml:lang="it">Procedura guidata di base DVD</li>
|
||||
<li xml:lang="ko">기본 DVD 마법사</li>
|
||||
<li xml:lang="nl">Basis dvd-assistent</li>
|
||||
<li xml:lang="nn">Enkel DVD-vegvisar</li>
|
||||
<li xml:lang="pl">Pomocnik podstawowego DVD</li>
|
||||
@@ -214,12 +261,37 @@
|
||||
<li xml:lang="zh-TW">基本 DVD 精靈</li>
|
||||
</ul>
|
||||
</description>
|
||||
<releases>
|
||||
<release date="2018-12-13" version="18.12.0"/>
|
||||
</releases>
|
||||
<url type="homepage">https://kdenlive.org/</url>
|
||||
<url type="bugtracker">https://bugs.kde.org</url>
|
||||
<url type="help">https://userbase.kde.org/Kdenlive/Manual</url>
|
||||
<url type="donation">https://www.kde.org/community/donations/?app=kdenlive&source=appdata</url>
|
||||
<screenshots>
|
||||
<screenshot type="source">
|
||||
<image>https://kdenlive.org/wp-content/data/kdenlive-screenshot.png</image>
|
||||
<caption>Kdenlive 18.08</caption>
|
||||
<caption xml:lang="ca">Kdenlive 18.08</caption>
|
||||
<caption xml:lang="ca-valencia">Kdenlive 18.08</caption>
|
||||
<caption xml:lang="cs">Kdenlive 18.08</caption>
|
||||
<caption xml:lang="de">Kdenlive 18.08</caption>
|
||||
<caption xml:lang="en-GB">Kdenlive 18.08</caption>
|
||||
<caption xml:lang="es">Kdenlive 18.08</caption>
|
||||
<caption xml:lang="fi">Kdenlive 18.08</caption>
|
||||
<caption xml:lang="fr">Kdenlive 18.08</caption>
|
||||
<caption xml:lang="gl">Kdenlive 18.08</caption>
|
||||
<caption xml:lang="id">Kdenlive 18.08</caption>
|
||||
<caption xml:lang="it">Kdenlive 18.08</caption>
|
||||
<caption xml:lang="nl">Kdenlive 18.08</caption>
|
||||
<caption xml:lang="pl">Kdenlive 18.08</caption>
|
||||
<caption xml:lang="pt">Kdenlive 18.08</caption>
|
||||
<caption xml:lang="pt-BR">Kdenlive 18.08</caption>
|
||||
<caption xml:lang="sv">Kdenlive 18.08</caption>
|
||||
<caption xml:lang="uk">Kdenlive 18.08</caption>
|
||||
<caption xml:lang="x-test">xxKdenlive 18.08xx</caption>
|
||||
<caption xml:lang="zh-CN">Kdenlive 18.08</caption>
|
||||
<caption xml:lang="zh-TW">Kdenlive 18.08</caption>
|
||||
<image>https://cdn.kde.org/screenshots/kdenlive/screenshot-monitors.png</image>
|
||||
</screenshot>
|
||||
</screenshots>
|
||||
<project_group>KDE</project_group>
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
# KDE Config File
|
||||
[Desktop Entry]
|
||||
Name=Kdenlive
|
||||
Name[ar]=كدينلايڤ
|
||||
Name[bs]=Kdenlive
|
||||
Name[ca]=Kdenlive
|
||||
Name[ca@valencia]=Kdenlive
|
||||
@@ -11,6 +12,7 @@ Name[el]=Kdenlive
|
||||
Name[en_GB]=Kdenlive
|
||||
Name[es]=Kdenlive
|
||||
Name[et]=Kdenlive
|
||||
Name[eu]=Kdenlive
|
||||
Name[fi]=Kdenlive
|
||||
Name[fr]=Kdenlive
|
||||
Name[ga]=Kdenlive
|
||||
@@ -19,6 +21,7 @@ Name[hu]=Kdenlive
|
||||
Name[it]=Kdenlive
|
||||
Name[ja]=Kdenlive
|
||||
Name[km]=Kdenlive
|
||||
Name[ko]=Kdenlive
|
||||
Name[lt]=Kdenlive
|
||||
Name[lv]=Kdenlive
|
||||
Name[mr]=के-डि-एनलाइव्ह
|
||||
@@ -45,13 +48,14 @@ GenericName[ar]=محرّر فيديوهات
|
||||
GenericName[bs]=Video uređivač
|
||||
GenericName[ca]=Editor de vídeo
|
||||
GenericName[ca@valencia]=Editor de vídeo
|
||||
GenericName[cs]=Editor videí
|
||||
GenericName[cs]=Editor videa
|
||||
GenericName[da]=Videoredigering
|
||||
GenericName[de]=Video-Editor
|
||||
GenericName[el]=Επεξεργαστής βίντεο
|
||||
GenericName[en_GB]=Video Editor
|
||||
GenericName[es]=Editor de video
|
||||
GenericName[et]=Videoredaktor
|
||||
GenericName[eu]=Bideo editorea
|
||||
GenericName[fi]=Videomuokkain
|
||||
GenericName[fr]=Éditeur vidéo
|
||||
GenericName[ga]=Eagarthóir Físe
|
||||
@@ -60,6 +64,7 @@ GenericName[hu]=Videoszerkesztő
|
||||
GenericName[it]=Editor video
|
||||
GenericName[ja]=ビデオエディタ
|
||||
GenericName[km]=កម្មវិធីកែសម្រួលវីដេអូ
|
||||
GenericName[ko]=동영상 편집기
|
||||
GenericName[lt]=Video redaktorius
|
||||
GenericName[lv]=Video redaktors
|
||||
GenericName[mr]=व्हिडीओ संपादक
|
||||
@@ -79,45 +84,36 @@ GenericName[uk]=Відеоредактор
|
||||
GenericName[x-test]=xxVideo Editorxx
|
||||
GenericName[zh_CN]=视频编辑器
|
||||
GenericName[zh_TW]=影像編輯器
|
||||
Comment=Nonlinear video editor for KDE
|
||||
Comment[ar]=محرّر فيديوهات غير خطّيّ لكدي
|
||||
Comment[bs]=Nelinearni video uređivač za KDE
|
||||
Comment[ca]=Editor de vídeo no lineal per al KDE
|
||||
Comment[ca@valencia]=Editor de vídeo no lineal per al KDE
|
||||
Comment[cs]=Nelineární editor videí pro KDE
|
||||
Comment[da]=Ikke-lineær videoredigering til KDE
|
||||
Comment[de]=Nichtlinearer Video-Editor für KDE
|
||||
Comment[el]=Μη γραμμικός επεξεργαστής βίντεο για το KDE
|
||||
Comment[en_GB]=Nonlinear video editor for KDE
|
||||
Comment[es]=Editor no lineal de video para KDE
|
||||
Comment[et]=KDE mittelineaarne videoredaktor
|
||||
Comment[fi]=Epälineaarinen videomuokkain KDE:lle
|
||||
Comment[fr]=Éditeur vidéo non linéaire pour KDE
|
||||
Comment[gl]=Editor de vídeo non linear para KDE
|
||||
Comment[hu]=Nemlineáris videoszerkesztő a KDE-hez
|
||||
Comment[it]=Editor di video non lineare per KDE
|
||||
Comment[ja]=KDE 向けノンリニアビデオエディタ
|
||||
Comment[km]=កម្មវិធីកែសម្រួលវីដេអូមិនលីនេអ៊ែរសម្រាប់ KDE
|
||||
Comment[lt]=Nelinijinis veido redaktorius skirtas KDE
|
||||
Comment[lv]=Nelineārais video redaktors KDE videi
|
||||
Comment[mr]=केडीई करिता अरेषीय व्हिडीओ संपादक
|
||||
Comment[nb]=Videoredigeringsprogram for KDE med dataklipping
|
||||
Comment[nl]=Niet-lineaire video-bewerker voor KDE
|
||||
Comment=Nonlinear video editor by KDE
|
||||
Comment[ar]=محرّر فيديوهات غير خطّيّ من كدي
|
||||
Comment[ca]=Editor de vídeo no lineal, creat per la comunitat KDE
|
||||
Comment[ca@valencia]=Editor de vídeo no lineal, creat per la comunitat KDE
|
||||
Comment[cs]=Nelineární editor videa od KDE
|
||||
Comment[da]=Ikke-lineært videoredigeringsprogram af KDE
|
||||
Comment[de]=Nichtlinearer Video-Editor von KDE
|
||||
Comment[el]=Μη γραμμικός επεξεργαστής βίντεο από το KDE
|
||||
Comment[en_GB]=Non-linear video editor by KDE
|
||||
Comment[es]=Editor no lineal de video de KDE
|
||||
Comment[eu]=KDEren bideo editore ez-lineala
|
||||
Comment[fi]=KDE:n epälineaarinen videomuokkain
|
||||
Comment[fr]=Éditeur vidéo non linéaire par KDE
|
||||
Comment[gl]=Editor de vídeo non lineal por KDE
|
||||
Comment[it]=Editor di video non lineare di KDE
|
||||
Comment[ko]=KDE의 비선형 동영상 편집기
|
||||
Comment[nl]=Niet-lineaire video-bewerker door KDE
|
||||
Comment[nn]=Program for ikkje-lineær videoredigering
|
||||
Comment[pl]=Nieliniowy edytor wideo dla KDE
|
||||
Comment[pt]=Editor de vídeo não-linear para o KDE
|
||||
Comment[pt_BR]=Editor de vídeo não-linear para o KDE
|
||||
Comment[ro]=Redactor de imagini neliniar pentru KDE
|
||||
Comment[pl]=Nieliniowy edytor wideo w ramach KDE
|
||||
Comment[pt]=Editor de vídeo não-linear do KDE
|
||||
Comment[pt_BR]=Editor de vídeo não-linear do KDE
|
||||
Comment[ru]=Нелинейный видеоредактор от KDE
|
||||
Comment[sk]=Nelineárny editor videa pre KDE
|
||||
Comment[sl]=Ne-linearni urejevalnik videa za KDE
|
||||
Comment[sv]=Icke-linjär videoeditor för KDE
|
||||
Comment[sl]=Ne-linearni urejevalnik videa s strani KDE
|
||||
Comment[sv]=Icke-linjär videoeditor av KDE
|
||||
Comment[tr]=KDE için doğrusal olmayan video düzenleyici
|
||||
Comment[ug]=KDE ئۈچۈن سىزىقسىز سىن تەھرىرلىگۈچ
|
||||
Comment[uk]=Нелінійний редактор відео для KDE
|
||||
Comment[x-test]=xxNonlinear video editor for KDExx
|
||||
Comment[zh_CN]=KDE 的非线性视频编辑器
|
||||
Comment[zh_TW]=KDE 上的非線性影像編輯器
|
||||
Comment[uk]=Нелінійний редактор відео від KDE
|
||||
Comment[x-test]=xxNonlinear video editor by KDExx
|
||||
Comment[zh_CN]=KDE 推出的非线性视频编辑器
|
||||
Comment[zh_TW]=來自 KDE 的非線性影像編輯器
|
||||
Type=Application
|
||||
Exec=kdenlive %U
|
||||
Icon=kdenlive
|
||||
@@ -127,25 +123,32 @@ Terminal=false
|
||||
MimeType=application/x-kdenlive;
|
||||
Categories=Qt;KDE;AudioVideo;AudioVideoEditing;
|
||||
Keywords=editing;video;audio;mlt;kde;
|
||||
Keywords[ar]=تحرير;فيديو;صوت;كدي;واجهة;مسارات;تعدد;
|
||||
Keywords[ca]=edició;vídeo;àudio;mlt;kde;
|
||||
Keywords[ca@valencia]=edició;vídeo;àudio;mlt;kde;
|
||||
Keywords[cs]=úprava;video;zvuk;mlt;kde;
|
||||
Keywords[da]=redigering;video;lyd;mlt;kde;
|
||||
Keywords[de]=Editing;Bearbeitung;Schnitt;Videoschnitt;Video;Audio;MLT;
|
||||
Keywords[el]=επεξεργασία;βίντεο;ήχος;mlt;kde;
|
||||
Keywords[en_GB]=editing;video;audio;mlt;kde;
|
||||
Keywords[es]=edición;video;audio;mlt;kde;
|
||||
Keywords[et]=redigeerimine;muutmine;video;audio;heli;mlt;kde;
|
||||
Keywords[eu]=editatzea;bideoa;audioa;mlt;kde;
|
||||
Keywords[fi]=editing;video;audio;mlt;kde;editointi;ääni;
|
||||
Keywords[fr]=montage;vidéo;audio;mlt;kde;
|
||||
Keywords[gl]=editing;edición;video;vídeo;audio;son;mlt;kde;
|
||||
Keywords[it]=editing;video;audio;mlt;kde;
|
||||
Keywords[ko]=editing;video;audio;mlt;kde;편집;비디오;오디오;동영상;음악;
|
||||
Keywords[nl]=bewerken;video;audio;mlt;kde;
|
||||
Keywords[nn]=redigering;video;lyd;mlt;kde;
|
||||
Keywords[pl]=edytowanie;video;wideo;filmy;audio;dźwięk;mlt;kde;
|
||||
Keywords[pt]=edição;vídeo;áudio;MLT;kde;
|
||||
Keywords[pt_BR]=edição;vídeo;áudio;mlt;kde;
|
||||
Keywords[ru]=editing;video;audio;редактирование;видео;аудио;mlt;kde;
|
||||
Keywords[sk]=editovanie;video;audio;mlt;kde;
|
||||
Keywords[sl]=urejanje;video;zvok;mlt;kde;
|
||||
Keywords[sv]=redigering;video;ljud;mlt;kde;
|
||||
Keywords[tr]=editing;video;audio;mlt;kde;
|
||||
Keywords[uk]=editing;video;audio;mlt;kde;редагування;відео;звук;аудіо;млт;кдє;
|
||||
Keywords[x-test]=xxeditingxx;xxvideoxx;xxaudioxx;xxmltxx;xxkdexx;
|
||||
Keywords[zh_CN]=editing;video;audio;mlt;kde;编辑;视频;音频;
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
|
||||
<mime-type type="application/x-kdenlive">
|
||||
<comment>Kdenlive video project document</comment>
|
||||
<comment xml:lang="ast">Documentu de proyeutu de videu Kdenlive</comment>
|
||||
<comment xml:lang="ar">مستند مشروع «كدينلايڤ» ڤديوهيّ</comment>
|
||||
<comment xml:lang="bs">Kdenlive video projekt dokument</comment>
|
||||
<comment xml:lang="ca">document de projecte de vídeo del Kdenlive</comment>
|
||||
<comment xml:lang="ca@valencia">document de projecte de vídeo del Kdenlive</comment>
|
||||
@@ -13,6 +13,7 @@
|
||||
<comment xml:lang="en_GB">Kdenlive video project document</comment>
|
||||
<comment xml:lang="es">Documento de proyecto de video de Kdenlive</comment>
|
||||
<comment xml:lang="et">Kdenlive'i videoprojekti dokument</comment>
|
||||
<comment xml:lang="eu">Kdenlive bideo proiektu dokumentua</comment>
|
||||
<comment xml:lang="fi">Kdenlive-videoprojektitiedosto</comment>
|
||||
<comment xml:lang="fr">Projet vidéo Kdenlive</comment>
|
||||
<comment xml:lang="gl">Documento dun proxecto de vídeo de Kdenlive</comment>
|
||||
@@ -36,6 +37,7 @@
|
||||
</mime-type>
|
||||
<mime-type type="application/x-kdenlivetitle">
|
||||
<comment>Kdenlive video title</comment>
|
||||
<comment xml:lang="ar">عنوان «كدينلايڤ» ڤديوهيّ</comment>
|
||||
<comment xml:lang="bs">Kdenlive video naslov</comment>
|
||||
<comment xml:lang="ca">títol de vídeo del Kdenlive</comment>
|
||||
<comment xml:lang="ca@valencia">títol de vídeo del Kdenlive</comment>
|
||||
@@ -46,6 +48,7 @@
|
||||
<comment xml:lang="en_GB">Kdenlive video title</comment>
|
||||
<comment xml:lang="es">Título de video de Kdenlive</comment>
|
||||
<comment xml:lang="et">Kdenlive'i videotiitel</comment>
|
||||
<comment xml:lang="eu">Kdenlive video izenburua</comment>
|
||||
<comment xml:lang="fi">Kdenlive-video-otsikko</comment>
|
||||
<comment xml:lang="fr">Titre vidéo Kdenlive</comment>
|
||||
<comment xml:lang="gl">Título de vídeo de Kdenlive</comment>
|
||||
@@ -6,6 +6,9 @@
|
||||
<parameter type="animatedrect" name="rect" default="0 0 %width %height 1">
|
||||
<name>Rectangle</name>
|
||||
</parameter>
|
||||
<parameter type="animated" name="rotation" max="360" min="-360" default="0" notintimeline="1">
|
||||
<name>Rotation</name>
|
||||
</parameter>
|
||||
<parameter type="list" name="compositing" default="0" paramlist="0;11;12;13;14;15;16;17;18;19;20;21;22;23;24;25;26;27;28;29;6;8">
|
||||
<paramlistdisplay>Alpha blend,Xor,Plus,Multiply,Screen,Overlay,Darken,Lighten,Color dodge,Color burn,Hard light,Soft light,Difference,Exclusion,Bitwise or,Bitwise and,Bitwise xor,Bitwise nor,Bitwise nand,Bitwise not xor,Destination in,Destination out</paramlistdisplay>
|
||||
<name>Compositing</name>
|
||||
@@ -13,5 +16,8 @@
|
||||
<parameter type="bool" name="distort" default="0" min="0" max="1">
|
||||
<name>Distort</name>
|
||||
</parameter>
|
||||
<parameter type="bool" name="rotate_center" default="1" min="0" max="1">
|
||||
<name>Rotate from center</name>
|
||||
</parameter>
|
||||
</transition>
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 35 KiB |
|
Before Width: | Height: | Size: 238 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 50 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 249 KiB |
|
Before Width: | Height: | Size: 313 KiB |
|
Before Width: | Height: | Size: 35 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 7.6 KiB |
|
Before Width: | Height: | Size: 41 KiB |
|
Before Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 3.5 KiB |
@@ -16,8 +16,8 @@
|
||||
<!-- TRANS:ROLES_OF_TRANSLATORS -->
|
||||
</authorgroup>
|
||||
<legalnotice>&FDLNotice;</legalnotice>
|
||||
<date>2011-06-17</date>
|
||||
<releaseinfo>0.8.2</releaseinfo>
|
||||
<date>2018-10-27</date>
|
||||
<releaseinfo>Applications 18.12</releaseinfo>
|
||||
<abstract>
|
||||
<para></para>
|
||||
</abstract>
|
||||
@@ -27,16 +27,17 @@
|
||||
<keyword>video</keyword>
|
||||
</keywordset>
|
||||
</bookinfo>
|
||||
<!--userbase <timestamp>2011-06-17T15:39:59Z</timestamp>-->
|
||||
<!--userbase <timestamp>2018-10-27T11:21:38Z</timestamp>-->
|
||||
|
||||
<!--userbase-content-->
|
||||
<chapter id="creating-a-new-project"><title>Creating a new project</title>
|
||||
<chapter id="quick-start"><title>Quick Start</title>
|
||||
<sect1 id="creating-a-new-project"><title>Creating a new project</title>
|
||||
<para>
|
||||
<screenshot>
|
||||
<screeninfo></screeninfo>
|
||||
<mediaobject>
|
||||
<imageobject>
|
||||
<imagedata fileref="Kdenlive_Quickstart-Folder-Structure.png" format="PNG"/>
|
||||
<imagedata fileref="kdenlive_quickstart-folder-structure.png" format="PNG"/>
|
||||
</imageobject>
|
||||
<textobject>
|
||||
<phrase>Kdenlive directory structure</phrase>
|
||||
@@ -45,16 +46,20 @@
|
||||
<para>Kdenlive directory structure</para>
|
||||
</caption>
|
||||
</mediaobject>
|
||||
</screenshot></para>
|
||||
<para>The first step is creating a new (empty) folder for our new project. I will call it <filename>quickstart-tutorial/</filename> in this tutorial. Then get some sample video clips, or download them from here:<ulink url="http://granjow.net/uploads/kdenlive/manual/kdenlive-tutorial-videos-2011-avi.tar.bz2">kdenlive-tutorial-videos-2011-avi.tar.bz2</ulink> (7 MB)<footnote><para>If you prefer Theora (which you probably don’t since Ogg Video usually causes problems), you can alternatively download <ulink url="http://granjow.net/uploads/kdenlive/manual/kdenlive-tutorial-videos-2011-ogv.tar.bz2">kdenlive-tutorial-videos-2011-ogv.tar.bz2</ulink>.</para></footnote>, and extract them to ⪚ a <filename>quickstart-tutorial/Videos/</filename> subfolder inside the project folder.</para>
|
||||
<para>The image on the left shows the suggested directory structure: Each project has its own directory, with video files in the <filename>Videos</filename> subdirectory, audio files in the <filename>Audio</filename> directory, &etc; (<ulink url="http://userbase.kde.org/Special:myLanguage/Kdenlive/Manual/Projects_and_Files#File_Structure">read more</ulink>)</para>
|
||||
<para>(The tutorial from now on assumes that you use the sample videos provided, but it works with any.)</para>
|
||||
</screenshot>
|
||||
</para>
|
||||
<para>The first step is creating a new (empty) folder for our new project. I will call it <filename>quickstart-tutorial/</filename> in this tutorial. Then get some sample video clips, or download them from here:<ulink url="http://granjow.net/uploads/kdenlive/manual/kdenlive-tutorial-videos-2011-avi.tar.bz2">kdenlive-tutorial-videos-2011-avi.tar.bz2</ulink> (7 MB)<footnote><para>If you prefer Theora (which you probably don’t since Ogg Video usually causes problems), you can alternatively download <ulink url="http://granjow.net/uploads/kdenlive/manual/kdenlive-tutorial-videos-2011-ogv.tar.bz2">kdenlive-tutorial-videos-2011-ogv.tar.bz2</ulink>.</para></footnote>, and extract them to ⪚ a <filename>quickstart-tutorial/Videos/</filename> subfolder inside the project folder.
|
||||
</para>
|
||||
<para>The image on the left shows the suggested directory structure: Each project has its own directory, with video files in the <filename>Videos</filename> subdirectory, audio files in the <filename>Audio</filename> directory, &etc; (<ulink url="http://userbase.kde.org/Special:myLanguage/Kdenlive/Manual/Projects_and_Files#File_Structure">read more</ulink>)
|
||||
</para>
|
||||
<para>(The tutorial from now on assumes that you use the sample videos provided, but it works with any.)
|
||||
</para>
|
||||
<para>
|
||||
<screenshot>
|
||||
<screeninfo></screeninfo>
|
||||
<mediaobject>
|
||||
<imageobject>
|
||||
<imagedata fileref="Kdenlive_Quickstart-New-Project.png" format="PNG"/>
|
||||
<imagedata fileref="kdenlive_quickstart-new-project.png" format="PNG"/>
|
||||
</imageobject>
|
||||
<textobject>
|
||||
<phrase>New Project dialog</phrase>
|
||||
@@ -63,17 +68,20 @@
|
||||
<para>New Project dialog</para>
|
||||
</caption>
|
||||
</mediaobject>
|
||||
</screenshot></para>
|
||||
<para>Open <application>Kdenlive</application> and create a new project (<menuchoice><guimenu>File</guimenu><guimenuitem>New</guimenuitem></menuchoice>).</para>
|
||||
<para>Choose the previously created project folder (<filename>quickstart-tutorial/</filename>) and select an appropriate project profile. The video files provided above are 720p, 23.98 fps.<footnote><para><ulink url="http://en.wikipedia.org/wiki/720p">720</ulink> is the video height, p stands for <ulink url="http://en.wikipedia.org/wiki/Progressive_scan">progressive scan</ulink> in contrast to <ulink url="http://en.wikipedia.org/wiki/Interlaced_video">interlaced video</ulink>, and the fps number denotes the number of full frames per second.</para></footnote> If you are using your own files and don’t know which one to use, <application>Kdenlive</application> will suggest an appropriate one when the first clip is added, so you can leave the field on whatever it is.</para>
|
||||
</chapter>
|
||||
<chapter id="adding-clips"><title>Adding clips</title>
|
||||
</screenshot>
|
||||
</para>
|
||||
<para>Open &kdenlive; and create a new project (<menuchoice><guimenu>File</guimenu><guimenuitem>New</guimenuitem></menuchoice>).
|
||||
</para>
|
||||
<para>Choose the previously created project folder (<filename>quickstart-tutorial/</filename>) and select an appropriate project profile. The video files provided above are 720p, 23.98 fps.<footnote><para><ulink url="http://en.wikipedia.org/wiki/720p">720</ulink> is the video height, p stands for <ulink url="http://en.wikipedia.org/wiki/Progressive_scan">progressive scan</ulink> in contrast to <ulink url="http://en.wikipedia.org/wiki/Interlaced_video">interlaced video</ulink>, and the fps number denotes the number of full frames per second.</para></footnote> If you are using your own files and don’t know which one to use, &kdenlive; will suggest an appropriate one when the first clip is added <footnote><para>Provided Configure Kdenlive Settings under <ulink url="http://userbase.kde.org/Special:myLanguage/Kdenlive/Manual/Settings_Menu/Configure_Kdenlive#Misc">Misc</ulink> is set to <emphasis>Check if first added clip matches project profile</emphasis></para></footnote> , so you can leave the field on whatever it is.
|
||||
</para>
|
||||
</sect1>
|
||||
<sect1 id="adding-clips"><title>Adding clips</title>
|
||||
<para>
|
||||
<screenshot>
|
||||
<screeninfo></screeninfo>
|
||||
<mediaobject>
|
||||
<imageobject>
|
||||
<imagedata fileref="Kdenlive_Quickstart-Add-Clips.png" format="PNG"/>
|
||||
<imagedata fileref="kdenlive_quickstart-add-clips.png" format="PNG"/>
|
||||
</imageobject>
|
||||
<textobject>
|
||||
<phrase>Project Tree: Adding video clips</phrase>
|
||||
@@ -82,30 +90,34 @@
|
||||
<para>Project Tree: Adding video clips</para>
|
||||
</caption>
|
||||
</mediaobject>
|
||||
</screenshot></para>
|
||||
<para>Now that the project is ready, let’s start adding some clips (&ie; the ones you downloaded). This works via the <emphasis>Project Tree widget</emphasis>; a click on the <guilabel>Add Clip</guilabel> icon directly opens the file dialog, a click on the small arrow shows a list of additional clip types that can be added as well. Video clips, audio clips, images, and other <application>Kdenlive</application> projects can be added via the default <guilabel>Add Clip</guilabel> dialog.</para>
|
||||
</screenshot>
|
||||
</para>
|
||||
<para>Now that the project is ready, let’s start adding some clips (&ie; the ones you downloaded). This works via the <emphasis>Project Tree widget</emphasis>; a click on the <guilabel>Add Clip</guilabel> icon <inlinemediaobject> <imageobject> <imagedata fileref="Icon-add-clip.png" format="PNG"/> </imageobject> </inlinemediaobject> directly opens the file dialog, a click on the small arrow shows a list of additional clip types that can be added as well. Video clips, audio clips, images, and other &kdenlive; projects can be added via the default <guilabel>Add Clip</guilabel> dialog.
|
||||
</para>
|
||||
<para>
|
||||
<screenshot>
|
||||
<screeninfo></screeninfo>
|
||||
<mediaobject>
|
||||
<imageobject>
|
||||
<imagedata fileref="Kdenlive_Quickstart-Mainwindow.png" format="PNG"/>
|
||||
<imagedata fileref="kdenlive_quickstart-mainwindow.png" format="PNG"/>
|
||||
</imageobject>
|
||||
<textobject>
|
||||
<phrase>Kdenlive 0.8 window with the tutorial files</phrase>
|
||||
<phrase>Kdenlive 16.08 window with the tutorial files</phrase>
|
||||
</textobject>
|
||||
<caption>
|
||||
<para>Kdenlive 0.8 window with the tutorial files</para>
|
||||
<para>Kdenlive 16.08 window with the tutorial files</para>
|
||||
</caption>
|
||||
</mediaobject>
|
||||
</screenshot></para>
|
||||
<para>After loading the clips, <application>Kdenlive</application> will look similar to this. On the top left there is the already known project tree. Right of it are the monitors that show video; The clip monitor displays video from the original clips, the project monitor shows how the output video will look, with all effects, transitions, &etc; applied. The third, also very important, item is the timeline (below the monitors): This is the place where the video clips will be edited. There are two different types of tracks, Video and Audio. Video tracks can contain any kind of clip, audio tracks as well – but when dropping a video file to the audio track, only the audio will be used.</para>
|
||||
</screenshot>
|
||||
</para>
|
||||
<para>After loading the clips, &kdenlive; will look similar to this. On the top left there is the already known project tree. Right of it are the monitors that show video; The clip monitor displays video from the original clips, the project monitor shows how the output video will look, with all effects, transitions, &etc; applied. The third, also very important, item is the timeline (below the monitors): This is the place where the video clips will be edited. There are two different types of tracks, Video and Audio. Video tracks can contain any kind of clip, audio tracks as well – but when dropping a video file to the audio track, only the audio will be used.
|
||||
</para>
|
||||
<para>
|
||||
<screenshot>
|
||||
<screeninfo></screeninfo>
|
||||
<mediaobject>
|
||||
<imageobject>
|
||||
<imagedata fileref="Kdenlive_Quickstart-Save-Project.png" format="PNG"/>
|
||||
<imagedata fileref="kdenlive_quickstart-save-project.png" format="PNG"/>
|
||||
</imageobject>
|
||||
<textobject>
|
||||
<phrase>Saving a Kdenlive project</phrase>
|
||||
@@ -114,17 +126,22 @@
|
||||
<para>Saving a Kdenlive project</para>
|
||||
</caption>
|
||||
</mediaobject>
|
||||
</screenshot></para>
|
||||
<para>Let’s save the work via <menuchoice><guimenu>File</guimenu><guimenuitem>Save</guimenuitem></menuchoice>. This saves our project, &ie; where we placed the clips on the timeline, which effects we applied, and so on. It can <emphasis>not</emphasis> be played.<footnote><para>To be correct, it <emphasis>can</emphasis> be played using <varname>melt yourproject.kdenlive</varname>, but this is not the way you would want to present your final video since it is (most likely) too slow. Additionally, it only works if melt is installed.</para></footnote> The process of creating the final video is called <emphasis>Rendering</emphasis>.</para>
|
||||
</chapter>
|
||||
<chapter id="timeline"><title>Timeline</title>
|
||||
<para>Now comes the actual editing. Project clips are combined to the final result on the timeline. They get there by drag and drop: Drag some Napoli (assuming you are using the files provided above, as in the rest of this quick start tutorial; If not, please make sure your screen is waterproof, and perhaps tomatoproof), and drop it onto the first track in the timeline.</para>
|
||||
</screenshot>
|
||||
</para>
|
||||
<para>Let’s save the work via <menuchoice><guimenu>File</guimenu><guimenuitem>Save</guimenuitem></menuchoice>. This saves our project, &ie; where we placed the clips on the timeline, which effects we applied, and so on. It can <emphasis>not</emphasis> be played.<footnote><para>To be correct, it <emphasis>can</emphasis> be played using <varname>melt yourproject.kdenlive</varname>, but this is not the way you would want to present your final video since it is (most likely) too slow. Additionally, it only works if melt is installed.</para></footnote> The process of creating the final video is called <emphasis>Rendering</emphasis>.
|
||||
</para>
|
||||
</sect1>
|
||||
<sect1 id="timeline"><title>Timeline</title>
|
||||
<para>See also <link linkend="timeline">Timeline section of the manual</link>
|
||||
</para>
|
||||
<para>Now comes the actual editing. Project clips are combined to the final result on the timeline. They get there by drag and drop: Drag some Napoli (assuming you are using the files provided above, as in the rest of this quick start tutorial; If not, please make sure your screen is waterproof, and perhaps tomatoproof) from the project tree, and drop it onto the first track in the timeline.
|
||||
</para>
|
||||
<para>
|
||||
<screenshot>
|
||||
<screeninfo></screeninfo>
|
||||
<mediaobject>
|
||||
<imageobject>
|
||||
<imagedata fileref="Kdenlive_Quickstart-Timeline-Clips.png" format="PNG"/>
|
||||
<imagedata fileref="kdenlive_quickstart-timeline-clips.png" format="PNG"/>
|
||||
</imageobject>
|
||||
<textobject>
|
||||
<phrase>First clips in the timeline</phrase>
|
||||
@@ -133,14 +150,16 @@
|
||||
<para>First clips in the timeline</para>
|
||||
</caption>
|
||||
</mediaobject>
|
||||
</screenshot></para>
|
||||
<para>Since some cutlery is needed as well, drop the spoon on the first track as well. Then drag the Napoli to the beginning of the timeline (otherwise the rendered video would start with some seconds of plain black), and the Spoon right after the Napoli, such that it looks like in the image on the left. (Where I have zoomed in with <keycombo>&Ctrl;<keycap>Wheel</keycap></keycombo>.)</para>
|
||||
</screenshot>
|
||||
</para>
|
||||
<para>Since some cutlery is needed as well, grab the spoon clip and drop it on the first track as well. Then drag the Napoli to the beginning of the timeline (otherwise the rendered video would start with some seconds of plain black), and the Spoon right after the Napoli, such that it looks like in the image on the left. (Where I have zoomed in with <keycombo>&Ctrl;<keycap>Wheel</keycap></keycombo>.)
|
||||
</para>
|
||||
<para>
|
||||
<screenshot>
|
||||
<screeninfo></screeninfo>
|
||||
<mediaobject>
|
||||
<imageobject>
|
||||
<imagedata fileref="Kdenlive_Quickstart-TimelineCursor.png" format="PNG"/>
|
||||
<imagedata fileref="kdenlive_quickstart-timelinecursor.png" format="PNG"/>
|
||||
</imageobject>
|
||||
<textobject>
|
||||
<phrase>Timeline cursor</phrase>
|
||||
@@ -149,14 +168,16 @@
|
||||
<para>Timeline cursor</para>
|
||||
</caption>
|
||||
</mediaobject>
|
||||
</screenshot></para>
|
||||
<para>The result can already be previewed by pressing <keycap>Space</keycap> (or the <guilabel>Play</guilabel> button in the project monitor). You will see the Napoli directly followed by a Spoon. If the timeline cursor is not at the beginning, the project monitor will start playing somewhere in the middle; you can move it by dragging it either on the timeline ruler or in the project monitor. If you prefer keyboard shortcuts, <keycombo>&Ctrl;<keycap>Home</keycap></keycombo> does the same for the monitor that is activated. (Select the <guilabel>Project Monitor</guilabel> if it is not selected yet before using the shortcut.)</para>
|
||||
</screenshot>
|
||||
</para>
|
||||
<para>The result can already be previewed by pressing <keycap>Space</keycap> (or the <guilabel>Play</guilabel> button in the project monitor). You will see the Napoli directly followed by a Spoon. If the timeline cursor is not at the beginning, the project monitor will start playing somewhere in the middle; you can move it by dragging it either on the timeline ruler or in the project monitor. If you prefer keyboard shortcuts, <keycombo>&Ctrl;<keycap>Home</keycap></keycombo> does the same for the monitor that is activated. (Select the <guilabel>Project Monitor</guilabel> if it is not selected yet before using the shortcut.)
|
||||
</para>
|
||||
<para>
|
||||
<screenshot>
|
||||
<screeninfo></screeninfo>
|
||||
<mediaobject>
|
||||
<imageobject>
|
||||
<imagedata fileref="Kdenlive_Quickstart-Resize-Marker.png" format="PNG"/>
|
||||
<imagedata fileref="kdenlive_quickstart-resize-marker.png" format="PNG"/>
|
||||
</imageobject>
|
||||
<textobject>
|
||||
<phrase>Resize marker</phrase>
|
||||
@@ -165,14 +186,16 @@
|
||||
<para>Resize marker</para>
|
||||
</caption>
|
||||
</mediaobject>
|
||||
</screenshot></para>
|
||||
<para>Since after eating comes playing, there is a Billard clip. Add it to the timeline as well. The first 1.5 seconds nothing happens in the clip, so it should perhaps be <guilabel>cut</guilabel> to avoid the video becoming boring. An easy way<footnote><para>Writing it this way suggests that there are several ways of cutting a clip. This is in fact true.</para></footnote> for this is to move the timeline cursor to the desired position (&ie; the position where you want to cut the video), then drag the left border of the clip when the resize marker appears. It will snap in at the timeline cursor when you move close enough.</para>
|
||||
</screenshot>
|
||||
</para>
|
||||
<para>Since after eating comes playing, there is a Billiards clip. Add it to the timeline as well. For the first 1.5 seconds nothing happens in the clip, so it should perhaps be <guilabel>cut</guilabel> to avoid the video becoming boring. An easy way<footnote><para>Writing it this way suggests that there are several ways of cutting a clip. This is in fact true.</para></footnote> for this is to move the timeline cursor to the desired position (&ie; the position where you want to cut the video), then drag the left border of the clip when the resize marker appears. It will snap in at the timeline cursor when you move close enough.
|
||||
</para>
|
||||
<para>
|
||||
<screenshot>
|
||||
<screeninfo></screeninfo>
|
||||
<mediaobject>
|
||||
<imageobject>
|
||||
<imagedata fileref="Kdenlive_Quickstart-Overlap-Clips.png" format="PNG"/>
|
||||
<imagedata fileref="kdenlive_quickstart-overlap-clips.png" format="PNG"/>
|
||||
</imageobject>
|
||||
<textobject>
|
||||
<phrase>Overlapping clips</phrase>
|
||||
@@ -181,15 +204,18 @@
|
||||
<para>Overlapping clips</para>
|
||||
</caption>
|
||||
</mediaobject>
|
||||
</screenshot></para>
|
||||
<para>To add a <emphasis>transition</emphasis> between eating (the Spoon) and playing billard, the two clips need to overlap. To be precise: the second clip should be above or below the first one and end some frames after the second one begins. Zooming in until the ticks for simple frames appear helps there; it also makes it easy to always have the same transition duration, like five frames in this case.</para>
|
||||
<para>You can zoom in by either using the <guilabel>zoom slider</guilabel> at the bottom of the <application>Kdenlive</application> window, or with <keycombo>&Ctrl;<keycap>Mousewheel</keycap></keycombo>. <application>Kdenlive</application> will zoom to the timeline cursor, so first set it to the position which you want to see enlarged, then zoom in.</para>
|
||||
</screenshot>
|
||||
</para>
|
||||
<para>To add a <emphasis>transition</emphasis> between eating (the Spoon) and playing billiards, the two clips need to overlap. To be precise: the second clip should be above or below the first one and end some frames after the second one begins. Zooming in until the ticks for single frames appear helps here; it also makes it easy to always have the same transition duration, five frames in this case.
|
||||
</para>
|
||||
<para>You can zoom in by either using the <guilabel>zoom slider</guilabel> at the bottom of the &kdenlive; window, or with <keycombo>&Ctrl;<keycap>Mousewheel</keycap></keycombo>. &kdenlive; will zoom to the timeline cursor, so first set it to the position which you want to see enlarged, then zoom in.
|
||||
</para>
|
||||
<para>
|
||||
<screenshot>
|
||||
<screeninfo></screeninfo>
|
||||
<mediaobject>
|
||||
<imageobject>
|
||||
<imagedata fileref="Kdenlive-Quickstart-Add-Transition.png" format="PNG"/>
|
||||
<imagedata fileref="kdenlive-quickstart-add-transition.png" format="PNG"/>
|
||||
</imageobject>
|
||||
<textobject>
|
||||
<phrase>Transition marker</phrase>
|
||||
@@ -198,64 +224,67 @@
|
||||
<para>Transition marker</para>
|
||||
</caption>
|
||||
</mediaobject>
|
||||
</screenshot></para>
|
||||
<para>Now that the clips overlap, the transition can be added. This is done either by right-clicking on the upper clip and choosing <guilabel>Add Transition</guilabel> or, easier, by clicking the lower right corner of the Spoon clip. The latter by default adds a dissolve transition, which is in this case the best idea anyway since the Spoon is not required for playing anyway.</para>
|
||||
<para>The dissolve transitions fades the first clip into the second one.</para>
|
||||
</screenshot>
|
||||
</para>
|
||||
<para>Now that the clips overlap, the transition can be added. This is done either by right-clicking on the upper clip and choosing <guilabel>Add Transition</guilabel> or, easier, by clicking the green triangle that appears when you hover the mouse over the lower right corner of the Spoon clip. The latter, by default, adds a dissolve transition, which is in this case the best idea anyway since the Spoon is not required for playing.
|
||||
</para>
|
||||
<para>The dissolve transitions fades the first clip into the second one. See also <ulink url="http://userbase.kde.org/Special:myLanguage/Kdenlive/Manual/Transitions">Transition section of the manual</ulink>.
|
||||
</para>
|
||||
<para>
|
||||
<screenshot>
|
||||
<screeninfo></screeninfo>
|
||||
<mediaobject>
|
||||
<imageobject>
|
||||
<imagedata fileref="Kdenlive-Quickstart-Add-Last-Clip.png" format="PNG"/>
|
||||
<imagedata fileref="kdenlive-quickstart-add-last-clip.png" format="PNG"/>
|
||||
</imageobject>
|
||||
<textobject>
|
||||
<phrase></phrase>
|
||||
</textobject>
|
||||
<caption>
|
||||
<para></para>
|
||||
</caption>
|
||||
</mediaobject>
|
||||
</screenshot></para>
|
||||
<para>Let’s add the last clip, the Piano, now, and again apply a dissolve transition. When adding it on the first track of the timeline, you need to click on the new clip’s lower left edge to add the transition to the previous clip.</para>
|
||||
<sect1 id="effects"><title>Effects</title>
|
||||
</screenshot>
|
||||
</para>
|
||||
<para>Let’s now add the last clip, the Piano, and again apply a dissolve transition. When adding it on the first track of the timeline, you need to click on the new clip’s lower left edge to add the transition to the previous clip.
|
||||
</para>
|
||||
<sect2 id="effects"><title>Effects</title>
|
||||
<para>
|
||||
<screenshot>
|
||||
<screeninfo></screeninfo>
|
||||
<mediaobject>
|
||||
<imageobject>
|
||||
<imagedata fileref="Kdenlive_Quickstart-Add-Effect.png" format="PNG"/>
|
||||
<imagedata fileref="kdenlive_quickstart-add-effect.png" format="PNG"/>
|
||||
</imageobject>
|
||||
<textobject>
|
||||
<phrase>Effects</phrase>
|
||||
<phrase>Effect List</phrase>
|
||||
</textobject>
|
||||
<caption>
|
||||
<para>Effects</para>
|
||||
<para>Effect List</para>
|
||||
</caption>
|
||||
</mediaobject>
|
||||
</screenshot></para>
|
||||
<para>The Piano can be colourized by adding an <emphasis>effect</emphasis> to it. Select the piano clip, then double-click the <guilabel>RGB Adjustment</guilabel> effect in the <guilabel>Effects</guilabel>. If it is not visible, you can get it via <menuchoice><guimenu>View</guimenu><guimenuitem>Effects</guimenuitem></menuchoice>.</para>
|
||||
</screenshot>
|
||||
</para>
|
||||
<para>The Piano can be colourized by adding an <emphasis>effect</emphasis> to it. Select the piano clip, then double-click the <guilabel>RGB Adjustment</guilabel> effect in the <guilabel>Effect List</guilabel>. If it is not visible, you can get it via <menuchoice><guimenu>View</guimenu><guimenuitem>Effect List</guimenuitem></menuchoice>.
|
||||
</para>
|
||||
<para>
|
||||
<screenshot>
|
||||
<screeninfo></screeninfo>
|
||||
<mediaobject>
|
||||
<imageobject>
|
||||
<imagedata fileref="Kdenlive_Quickstart-Effect-Flag.png" format="PNG"/>
|
||||
<imagedata fileref="kdenlive_quickstart-effect-flag.png" format="PNG"/>
|
||||
</imageobject>
|
||||
<textobject>
|
||||
<phrase></phrase>
|
||||
</textobject>
|
||||
<caption>
|
||||
<para></para>
|
||||
</caption>
|
||||
</mediaobject>
|
||||
</screenshot></para>
|
||||
<para>Once the effect has been added, its name will be added to the timeline clip. It will also be shown in the <guilabel>Effect Stack</guilabel> widget.</para>
|
||||
</screenshot>
|
||||
</para>
|
||||
<para>Once the effect has been added, its name will be added to the timeline clip. It will also be shown in the <guilabel>Effect Stack</guilabel> widget.
|
||||
</para>
|
||||
<para>
|
||||
<screenshot>
|
||||
<screeninfo></screeninfo>
|
||||
<mediaobject>
|
||||
<imageobject>
|
||||
<imagedata fileref="Kdenlive-Quickstart-EffectStack.png" format="PNG"/>
|
||||
<imagedata fileref="kdenlive-quickstart-effectstack.png" format="PNG"/>
|
||||
</imageobject>
|
||||
<textobject>
|
||||
<phrase>Effect Stack with RGB adjustment</phrase>
|
||||
@@ -264,17 +293,22 @@
|
||||
<para>Effect Stack with RGB adjustment</para>
|
||||
</caption>
|
||||
</mediaobject>
|
||||
</screenshot></para>
|
||||
<para>To get a warm yellow-orange tone on the image, fitting the comfortable evening, blue needs to be reduced and red and green improved.</para>
|
||||
<para>The values in the effect stack widget can be changed by using the slider (middle mouse button resets it to the default value), or by entering a value directly by double-clicking the number right to the slider.</para>
|
||||
<para>Effects can also be added with the <guilabel>Add new effect</guilabel> icon (framed in the image on the left) in the <guilabel>Effect Stack</guilabel>; It always refers to the timeline clip that is currently selected. By unchecking the checkbox they are temporarily disabled (the settings remain though), this is ⪚ useful for effects that require a lot of computing power, so they can be disabled when editing and enabled again for rendering.</para>
|
||||
<para>For some effects, like the one used there, it is possible to add keyframes. The framed watch icon indicates this. Keyframes are used for changing effect parameters over time. In our clip this allows us to fade the piano’s colour from a warm evening colour to a cold night colour.</para>
|
||||
</screenshot>
|
||||
</para>
|
||||
<para>To get a warm yellow-orange tone on the image, fitting the comfortable evening, blue needs to be reduced and red and green improved.
|
||||
</para>
|
||||
<para>The values in the effect stack widget can be changed by using the slider (middle mouse button resets it to the default value), or by entering a value directly by double-clicking the number to the right of the slider.
|
||||
</para>
|
||||
<para>Effects can also be added with the <guilabel>Add new effect</guilabel> icon (framed in the image on the left) in the <guilabel>Effect Stack</guilabel>; It always refers to the timeline clip that is currently selected. By unchecking the checkbox they are temporarily disabled (the settings remain though), this is ⪚ useful for effects that require a lot of computing power, so they can be disabled when editing and enabled again for rendering.
|
||||
</para>
|
||||
<para>For some effects, like the one used there, it is possible to add keyframes. The framed watch icon indicates this. Keyframes are used for changing effect parameters over time. In our clip this allows us to fade the piano’s colour from a warm evening colour to a cold night colour.
|
||||
</para>
|
||||
<para>
|
||||
<screenshot>
|
||||
<screeninfo></screeninfo>
|
||||
<mediaobject>
|
||||
<imageobject>
|
||||
<imagedata fileref="Kdenlive_Quickstart-Keyframes.png" format="PNG"/>
|
||||
<imagedata fileref="kdenlive_quickstart-keyframes.png" format="PNG"/>
|
||||
</imageobject>
|
||||
<textobject>
|
||||
<phrase>Keyframes for effects</phrase>
|
||||
@@ -283,19 +317,26 @@
|
||||
<para>Keyframes for effects</para>
|
||||
</caption>
|
||||
</mediaobject>
|
||||
</screenshot></para>
|
||||
<para>After clicking the <guilabel>keyframe</guilabel> icon (the clock icon framed in the previous image), the Effect Stack widget will re-arrange. By default there will be two keyframes, one at the beginning of the timeline clip and one at the end. Move the timeline cursor to the end of the timeline clip, such that the project monitor actually shows the new colours when changing the parameters of the keyframe at the end.</para>
|
||||
<para>Make sure the last keyframe is selected in the Effect Stack’s list. Then you are ready to flood the piano with a deep blue.</para>
|
||||
<para>Moving the timeline cursor to the beginning of the project and playing it (with <keycap>Space</keycap>, or the <guilabel>Play</guilabel> button in the <guilabel>Project Monitor</guilabel>), the piano should now change the colour as desired.</para>
|
||||
<para>Keyframing was the hardest part of this tutorial. If you managed to do it, you will master <guilabel>Kdenlive</guilabel> easily!</para>
|
||||
</sect1>
|
||||
<sect1 id="music"><title>Music</title>
|
||||
</screenshot>
|
||||
</para>
|
||||
<para>After clicking the <guilabel>keyframe</guilabel> icon (the clock icon framed in the previous image), the Effect Stack widget will re-arrange. By default there will be two keyframes, one at the beginning of the timeline clip and one at the end. Move the timeline cursor to the end of the timeline clip, such that the project monitor actually shows the new colours when changing the parameters of the keyframe at the end.
|
||||
</para>
|
||||
<para>Make sure the last keyframe is selected in the Effect Stack’s list. Then you are ready to flood the piano with a deep blue.
|
||||
</para>
|
||||
<para>Moving the timeline cursor to the beginning of the project and playing it (with <keycap>Space</keycap>, or the <guilabel>Play</guilabel> button in the <guilabel>Project Monitor</guilabel>), the piano should now change the colour as desired.
|
||||
</para>
|
||||
<para>Keyframing was the hardest part of this tutorial. If you managed to do it, you will master &kdenlive; easily!
|
||||
</para>
|
||||
<para>See also <link linkend="effects">Effects section of the manual</link>.
|
||||
</para>
|
||||
</sect2>
|
||||
<sect2 id="music"><title>Music</title>
|
||||
<para>
|
||||
<screenshot>
|
||||
<screeninfo></screeninfo>
|
||||
<mediaobject>
|
||||
<imageobject>
|
||||
<imagedata fileref="Kdenlive_Quickstart-Fadeout.png" format="PNG"/>
|
||||
<imagedata fileref="kdenlive_quickstart-fadeout.png" format="PNG"/>
|
||||
</imageobject>
|
||||
<textobject>
|
||||
<phrase>Audio fadeout</phrase>
|
||||
@@ -304,18 +345,21 @@
|
||||
<para>Audio fadeout</para>
|
||||
</caption>
|
||||
</mediaobject>
|
||||
</screenshot></para>
|
||||
<para>Since the clips do not provide any audio, let’s search for some nice piece of music, on your local collection or on web pages like <ulink url="http://www.jamendo.com">Jamendo</ulink>. The audio clip should, after adding it, go to an audio track on the timeline.</para>
|
||||
<para>The audio clip can be resized on the timeline the same way as video clips are. The cursor will snap in at the end of the project automatically. To add a fade out effect at the end of the audio clip (except if you found a file with exactly the right length) you can hover the top right (or left) edge of the timeline clip and drag the green disc to the position where fading out should start.<footnote><para>This green disc is a shorthand for adding the effect <menuchoice><guimenu>Fade</guimenu><guimenuitem>Fade out</guimenuitem></menuchoice>. Both ways lead to the same result.</para></footnote></para>
|
||||
</screenshot>
|
||||
</para>
|
||||
<para>Since the clips do not provide any audio, let’s search for some nice piece of music, from your local collection or on web pages like <ulink url="http://www.jamendo.com">Jamendo</ulink>. The audio clip should, after adding it, be dragged to an audio track on the timeline.
|
||||
</para>
|
||||
<para>The audio clip can be resized on the timeline the same way as video clips are. The cursor will snap in at the end of the project automatically. To add a fade out effect at the end of the audio clip (except if you found a file with exactly the right length) you can hover the top right (or left) edge of the timeline clip and drag the green disc to the position where fading out should start.<footnote><para>This green disc is a shorthand for adding the effect <menuchoice><guimenu>Fade</guimenu><guimenuitem>Fade out</guimenuitem></menuchoice>. Both ways lead to the same result.</para></footnote>
|
||||
</para>
|
||||
</sect2>
|
||||
</sect1>
|
||||
</chapter>
|
||||
<chapter id="rendering"><title>Rendering</title>
|
||||
<sect1 id="rendering"><title>Rendering</title>
|
||||
<para>
|
||||
<screenshot>
|
||||
<screeninfo></screeninfo>
|
||||
<mediaobject>
|
||||
<imageobject>
|
||||
<imagedata fileref="Kdenlive_Quickstart-Renderer.png" format="PNG"/>
|
||||
<imagedata fileref="kdenlive_quickstart-renderer.png" format="PNG"/>
|
||||
</imageobject>
|
||||
<textobject>
|
||||
<phrase>Rendering dialog</phrase>
|
||||
@@ -324,14 +368,16 @@
|
||||
<para>Rendering dialog</para>
|
||||
</caption>
|
||||
</mediaobject>
|
||||
</screenshot></para>
|
||||
<para>A few minutes left, and the project is finished! Click the Render button (or go to <menuchoice><guimenu>Project</guimenu><guimenuitem>Render</guimenuitem></menuchoice>, or press <keycombo>&Ctrl;&Enter;</keycombo>) to get the dialog shown on the left. Select the desired output file for our new video with all effects and transitions, choose MPEG4 (works nearly everywhere) and a bitrate of 2000k (the higher the bitrate, the larger the output file and the better the quality – but since the bitrate for the input clips was 2000k already, using a higher one would not improve quality and is therefore unnecessary), and press the <emphasis>Render to File</emphasis> button.</para>
|
||||
</screenshot>
|
||||
</para>
|
||||
<para>A few minutes left, and the project is finished! Click the Render button (or go to <menuchoice><guimenu>Project</guimenu><guimenuitem>Render</guimenuitem></menuchoice>, or press <keycombo>&Ctrl;&Enter;</keycombo>) to get the dialog shown on the left. Select the desired output file for our new video with all effects and transitions, choose MPEG4 (works nearly everywhere) and a bitrate of 2000k (the higher the bitrate, the larger the output file and the better the quality – but since the bitrate for the input clips was 2000k already, using a higher one would not improve quality and is therefore unnecessary), and press the <guilabel>Render to File</guilabel> button.
|
||||
</para>
|
||||
<para>
|
||||
<screenshot>
|
||||
<screeninfo></screeninfo>
|
||||
<mediaobject>
|
||||
<imageobject>
|
||||
<imagedata fileref="Kdenlive_Quickstart-Rendering.png" format="PNG"/>
|
||||
<imagedata fileref="kdenlive_quickstart-rendering.png" format="PNG"/>
|
||||
</imageobject>
|
||||
<textobject>
|
||||
<phrase>Rendering progress</phrase>
|
||||
@@ -340,8 +386,31 @@
|
||||
<para>Rendering progress</para>
|
||||
</caption>
|
||||
</mediaobject>
|
||||
</screenshot></para>
|
||||
<para>After some seconds rendering will be finished, and your first <application>Kdenlive</application> project completed. Congratulations!</para>
|
||||
</screenshot>
|
||||
</para>
|
||||
<para>After some seconds rendering will be finished, and your first &kdenlive; project completed. Congratulations!
|
||||
</para>
|
||||
<screenshot>
|
||||
<screeninfo></screeninfo>
|
||||
<mediaobject>
|
||||
<imageobject>
|
||||
<imagedata fileref="kdenlive_quickstart-rendering.png" format="PNG"/>
|
||||
</imageobject>
|
||||
<textobject>
|
||||
<phrase>Rendering progress</phrase>
|
||||
</textobject>
|
||||
<caption>
|
||||
<para>Rendering progress</para>
|
||||
</caption>
|
||||
</mediaobject>
|
||||
</screenshot>
|
||||
</sect1>
|
||||
<sect1>
|
||||
<title>Complete manual</title>
|
||||
<para>Further documentation for the current version of &kdenlive; can be found in <ulink url="http://userbase.kde.org/Special:myLanguage/Kdenlive/Manual">the full manual</ulink>.
|
||||
</para>
|
||||
</sect1>
|
||||
|
||||
</chapter>
|
||||
|
||||
<!--userbase-content-->
|
||||
|
||||
BIN
doc/kdenlive-quickstart-add-last-clip.png
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
doc/kdenlive-quickstart-add-transition.png
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
doc/kdenlive-quickstart-effectstack.png
Normal file
|
After Width: | Height: | Size: 199 KiB |
BIN
doc/kdenlive_quickstart-add-clips.png
Normal file
|
After Width: | Height: | Size: 9.8 KiB |
BIN
doc/kdenlive_quickstart-add-effect.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
doc/kdenlive_quickstart-effect-flag.png
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
doc/kdenlive_quickstart-fadeout.png
Normal file
|
After Width: | Height: | Size: 58 KiB |
BIN
doc/kdenlive_quickstart-folder-structure.png
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
doc/kdenlive_quickstart-keyframes.png
Normal file
|
After Width: | Height: | Size: 215 KiB |
BIN
doc/kdenlive_quickstart-mainwindow.png
Normal file
|
After Width: | Height: | Size: 63 KiB |
BIN
doc/kdenlive_quickstart-new-project.png
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
doc/kdenlive_quickstart-overlap-clips.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
doc/kdenlive_quickstart-renderer.png
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
doc/kdenlive_quickstart-rendering.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
doc/kdenlive_quickstart-resize-marker.png
Normal file
|
After Width: | Height: | Size: 8.7 KiB |
BIN
doc/kdenlive_quickstart-save-project.png
Normal file
|
After Width: | Height: | Size: 63 KiB |
BIN
doc/kdenlive_quickstart-timeline-clips.png
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
doc/kdenlive_quickstart-timelinecursor.png
Normal file
|
After Width: | Height: | Size: 3.7 KiB |
487
packaging/appimage/01-dependencies.sh
Executable file
@@ -0,0 +1,487 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Halt on errors
|
||||
set -e
|
||||
|
||||
# Be verbose
|
||||
set -x
|
||||
|
||||
# Now we are inside CentOS 6
|
||||
grep -r "CentOS release 6" /etc/redhat-release || exit 1
|
||||
|
||||
CPU_CORES=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu)
|
||||
|
||||
if [[ $CPU_CORES -gt 1 ]]; then
|
||||
CPU_CORES=$((CPU_CORES-1))
|
||||
fi
|
||||
|
||||
echo "CPU Cores to use : $CPU_CORES"
|
||||
|
||||
# Determine which architecture should be built
|
||||
if [[ "$(arch)" = "i686" || "$(arch)" = "x86_64" ]] ; then
|
||||
ARCH=$(arch)
|
||||
else
|
||||
echo "Architecture could not be determined"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ ! -f /etc/yum.repos.d/epel.repo ]] ; then
|
||||
|
||||
yum -y install epel-release
|
||||
|
||||
# we need to be up to date in order to install the xcb-keysyms dependency
|
||||
yum -y update
|
||||
fi
|
||||
|
||||
# Required for GAVL install (used in frei0r crop,scale,tilt effect)
|
||||
if [[ ! -f /etc/yum.repos.d/linuxtech.repo ]] ; then
|
||||
cat > /etc/yum.repos.d/linuxtech.repo << 'EOF'
|
||||
[linuxtech]
|
||||
name=LinuxTECH
|
||||
baseurl=http://pkgrepo.linuxtech.net/el6/release/
|
||||
enabled=1
|
||||
gpgcheck=1
|
||||
gpgkey=http://pkgrepo.linuxtech.net/el6/release/RPM-GPG-KEY-LinuxTECH.NET
|
||||
EOF
|
||||
yum -y update
|
||||
fi
|
||||
|
||||
# gettext
|
||||
|
||||
# Packages for base dependencies and Qt5.
|
||||
yum -y install wget \
|
||||
tar \
|
||||
bzip2 \
|
||||
xz \
|
||||
subversion \
|
||||
libtool \
|
||||
which \
|
||||
fuse \
|
||||
automake \
|
||||
mesa-libEGL \
|
||||
cmake3 \
|
||||
gcc-c++ \
|
||||
patch \
|
||||
libxcb \
|
||||
xcb-util \
|
||||
xkeyboard-config \
|
||||
gperf \
|
||||
bison \
|
||||
flex \
|
||||
zlib-devel \
|
||||
expat-devel \
|
||||
fuse-devel \
|
||||
libtool-ltdl-devel \
|
||||
glib2-devel \
|
||||
glibc-headers \
|
||||
mysql-devel \
|
||||
eigen3-devel \
|
||||
openssl-devel \
|
||||
cppunit-devel \
|
||||
libstdc++-devel \
|
||||
freetype-devel \
|
||||
fontconfig-devel \
|
||||
libxml2-devel \
|
||||
libstdc++-devel \
|
||||
libXrender-devel \
|
||||
lcms2-devel \
|
||||
xcb-util-keysyms-devel \
|
||||
libXi-devel \
|
||||
mesa-libGL-devel \
|
||||
mesa-libGLU-devel \
|
||||
libxcb-devel \
|
||||
xcb-util-devel \
|
||||
glibc-devel \
|
||||
libudev-devel \
|
||||
libicu-devel \
|
||||
sqlite-devel \
|
||||
libusb-devel \
|
||||
libexif-devel \
|
||||
libical-devel \
|
||||
libxslt-devel \
|
||||
xz-devel \
|
||||
lz4-devel \
|
||||
inotify-tools-devel \
|
||||
cups-devel \
|
||||
openal-soft-devel \
|
||||
pixman-devel \
|
||||
polkit-devel \
|
||||
perl-ExtUtils-MakeMaker \
|
||||
curl-devel \
|
||||
pulseaudio-libs-devel \
|
||||
libgavl-devel \
|
||||
sox-devel \
|
||||
fftw-devel \
|
||||
perl-List-MoreUtils \
|
||||
perl-XML-Parser \
|
||||
jack-audio-connection-kit-devel \
|
||||
ladspa-devel
|
||||
|
||||
if ( !test -d /usr/bin/cmake ) ; then
|
||||
ln -s /usr/bin/cmake3 /usr/bin/cmake
|
||||
fi
|
||||
|
||||
# Newer compiler than what comes with offcial CentOS 6 (only 64 bits)
|
||||
yum -y install centos-release-scl-rh
|
||||
yum -y install devtoolset-3-gcc devtoolset-3-gcc-c++
|
||||
|
||||
# required for Kdenlive related libs
|
||||
yum -y install libXft-devel atk-devel libXcomposite-devel
|
||||
|
||||
# Get helper functions
|
||||
wget -q https://github.com/probonopd/AppImages/raw/master/functions.sh -O ./functions.sh
|
||||
. ./functions.sh
|
||||
rm -f functions.sh
|
||||
|
||||
echo -e "---------- Clean-up Old Packages\n"
|
||||
|
||||
# Remove system based devel package to prevent conflict with new one.
|
||||
yum -y erase boost-devel libgphoto2 sane-backends libjpeg-devel jasper-devel libpng-devel libtiff-devel git
|
||||
|
||||
# Prepare the install location
|
||||
# rm -rf /app/ || true
|
||||
mkdir -p /app/usr
|
||||
mkdir -p /external/build
|
||||
mkdir -p /external/download
|
||||
|
||||
export LLVM_ROOT=/opt/llvm/
|
||||
|
||||
# make sure lib and lib64 are the same thing
|
||||
mkdir -p /app/usr/lib
|
||||
cd /app/usr
|
||||
rm -Rf lib64
|
||||
ln -s lib lib64
|
||||
|
||||
QTVERSION=5.9.4
|
||||
QVERSION_SHORT=5.9
|
||||
QTDIR=/usr/local/Qt-${QTVERSION}/
|
||||
|
||||
# Use the new compiler
|
||||
. /opt/rh/devtoolset-3/enable
|
||||
|
||||
BUILDING_DIR="/external/build"
|
||||
DOWNLOAD_DIR="/external/download"
|
||||
|
||||
# install recent git
|
||||
if [ ! -d /external/git-2.7.4 ]; then
|
||||
cd /external
|
||||
wget https://www.kernel.org/pub/software/scm/git/git-2.7.4.tar.gz
|
||||
tar xzf git-2.7.4.tar.gz
|
||||
fi
|
||||
cd /external/git-2.7.4
|
||||
make prefix=/usr/local/git all
|
||||
make prefix=/usr/local/git install
|
||||
echo 'export PATH=$PATH:/usr/local/git/bin' >> /etc/bashrc
|
||||
source /etc/bashrc
|
||||
|
||||
cd $BUILDING_DIR
|
||||
|
||||
rm -rf $BUILDING_DIR/* || true
|
||||
|
||||
cmake3 /kdenlive/packaging/appimage/3rdparty \
|
||||
-DCMAKE_INSTALL_PREFIX:PATH=/usr \
|
||||
-DINSTALL_ROOT=/usr \
|
||||
-DEXTERNALS_DOWNLOAD_DIR=$DOWNLOAD_DIR
|
||||
|
||||
cmake3 --build . --config RelWithDebInfo --target ext_jpeg -- -j$CPU_CORES
|
||||
cmake3 --build . --config RelWithDebInfo --target ext_jasper -- -j$CPU_CORES
|
||||
cmake3 --build . --config RelWithDebInfo --target ext_png -- -j$CPU_CORES
|
||||
cmake3 --build . --config RelWithDebInfo --target ext_tiff -- -j$CPU_CORES
|
||||
#cmake3 --build . --config RelWithDebInfo --target ext_opencv -- -j$CPU_CORES
|
||||
cmake3 --build . --config RelWithDebInfo --target ext_qt -- -j$CPU_CORES
|
||||
cmake3 --build . --config RelWithDebInfo --target ext_exiv2 -- -j$CPU_CORES
|
||||
|
||||
|
||||
#gettext
|
||||
cd /external
|
||||
if ( test -d /external/gettext-0.18.3 )
|
||||
then
|
||||
echo "gettext already downloaded"
|
||||
else
|
||||
wget http://ftp.gnu.org/pub/gnu/gettext/gettext-0.18.3.tar.gz
|
||||
tar -xf gettext-0.18.3.tar.gz
|
||||
fi
|
||||
cd gettext-0.18.3
|
||||
./configure --prefix=/usr
|
||||
make -j5
|
||||
make install
|
||||
|
||||
#necessary ?
|
||||
#pulseaudio-libs
|
||||
|
||||
# qjsonparser, used to add metadata to the plugins needs to work in a en_US.UTF-8 environment. That's
|
||||
# not always set correctly in CentOS 6.7
|
||||
export LC_ALL=en_US.UTF-8
|
||||
export LANG=en_us.UTF-8
|
||||
|
||||
|
||||
# Make sure we build from the /, parts of this script depends on that. We also need to run as root...
|
||||
cd /
|
||||
|
||||
# TO-DO ask about this.
|
||||
export CMAKE_PREFIX_PATH=$QTDIR:/app/share/llvm/
|
||||
|
||||
#update cmake https://xinyustudio.wordpress.com/2014/06/18/how-to-install-cmake-3-0-on-centos-6-centos-7/
|
||||
#export PATH=/usr/local/cmake-3.0.0/bin:$PATH
|
||||
|
||||
# if the library path doesn't point to our usr/lib, linking will be broken and we won't find all deps either
|
||||
export LD_LIBRARY_PATH=/usr/lib64/:/usr/lib:/app/usr/lib:$QTDIR/lib/:/opt/python3.5/lib/:$LD_LIBRARY_PATH
|
||||
|
||||
# start building the deps
|
||||
|
||||
function build_external
|
||||
{ (
|
||||
# errors fatal
|
||||
echo "Compiler version:" $(g++ --version)
|
||||
set -e
|
||||
|
||||
SRC=/external
|
||||
BUILD=/external/build
|
||||
PREFIX=/app/usr/
|
||||
|
||||
# framework
|
||||
EXTERNAL=$1
|
||||
|
||||
# clone if not there
|
||||
mkdir -p $SRC
|
||||
cd $SRC
|
||||
if ( test -d $EXTERNAL )
|
||||
then
|
||||
echo "$EXTERNAL already cloned"
|
||||
cd $EXTERNAL
|
||||
git reset --hard
|
||||
git pull --rebase
|
||||
cd ..
|
||||
else
|
||||
git clone $EXTERNAL_ADDRESS
|
||||
fi
|
||||
|
||||
# create build dir
|
||||
mkdir -p $BUILD/$EXTERNAL
|
||||
|
||||
# go there
|
||||
cd $BUILD/$EXTERNAL
|
||||
|
||||
# cmake it
|
||||
if ( $EXTERNAL_CMAKE )
|
||||
then
|
||||
cmake3 -DCMAKE_INSTALL_PREFIX:PATH=$PREFIX $2 $SRC/$EXTERNAL
|
||||
else
|
||||
$EXTERNAL_CONFIGURE
|
||||
fi
|
||||
# make
|
||||
make -j8
|
||||
|
||||
# install
|
||||
make install
|
||||
) }
|
||||
|
||||
|
||||
export WLD=/app/usr/ # change this to another location if you prefer
|
||||
export LD_LIBRARY_PATH=$WLD/lib:$LD_LIBRARY_PATH
|
||||
export PKG_CONFIG_PATH=$WLD/lib/pkgconfig/:$WLD/share/pkgconfig/:/usr/lib/pkgconfig/:$PKG_CONFIG_PATH
|
||||
export PATH=$WLD/bin:$PATH
|
||||
export ACLOCAL_PATH=$WLD/share/aclocal
|
||||
export ACLOCAL="aclocal -I $ACLOCAL_PATH"
|
||||
|
||||
#yasm
|
||||
IN=yasm,https://github.com/yasm/yasm.git,true,""
|
||||
IFS=',' read -a external_options <<< $IN
|
||||
EXTERNAL="${external_options[0]}"
|
||||
EXTERNAL_ADDRESS="${external_options[1]}"
|
||||
EXTERNAL_CMAKE="${external_options[2]}"
|
||||
EXTERNAL_CONFIGURE="${external_options[3]}"
|
||||
build_external $EXTERNAL
|
||||
|
||||
#nasm
|
||||
cd /external
|
||||
if ( test -d /external/nasm-2.13.02 )
|
||||
then
|
||||
echo "nasm already downloaded"
|
||||
else
|
||||
wget http://www.nasm.us/pub/nasm/releasebuilds/2.13.02/nasm-2.13.02.tar.xz
|
||||
tar -xf nasm-2.13.02.tar.xz
|
||||
fi
|
||||
cd nasm-2.13.02
|
||||
./configure --prefix=$WLD
|
||||
make -j5
|
||||
make install
|
||||
|
||||
|
||||
#libsndfile
|
||||
cd /external
|
||||
if ( test -d /external/libsndfile-1.0.28 )
|
||||
then
|
||||
echo "libsndfile already downloaded"
|
||||
else
|
||||
wget http://www.mega-nerd.com/libsndfile/files/libsndfile-1.0.28.tar.gz
|
||||
tar -xf libsndfile-1.0.28.tar.gz
|
||||
fi
|
||||
cd libsndfile-1.0.28
|
||||
./configure --prefix=$WLD
|
||||
make -j5
|
||||
make install
|
||||
|
||||
#libsamplerate
|
||||
cd /external
|
||||
if ( test -d /external/libsamplerate-0.1.9 )
|
||||
then
|
||||
echo "libsamplerate already downloaded"
|
||||
else
|
||||
wget http://www.mega-nerd.com/SRC/libsamplerate-0.1.9.tar.gz
|
||||
tar -xf libsamplerate-0.1.9.tar.gz
|
||||
fi
|
||||
cd libsamplerate-0.1.9
|
||||
./configure --prefix=$WLD
|
||||
make -j5
|
||||
make install
|
||||
|
||||
|
||||
#alsa-lib
|
||||
cd /external
|
||||
if ( test -d /external/alsa-lib-1.1.5 )
|
||||
then
|
||||
echo "alsa-lib already downloaded"
|
||||
else
|
||||
wget ftp://ftp.alsa-project.org/pub/lib/alsa-lib-1.1.5.tar.bz2
|
||||
tar -xf alsa-lib-1.1.5.tar.bz2
|
||||
fi
|
||||
cd alsa-lib-1.1.5
|
||||
./configure --prefix=$WLD
|
||||
make -j5
|
||||
make install
|
||||
|
||||
#sdl
|
||||
cd /external
|
||||
if ( test -d /external/SDL2-2.0.7 )
|
||||
then
|
||||
echo "SDL already downloaded"
|
||||
else
|
||||
wget http://libsdl.org/release/SDL2-2.0.7.tar.gz
|
||||
tar -xf SDL2-2.0.7.tar.gz
|
||||
fi
|
||||
cd /external/SDL2-2.0.7
|
||||
./configure --prefix=$WLD --with-alsa-prefix=/app/usr/lib --with-alsa-inc-prefix=/app/usr/include/
|
||||
make
|
||||
make install
|
||||
|
||||
|
||||
function build_framework
|
||||
{ (
|
||||
# errors fatal
|
||||
echo "Compiler version:" $(g++ --version)
|
||||
set -e
|
||||
|
||||
SRC=/kf5
|
||||
BUILD=/kf5/build
|
||||
PREFIX=/app/usr/
|
||||
|
||||
# framework
|
||||
FRAMEWORK=$1
|
||||
|
||||
# clone if not there
|
||||
mkdir -p $SRC
|
||||
cd $SRC
|
||||
if ( test -d $FRAMEWORK )
|
||||
then
|
||||
echo "$FRAMEWORK already cloned"
|
||||
cd $FRAMEWORK
|
||||
if [ "$FRAMEWORK" = "polkit-qt-1" ] || [ "$FRAMEWORK" = "breeze" ] || [ "$FRAMEWORK" = "kdecoration" ]; then
|
||||
git checkout .
|
||||
git checkout master
|
||||
git reset --hard
|
||||
git pull --rebase
|
||||
elif [ "$FRAMEWORK" = "knotifications" ]; then
|
||||
git checkout .
|
||||
git checkout master
|
||||
git fetch --tags
|
||||
git checkout v5.45.0
|
||||
else
|
||||
git fetch --tags
|
||||
git checkout v5.45.0
|
||||
fi
|
||||
#git checkout master
|
||||
#git reset --hard
|
||||
#git pull --rebase
|
||||
cd ..
|
||||
else
|
||||
git clone git://anongit.kde.org/$FRAMEWORK
|
||||
cd $FRAMEWORK
|
||||
if [ "$FRAMEWORK" = "polkit-qt-1" ] || [ "$FRAMEWORK" = "breeze" ] || [ "$FRAMEWORK" = "kdecoration" ]; then
|
||||
git checkout master
|
||||
git reset --hard
|
||||
git pull --rebase
|
||||
elif [ "$FRAMEWORK" = "knotifications" ]; then
|
||||
git reset --hard
|
||||
git fetch --tags
|
||||
git checkout v5.45.0
|
||||
else
|
||||
git fetch --tags
|
||||
git checkout v5.45.0
|
||||
fi
|
||||
cd ..
|
||||
fi
|
||||
|
||||
if [ "$FRAMEWORK" = "knotifications" ]; then
|
||||
cd $FRAMEWORK
|
||||
echo "patching knotifications"
|
||||
cat > no_phonon.patch << EOF
|
||||
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
||||
index 0104c73..de44e9a 100644
|
||||
--- a/CMakeLists.txt
|
||||
+++ b/CMakeLists.txt
|
||||
@@ -59,11 +59,11 @@ find_package(KF5Config ${KF5_DEP_VERSION} REQUIRED)
|
||||
find_package(KF5Codecs ${KF5_DEP_VERSION} REQUIRED)
|
||||
find_package(KF5CoreAddons ${KF5_DEP_VERSION} REQUIRED)
|
||||
|
||||
-find_package(Phonon4Qt5 4.6.60 REQUIRED NO_MODULE)
|
||||
-set_package_properties(Phonon4Qt5 PROPERTIES
|
||||
- DESCRIPTION "Qt-based audio library"
|
||||
- TYPE REQUIRED
|
||||
- PURPOSE "Required to build audio notification support")
|
||||
+#find_package(Phonon4Qt5 4.6.60 REQUIRED NO_MODULE)
|
||||
+#set_package_properties(Phonon4Qt5 PROPERTIES
|
||||
+# DESCRIPTION "Qt-based audio library"
|
||||
+# TYPE REQUIRED
|
||||
+# PURPOSE "Required to build audio notification support")
|
||||
if (Phonon4Qt5_FOUND)
|
||||
add_definitions(-DHAVE_PHONON4QT5)
|
||||
endif()
|
||||
EOF
|
||||
cat no_phonon.patch |patch -p1
|
||||
cd ..
|
||||
fi
|
||||
|
||||
# create build dir
|
||||
mkdir -p $BUILD/$FRAMEWORK
|
||||
|
||||
# go there
|
||||
cd $BUILD/$FRAMEWORK
|
||||
|
||||
# cmake it
|
||||
cmake3 -DBUILD_TESTING:BOOL=OFF -DCMAKE_INSTALL_PREFIX:PATH=$PREFIX $2 $SRC/$FRAMEWORK > /tmp/$FRAMEWORK.log
|
||||
|
||||
# make
|
||||
make -j8
|
||||
|
||||
# install
|
||||
make install
|
||||
) }
|
||||
|
||||
|
||||
#TO-DO script these extras
|
||||
build_framework extra-cmake-modules "-DKDE_INSTALL_USE_QT_SYS_PATHS:BOOL=ON"
|
||||
#Cmake is too old on centos6.... so does this mean no sound for KDE apps? blech.
|
||||
#build_framework phonon -DPHONON_BUILD_PHONON4QT5=ON
|
||||
|
||||
for FRAMEWORK in karchive kconfig kwidgetsaddons kcompletion kcoreaddons polkit-qt-1 kauth kcodecs ki18n kdoctools kguiaddons kconfigwidgets kwindowsystem kcrash kdbusaddons kitemviews kiconthemes kjobwidgets kservice solid sonnet ktextwidgets attica kglobalaccel kxmlgui kbookmarks knotifications kio knotifyconfig knewstuff kpackage kdeclarative ; do
|
||||
build_framework $FRAMEWORK "-DKDE_INSTALL_USE_QT_SYS_PATHS:BOOL=ON"
|
||||
done
|
||||
build_framework breeze-icons "-DBINARY_ICONS_RESOURCE=1 -DKDE_INSTALL_USE_QT_SYS_PATHS:BOOL=ON"
|
||||
build_framework kdecoration "-DKDE_INSTALL_USE_QT_SYS_PATHS:BOOL=ON"
|
||||
build_framework breeze "-DKDE_INSTALL_USE_QT_SYS_PATHS:BOOL=ON"
|
||||
|
||||
cd ..
|
||||
|
||||
echo "+++++++++++++\n BUILDING FRAMEWORKS DONE \n+++++++++++++++"
|
||||
|
||||
409
packaging/appimage/02-avlibs.sh
Executable file
@@ -0,0 +1,409 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Halt on errors
|
||||
set -e
|
||||
|
||||
# Be verbose
|
||||
set -x
|
||||
|
||||
# Now we are inside CentOS 6
|
||||
grep -r "CentOS release 6" /etc/redhat-release || exit 1
|
||||
|
||||
. /opt/rh/devtoolset-3/enable
|
||||
|
||||
#necessary ?
|
||||
#pulseaudio-libs
|
||||
|
||||
QTVERSION=5.9.4
|
||||
QVERSION_SHORT=5.9
|
||||
QTDIR=/usr/local/Qt-${QTVERSION}/
|
||||
|
||||
# qjsonparser, used to add metadata to the plugins needs to work in a en_US.UTF-8 environment. That's
|
||||
# not always set correctly in CentOS 6.7
|
||||
export LC_ALL=en_US.UTF-8
|
||||
export LANG=en_us.UTF-8
|
||||
|
||||
# Determine which architecture should be built
|
||||
if [[ "$(arch)" = "i686" || "$(arch)" = "x86_64" ]] ; then
|
||||
ARCH=$(arch)
|
||||
else
|
||||
echo "Architecture could not be determined"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Make sure we build from the /, parts of this script depends on that. We also need to run as root...
|
||||
cd /
|
||||
|
||||
# TO-DO ask about this.
|
||||
export CMAKE_PREFIX_PATH=$QTDIR:/app/share/llvm/
|
||||
|
||||
# if the library path doesn't point to our usr/lib, linking will be broken and we won't find all deps either
|
||||
export LD_LIBRARY_PATH=/usr/lib64/:/usr/lib:/app/usr/lib:$QTDIR/lib/:/opt/python3.5/lib/:$LD_LIBRARY_PATH
|
||||
#export LD_LIBRARY_PATH=/usr/lib64/:/usr/lib:/app/usr/lib:$QTDIR/lib/:$LD_LIBRARY_PATH
|
||||
|
||||
# Prepare the install location
|
||||
#rm -rf /app/ || true
|
||||
mkdir -p /app/usr
|
||||
|
||||
# export LLVM_ROOT=/opt/llvm/
|
||||
|
||||
# start building the deps
|
||||
|
||||
function build_external
|
||||
{ (
|
||||
# errors fatal
|
||||
echo "Compiler version:" $(g++ --version)
|
||||
set -e
|
||||
|
||||
SRC=/external
|
||||
BUILD=/external/build
|
||||
PREFIX=/app/usr/
|
||||
|
||||
# framework
|
||||
EXTERNAL=$1
|
||||
|
||||
# clone if not there
|
||||
mkdir -p $SRC
|
||||
cd $SRC
|
||||
if ( test -d $EXTERNAL )
|
||||
then
|
||||
echo "$EXTERNAL already cloned"
|
||||
if [ $# -eq 0 ]; then
|
||||
cd $EXTERNAL
|
||||
git reset --hard
|
||||
git pull --rebase
|
||||
cd ..
|
||||
fi
|
||||
else
|
||||
git clone $EXTERNAL_ADDRESS
|
||||
fi
|
||||
|
||||
# create build dir
|
||||
mkdir -p $BUILD/$EXTERNAL
|
||||
|
||||
# go there
|
||||
cd $BUILD/$EXTERNAL
|
||||
|
||||
# cmake it
|
||||
if ( $EXTERNAL_CMAKE )
|
||||
then
|
||||
cmake3 -DCMAKE_INSTALL_PREFIX:PATH=$PREFIX $2 $SRC/$EXTERNAL
|
||||
else
|
||||
$EXTERNAL_CONFIGURE
|
||||
fi
|
||||
make -j8
|
||||
|
||||
# install
|
||||
make install
|
||||
) }
|
||||
|
||||
|
||||
export WLD=/app/usr/ # change this to another location if you prefer
|
||||
export LD_LIBRARY_PATH=$WLD/lib:$LD_LIBRARY_PATH
|
||||
export PKG_CONFIG_PATH=$WLD/lib/pkgconfig/:$WLD/share/pkgconfig/:/usr/lib/pkgconfig/:$PKG_CONFIG_PATH
|
||||
export PATH=$WLD/bin:$PATH
|
||||
export ACLOCAL_PATH=$WLD/share/aclocal
|
||||
export ACLOCAL="aclocal -I $ACLOCAL_PATH"
|
||||
|
||||
#libsndfile
|
||||
cd /external
|
||||
if ( test -d /external/libsndfile-1.0.28 )
|
||||
then
|
||||
echo "libsndfile already downloaded"
|
||||
else
|
||||
wget http://www.mega-nerd.com/libsndfile/files/libsndfile-1.0.28.tar.gz
|
||||
tar -xf libsndfile-1.0.28.tar.gz
|
||||
fi
|
||||
cd libsndfile-1.0.28
|
||||
./configure --prefix=$WLD
|
||||
make -j5
|
||||
make install
|
||||
|
||||
#libsamplerate
|
||||
cd /external
|
||||
if ( test -d /external/libsamplerate-0.1.9 )
|
||||
then
|
||||
echo "libsamplerate already downloaded"
|
||||
else
|
||||
wget http://www.mega-nerd.com/SRC/libsamplerate-0.1.9.tar.gz
|
||||
tar -xf libsamplerate-0.1.9.tar.gz
|
||||
fi
|
||||
cd libsamplerate-0.1.9
|
||||
./configure --prefix=$WLD
|
||||
make -j5
|
||||
make install
|
||||
|
||||
#ladspa-plugins (shw)
|
||||
cd /external
|
||||
if ( test -d /external/ladspa )
|
||||
then
|
||||
echo "ladspa already downloaded, on failure, replace AC_CONFIG_MACRO_DIRS([m4]) with AC_CONFIG_MACRO_DIR([m4])"
|
||||
cd ladspa
|
||||
git reset --hard
|
||||
git pull --rebase
|
||||
cd ..
|
||||
else
|
||||
git clone https://github.com/swh/ladspa.git
|
||||
fi
|
||||
cd ladspa
|
||||
echo "Readying ladspa, on failure, replace AC_CONFIG_MACRO_DIRS([m4]) with AC_CONFIG_MACRO_DIR([m4]) in configure.ac"
|
||||
autoreconf -i
|
||||
./configure --prefix=$WLD
|
||||
make -j5
|
||||
make install
|
||||
|
||||
|
||||
#alsa-lib
|
||||
cd /external
|
||||
if ( test -d /external/alsa-lib-1.1.5 )
|
||||
then
|
||||
echo "alsa-lib already downloaded"
|
||||
else
|
||||
wget ftp://ftp.alsa-project.org/pub/lib/alsa-lib-1.1.5.tar.bz2
|
||||
tar -xf alsa-lib-1.1.5.tar.bz2
|
||||
fi
|
||||
cd alsa-lib-1.1.5
|
||||
./configure --prefix=$WLD
|
||||
make -j5
|
||||
make install
|
||||
|
||||
|
||||
#libx264
|
||||
cd /external
|
||||
if ( test -d /external/x264 )
|
||||
then
|
||||
echo "libx264 already cloned"
|
||||
if [ $# -eq 0 ]; then
|
||||
cd x264
|
||||
git reset --hard
|
||||
git pull --rebase
|
||||
cd ..
|
||||
fi
|
||||
# make distclean
|
||||
else
|
||||
#git clone git://git.videolan.org/x264.git
|
||||
git clone https://anonscm.debian.org/git/pkg-multimedia/x264.git
|
||||
fi
|
||||
cd x264
|
||||
./configure --enable-static --enable-shared --prefix=$WLD
|
||||
make -j5
|
||||
make install
|
||||
|
||||
|
||||
#libx265
|
||||
cd /external
|
||||
if ( test -d /external/x265 )
|
||||
then
|
||||
echo "libx265 already downloaded"
|
||||
cd x265
|
||||
if [ $# -eq 0 ]; then
|
||||
git reset --hard
|
||||
git pull --rebase
|
||||
fi
|
||||
cd build/linux
|
||||
# make distclean
|
||||
else
|
||||
git clone https://anonscm.debian.org/git/pkg-multimedia/x265.git
|
||||
cd x265/build/linux
|
||||
fi
|
||||
cmake3 -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="$WLD" -DENABLE_PIC=ON -DENABLE_SHARED=OFF ../../source
|
||||
make -j5
|
||||
make install
|
||||
|
||||
#libvpx
|
||||
cd /external
|
||||
if ( test -d /external/libvpx )
|
||||
then
|
||||
echo "libvpx already cloned"
|
||||
if [ $# -eq 0 ]; then
|
||||
cd libvpx
|
||||
git reset --hard
|
||||
git pull --rebase
|
||||
cd ..
|
||||
fi
|
||||
#make clean
|
||||
else
|
||||
git clone https://anonscm.debian.org/git/pkg-multimedia/libvpx.git
|
||||
fi
|
||||
cd libvpx
|
||||
./configure --enable-static --as=yasm --enable-shared --prefix=$WLD
|
||||
make -j5
|
||||
make install
|
||||
|
||||
#ffmpeg
|
||||
cd /external
|
||||
if ( test -d /external/ffmpeg )
|
||||
then
|
||||
echo "ffmpeg already cloned"
|
||||
if [ $# -eq 0 ]; then
|
||||
cd ffmpeg
|
||||
git reset --hard
|
||||
# git pull --rebase
|
||||
git checkout debian/7%3.3.4-2
|
||||
cd ..
|
||||
fi
|
||||
else
|
||||
# git clone https://git.ffmpeg.org/ffmpeg.git
|
||||
# Use debian source
|
||||
git clone https://anonscm.debian.org/git/pkg-multimedia/ffmpeg.git
|
||||
fi
|
||||
cd ffmpeg
|
||||
./configure --prefix=$WLD --extra-ldflags="-L$WLD/lib -lstdc++ -lm -lrt -ldl" --extra-cflags="-I$WLD/include" --enable-shared --enable-avfilter --enable-gpl --enable-avresample --enable-libx265 --enable-libvpx --enable-libx264 --disable-doc
|
||||
make -j5
|
||||
make install
|
||||
|
||||
#opencv_contrib
|
||||
# download manually (hash mismatch)
|
||||
# https://github.com/opencv/opencv_3rdparty/tree/ippicv/master_20151201/ippicv
|
||||
|
||||
|
||||
if ( test -d /external/cairo-1.14.10 )
|
||||
then
|
||||
echo "cairo already downloaded"
|
||||
cd /external/cairo-1.14.10
|
||||
else
|
||||
cd /external
|
||||
wget https://www.cairographics.org/releases/cairo-1.14.10.tar.xz
|
||||
tar -xf cairo-1.14.10.tar.xz
|
||||
cd /external/cairo-1.14.10
|
||||
./autogen.sh
|
||||
fi
|
||||
./configure --prefix=$WLD
|
||||
make -j5
|
||||
make install
|
||||
/bin/cp /app/usr/lib/pkgconfig/cairo* /usr/lib/pkgconfig/
|
||||
|
||||
if ( test -d /external/harfbuzz-0.9.10 )
|
||||
then
|
||||
echo "pango already downloaded"
|
||||
cd /external/harfbuzz-0.9.10
|
||||
else
|
||||
cd /external
|
||||
wget https://www.freedesktop.org/software/harfbuzz/release/harfbuzz-0.9.10.tar.bz2
|
||||
tar -xf harfbuzz-0.9.10.tar.bz2
|
||||
cd /external/harfbuzz-0.9.10
|
||||
fi
|
||||
./configure --prefix=$WLD
|
||||
make -j5
|
||||
make install
|
||||
/bin/cp /app/usr/lib/pkgconfig/harf* /usr/lib/pkgconfig/
|
||||
/bin/cp /app/usr/lib/libharfbuzz.* /usr/lib
|
||||
|
||||
if ( test -d /external/pango-1.28.4 )
|
||||
then
|
||||
echo "pango already downloaded"
|
||||
cd /external/pango-1.28.4
|
||||
else
|
||||
cd /external
|
||||
wget http://ftp.gnome.org/pub/GNOME/sources/pango/1.28/pango-1.28.4.tar.gz
|
||||
tar -xf pango-1.28.4.tar.gz
|
||||
cd /external/pango-1.28.4
|
||||
fi
|
||||
./configure --prefix=$WLD
|
||||
make -j5
|
||||
make install
|
||||
/bin/cp /app/usr/lib/pkgconfig/pango* /usr/lib/pkgconfig/
|
||||
|
||||
if ( test -d /external/gdk-pixbuf-2.23.5 )
|
||||
then
|
||||
echo "gdk-pixbuf already downloaded"
|
||||
cd /external/gdk-pixbuf-2.23.5
|
||||
else
|
||||
cd /external
|
||||
wget http://ftp.gnome.org/pub/GNOME/sources/gdk-pixbuf/2.23/gdk-pixbuf-2.23.5.tar.xz
|
||||
tar -xf gdk-pixbuf-2.23.5.tar.xz
|
||||
cd /external/gdk-pixbuf-2.23.5
|
||||
fi
|
||||
./configure --prefix=$WLD
|
||||
make -j5
|
||||
make install
|
||||
/bin/cp /app/usr/lib/pkgconfig/gdk* /usr/lib/pkgconfig/
|
||||
|
||||
|
||||
if ( test -d /external/gtk+-2.23.90 )
|
||||
then
|
||||
echo "gtk2 already downloaded"
|
||||
cd /external/gtk+-2.23.90
|
||||
else
|
||||
cd /external
|
||||
wget http://ftp.gnome.org/pub/GNOME/sources/gtk+/2.23/gtk+-2.23.90.tar.gz
|
||||
tar -xf gtk+-2.23.90.tar.gz
|
||||
cd /external/gtk+-2.23.90
|
||||
fi
|
||||
./configure --prefix=$WLD
|
||||
make -j5
|
||||
make install
|
||||
/bin/cp /app/usr/lib/pkgconfig/gtk* /usr/lib/pkgconfig/
|
||||
/bin/cp /app/usr/lib/pkgconfig/gdk* /usr/lib/pkgconfig/
|
||||
|
||||
cd /external
|
||||
if ( test -d /external/opencv_contrib )
|
||||
then
|
||||
echo "opencv_contrib already cloned"
|
||||
if [ $# -eq 0 ]; then
|
||||
cd opencv_contrib
|
||||
git reset --hard
|
||||
# git pull --rebase
|
||||
git checkout 3.3.0
|
||||
cd ..
|
||||
fi
|
||||
else
|
||||
git clone https://github.com/opencv/opencv_contrib.git
|
||||
fi
|
||||
|
||||
cd /external
|
||||
if ( test -d /external/opencv )
|
||||
then
|
||||
echo "opencv already cloned"
|
||||
if [ $# -eq 0 ]; then
|
||||
cd opencv
|
||||
git reset --hard
|
||||
# git pull --rebase
|
||||
git checkout 3.3.0
|
||||
cd ..
|
||||
fi
|
||||
else
|
||||
git clone https://github.com/opencv/opencv.git
|
||||
fi
|
||||
|
||||
#opencv
|
||||
IN=opencv,https://github.com/opencv/opencv.git,true,""
|
||||
IFS=',' read -a external_options <<< $IN
|
||||
EXTERNAL="${external_options[0]}"
|
||||
EXTERNAL_ADDRESS="${external_options[1]}"
|
||||
EXTERNAL_CMAKE="${external_options[2]}"
|
||||
EXTERNAL_CMAKE_OPTIONS="-DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules -DBUILD_opencv_aruco=OFF -DBUILD_opencv_bgsegm=OFF -DBUILD_opencv_bioinspired=OFF -DBUILD_opencv_ccalib=OFF -DBUILD_opencv_cnn_3dobj=OFF -DBUILD_opencv_cvv=OFF -DBUILD_opencv_dnn=OFF -DBUILD_opencv_dnns_easily_fooled=OFF -DBUILD_opencv_dpm=OFF -DBUILD_opencv_fuzzy=OFF -DBUILD_opencv_hdf=OFF -DBUILD_opencv_line_descriptor=OFF -DBUILD_opencv_matlab=OFF -DBUILD_opencv_optflow=OFF -DBUILD_opencv_plot=ON -DBUILD_opencv_reg=OFF -DBUILD_opencv_rgbd=OFF -DBUILD_opencv_saliency=OFF -DBUILD_opencv_sfm=OFF -DBUILD_opencv_stereo=OFF -DBUILD_opencv_structured_light=OFF -DBUILD_opencv_surface_matching=OFF -DBUILD_opencv_xfeatures2d=OFF -DBUILD_opencv_xobjdetect=OFF -DBUILD_opencv_xphoto=OFF -DBUILD_opencv_calib3d=OFF -DBUILD_opencv_cudaarithm=OFF -DBUILD_opencv_cudabgsegm=OFF -DBUILD_opencv_cudacodec=OFF -DBUILD_opencv_cudafilters=OFF -DBUILD_opencv_cudalegacy=OFF -DBUILD_opencv_cudaobjdetect=OFF -DBUILD_opencv_cudaoptflow=OFF -DBUILD_opencv_cudastereo=OFF -DBUILD_opencv_cudawarping=OFF -DBUILD_opencv_cudev=OFF -DBUILD_opencv_java=OFF -DBUILD_opencv_shape=OFF -DBUILD_opencv_stitching=OFF -DBUILD_opencv_superres=OFF -DBUILD_opencv_ts=OFF -DBUILD_opencv_videoio=OFF -DBUILD_opencv_videostab=OFF -DBUILD_opencv_viz=OFF"
|
||||
|
||||
# create build dir
|
||||
SRC=/external
|
||||
BUILD=/external/build
|
||||
PREFIX=/app/usr/
|
||||
mkdir -p $BUILD/opencv
|
||||
|
||||
# go there
|
||||
cd $BUILD/opencv
|
||||
|
||||
cmake3 -DCMAKE_INSTALL_PREFIX:PATH=$PREFIX $EXTERNAL_CMAKE_OPTIONS $SRC/opencv
|
||||
|
||||
# make
|
||||
make -j8
|
||||
|
||||
# install
|
||||
make install
|
||||
|
||||
|
||||
#EXTERNAL_CONFIGURE="${external_options[3]}"
|
||||
#build_external $EXTERNAL $EXTERNAL_CMAKE_OPTIONS
|
||||
|
||||
|
||||
#vidstab
|
||||
IN=vid.stab,https://github.com/georgmartius/vid.stab.git,true,""
|
||||
IFS=',' read -a external_options <<< $IN
|
||||
EXTERNAL="${external_options[0]}"
|
||||
EXTERNAL_ADDRESS="${external_options[1]}"
|
||||
EXTERNAL_CMAKE="${external_options[2]}"
|
||||
EXTERNAL_CONFIGURE="${external_options[3]}"
|
||||
build_external $EXTERNAL
|
||||
|
||||
|
||||
echo "/////////////////\nBUILDING AV LIBS DONE\n////////////////"
|
||||
259
packaging/appimage/03-kdenlive.sh
Executable file
@@ -0,0 +1,259 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Halt on errors
|
||||
set -e
|
||||
|
||||
# Be verbose
|
||||
set -x
|
||||
|
||||
# Now we are inside CentOS 6
|
||||
grep -r "CentOS release 6" /etc/redhat-release || exit 1
|
||||
|
||||
# Get helper functions
|
||||
wget -q https://github.com/probonopd/AppImages/raw/master/functions.sh -O ./functions.sh
|
||||
. ./functions.sh
|
||||
rm -f functions.sh
|
||||
|
||||
. /opt/rh/devtoolset-3/enable
|
||||
|
||||
#necessary ?
|
||||
#pulseaudio-libs
|
||||
|
||||
QTVERSION=5.9.4
|
||||
QVERSION_SHORT=5.9
|
||||
QTDIR=/usr/local/Qt-${QTVERSION}/
|
||||
|
||||
# qjsonparser, used to add metadata to the plugins needs to work in a en_US.UTF-8 environment. That's
|
||||
# not always set correctly in CentOS 6.7
|
||||
export LC_ALL=en_US.UTF-8
|
||||
export LANG=en_us.UTF-8
|
||||
|
||||
# Determine which architecture should be built
|
||||
if [[ "$(arch)" = "i686" || "$(arch)" = "x86_64" ]] ; then
|
||||
ARCH=$(arch)
|
||||
else
|
||||
echo "Architecture could not be determined"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Make sure we build from the /, parts of this script depends on that. We also need to run as root...
|
||||
cd /
|
||||
|
||||
|
||||
# TO-DO ask about this.
|
||||
export CMAKE_PREFIX_PATH=$QTDIR:/app/share/llvm/
|
||||
|
||||
# if the library path doesn't point to our usr/lib, linking will be broken and we won't find all deps either
|
||||
export LD_LIBRARY_PATH=/usr/lib64/:/usr/lib:/app/usr/lib:$QTDIR/lib/:/opt/python3.5/lib/:$LD_LIBRARY_PATH
|
||||
#export LD_LIBRARY_PATH=/usr/lib64/:/usr/lib:/app/usr/lib:$QTDIR/lib/:$LD_LIBRARY_PATH
|
||||
|
||||
# Workaround for: On CentOS 6, .pc files in /usr/lib/pkgconfig are not recognized
|
||||
# However, this is where .pc files get installed when bulding libraries... (FIXME)
|
||||
# I found this by comparing the output of librevenge's "make install" command
|
||||
# between Ubuntu and CentOS 6
|
||||
|
||||
#ln -sf /usr/share/pkgconfig /usr/lib/pkgconfig
|
||||
|
||||
#update ruby
|
||||
yum -y remove ruby ruby-devel
|
||||
if ( test -d /external/ruby-2.1.2 )
|
||||
then
|
||||
echo "RUBY already cloned"
|
||||
else
|
||||
cd /external
|
||||
wget http://cache.ruby-lang.org/pub/ruby/2.1/ruby-2.1.2.tar.gz
|
||||
tar xvfvz ruby-2.1.2.tar.gz
|
||||
fi
|
||||
cd /external/ruby-2.1.2
|
||||
./configure
|
||||
make
|
||||
make install
|
||||
gem update --system
|
||||
|
||||
# Get project
|
||||
if [ ! -d /kdenlive ] ; then
|
||||
git clone --depth 1 http://anongit.kde.org/kdenlive.git /kdenlive
|
||||
cd /kdenlive/
|
||||
# git checkout -b timeline2 origin/refactoring_timeline
|
||||
else
|
||||
cd /kdenlive/
|
||||
if [ $# -eq 0 ]; then
|
||||
git pull
|
||||
fi
|
||||
fi
|
||||
cd /kdenlive/
|
||||
#git_pull_rebase_helper
|
||||
|
||||
# Prepare the install location
|
||||
#rm -rf /app/ || true
|
||||
#mkdir -p /app/usr
|
||||
|
||||
# export LLVM_ROOT=/opt/llvm/
|
||||
|
||||
# make sure lib and lib64 are the same thing
|
||||
mkdir -p /app/usr/lib
|
||||
cd /app/usr
|
||||
#ln -s lib lib64
|
||||
|
||||
# start building the deps
|
||||
|
||||
function build_external
|
||||
{ (
|
||||
# errors fatal
|
||||
echo "Compiler version:" $(g++ --version)
|
||||
set -e
|
||||
|
||||
SRC=/external
|
||||
BUILD=/external/build
|
||||
PREFIX=/app/usr/
|
||||
|
||||
# framework
|
||||
EXTERNAL=$1
|
||||
|
||||
# clone if not there
|
||||
mkdir -p $SRC
|
||||
cd $SRC
|
||||
if ( test -d $EXTERNAL )
|
||||
then
|
||||
echo "$EXTERNAL already cloned"
|
||||
if [ $# -eq 0 ]; then
|
||||
cd $EXTERNAL
|
||||
git reset --hard
|
||||
git pull --rebase
|
||||
cd ..
|
||||
fi
|
||||
else
|
||||
git clone $EXTERNAL_ADDRESS
|
||||
fi
|
||||
|
||||
# create build dir
|
||||
mkdir -p $BUILD/$EXTERNAL
|
||||
|
||||
# go there
|
||||
cd $BUILD/$EXTERNAL
|
||||
|
||||
# cmake it
|
||||
if ( $EXTERNAL_CMAKE )
|
||||
then
|
||||
cmake3 -DCMAKE_INSTALL_PREFIX:PATH=$PREFIX $2 $SRC/$EXTERNAL
|
||||
else
|
||||
$EXTERNAL_CONFIGURE
|
||||
fi
|
||||
# make
|
||||
make -j8
|
||||
|
||||
# install
|
||||
make install
|
||||
) }
|
||||
|
||||
|
||||
export WLD=/app/usr/ # change this to another location if you prefer
|
||||
export LD_LIBRARY_PATH=$WLD/lib:$LD_LIBRARY_PATH
|
||||
export PKG_CONFIG_PATH=$WLD/lib/pkgconfig/:$WLD/share/pkgconfig/:/usr/lib/pkgconfig/:$PKG_CONFIG_PATH
|
||||
export PATH=$WLD/bin:$PATH
|
||||
export ACLOCAL_PATH=$WLD/share/aclocal
|
||||
export ACLOCAL="aclocal -I $ACLOCAL_PATH"
|
||||
|
||||
|
||||
IN=frei0r,https://github.com/dyne/frei0r.git,true,""
|
||||
IFS=',' read -a external_options <<< $IN
|
||||
EXTERNAL="${external_options[0]}"
|
||||
EXTERNAL_ADDRESS="${external_options[1]}"
|
||||
EXTERNAL_CMAKE="${external_options[2]}"
|
||||
EXTERNAL_CMAKE_OPTIONS="-DWITHOUT_OPENCV:BOOL=ON"
|
||||
EXTERNAL_CONFIGURE="${external_options[3]}"
|
||||
build_external $EXTERNAL $EXTERNAL_CMAKE_OPTIONS
|
||||
|
||||
#TODO: dependencies for MLT modules (xml, sdl, etc).
|
||||
|
||||
#movit - - Requires some adjustments to build with older automake
|
||||
#cd /external
|
||||
#if ( test -d /external/movit )
|
||||
#then
|
||||
# echo "movit already cloned"
|
||||
#if [ $# -eq 0 ]; then
|
||||
# cd movit
|
||||
# git pull
|
||||
# git reset --hard
|
||||
# git pull --rebase
|
||||
# cd ..
|
||||
#fi
|
||||
#else
|
||||
# git clone https://git.sesse.net/movit
|
||||
#fi
|
||||
#cd movit
|
||||
#./autogen.sh
|
||||
#./configure --prefix=/app/usr
|
||||
#make -j5
|
||||
#make install
|
||||
|
||||
|
||||
#mlt
|
||||
cd /external
|
||||
if ( test -d /external/mlt )
|
||||
then
|
||||
echo "mlt already cloned"
|
||||
if [ $# -eq 0 ]; then
|
||||
cd mlt
|
||||
git reset --hard
|
||||
git pull --rebase
|
||||
#current git master incompatible (crashes Kdenlive on keyframes)
|
||||
git checkout 15105c4
|
||||
cd ..
|
||||
fi
|
||||
else
|
||||
git clone https://github.com/mltframework/mlt.git
|
||||
fi
|
||||
cd mlt
|
||||
|
||||
|
||||
# patch MLT
|
||||
cat > mlt_fix.patch << 'EOF'
|
||||
diff --git a/src/modules/vid.stab/configure b/src/modules/vid.stab/configure
|
||||
index e501888..55f0307 100755
|
||||
--- a/src/modules/vid.stab/configure
|
||||
+++ b/src/modules/vid.stab/configure
|
||||
@@ -19,7 +19,8 @@ then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
- echo > config.mak
|
||||
+ echo "CFLAGS += $(pkg-config --cflags vidstab)" > config.mak
|
||||
+ echo "LDFLAGS += $(pkg-config --libs vidstab)" >> config.mak
|
||||
case $targetos in
|
||||
Darwin)
|
||||
;;
|
||||
EOF
|
||||
cat mlt_fix.patch |patch -p1
|
||||
|
||||
export CXXFLAGS="-std=c++11"
|
||||
./configure --enable-gpl --prefix=/app/usr --disable-rtaudio
|
||||
make -j5
|
||||
make install
|
||||
|
||||
|
||||
|
||||
# Build kdenlive
|
||||
mkdir -p /kdenlive_build
|
||||
mkdir -p /kdenlive_build/po
|
||||
|
||||
if [ ! -d /kdenlive/po ] ; then
|
||||
ln -s /kdenlive_build/po /kdenlive/po
|
||||
fi
|
||||
|
||||
cd /kdenlive_build
|
||||
cmake3 ../kdenlive \
|
||||
-DCMAKE_INSTALL_PREFIX:PATH=/app/usr/ \
|
||||
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
|
||||
-DPACKAGERS_BUILD=1 \
|
||||
-DKDE_INSTALL_USE_QT_SYS_PATHS:BOOL=ON \
|
||||
-DKDE_L10N_AUTO_TRANSLATIONS:BOOL=ON \
|
||||
-DBUILD_TESTS=FALSE
|
||||
make -j8
|
||||
make install
|
||||
|
||||
echo "++++++++++++++++++\nBUILD FINSHED \n+++++++++++++++++";
|
||||
###############################################################
|
||||
# Build complete, AppImage bundling begins here
|
||||
###############################################################
|
||||
|
||||
346
packaging/appimage/04-create-app.sh
Executable file
@@ -0,0 +1,346 @@
|
||||
#!/bin/bash
|
||||
|
||||
|
||||
|
||||
# Halt on errors
|
||||
set -e
|
||||
|
||||
# Be verbose
|
||||
set -x
|
||||
|
||||
# Now we are inside CentOS 6
|
||||
grep -r "CentOS release 6" /etc/redhat-release || exit 1
|
||||
|
||||
# Get helper functions
|
||||
wget -q https://github.com/probonopd/AppImages/raw/master/functions.sh -O ./functions.sh
|
||||
. ./functions.sh
|
||||
rm -f functions.sh
|
||||
|
||||
. /opt/rh/devtoolset-3/enable
|
||||
|
||||
#necessary ?
|
||||
#pulseaudio-libs
|
||||
|
||||
QTVERSION=5.9.1
|
||||
QVERSION_SHORT=5.9
|
||||
#QTDIR=/usr/local/Qt-${QTVERSION}/
|
||||
QTDIR=/usr/
|
||||
|
||||
# qjsonparser, used to add metadata to the plugins needs to work in a en_US.UTF-8 environment. That's
|
||||
# not always set correctly in CentOS 6.7
|
||||
export LC_ALL=en_US.UTF-8
|
||||
export LANG=en_us.UTF-8
|
||||
|
||||
# Determine which architecture should be built
|
||||
if [[ "$(arch)" = "i686" || "$(arch)" = "x86_64" ]] ; then
|
||||
ARCH=$(arch)
|
||||
else
|
||||
echo "Architecture could not be determined"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Make sure we build from the /, parts of this script depends on that. We also need to run as root...
|
||||
cd /
|
||||
|
||||
# TO-DO ask about this.
|
||||
export CMAKE_PREFIX_PATH=$QTDIR:/app/share/llvm/
|
||||
|
||||
# if the library path doesn't point to our usr/lib, linking will be broken and we won't find all deps either
|
||||
export LD_LIBRARY_PATH=/usr/lib64/:/usr/lib:/app/usr/lib:$QTDIR/lib/:/opt/python3.5/lib/:$LD_LIBRARY_PATH
|
||||
#export LD_LIBRARY_PATH=/usr/lib64/:/usr/lib:/app/usr/lib:$QTDIR/lib/:$LD_LIBRARY_PATH
|
||||
|
||||
# Workaround for: On CentOS 6, .pc files in /usr/lib/pkgconfig are not recognized
|
||||
# However, this is where .pc files get installed when bulding libraries... (FIXME)
|
||||
# I found this by comparing the output of librevenge's "make install" command
|
||||
# between Ubuntu and CentOS 6
|
||||
|
||||
#ln -sf /usr/share/pkgconfig /usr/lib/pkgconfig
|
||||
|
||||
export WLD=/app/usr/ # change this to another location if you prefer
|
||||
export LD_LIBRARY_PATH=$WLD/lib:$LD_LIBRARY_PATH
|
||||
export PKG_CONFIG_PATH=$WLD/lib/pkgconfig/:$WLD/share/pkgconfig/:/usr/lib/pkgconfig/:$PKG_CONFIG_PATH
|
||||
export PATH=$WLD/bin:$PATH
|
||||
export ACLOCAL_PATH=$WLD/share/aclocal
|
||||
export ACLOCAL="aclocal -I $ACLOCAL_PATH"
|
||||
|
||||
|
||||
echo "++++++++++++++++++\nBUILD FINSHED \n+++++++++++++++++";
|
||||
###############################################################
|
||||
# Build complete, AppImage bundling begins here
|
||||
###############################################################
|
||||
|
||||
cd /app
|
||||
|
||||
# FIXME: How to find out which subset of plugins is really needed? I used strace when running the binary
|
||||
mkdir -p ./usr/lib/qt5/plugins/
|
||||
|
||||
PLUGINS=$(dirname $QTDIR/plugins/bearer)
|
||||
|
||||
/bin/cp -r $PLUGINS/{bearer,generic,imageformats,platforms,iconengines,platforminputcontexts,xcbglintegrations} ./usr/lib/qt5/plugins/
|
||||
/bin/cp -r $PLUGINS/kf5 ./usr/lib/qt5/plugins/
|
||||
/bin/cp -r $PLUGINS/mltpreview.so ./usr/lib/qt5/plugins/
|
||||
mkdir -p ./usr/lib/qt5/plugins/styles/
|
||||
/bin/cp -r /usr/plugins/styles/breeze.so ./usr/lib/qt5/plugins/styles/
|
||||
/bin/cp -r /usr/plugins/kstyle_breeze_config.so ./usr/lib/qt5/plugins/
|
||||
|
||||
/bin/cp -r $QTDIR/qml ./usr/lib/qt5/
|
||||
cp -ru /usr/share/mime/* /app/usr/share/mime
|
||||
update-mime-database /app/usr/share/mime/
|
||||
|
||||
if ( test -d ./usr/lib/plugins )
|
||||
then
|
||||
mv ./usr/lib/plugins/* ./usr/lib/qt5/plugins/
|
||||
fi
|
||||
|
||||
/bin/cp $(ldconfig -p | grep libsasl2.so.2 | cut -d ">" -f 2 | xargs) ./usr/lib/
|
||||
/bin/cp $(ldconfig -p | grep libGL.so.1 | cut -d ">" -f 2 | xargs) ./usr/lib/ # otherwise segfaults!?
|
||||
/bin/cp $(ldconfig -p | grep libGLU.so.1 | cut -d ">" -f 2 | xargs) ./usr/lib/ # otherwise segfaults!?
|
||||
# Fedora 23 seemed to be missing SOMETHING from the Centos 6.7. The only message was:
|
||||
# This application failed to start because it could not find or load the Qt platform plugin "xcb".
|
||||
# Setting export QT_DEBUG_PLUGINS=1 revealed the cause.
|
||||
# QLibraryPrivate::loadPlugin failed on "/usr/lib64/qt5/plugins/platforms/libqxcb.so" :
|
||||
# "Cannot load library /usr/lib64/qt5/plugins/platforms/libqxcb.so: (/lib64/libEGL.so.1: undefined symbol: drmGetNodeTypeFromFd)"
|
||||
# Which means that we have to copy libEGL.so.1 in too
|
||||
# cp $(ldconfig -p | grep libEGL.so.1 | cut -d ">" -f 2 | xargs) ./usr/lib/ # Otherwise F23 cannot load the Qt platform plugin "xcb"
|
||||
# let's not copy xcb itself, that breaks on dri3 systems https://bugs.kde.org/show_bug.cgi?id=360552
|
||||
#cp $(ldconfig -p | grep libxcb.so.1 | cut -d ">" -f 2 | xargs) ./usr/lib/
|
||||
/bin/cp $(ldconfig -p | grep libfreetype.so.6 | cut -d ">" -f 2 | xargs) ./usr/lib/ # For Fedora 20
|
||||
# cp $(ldconfig -p | grep libfuse | cut -d ">" -f 2 | xargs) ./usr/lib/
|
||||
#cp $(ldconfig -p | grep libselinux | cut -d ">" -f 2 | xargs) ./usr/lib/
|
||||
|
||||
ldd usr/bin/kdenlive | grep "=>" | awk '{print $3}' | xargs -I '{}' cp -v '{}' ./usr/lib || true
|
||||
ldd usr/bin/plugins/platforms/libqxcb.so | grep "=>" | awk '{print $3}' | xargs -I '{}' cp -v '{}' ./usr/lib || true
|
||||
|
||||
# Copy in the indirect dependencies
|
||||
FILES=$(find . -type f -executable)
|
||||
|
||||
for FILE in $FILES ; do
|
||||
ldd "${FILE}" | grep "=>" | awk '{print $3}' | xargs -I '{}' cp -v '{}' usr/lib || true
|
||||
done
|
||||
|
||||
cd usr/ ; find . -type f -exec sed -i -e 's|/usr/lib|././/lib|g' {} \; ; cd ..
|
||||
|
||||
#DEPS=""
|
||||
#for FILE in $FILES ; do
|
||||
# ldd "${FILE}" | grep "=>" | awk '{print $3}' | xargs -I '{}' echo '{}' > DEPSFILE
|
||||
#done
|
||||
#DEPS=$(cat DEPSFILE |sort | uniq)
|
||||
#for FILE in $DEPS ; do
|
||||
# if [ -f $FILE ] ; then
|
||||
# echo $FILE
|
||||
# cp --parents -rfL $FILE ./
|
||||
# fi
|
||||
#done
|
||||
#rm -f DEPSFILE
|
||||
|
||||
copy_deps
|
||||
if [ -d lib64 ] ; then
|
||||
mv lib64/* usr/lib/
|
||||
rm -rf lib64/
|
||||
fi
|
||||
|
||||
# YESOK1
|
||||
|
||||
# The following are assumed to be part of the base system
|
||||
rm -f usr/lib/libcom_err.so.2 || true
|
||||
rm -f usr/lib/libcrypt.so.1 || true
|
||||
rm -f usr/lib/libdl.so.2 || true
|
||||
rm -f usr/lib/libexpat.so.1 || true
|
||||
#rm -f usr/lib/libfontconfig.so.1 || true
|
||||
rm -f usr/lib/libgcc_s.so.1 || true
|
||||
rm -f usr/lib/libglib-2.0.so.0 || true
|
||||
rm -f usr/lib/libgpg-error.so.0 || true
|
||||
rm -f usr/lib/libgssapi_krb5.so.2 || true
|
||||
rm -f usr/lib/libgssapi.so.3 || true
|
||||
rm -f usr/lib/libhcrypto.so.4 || true
|
||||
rm -f usr/lib/libheimbase.so.1 || true
|
||||
rm -f usr/lib/libheimntlm.so.0 || true
|
||||
rm -f usr/lib/libhx509.so.5 || true
|
||||
rm -f usr/lib/libICE.so.6 || true
|
||||
rm -f usr/lib/libidn.so.11 || true
|
||||
rm -f usr/lib/libk5crypto.so.3 || true
|
||||
rm -f usr/lib/libkeyutils.so.1 || true
|
||||
rm -f usr/lib/libkrb5.so.26 || true
|
||||
rm -f usr/lib/libkrb5.so.3 || true
|
||||
rm -f usr/lib/libkrb5support.so.0 || true
|
||||
# rm -f usr/lib/liblber-2.4.so.2 || true # needed for debian wheezy
|
||||
# rm -f usr/lib/libldap_r-2.4.so.2 || true # needed for debian wheezy
|
||||
rm -f usr/lib/libm.so.6 || true
|
||||
rm -f usr/lib/libp11-kit.so.0 || true
|
||||
rm -f usr/lib/libpcre.so.3 || true
|
||||
rm -f usr/lib/libpthread.so.0 || true
|
||||
rm -f usr/lib/libresolv.so.2 || true
|
||||
rm -f usr/lib/libroken.so.18 || true
|
||||
rm -f usr/lib/librt.so.1 || true
|
||||
rm -f usr/lib/libsasl2.so.2 || true
|
||||
rm -f usr/lib/libSM.so.6 || true
|
||||
rm -f usr/lib/libusb-1.0.so.0 || true
|
||||
rm -f usr/lib/libuuid.so.1 || true
|
||||
rm -f usr/lib/libwind.so.0 || true
|
||||
rm -f usr/lib/libfontconfig.so.* || true
|
||||
|
||||
# Remove these libraries, we need to use the system versions; this means 11.04 is not supported (12.04 is our baseline)
|
||||
# rm -f usr/lib/libEGL.so.* || true
|
||||
rm -f usr/lib/libxcb* || true
|
||||
rm -f usr/lib/libGL.so.* || true
|
||||
rm -f usr/lib/libdrm.so.* || true
|
||||
rm -f usr/lib/libX11.so.* || true
|
||||
|
||||
#YESOK2
|
||||
|
||||
#mv usr/local/Qt-*/lib/* usr/lib
|
||||
#rm -rf usr/local/
|
||||
# mv ./opt/python3.5/lib/* usr/lib
|
||||
# mv ./opt/llvm/lib/* usr/lib
|
||||
#rm -rf ./opt/
|
||||
rm -rf app/
|
||||
|
||||
#delete_blacklisted
|
||||
BLACKLISTED_FILES=$(cat_file_from_url https://github.com/AppImage/AppImages/raw/master/excludelist | sed 's|#.*||g')
|
||||
echo $BLACKLISTED_FILES
|
||||
for FILE in $BLACKLISTED_FILES ;
|
||||
do
|
||||
if [[ $FILE == libpango* ]] || [[ $FILE == libgdk_pixbuf* ]] ;
|
||||
then
|
||||
echo "keeping libpango"
|
||||
else
|
||||
FILES="$(find . -name "${FILE}" -not -path "./usr/optional/*")"
|
||||
for FOUND in $FILES ; do
|
||||
rm -vf "$FOUND" "$(readlink -f "$FOUND")"
|
||||
done
|
||||
fi
|
||||
done
|
||||
|
||||
# Do not bundle developer stuff
|
||||
rm -rf usr/include || true
|
||||
rm -rf usr/lib/cmake || true
|
||||
rm -rf usr/lib/pkgconfig || true
|
||||
find . -name '*.la' | xargs -i rm {}
|
||||
rm -rf usr/share/ECM/ || true
|
||||
rm -rf usr/share/gettext || true
|
||||
rm -rf usr/share/pkgconfig || true
|
||||
rm -rf rm -rf ./usr/mkspecs/ || true
|
||||
|
||||
# Remove
|
||||
|
||||
strip -g $(find usr) || true
|
||||
|
||||
if [ ! -z "$(ls -A usr/lib/libexec/kf5)" ]; then
|
||||
/bin/cp -R usr/lib/libexec/kf5/* /app/usr/bin/
|
||||
fi;
|
||||
|
||||
cd /
|
||||
if [ ! -d appimage-exec-wrapper ]; then
|
||||
git clone git://anongit.kde.org/scratch/brauch/appimage-exec-wrapper
|
||||
fi;
|
||||
cd /appimage-exec-wrapper/
|
||||
make clean
|
||||
make
|
||||
|
||||
cd /app
|
||||
/bin/cp -v /appimage-exec-wrapper/exec.so exec_wrapper.so
|
||||
|
||||
cat > AppRun << EOF
|
||||
#!/bin/bash
|
||||
|
||||
DIR="\`dirname \"\$0\"\`"
|
||||
DIR="\`( cd \"\$DIR\" && pwd )\`"
|
||||
export APPDIR=\$DIR
|
||||
|
||||
export LD_PRELOAD=\$DIR/exec_wrapper.so
|
||||
|
||||
export APPIMAGE_ORIGINAL_QML2_IMPORT_PATH=\$QML2_IMPORT_PATH
|
||||
export APPIMAGE_ORIGINAL_LD_LIBRARY_PATH=\$LD_LIBRARY_PATH
|
||||
export APPIMAGE_ORIGINAL_QT_PLUGIN_PATH=\$QT_PLUGIN_PATH
|
||||
export APPIMAGE_ORIGINAL_XDG_DATA_DIRS=\$XDG_DATA_DIRS
|
||||
export APPIMAGE_ORIGINAL_XDG_CONFIG_HOME=\$XDG_CONFIG_HOME
|
||||
export APPIMAGE_ORIGINAL_PATH=\$PATH
|
||||
|
||||
export APPIMAGE_ORIGINAL_MLT_REPOSITORY=\$MLT_REPOSITORY
|
||||
export APPIMAGE_ORIGINAL_MLT_DATA=\$MLT_DATA
|
||||
export APPIMAGE_ORIGINAL_MLT_ROOT_DIR=\$MLT_ROOT_DIR
|
||||
export APPIMAGE_ORIGINAL_MLT_PROFILES_PATH=\$MLT_PROFILES_PATH
|
||||
export APPIMAGE_ORIGINAL_MLT_PRESETS_PATH=\$MLT_PRESETS_PATH
|
||||
|
||||
|
||||
export QML2_IMPORT_PATH=\$DIR/usr/lib/qt5/qml:\$QML2_IMPORT_PATH
|
||||
export LD_LIBRARY_PATH=\$DIR/usr/lib/:\$LD_LIBRARY_PATH
|
||||
export QT_PLUGIN_PATH=\$DIR/usr/lib/qt5/plugins/
|
||||
export XDG_DATA_DIRS=\$DIR/usr/share/:\$XDG_DATA_DIRS
|
||||
export XDG_CONFIG_HOME=\$HOME/.config/kdenlive-appimage/
|
||||
export PATH=\$DIR/usr/bin:\$PATH
|
||||
export KDE_FORK_SLAVES=1
|
||||
|
||||
export MLT_REPOSITORY=\$DIR/usr/lib/mlt/
|
||||
export MLT_DATA=\$DIR/usr/share/mlt/
|
||||
export MLT_ROOT_DIR=\$DIR/usr/
|
||||
export LADSPA_PATH=\$DIR/usr/lib/ladspa
|
||||
export FREI0R_PATH=\$DIR/usr/lib/frei0r-1
|
||||
export MLT_PROFILES_PATH=\$DIR/usr/share/mlt/profiles/
|
||||
export MLT_PRESETS_PATH=\$DIR/usr/share/mlt/presets/
|
||||
export SDL_AUDIODRIVER=pulseaudio
|
||||
export XDG_CURRENT_DESKTOP=
|
||||
|
||||
export APPIMAGE_STARTUP_QML2_IMPORT_PATH=\$QML2_IMPORT_PATH
|
||||
export APPIMAGE_STARTUP_LD_LIBRARY_PATH=\$LD_LIBRARY_PATH
|
||||
export APPIMAGE_STARTUP_QT_PLUGIN_PATH=\$QT_PLUGIN_PATH
|
||||
export APPIMAGE_STARTUP_XDG_DATA_DIRS=\$XDG_DATA_DIRS
|
||||
export APPIMAGE_STARTUP_XDG_CONFIG_HOME=\$XDG_CONFIG_HOME
|
||||
export APPIMAGE_STARTUP_PATH=\$PATH
|
||||
|
||||
export APPIMAGE_STARTUP_MLT_REPOSITORY=\$MLT_REPOSITORY
|
||||
export APPIMAGE_STARTUP_MLT_DATA=\$MLT_DATA
|
||||
export APPIMAGE_STARTUP_MLT_ROOT_DIR=\$MLT_ROOT_DIR
|
||||
export APPIMAGE_STARTUP_MLT_PROFILES_PATH=\$MLT_PROFILES_PATH
|
||||
export APPIMAGE_STARTUP_MLT_PRESETS_PATH=\$MLT_PRESETS_PATH
|
||||
export APPIMAGE_STARTUP_SDL_AUDIODRIVER=\$SDL_AUDIODRIVER
|
||||
export APPIMAGE_STARTUP_XDG_CURRENT_DESKTOP=\$XDG_CURRENT_DESKTOP
|
||||
|
||||
kdenlive --config kdenlive-appimagerc \$@
|
||||
EOF
|
||||
chmod +x AppRun
|
||||
|
||||
/bin/cp /kdenlive/data/org.kde.kdenlive.desktop kdenlive.desktop
|
||||
/bin/cp /kdenlive/data/icons/128-apps-kdenlive.png ./kdenlive.png
|
||||
|
||||
#TO-DO this will need some text manipulation in ruby to get this var.
|
||||
APP=Kdenlive
|
||||
LOWERAPP=kdenlive
|
||||
|
||||
get_desktopintegration kdenlive
|
||||
|
||||
cd /
|
||||
|
||||
#cleanup previous image
|
||||
rm -Rf /$APP/$APP.AppDir
|
||||
|
||||
mkdir -p /$APP/$APP.AppDir
|
||||
cd /$APP/
|
||||
cp -R ../app/* $APP.AppDir/
|
||||
|
||||
# Remove useless stuff
|
||||
rm -Rf $APP.AppDir/usr/share/wallpapers/ || true
|
||||
rm -Rf $APP.AppDir/usr/share/kconf_update/ || true
|
||||
rm -Rf $APP.AppDir/usr/share/gtk-2.0/ || true
|
||||
rm -Rf $APP.AppDir/usr/share/gtk-doc/ || true
|
||||
rm -Rf $APP.AppDir/usr/share/kf5/kdoctools/ || true
|
||||
rm -Rf $APP.AppDir/usr/share/kservices5/searchproviders/ || true
|
||||
rm -Rf $APP.AppDir/usr/share/kservices5/useragentstrings/ || true
|
||||
rm -Rf $APP.AppDir/usr/share/man/ || true
|
||||
rm -Rf $APP.AppDir/usr/bin/ffserver || true
|
||||
rm -Rf $APP.AppDir/usr/bin/gtk-demo || true
|
||||
rm -Rf $APP.AppDir/usr/bin/yasm || true
|
||||
rm -Rf $APP.AppDir/usr/bin/nasm || true
|
||||
rm -Rf $APP.AppDir/usr/bin/ndisasm || true
|
||||
rm -Rf $APP.AppDir/usr/bin/ytasm || true
|
||||
rm -Rf $APP.AppDir/usr/bin/x264 || true
|
||||
rm -Rf $APP.AppDir/usr/bin/x265 || true
|
||||
rm -Rf $APP.AppDir/usr/bin/vsyasm || true
|
||||
rm -Rf $APP.AppDir/usr/bin/vpxdec || true
|
||||
rm -Rf $APP.AppDir/usr/bin/vpxenc || true
|
||||
rm -Rf $APP.AppDir/usr/bin/meinproc5 || true
|
||||
rm -Rf $APP.AppDir/usr/bin/desktoptojson || true
|
||||
rm -Rf $APP.AppDir/usr/lib/kconf_update_bin/ || true
|
||||
|
||||
|
||||
|
||||
28
packaging/appimage/05-buildall.sh
Executable file
@@ -0,0 +1,28 @@
|
||||
#!/bin/bash
|
||||
|
||||
|
||||
# Halt on errors
|
||||
set -e
|
||||
|
||||
# Be verbose
|
||||
set -x
|
||||
|
||||
echo "++ building dependencies and frameworks..."
|
||||
. /kdenlive/packaging/appimage/01-dependencies.sh
|
||||
|
||||
echo "++ building dependencies and frameworks DONE"
|
||||
|
||||
echo "++ building AV libraries (ffmpeg, OpenCV) ..."
|
||||
. /kdenlive/packaging/appimage/02-avlibs.sh
|
||||
|
||||
echo "++ building AV libraries (ffmpeg, OpenCV) DONE"
|
||||
|
||||
echo "++ building MLT and Kdenlive ..."
|
||||
. /kdenlive/packaging/appimage/03-kdenlive.sh
|
||||
|
||||
echo "++ building MLT and Kdenlive DONE"
|
||||
|
||||
echo "++ Preparing AppImage folder ..."
|
||||
. /kdenlive/packaging/appimage/04-create-app.sh
|
||||
|
||||
echo "++ Preparing AppImage folder DONE"
|
||||
62
packaging/appimage/3rdparty/CMakeLists.txt
vendored
Normal file
@@ -0,0 +1,62 @@
|
||||
# Rules to build 3rd-party libraries for digiKam bundles.
|
||||
#
|
||||
# Copyright (c) 2015-2017, Gilles Caulier, <caulier dot gilles at gmail dot com>
|
||||
#
|
||||
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
|
||||
#
|
||||
|
||||
project(digikam-bundles)
|
||||
|
||||
cmake_minimum_required(VERSION 2.8.6)
|
||||
|
||||
function(JoinListAsString VALUES GLUE OUTPUT)
|
||||
string(REPLACE ";" "${GLUE}" _TMP_STR "${VALUES}")
|
||||
set(${OUTPUT} "${_TMP_STR}" PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)
|
||||
message(FATAL_ERROR "Compiling in the source directory is not supported. Use for example 'mkdir build; cd build; cmake ..'.")
|
||||
endif()
|
||||
|
||||
# Tools must be obtained to work with:
|
||||
include (ExternalProject)
|
||||
|
||||
# allow specification of a directory with pre-downloaded
|
||||
# requirements
|
||||
if(NOT IS_DIRECTORY ${EXTERNALS_DOWNLOAD_DIR})
|
||||
message(FATAL_ERROR "No externals download dir set. Use -DEXTERNALS_DOWNLOAD_DIR")
|
||||
endif()
|
||||
|
||||
if(NOT IS_DIRECTORY ${INSTALL_ROOT})
|
||||
message(FATAL_ERROR "No install dir set. Use -DINSTALL_ROOT")
|
||||
endif()
|
||||
|
||||
set(TOP_INST_DIR ${INSTALL_ROOT})
|
||||
set(EXTPREFIX "${TOP_INST_DIR}")
|
||||
set(CMAKE_PREFIX_PATH "${EXTPREFIX}")
|
||||
|
||||
message( STATUS "CMAKE_GENERATOR: ${CMAKE_GENERATOR}")
|
||||
message( STATUS "CMAKE_CL_64: ${CMAKE_CL_64}")
|
||||
|
||||
set(GLOBAL_BUILD_TYPE RelWithDebInfo)
|
||||
set(GLOBAL_PROFILE ${GLOBAL_PROFILE} -DBUILD_TESTING=false)
|
||||
set(PATCH_COMMAND patch)
|
||||
|
||||
# this list must be dependency-ordered
|
||||
add_subdirectory(ext_jpeg)
|
||||
add_subdirectory(ext_jasper)
|
||||
add_subdirectory(ext_png)
|
||||
add_subdirectory(ext_tiff)
|
||||
#add_subdirectory(ext_libgphoto2)
|
||||
#add_subdirectory(ext_sane)
|
||||
add_subdirectory(ext_exiv2)
|
||||
add_subdirectory(ext_boost)
|
||||
#add_subdirectory(ext_opencv)
|
||||
#add_subdirectory(ext_lensfun)
|
||||
add_subdirectory(ext_qt)
|
||||
#add_subdirectory(ext_qtwebkit)
|
||||
#add_subdirectory(ext_qtav)
|
||||
#add_subdirectory(ext_kf5)
|
||||
#add_subdirectory(ext_marble)
|
||||
#add_subdirectory(ext_libksane)
|
||||
23
packaging/appimage/3rdparty/ext_boost/CMakeLists.txt
vendored
Executable file
@@ -0,0 +1,23 @@
|
||||
# Script to build Boost for digiKam bundle.
|
||||
#
|
||||
# Copyright (c) 2015-2017, Gilles Caulier, <caulier dot gilles at gmail dot com>
|
||||
#
|
||||
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
|
||||
#
|
||||
|
||||
SET(PREFIX_ext_boost "${EXTPREFIX}")
|
||||
|
||||
ExternalProject_Add( ext_boost
|
||||
DOWNLOAD_DIR ${EXTERNALS_DOWNLOAD_DIR}
|
||||
URL http://downloads.sourceforge.net/project/boost/boost/1.60.0/boost_1_60_0.tar.bz2
|
||||
URL_MD5 65a840e1a0b13a558ff19eeb2c4f0cbe
|
||||
CONFIGURE_COMMAND <SOURCE_DIR>/bootstrap.sh --prefix=${PREFIX_ext_boost} --with-libraries=system
|
||||
BUILD_COMMAND <SOURCE_DIR>/b2 install
|
||||
INSTALL_COMMAND ""
|
||||
INSTALL_DIR ${PREFIX_ext_boost}
|
||||
|
||||
UPDATE_COMMAND ""
|
||||
ALWAYS 0
|
||||
BUILD_IN_SOURCE 1
|
||||
)
|
||||
112
packaging/appimage/3rdparty/ext_exiv2/CMakeLists.txt
vendored
Executable file
@@ -0,0 +1,112 @@
|
||||
# Script to build Exiv2 for digiKam bundle.
|
||||
#
|
||||
# Copyright (c) 2015-2017, Gilles Caulier, <caulier dot gilles at gmail dot com>
|
||||
#
|
||||
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
|
||||
#
|
||||
|
||||
set(PREFIX_ext_exiv2 "${EXTPREFIX}")
|
||||
|
||||
set(Exiv2_Conf -DEXIV2_ENABLE_SHARED=ON
|
||||
-DEXIV2_ENABLE_XMP=ON
|
||||
-DEXIV2_ENABLE_LIBXMP=ON
|
||||
-DEXIV2_ENABLE_PNG=ON
|
||||
-DEXIV2_ENABLE_NLS=OFF
|
||||
-DEXIV2_ENABLE_PRINTUCS2=ON
|
||||
-DEXIV2_ENABLE_LENSDATA=ON
|
||||
-DEXIV2_ENABLE_COMMERCIAL=OFF
|
||||
-DEXIV2_ENABLE_BUILD_SAMPLES=OFF
|
||||
-DEXIV2_ENABLE_BUILD_PO=OFF
|
||||
-DEXIV2_ENABLE_VIDEO=OFF
|
||||
-DEXIV2_ENABLE_WEBREADY=OFF
|
||||
-DEXIV2_ENABLE_CURL=OFF
|
||||
-DEXIV2_ENABLE_SSH=OFF
|
||||
)
|
||||
|
||||
JoinListAsString("${Exiv2_Conf}" " " BASH_OPTIONS)
|
||||
|
||||
if(MINGW)
|
||||
|
||||
ExternalProject_Add(ext_exiv2
|
||||
DOWNLOAD_DIR ${EXTERNALS_DOWNLOAD_DIR}
|
||||
|
||||
# To use official release tarball
|
||||
URL http://www.exiv2.org/builds/exiv2-0.26-trunk.tar.gz
|
||||
URL_MD5 5399e3b570d7f9205f0e76d47582da4c
|
||||
|
||||
# To use current implementation from SVN
|
||||
|
||||
#SVN_REPOSITORY svn://dev.exiv2.org/svn/trunk
|
||||
|
||||
CONFIGURE_COMMAND cd <SOURCE_DIR> &&
|
||||
./bootstrap.mxe ${MXE_BUILDROOT} RelWithDebInfo ${BASH_OPTIONS}
|
||||
|
||||
BUILD_COMMAND cd <SOURCE_DIR>/build && $(MAKE) -j
|
||||
|
||||
INSTALL_COMMAND cd <SOURCE_DIR>/build && $(MAKE) install/fast
|
||||
|
||||
BUILD_IN_SOURCE 1
|
||||
|
||||
UPDATE_COMMAND ""
|
||||
ALWAYS 0
|
||||
)
|
||||
|
||||
|
||||
elseif(APPLE)
|
||||
|
||||
ExternalProject_Add(ext_exiv2
|
||||
DOWNLOAD_DIR ${EXTERNALS_DOWNLOAD_DIR}
|
||||
|
||||
# To use official release tarball
|
||||
|
||||
URL http://www.exiv2.org/builds/exiv2-0.26-trunk.tar.gz
|
||||
URL_MD5 5399e3b570d7f9205f0e76d47582da4c
|
||||
|
||||
# To use current implementation from SVN
|
||||
|
||||
#SVN_REPOSITORY svn://dev.exiv2.org/svn/trunk
|
||||
|
||||
CONFIGURE_COMMAND cp -f ${CMAKE_CURRENT_SOURCE_DIR}/../../../../bootstrap.macports <SOURCE_DIR>/. &&
|
||||
<SOURCE_DIR>/bootstrap.macports ${PREFIX_ext_exiv2} RelWithDebInfo x86_64 ${BASH_OPTIONS}
|
||||
|
||||
BUILD_COMMAND cd <SOURCE_DIR>/build && $(MAKE)
|
||||
|
||||
INSTALL_COMMAND cd <SOURCE_DIR>/build && $(MAKE) install/fast
|
||||
|
||||
BUILD_IN_SOURCE 1
|
||||
|
||||
UPDATE_COMMAND ""
|
||||
ALWAYS 0
|
||||
)
|
||||
|
||||
else() # Linux
|
||||
|
||||
ExternalProject_Add(ext_exiv2
|
||||
DOWNLOAD_DIR ${EXTERNALS_DOWNLOAD_DIR}
|
||||
|
||||
# To use official release tarball
|
||||
|
||||
URL http://www.exiv2.org/builds/exiv2-0.26-trunk.tar.gz
|
||||
URL_MD5 5399e3b570d7f9205f0e76d47582da4c
|
||||
|
||||
# To use current implementation from SVN
|
||||
|
||||
#SVN_REPOSITORY svn://dev.exiv2.org/svn/trunk
|
||||
|
||||
CONFIGURE_COMMAND cd <SOURCE_DIR> &&
|
||||
$(CMAKE_COMMAND) . -DCMAKE_INSTALL_PREFIX=${PREFIX_ext_exiv2}
|
||||
-DCMAKE_BUILD_TYPE=${GLOBAL_BUILD_TYPE}
|
||||
-DICONV_INCLUDE_DIR=${PREFIX_ext_exiv2}/include
|
||||
${Exiv2_Conf}
|
||||
${GLOBAL_PROFILE}
|
||||
|
||||
BUILD_COMMAND cd <SOURCE_DIR> && $(MAKE)
|
||||
|
||||
INSTALL_COMMAND cd <SOURCE_DIR> && $(MAKE) install/fast
|
||||
|
||||
UPDATE_COMMAND ""
|
||||
ALWAYS 0
|
||||
)
|
||||
|
||||
endif()
|
||||
19
packaging/appimage/3rdparty/ext_jasper/CMakeLists.txt
vendored
Executable file
@@ -0,0 +1,19 @@
|
||||
# Script to build jasperlib for digiKam bundle.
|
||||
#
|
||||
# Copyright (c) 2015-2017, Gilles Caulier, <caulier dot gilles at gmail dot com>
|
||||
#
|
||||
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
|
||||
#
|
||||
|
||||
SET(PREFIX_ext_jasper "${EXTPREFIX}")
|
||||
|
||||
ExternalProject_Add(ext_jasper
|
||||
DOWNLOAD_DIR ${EXTERNALS_DOWNLOAD_DIR}
|
||||
URL http://www.ece.uvic.ca/~frodo/jasper/software/jasper-1.900.29.tar.gz
|
||||
URL_MD5 4619ec9860c10e557b3f192f5e76f596
|
||||
|
||||
CONFIGURE_COMMAND <SOURCE_DIR>/configure --prefix=${PREFIX_ext_jasper} ${GLOBAL_AUTOMAKE_PROFILE} --disable-opengl
|
||||
UPDATE_COMMAND ""
|
||||
ALWAYS 0
|
||||
)
|
||||
22
packaging/appimage/3rdparty/ext_jpeg/CMakeLists.txt
vendored
Executable file
@@ -0,0 +1,22 @@
|
||||
# Script to build libjpeg for digiKam bundle.
|
||||
#
|
||||
# Copyright (c) 2015-2017, Gilles Caulier, <caulier dot gilles at gmail dot com>
|
||||
#
|
||||
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
|
||||
#
|
||||
|
||||
SET(PREFIX_ext_jpeg "${EXTPREFIX}")
|
||||
|
||||
ExternalProject_Add(ext_jpeg
|
||||
DOWNLOAD_DIR ${EXTERNALS_DOWNLOAD_DIR}
|
||||
URL https://sourceforge.net/projects/libjpeg-turbo/files/1.5.3/libjpeg-turbo-1.5.3.tar.gz
|
||||
URL_MD5 7c82f0f6a3130ec06b8a4d0b321cbca3
|
||||
|
||||
CONFIGURE_COMMAND <SOURCE_DIR>/configure --prefix=${PREFIX_ext_jpeg}
|
||||
--without-simd
|
||||
--with-jpeg8
|
||||
|
||||
UPDATE_COMMAND ""
|
||||
ALWAYS 0
|
||||
)
|
||||
121
packaging/appimage/3rdparty/ext_opencv/CMakeLists.txt
vendored
Normal file
@@ -0,0 +1,121 @@
|
||||
# Script to build OpenCV for digiKam bundle.
|
||||
#
|
||||
# Copyright (c) 2015-2017, Gilles Caulier, <caulier dot gilles at gmail dot com>
|
||||
#
|
||||
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
|
||||
#
|
||||
|
||||
set(EXTPREFIX_opencv "${EXTPREFIX}" )
|
||||
|
||||
set(Opencv_Conf -DBUILD_EXAMPLES=OFF
|
||||
-DBUILD_TESTS=OFF
|
||||
-DBUILD_DOCS=OFF
|
||||
-DBUILD_PERF_TESTS=OFF
|
||||
-DBUILD_NEW_PYTHON_SUPPORT=OFF
|
||||
-BUILD_ZLIB=OFF
|
||||
-DOPENCV_BUILD_3RDPARTY_LIBS=OFF
|
||||
-DINSTALL_C_EXAMPLES=OFF
|
||||
-DINSTALL_PYTHON_EXAMPLES=OFF
|
||||
-DWITH_1394=OFF
|
||||
-DWITH_VTK=OFF
|
||||
-DWITH_CUDA=OFF
|
||||
-DWITH_DIRECTX=OFF
|
||||
-DWITH_DSHOW=OFF
|
||||
-DWITH_EIGEN=OFF
|
||||
-DWITH_FFMPEG=OFF
|
||||
-DWITH_GSTREAMER=OFF
|
||||
-DWITH_GTK=OFF
|
||||
-DWITH_IPP=OFF
|
||||
-DWITH_JASPER=OFF
|
||||
-DWITH_JPEG=OFF
|
||||
-DWITH_MATLAB=OFF
|
||||
-DWITH_OPENEXR=OFF
|
||||
-DWITH_OPENNI=OFF
|
||||
-DWITH_PNG=OFF
|
||||
-DWITH_PVAPI=OFF
|
||||
-DWITH_WIN32UI=OFF
|
||||
-DWITH_QT=OFF
|
||||
-DWITH_QUICKTIME=OFF
|
||||
-DWITH_QT_OPENGL=OFF
|
||||
-DWITH_TBB=OFF
|
||||
-DWITH_TIFF=OFF
|
||||
-DWITH_UNICAP=OFF
|
||||
-DWITH_V4L=OFF
|
||||
-DWITH_VFW=OFF
|
||||
-DWITH_VIDEOINPUT=OFF
|
||||
-DWITH_XINE=OFF
|
||||
-DWITH_OPENCL=OFF
|
||||
-DWITH_GPHOTO2=OFF
|
||||
-DBUILD_opencv_videoio=OFF
|
||||
)
|
||||
|
||||
JoinListAsString("${Opencv_Conf}" " " BASH_OPTIONS)
|
||||
|
||||
if(MINGW)
|
||||
|
||||
ExternalProject_Add(ext_opencv
|
||||
|
||||
URL https://github.com/Itseez/opencv/archive/3.2.0.zip
|
||||
URL_MD5 bfc6a261eb069b709bcfe7e363ef5899
|
||||
|
||||
CMAKE_ARGS -DCMAKE_BUILD_TYPE=${GLOBAL_BUILD_TYPE}
|
||||
-DCMAKE_TOOLCHAIN_FILE=${MXE_TOOLCHAIN}
|
||||
-DCMAKE_INSTALL_PREFIX=${MXE_INSTALL_PREFIX}
|
||||
-DCMAKE_BUILD_WITH_INSTALL_RPATH=ON
|
||||
${GLOBAL_PROFILE}
|
||||
${Opencv_Conf}
|
||||
|
||||
UPDATE_COMMAND ""
|
||||
ALWAYS 0
|
||||
)
|
||||
|
||||
ExternalProject_Add_step(ext_opencv before_download
|
||||
|
||||
# Note : under MXE, in case of curl is not compiled with https support,
|
||||
# we cannot download the tarball as under Linux/MacOS.
|
||||
# COMMAND wget -N https://github.com/Itseez/opencv/archive/3.2.0.zip -O ${EXTERNALS_DOWNLOAD_DIR}/3.2.0.zip
|
||||
# DEPENDERS download
|
||||
)
|
||||
|
||||
elseif(APPLE)
|
||||
|
||||
ExternalProject_Add(ext_opencv
|
||||
DOWNLOAD_DIR ${EXTERNALS_DOWNLOAD_DIR}
|
||||
|
||||
URL https://github.com/Itseez/opencv/archive/3.2.0.zip
|
||||
URL_MD5 bfc6a261eb069b709bcfe7e363ef5899
|
||||
|
||||
CONFIGURE_COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/../../../../bootstrap.macports <SOURCE_DIR>/. &&
|
||||
<SOURCE_DIR>/bootstrap.macports ${EXTPREFIX_opencv} RelWithDebInfo x86_64 "${BASH_OPTIONS}"
|
||||
|
||||
BUILD_COMMAND cd <SOURCE_DIR>/build && $(MAKE)
|
||||
|
||||
INSTALL_COMMAND cd <SOURCE_DIR>/build && make install/fast
|
||||
|
||||
BUILD_IN_SOURCE 1
|
||||
|
||||
UPDATE_COMMAND ""
|
||||
ALWAYS 0
|
||||
)
|
||||
|
||||
else() #Linux
|
||||
|
||||
ExternalProject_Add(ext_opencv
|
||||
DOWNLOAD_DIR ${EXTERNALS_DOWNLOAD_DIR}
|
||||
|
||||
URL https://github.com/Itseez/opencv/archive/3.2.0.zip
|
||||
URL_MD5 bfc6a261eb069b709bcfe7e363ef5899
|
||||
|
||||
INSTALL_DIR ${EXTPREFIX_opencv}
|
||||
|
||||
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${EXTPREFIX_opencv}
|
||||
-DCMAKE_BUILD_TYPE=${GLOBAL_BUILD_TYPE}
|
||||
${GLOBAL_PROFILE}
|
||||
${Opencv_Conf}
|
||||
|
||||
UPDATE_COMMAND ""
|
||||
ALWAYS 0
|
||||
)
|
||||
|
||||
endif()
|
||||
19
packaging/appimage/3rdparty/ext_png/CMakeLists.txt
vendored
Executable file
@@ -0,0 +1,19 @@
|
||||
# Script to build libpng for digiKam bundle.
|
||||
#
|
||||
# Copyright (c) 2015-2017, Gilles Caulier, <caulier dot gilles at gmail dot com>
|
||||
#
|
||||
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
|
||||
#
|
||||
|
||||
SET(PREFIX_ext_png "${EXTPREFIX}")
|
||||
|
||||
ExternalProject_Add(ext_png
|
||||
DOWNLOAD_DIR ${EXTERNALS_DOWNLOAD_DIR}
|
||||
URL http://prdownloads.sourceforge.net/libpng/libpng-1.6.26.tar.xz
|
||||
URL_MD5 faed9bb495d2e12dd0c9ec561ca60cd8
|
||||
|
||||
CONFIGURE_COMMAND <SOURCE_DIR>/configure --prefix=${PREFIX_ext_png}
|
||||
UPDATE_COMMAND ""
|
||||
ALWAYS 0
|
||||
)
|
||||
65
packaging/appimage/3rdparty/ext_qt/CMakeLists.txt
vendored
Normal file
@@ -0,0 +1,65 @@
|
||||
# Script to build Qt for digiKam bundle.
|
||||
#
|
||||
# Copyright (c) 2015-2017, Gilles Caulier, <caulier dot gilles at gmail dot com>
|
||||
#
|
||||
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
|
||||
#
|
||||
|
||||
SET(EXTPREFIX_qt "${EXTPREFIX}")
|
||||
|
||||
ExternalProject_Add(ext_qt
|
||||
DOWNLOAD_DIR ${EXTERNALS_DOWNLOAD_DIR}
|
||||
URL https://download.qt.io/official_releases/qt/5.9/5.9.4/single/qt-everywhere-opensource-src-5.9.4.tar.xz
|
||||
URL_MD5 d95f6ecb491e731c2fca622ccc7b6bbd
|
||||
CONFIGURE_COMMAND <SOURCE_DIR>/configure
|
||||
-prefix ${EXTPREFIX_qt}
|
||||
-opensource
|
||||
-confirm-license
|
||||
-nomake examples
|
||||
-sql-sqlite
|
||||
-fontconfig
|
||||
-openssl
|
||||
-optimized-qmake
|
||||
-no-mtdev
|
||||
-no-journald
|
||||
-no-syslog
|
||||
-no-tslib
|
||||
-no-directfb
|
||||
-no-linuxfb
|
||||
-no-libproxy
|
||||
-no-pch
|
||||
-no-compile-examples
|
||||
-qt-zlib
|
||||
-qt-pcre
|
||||
-qt-harfbuzz
|
||||
-qt-xcb
|
||||
-qt-xkbcommon-x11
|
||||
-skip qt3d
|
||||
-skip qtactiveqt
|
||||
-skip qtandroidextras
|
||||
-skip qtcanvas3d
|
||||
-skip qtcharts
|
||||
-skip qtconnectivity
|
||||
-skip qtdatavis3d
|
||||
-skip qtdoc
|
||||
-skip qtgamepad
|
||||
-skip qtlocation
|
||||
-skip qtmultimedia
|
||||
-skip qtpurchasing
|
||||
-skip qtremoteobjects
|
||||
-skip qtserialport
|
||||
-skip qtscxml
|
||||
-skip qtsensors
|
||||
-skip qtspeech
|
||||
-skip qttranslations
|
||||
-skip qtvirtualkeyboard
|
||||
-skip qtwayland
|
||||
-skip qtwebsockets
|
||||
-skip qtwebchannel
|
||||
-skip qtwebengine
|
||||
|
||||
UPDATE_COMMAND ""
|
||||
BUILD_IN_SOURCE 1
|
||||
ALWAYS 0
|
||||
)
|
||||
20
packaging/appimage/3rdparty/ext_tiff/CMakeLists.txt
vendored
Executable file
@@ -0,0 +1,20 @@
|
||||
# Script to build libgphoto for digiKam bundle.
|
||||
#
|
||||
# Copyright (c) 2015-2017, Gilles Caulier, <caulier dot gilles at gmail dot com>
|
||||
#
|
||||
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
|
||||
#
|
||||
|
||||
SET(EXTPREFIX_tiff "${EXTPREFIX}" )
|
||||
|
||||
ExternalProject_Add(ext_tiff
|
||||
DOWNLOAD_DIR ${EXTERNALS_DOWNLOAD_DIR}
|
||||
URL ftp://download.osgeo.org/libtiff/tiff-4.0.6.tar.gz
|
||||
URL_MD5 d1d2e940dea0b5ad435f21f03d96dd72
|
||||
|
||||
CONFIGURE_COMMAND <SOURCE_DIR>/configure -prefix ${EXTPREFIX_tiff}
|
||||
UPDATE_COMMAND ""
|
||||
ALWAYS 0
|
||||
)
|
||||
|
||||
81
packaging/appimage/howto.txt
Normal file
@@ -0,0 +1,81 @@
|
||||
|
||||
----------- These first part is only required once ---------------
|
||||
|
||||
# install docker from your package manager
|
||||
|
||||
# get docker centos image
|
||||
|
||||
docker pull centos:6
|
||||
|
||||
|
||||
# create the container and start it
|
||||
|
||||
docker run -i -t centos:6 /bin/bash
|
||||
|
||||
|
||||
# install git
|
||||
|
||||
yum -y install git
|
||||
|
||||
|
||||
# clone kdenlive repository
|
||||
|
||||
cd /
|
||||
git clone git://anongit.kde.org/kdenlive.git
|
||||
|
||||
|
||||
# If you want to build a specific branch, now is the time, for example:
|
||||
cd kdenlive
|
||||
git checkout -b timeline2 origin/refactoring_timeline
|
||||
|
||||
------------------------------------------------------------------
|
||||
|
||||
# The next time you want to enter your docker container, use:
|
||||
|
||||
docker start -a -i f7001a5ae294
|
||||
|
||||
|
||||
# where f7001a5ae294 is the container id, can be found using
|
||||
|
||||
docker ps -a
|
||||
|
||||
------------------------------------------------------------------
|
||||
|
||||
# Run the build scripts:
|
||||
|
||||
. /kdenlive/packaging/appimage/05-buildall.sh
|
||||
|
||||
|
||||
# When the build is finished, you will have an AppImage folder:
|
||||
|
||||
/Kdenlive/Kdenlive.AppDir
|
||||
|
||||
|
||||
--- Last step: packaging on the host --------------------------------------------
|
||||
|
||||
# You need to create the AppImage from this directory. However
|
||||
# due to squashfs issues, you cannot create it from inside docker
|
||||
# so my solution is to copy this folder to the host and do the packaging job here.
|
||||
|
||||
Open a new terminal on the host computer.
|
||||
|
||||
# Copy the AppImage directory
|
||||
|
||||
docker cp f7001a5ae294:/Kdenlive/Kdenlive.AppDir .
|
||||
|
||||
# Get AppImageTool if not done yet:
|
||||
|
||||
wget https://github.com/AppImage/AppImageKit/releases/download/9/appimagetool-x86_64.AppImage
|
||||
|
||||
# Make it executable
|
||||
|
||||
chmod +x appimagetool-x86_64.AppImage
|
||||
|
||||
# Build the AppImage
|
||||
|
||||
./appimagetool-x86_64.AppImage Kdenlive.AppDir
|
||||
|
||||
# DONE ! You now have an AppImage called Kdenlive-x86_64.AppImage
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
240
packaging/kdenlive-lnx-withalldeps.sh
Normal file
@@ -0,0 +1,240 @@
|
||||
#!/bin/bash
|
||||
# (C) 2018 V. Pinon <vpinon@kde.org>
|
||||
# License: GPLv2+
|
||||
# Tested in Debian sid x86_64
|
||||
|
||||
# Be verbose, halt on errors
|
||||
set -xe
|
||||
|
||||
# Prepare the install location
|
||||
# change this to another location if you prefer
|
||||
export WLD=/app/usr
|
||||
SRC_DIR=/external
|
||||
|
||||
mkdir -p $WLD/lib $SRC_DIR
|
||||
# make sure lib and lib64 are the same thing
|
||||
[[ -L $WLD/lib64 ]] || ln -s $WLD/lib $WLD/lib64
|
||||
# qjsonparser, used to add metadata to the plugins needs to work in a en_US.UTF-8 environment.
|
||||
export LC_ALL=en_US.UTF-8 LANG=en_us.UTF-8
|
||||
export PATH=$WLD/bin:$PATH
|
||||
export LD_LIBRARY_PATH=$WLD/lib:/usr/lib64/:/usr/lib
|
||||
export PKG_CONFIG_PATH=$WLD/lib/pkgconfig/:$WLD/share/pkgconfig/:/usr/lib/pkgconfig
|
||||
export ACLOCAL_PATH=$WLD/share/aclocal
|
||||
export ACLOCAL="aclocal -I $ACLOCAL_PATH"
|
||||
|
||||
CPU_CORES=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu)
|
||||
if [[ $CPU_CORES -gt 1 ]]; then
|
||||
CPU_CORES=$((CPU_CORES-1))
|
||||
fi
|
||||
ARCH=$(arch)
|
||||
if [[ "$ARCH" != "i686" && "$ARCH" != "x86_64" ]] ; then
|
||||
echo "Architecture could not be determined" ; exit 1
|
||||
fi
|
||||
|
||||
# $1: repo URL, $2: branch
|
||||
function git_pull {
|
||||
URL=$1 BRANCH=$2
|
||||
PKG=${URL##*/}; PKG=${PKG%%.git}
|
||||
cd $SRC_DIR
|
||||
if [ -d $PKG ]; then
|
||||
echo "$PKG already cloned"
|
||||
cd $PKG
|
||||
git reset --hard
|
||||
git checkout $BRANCH
|
||||
git pull --rebase
|
||||
cd ..
|
||||
else
|
||||
git clone $URL
|
||||
fi
|
||||
}
|
||||
|
||||
# $1: archive URL
|
||||
function wget_extract {
|
||||
URL=$1
|
||||
ARCHIVE=${URL##*/}
|
||||
PKGVERS=${ARCHIVE%%.tar.*}
|
||||
cd $SRC_DIR
|
||||
if [ -d $SRC_DIR/$PKGVERS ]; then
|
||||
echo "$PKGVERS already downloaded"
|
||||
else
|
||||
[ -f $ARCHIVE ] || wget --no-check-certificate $URL
|
||||
if [[ ${ARCHIVE##*.} == zip ]] ; then
|
||||
unzip $ARCHIVE
|
||||
else
|
||||
tar -xf ${URL##*/}
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# $1: package name ; $*: cmake args
|
||||
function cmake_make {
|
||||
PKG=$1; shift; CMAKE_ARGS=$*
|
||||
mkdir -p $SRC_DIR/$PKG/build
|
||||
cd $SRC_DIR/$PKG/build
|
||||
cmake -DCMAKE_INSTALL_PREFIX:PATH=$WLD -DCMAKE_BUILD_TYPE=Release $CMAKE_ARGS ..
|
||||
make -j$CPU_CORES
|
||||
make install
|
||||
}
|
||||
|
||||
# $1: package name ; $2: configure args
|
||||
function configure_make {
|
||||
PKG=$1; shift; CONFIGURE_ARGS=$*
|
||||
cd $SRC_DIR/$PKG
|
||||
./configure --prefix=$WLD $CONFIGURE_ARGS
|
||||
make -j$CPU_CORES
|
||||
make install
|
||||
}
|
||||
|
||||
# Build tools
|
||||
wget_extract https://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
|
||||
cmake_make yasm-1.3.0
|
||||
wget_extract http://www.nasm.us/pub/nasm/releasebuilds/2.13.02/nasm-2.13.02.tar.xz
|
||||
configure_make nasm-2.13.02
|
||||
|
||||
# Media libs
|
||||
wget_extract ftp://ftp.alsa-project.org/pub/lib/alsa-lib-1.1.5.tar.bz2
|
||||
configure_make alsa-lib-1.1.5
|
||||
wget_extract https://libsdl.org/release/SDL2-2.0.8.tar.gz
|
||||
configure_make SDL2-2.0.8 --with-alsa-prefix=$WLD/lib --with-alsa-inc-prefix=$WLD/include
|
||||
|
||||
# Image libs
|
||||
wget_extract https://sourceforge.net/projects/libjpeg-turbo/files/1.5.3/libjpeg-turbo-1.5.3.tar.gz
|
||||
configure_make libjpeg-turbo-1.5.3
|
||||
wget_extract http://www.ece.uvic.ca/~frodo/jasper/software/jasper-2.0.14.tar.gz
|
||||
cmake_make jasper-2.0.14
|
||||
wget_extract http://prdownloads.sourceforge.net/libpng/libpng-1.6.34.tar.xz
|
||||
configure_make libpng-1.6.34
|
||||
wget_extract https://codeload.github.com/Exiv2/exiv2/tar.gz/master
|
||||
cmake_make exiv2-master \
|
||||
-DEXIV2_ENABLE_NLS=OFF -DEXIV2_ENABLE_PRINTUCS2=OFF -DEXIV2_ENABLE_LENSDATA=OFF -DEXIV2_ENABLE_BUILD_SAMPLES=OFF
|
||||
# Codec libs
|
||||
wget_extract http://www.mega-nerd.com/libsndfile/files/libsndfile-1.0.28.tar.gz
|
||||
configure_make libsndfile-1.0.28
|
||||
wget_extract http://www.mega-nerd.com/SRC/libsamplerate-0.1.9.tar.gz
|
||||
configure_make libsamplerate-0.1.9
|
||||
git_pull https://anonscm.debian.org/git/pkg-multimedia/libvpx.git
|
||||
configure_make libvpx --enable-shared
|
||||
git_pull https://anonscm.debian.org/git/pkg-multimedia/x264.git
|
||||
configure_make x264 --enable-shared
|
||||
wget_extract http://ftp.videolan.org/pub/videolan/x265/x265_2.7.tar.gz
|
||||
pushd $SRC_DIR/x265_2.7/build/linux
|
||||
cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="$WLD" -DENABLE_SHARED=ON ../../source
|
||||
make -j$CPU_CORES
|
||||
make install
|
||||
popd
|
||||
git_pull https://anonscm.debian.org/git/pkg-multimedia/ffmpeg.git debian/7%3.4.2-1
|
||||
configure_make ffmpeg --extra-ldflags="-L$WLD/lib" --extra-cflags="-I$WLD/include" \
|
||||
--enable-shared --enable-gpl --disable-doc --enable-avfilter --enable-avresample \
|
||||
--enable-libvpx --enable-libx264 --enable-libx265
|
||||
|
||||
# Graphics libs
|
||||
wget_extract https://www.cairographics.org/releases/cairo-1.14.12.tar.xz
|
||||
configure_make cairo-1.14.12
|
||||
wget_extract https://www.freedesktop.org/software/harfbuzz/release/harfbuzz-1.7.6.tar.bz2
|
||||
configure_make harfbuzz-1.7.6
|
||||
#requires libfribidi-dev
|
||||
wget_extract https://download.gnome.org/sources/pango/1.42/pango-1.42.0.tar.xz
|
||||
configure_make pango-1.42.0
|
||||
wget_extract https://download.gnome.org/sources/gdk-pixbuf/2.32/gdk-pixbuf-2.32.3.tar.xz
|
||||
configure_make gdk-pixbuf-2.32.3
|
||||
wget_extract https://download.gnome.org/sources/gtk+/2.24/gtk+-2.24.32.tar.xz
|
||||
configure_make gtk+-2.24.32
|
||||
wget_extract https://download.qt.io/official_releases/qt/5.10/5.10.1/single/qt-everywhere-src-5.10.1.tar.xz
|
||||
pushd $SRC_DIR/qt-everywhere-src-5.10.1
|
||||
./configure -prefix $WLD -opensource -confirm-license -release -shared \
|
||||
-nomake examples -nomake tests -no-pch \
|
||||
-qt-zlib -qt-pcre -qt-harfbuzz -openssl \
|
||||
-qt-xcb -qt-xkbcommon-x11
|
||||
make -j$CPU_CORES
|
||||
make install
|
||||
popd
|
||||
|
||||
# libxcb-keysyms1-dev
|
||||
# KDE Frameworks
|
||||
KF5_VERSION=5.44.0
|
||||
for FRAMEWORK in \
|
||||
extra-cmake-modules breeze-icons karchive kconfig kcoreaddons kdbusaddons kguiaddons \
|
||||
ki18n kitemviews kwidgetsaddons kcompletion kwindowsystem \
|
||||
kcrash kjobwidgets kauth kcodecs kconfigwidgets kiconthemes \
|
||||
solid sonnet attica kservice kglobalaccel ktextwidgets \
|
||||
kxmlgui kbookmarks knotifications kio knewstuff knotifyconfig \
|
||||
kpackage kdeclarative ; do
|
||||
#git_pull git://anongit.kde.org/$FRAMEWORK v$KF5_VERSION
|
||||
wget_extract https://download.kde.org/stable/frameworks/${KF5_VERSION%.*}/$FRAMEWORK-$KF5_VERSION.tar.xz
|
||||
if [ "$FRAMEWORK" = "breeze-icons" ]; then
|
||||
cmake_make $FRAMEWORK-$KF5_VERSION -DKDE_INSTALL_USE_QT_SYS_PATHS:BOOL=ON -DBUILD_TESTING:BOOL=OFF -DBINARY_ICONS_RESOURCE=1
|
||||
elif [ "$FRAMEWORK" = "knotifications" ]; then
|
||||
cd $FRAMEWORK-$KF5_VERSION
|
||||
cat | patch -p1 << EOF
|
||||
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
||||
index 0104c73..de44e9a 100644
|
||||
--- a/CMakeLists.txt
|
||||
+++ b/CMakeLists.txt
|
||||
@@ -59,11 +59,11 @@ find_package(KF5Config \${KF5_DEP_VERSION} REQUIRED)
|
||||
find_package(KF5Codecs \${KF5_DEP_VERSION} REQUIRED)
|
||||
find_package(KF5CoreAddons \${KF5_DEP_VERSION} REQUIRED)
|
||||
|
||||
-find_package(Phonon4Qt5 4.6.60 REQUIRED NO_MODULE)
|
||||
-set_package_properties(Phonon4Qt5 PROPERTIES
|
||||
- DESCRIPTION "Qt-based audio library"
|
||||
- TYPE REQUIRED
|
||||
- PURPOSE "Required to build audio notification support")
|
||||
+#find_package(Phonon4Qt5 4.6.60 REQUIRED NO_MODULE)
|
||||
+#set_package_properties(Phonon4Qt5 PROPERTIES
|
||||
+# DESCRIPTION "Qt-based audio library"
|
||||
+# TYPE REQUIRED
|
||||
+# PURPOSE "Required to build audio notification support")
|
||||
if (Phonon4Qt5_FOUND)
|
||||
add_definitions(-DHAVE_PHONON4QT5)
|
||||
endif()
|
||||
EOF
|
||||
|
||||
cmake_make $FRAMEWORK-$KF5_VERSION -DKDE_INSTALL_USE_QT_SYS_PATHS:BOOL=ON -DBUILD_TESTING:BOOL=OFF
|
||||
else
|
||||
cmake_make $FRAMEWORK-$KF5_VERSION -DKDE_INSTALL_USE_QT_SYS_PATHS:BOOL=ON -DBUILD_TESTING:BOOL=OFF
|
||||
fi
|
||||
done
|
||||
wget_extract https://download.kde.org/stable/plasma/5.12.4/kdecoration-5.12.4.tar.xz
|
||||
cmake_make kdecoration-5.12.4 -DKDE_INSTALL_USE_QT_SYS_PATHS:BOOL=ON -DBUILD_TESTING:BOOL=OFF
|
||||
wget_extract https://download.kde.org/stable/plasma/5.12.4/breeze-5.12.4.tar.xz
|
||||
cmake_make breeze-5.12.4 -DKDE_INSTALL_USE_QT_SYS_PATHS:BOOL=ON -DBUILD_TESTING:BOOL=OFF
|
||||
|
||||
wget_extract https://codeload.github.com/opencv/opencv/tar.gz/3.4.1
|
||||
wget_extract https://github.com/opencv/opencv_contrib/archive/3.4.1.tar.gz
|
||||
cmake_make opencv-3.4.1 -DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-3.4.1/modules \
|
||||
-DJASPER_INCLUDE_DIR=$WLD/include \
|
||||
-DBUILD_opencv_plot=ON \
|
||||
-DBUILD_opencv_aruco=OFF -DBUILD_opencv_bgsegm=OFF -DBUILD_opencv_bioinspired=OFF \
|
||||
-DBUILD_opencv_ccalib=OFF -DBUILD_opencv_cnn_3dobj=OFF -DBUILD_opencv_cvv=OFF \
|
||||
-DBUILD_opencv_dnn=OFF -DBUILD_opencv_dnns_easily_fooled=OFF -DBUILD_opencv_dpm=OFF \
|
||||
-DBUILD_opencv_fuzzy=OFF -DBUILD_opencv_hdf=OFF -DBUILD_opencv_line_descriptor=OFF \
|
||||
-DBUILD_opencv_matlab=OFF -DBUILD_opencv_optflow=OFF \
|
||||
-DBUILD_opencv_reg=OFF -DBUILD_opencv_rgbd=OFF -DBUILD_opencv_saliency=OFF \
|
||||
-DBUILD_opencv_sfm=OFF -DBUILD_opencv_stereo=OFF -DBUILD_opencv_structured_light=OFF \
|
||||
-DBUILD_opencv_surface_matching=OFF -DBUILD_opencv_xfeatures2d=OFF \
|
||||
-DBUILD_opencv_xobjdetect=OFF -DBUILD_opencv_xphoto=OFF -DBUILD_opencv_calib3d=OFF \
|
||||
-DBUILD_opencv_cudaarithm=OFF -DBUILD_opencv_cudabgsegm=OFF \
|
||||
-DBUILD_opencv_cudacodec=OFF -DBUILD_opencv_cudafilters=OFF \
|
||||
-DBUILD_opencv_cudalegacy=OFF -DBUILD_opencv_cudaobjdetect=OFF \
|
||||
-DBUILD_opencv_cudaoptflow=OFF -DBUILD_opencv_cudastereo=OFF \
|
||||
-DBUILD_opencv_cudawarping=OFF -DBUILD_opencv_cudev=OFF \
|
||||
-DBUILD_opencv_java=OFF -DBUILD_opencv_shape=OFF -DBUILD_opencv_stitching=OFF \
|
||||
-DBUILD_opencv_superres=OFF -DBUILD_opencv_ts=OFF -DBUILD_opencv_videoio=OFF \
|
||||
-DBUILD_opencv_videostab=OFF -DBUILD_opencv_viz=OFF
|
||||
#git_pull https://github.com/georgmartius/vid.stab
|
||||
wget_extract https://codeload.github.com/georgmartius/vid.stab/tar.gz/v1.1.0
|
||||
cmake_make vid.stab-1.1.0
|
||||
wget_extract https://files.dyne.org/frei0r/releases/frei0r-plugins-1.6.1.tar.gz
|
||||
cmake_make frei0r-plugins-1.6.1 -DWITHOUT_OPENCV:BOOL=ON
|
||||
# git_pull https://git.sesse.net/movit
|
||||
# pushd $SRC_DIR/movit
|
||||
# ./autogen.sh
|
||||
# popd
|
||||
# configure_make movit
|
||||
|
||||
git_pull https://github.com/mltframework/mlt.git
|
||||
configure_make mlt --enable-gpl --disable-rtaudio
|
||||
#po->ruby
|
||||
git_pull git://anongit.kde.org/kdenlive
|
||||
cmake_make kdenlive -DKDE_INSTALL_USE_QT_SYS_PATHS:BOOL=ON -DPACKAGERS_BUILD=1 -DBUILD_TESTS=FALSE
|
||||
#-DKDE_L10N_AUTO_TRANSLATIONS:BOOL=ON \
|
||||
162
packaging/kdenlive-msys2.sh
Normal file
@@ -0,0 +1,162 @@
|
||||
#!/bin/bash
|
||||
# (C) 2018 V. Pinon <vpinon@kde.org>
|
||||
# License: GPLv2+
|
||||
# Uses msys2 package management, download from msys2.org
|
||||
|
||||
# Be verbose, halt on errors
|
||||
set -xe
|
||||
|
||||
[ -z "$MSYSTEM" ] && echo "Please run under MSYS/MINGW(64)" && exit 1
|
||||
|
||||
# change this to another location if you prefer
|
||||
export SRC=$PWD/src
|
||||
mkdir -p $SRC
|
||||
|
||||
export PREFIX=$MINGW_PREFIX
|
||||
|
||||
#if [ -n "$PREFIX" ] ; then
|
||||
# mkdir -p $PREFIX/lib
|
||||
# export PATH=$PREFIX/bin:$PATH
|
||||
# export LD_LIBRARY_PATH=$PREFIX/lib:/usr/lib
|
||||
# export PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig:/usr/lib/pkgconfig
|
||||
#fi
|
||||
|
||||
THREADS=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu)
|
||||
[[ $THREADS -gt 1 ]] && THREADS=$((THREADS-1))
|
||||
|
||||
# $@: package base names
|
||||
function pacman_install {
|
||||
pacman -Sy --needed ${@/#/mingw-w64-x86_64-}
|
||||
}
|
||||
|
||||
# $1: repo URL, $2: branch
|
||||
function git_pull {
|
||||
URL=$1 BRANCH=$2
|
||||
PKG=${URL##*/}; PKG=${PKG%%.git}
|
||||
cd $SRC
|
||||
if [ -d $PKG ]; then
|
||||
echo "$PKG already cloned"
|
||||
cd $PKG
|
||||
# git reset --hard
|
||||
git checkout $BRANCH
|
||||
git pull --rebase
|
||||
cd ..
|
||||
else
|
||||
git clone $URL
|
||||
fi
|
||||
}
|
||||
|
||||
# $1: archive URL
|
||||
function wget_extract {
|
||||
URL=$1
|
||||
ARCHIVE=${URL##*/}
|
||||
PKGVERS=${ARCHIVE%%.tar.*}
|
||||
cd $SRC
|
||||
if [ -d $SRC/$PKGVERS ]; then
|
||||
echo "$PKGVERS already downloaded"
|
||||
else
|
||||
[ -f $ARCHIVE ] || wget $URL
|
||||
if [[ ${ARCHIVE##*.} == zip ]] ; then
|
||||
unzip $ARCHIVE
|
||||
else
|
||||
tar -xf ${URL##*/}
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# $1: package name ; $@: cmake args
|
||||
function cmake_ninja {
|
||||
PKG=$1; shift; CMAKE_ARGS="$@"
|
||||
[ -n "$PREFIX" ] && CMAKE_ARGS+=" -DCMAKE_INSTALL_PREFIX:PATH=$PREFIX"
|
||||
mkdir -p $SRC/$PKG/build
|
||||
cd $SRC/$PKG/build
|
||||
cmake .. -G Ninja $CMAKE_ARGS
|
||||
ninja install
|
||||
}
|
||||
|
||||
# $1: package name ; $2: configure args
|
||||
function configure_make {
|
||||
PKG=$1; shift; CONFIGURE_ARGS="$@"
|
||||
[ -n "$PREFIX" ] && CONFIGURE_ARGS+=" --prefix=$PREFIX"
|
||||
cd $SRC/$PKG
|
||||
./configure $CONFIGURE_ARGS
|
||||
mingw32-make -j$THREADS
|
||||
mingw32-make install
|
||||
}
|
||||
|
||||
|
||||
#### DOWNLOAD DEPS
|
||||
|
||||
if pacman -Suy ; then
|
||||
# MSYS tools
|
||||
pacman -Sy --needed tar git automake1.16
|
||||
# MINGW packages
|
||||
TOOLS="make cmake ninja pkg-config libtool" # ruby
|
||||
DEPS="gcc drmingw gavl opencv dlfcn SDL2 exiv2 libexif vid.stab ffmpeg gtk2 qt5 fftw ladspa-sdk eigen3 extra-cmake-modules"
|
||||
KF5=(breeze-icons karchive kconfig kcoreaddons kdbusaddons kguiaddons \
|
||||
ki18n kitemviews kwidgetsaddons kcompletion kwindowsystem \
|
||||
kcrash kjobwidgets kauth kcodecs kconfigwidgets kiconthemes \
|
||||
solid sonnet attica kservice kglobalaccel ktextwidgets \
|
||||
kxmlgui kbookmarks knotifications kio knewstuff \
|
||||
kpackage kdeclarative)
|
||||
pacman_install $DEPS $TOOLS ${KF5[@]/%/-qt5}
|
||||
fi
|
||||
|
||||
#### BUILD EXTRA KF5
|
||||
|
||||
KF5_VERSION=$(pacman -Ss $MINGW_PACKAGE_PREFIX-extra-cmake-modules | sed -n 's/.* \(5\..*\)-.*/\1/p')
|
||||
for FRAMEWORK in knotifyconfig purpose ; do
|
||||
#git_pull git://anongit.kde.org/$FRAMEWORK v$KF5_VERSION
|
||||
wget_extract https://download.kde.org/stable/frameworks/${KF5_VERSION%.*}/$FRAMEWORK-$KF5_VERSION.tar.xz
|
||||
cmake_ninja $FRAMEWORK-$KF5_VERSION \
|
||||
-DKDE_INSTALL_USE_QT_SYS_PATHS:BOOL=ON
|
||||
#-DBUILD_TESTING:BOOL=OFF \
|
||||
#-DKDE_INSTALL_LIBDIR=lib \
|
||||
#-DKDE_INSTALL_QMLDIR=share/qt5/qml \
|
||||
#-DKDE_INSTALL_QTPLUGINDIR=share/qt5/plugins \
|
||||
#-DKDE_INSTALL_DBUSDIR=share/dbus-1 \
|
||||
#-DKDE_INSTALL_MANDIR=share/man \
|
||||
#-DKDE_INSTALL_APPDIR=share/applications \
|
||||
#-DKDE_INSTALL_MIMEDIR=share/mime/packages \
|
||||
#-DECM_MKSPECS_INSTALL_DIR=$MINGW_PREFIX/share/qt5/mkspecs/modules \
|
||||
#-DECM_DIR=$MINGW_PREFIX/share/ECM \
|
||||
done
|
||||
mkdir -p $MINGW_PREFIX/bin/data/color-schemes
|
||||
cd $MINGW_PREFIX/bin/data/color-schemes
|
||||
wget https://cgit.kde.org/breeze.git/plain/colors/{Breeze,BreezeDark,BreezeHighContrast,BreezeLight}.colors
|
||||
wget https://cgit.kde.org/plasma-desktop.git/plain/kcms/colors/schemes/{Honeycomb,Norway,ObsidianCoast,Oxygen,OxygenCold,Steel,WontonSoup,Zion,ZionReversed}.colors
|
||||
#### BUILD MULTIMEDIA DEPS
|
||||
|
||||
if false ; then # Still Failing
|
||||
wget_extract https://github.com/jackaudio/jack2/releases/download/v1.9.12/jack2-1.9.12.tar.gz
|
||||
git_pull https://github.com/jackaudio/jack2.git
|
||||
pushd $SRC/jack2 #-1.9.12
|
||||
./waf configure build install -j $THREADS --prefix=$PREFIX
|
||||
popd
|
||||
|
||||
git_pull https://git.sesse.net/movit
|
||||
pushd $SRC/movit
|
||||
./autogen.sh
|
||||
popd
|
||||
configure_make movit
|
||||
fi
|
||||
|
||||
git_pull https://github.com/dyne/frei0r.git
|
||||
cmake_ninja frei0r
|
||||
|
||||
git_pull https://github.com/mltframework/mlt.git
|
||||
configure_make mlt --enable-gpl --enable-gpl3
|
||||
mv $PREFIX/{melt.exe,libmlt*.dll} $PREFIX/bin
|
||||
|
||||
#### BUILD KDENLIVE
|
||||
|
||||
git_pull https://anongit.kde.org/kdenlive.git
|
||||
#git_pull https://anongit.kde.org/releaseme.git
|
||||
#pushd $SRC/kdenlive
|
||||
#ruby ../releaseme/fetchpo.rb --origin stable --project kdenlive --output-dir po --output-poqm-dir poqm .
|
||||
#popd
|
||||
mkdir -p $SRC/kdenlive/build
|
||||
cd $SRC/kdenlive/build
|
||||
cmake_ninja kdenlive -DCMAKE_BUILD_TYPE=RelWithDebSymbols -DBUILD_TESTING:BOOL=OFF -DKDE_INSTALL_USE_QT_SYS_PATHS:BOOL=ON
|
||||
|
||||
|
||||
@@ -9,12 +9,6 @@ set(kdenlive_render_SRCS
|
||||
add_executable(kdenlive_render ${kdenlive_render_SRCS})
|
||||
ecm_mark_nongui_executable(kdenlive_render)
|
||||
|
||||
qt5_use_modules(kdenlive_render Widgets Concurrent DBus)
|
||||
|
||||
target_link_libraries(kdenlive_render
|
||||
${QT_LIBRARIES}
|
||||
${Qt5_LIBRARIES}
|
||||
)
|
||||
|
||||
target_link_libraries(kdenlive_render Qt5::Core Qt5::DBus)
|
||||
|
||||
install(TARGETS kdenlive_render DESTINATION ${BIN_INSTALL_DIR})
|
||||
|
||||
@@ -75,13 +75,13 @@ int main(int argc, char **argv)
|
||||
QString srcString = args.takeFirst();
|
||||
QUrl srcurl;
|
||||
if (srcString.startsWith(QLatin1String("consumer:"))) {
|
||||
srcurl = QUrl::fromEncoded(srcString.section(QStringLiteral(":"), 1).toUtf8().constData());
|
||||
srcurl = QUrl::fromEncoded(srcString.section(QLatin1Char(':'), 1).toUtf8().constData());
|
||||
} else {
|
||||
srcurl = QUrl::fromEncoded(srcString.toUtf8().constData());
|
||||
}
|
||||
QString src = srcurl.toLocalFile();
|
||||
// The QUrl path() strips the consumer: protocol, so re-add it if necessary
|
||||
if (srcString.startsWith("consumer:")) {
|
||||
if (srcString.startsWith(QStringLiteral("consumer:"))) {
|
||||
src.prepend(QLatin1String("consumer:"));
|
||||
}
|
||||
QString dest = QFileInfo(QUrl::fromEncoded(args.takeFirst().toUtf8()).toLocalFile()).absoluteFilePath();
|
||||
|
||||
@@ -45,7 +45,7 @@ RenderJob::RenderJob(bool erase, bool usekuiserver, int pid, const QString &rend
|
||||
m_jobUiserver(nullptr),
|
||||
m_kdenliveinterface(nullptr),
|
||||
m_usekuiserver(usekuiserver),
|
||||
m_logfile(dest + ".txt"),
|
||||
m_logfile(dest + QStringLiteral(".txt")),
|
||||
m_erase(erase),
|
||||
m_seconds(0),
|
||||
m_frame(0),
|
||||
|
||||
@@ -1,38 +1,44 @@
|
||||
add_definitions(${Qt5Gui_DEFINITIONS})
|
||||
if(${Qt5Gui_OPENGL_IMPLEMENTATION} STREQUAL "GL")
|
||||
find_package(OpenGL REQUIRED)
|
||||
set_package_properties(OpenGL PROPERTIES
|
||||
DESCRIPTION "the OpenGL library"
|
||||
URL ""
|
||||
TYPE RUNTIME
|
||||
PURPOSE "")
|
||||
|
||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -pedantic -Wextra")
|
||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wcast-qual -Wcast-align -Wfloat-equal -Wpointer-arith")
|
||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wunreachable-code -Wchar-subscripts -Wcomment -Wformat")
|
||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror-implicit-function-declaration -Wmain -Wmissing-braces")
|
||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wparentheses -Wsequence-point -Wreturn-type -Wswitch")
|
||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wuninitialized -Wreorder -Wundef -Wshadow -Wwrite-strings")
|
||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wsign-compare -Wconversion")
|
||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wmissing-noreturn -Wsign-conversion -Wunused ")
|
||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wstrict-aliasing -Wstrict-overflow -Wconversion")
|
||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wdisabled-optimization")
|
||||
if (CMAKE_COMPILER_IS_GNUCXX)
|
||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wlogical-op -Wunsafe-loop-optimizations ")
|
||||
endif()
|
||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wunused-parameter -Wshadow -Wno-variadic-macros -Wno-float-conversion")
|
||||
|
||||
if(NOT WIN32)
|
||||
find_package(PkgConfig QUIET)
|
||||
execute_process(
|
||||
COMMAND ${PKG_CONFIG_EXECUTABLE} --variable=mltdatadir mlt-framework
|
||||
OUTPUT_VARIABLE MLT_DATADIR
|
||||
RESULT_VARIABLE MLT_DATADIR_failed)
|
||||
if (NOT MLT_DATADIR_failed)
|
||||
string(REGEX REPLACE "[\r\n]" "" MLT_DATADIR "${MLT_DATADIR}")
|
||||
endif()
|
||||
|
||||
execute_process(
|
||||
COMMAND ${PKG_CONFIG_EXECUTABLE} --variable=meltbin mlt-framework
|
||||
OUTPUT_VARIABLE MLT_MELTBIN
|
||||
RESULT_VARIABLE MLT_MELTBIN_failed)
|
||||
if (NOT MLT_MELTBIN_failed)
|
||||
string(REGEX REPLACE "[\r\n]" "" MLT_MELTBIN "${MLT_MELTBIN}")
|
||||
endif()
|
||||
else()
|
||||
find_package(OpenGLES REQUIRED)
|
||||
set_package_properties(OpenGLES PROPERTIES
|
||||
DESCRIPTION "the OpenGLES library"
|
||||
URL ""
|
||||
TYPE RUNTIME
|
||||
PURPOSE "")
|
||||
set(MLT_MELTBIN "melt.exe")
|
||||
set(MLT_DATADIR "../share/mlt")
|
||||
endif()
|
||||
|
||||
find_package(PkgConfig QUIET)
|
||||
execute_process(
|
||||
COMMAND ${PKG_CONFIG_EXECUTABLE} --variable=mltdatadir mlt-framework
|
||||
OUTPUT_VARIABLE MLT_DATADIR
|
||||
RESULT_VARIABLE MLT_DATADIR_failed)
|
||||
if (NOT MLT_DATADIR_failed)
|
||||
string(REGEX REPLACE "[\r\n]" "" MLT_DATADIR "${MLT_DATADIR}")
|
||||
add_definitions(-DMLT_DATADIR=\"${MLT_DATADIR}\")
|
||||
endif()
|
||||
|
||||
execute_process(
|
||||
COMMAND ${PKG_CONFIG_EXECUTABLE} --variable=meltbin mlt-framework
|
||||
OUTPUT_VARIABLE MLT_MELTBIN
|
||||
RESULT_VARIABLE MLT_MELTBIN_failed)
|
||||
if (NOT MLT_MELTBIN_failed)
|
||||
string(REGEX REPLACE "[\r\n]" "" MLT_MELTBIN "${MLT_MELTBIN}")
|
||||
add_definitions(-DMLT_MELTBIN=\"${MLT_MELTBIN}\")
|
||||
endif()
|
||||
configure_file( mlt_config.h.in ${CMAKE_BINARY_DIR}/generated/mlt_config.h )
|
||||
include_directories( ${CMAKE_BINARY_DIR}/generated/ ) # Make sure it can be included...
|
||||
|
||||
option(WITH_JogShuttle "Build Jog/Shuttle support" ON)
|
||||
|
||||
@@ -57,12 +63,6 @@ set_package_properties(OpenGL PROPERTIES
|
||||
TYPE RUNTIME
|
||||
PURPOSE "")
|
||||
|
||||
set_package_properties(QtScript PROPERTIES
|
||||
DESCRIPTION "Qt module providing core scripting facilities"
|
||||
URL "http://qt.nokia.com/products/qt"
|
||||
TYPE RUNTIME
|
||||
PURPOSE "")
|
||||
|
||||
#if(APPLE)
|
||||
# macro_log_feature(SDL_FOUND
|
||||
# "SDL"
|
||||
@@ -71,6 +71,8 @@ set_package_properties(QtScript PROPERTIES
|
||||
# TRUE
|
||||
# )
|
||||
#endif(APPLE)
|
||||
#add_definitions( -DQT_NO_CAST_FROM_ASCII )
|
||||
#add_definitions( -DQT_NO_CAST_TO_ASCII )
|
||||
|
||||
install(FILES kdenlivesettings.kcfg DESTINATION ${KCFG_INSTALL_DIR})
|
||||
kconfig_add_kcfg_files(kdenlive_SRCS kdenlivesettings.kcfgc)
|
||||
@@ -95,6 +97,7 @@ add_subdirectory(onmonitoritems/rotoscoping)
|
||||
add_subdirectory(mltcontroller)
|
||||
add_subdirectory(bin)
|
||||
add_subdirectory(qml)
|
||||
add_subdirectory(profiles)
|
||||
|
||||
if (Qt5WebKitWidgets_FOUND)
|
||||
add_subdirectory(qt-oauth-lib)
|
||||
@@ -258,7 +261,6 @@ target_link_libraries(kdenlive
|
||||
KF5::Notifications
|
||||
KF5::TextWidgets
|
||||
KF5::IconThemes
|
||||
KF5::Crash
|
||||
Qt5::Svg
|
||||
${OPENGL_LIBRARIES}
|
||||
${OPENGLES_LIBRARIES}
|
||||
@@ -276,7 +278,20 @@ if (KF5_FILEMETADATA)
|
||||
target_link_libraries(kdenlive KF5::FileMetaData)
|
||||
endif()
|
||||
|
||||
qt5_use_modules( kdenlive Script Widgets Concurrent Qml Quick)
|
||||
if (DRMINGW_FOUND)
|
||||
add_definitions(-DUSE_DRMINGW)
|
||||
target_link_libraries(kdenlive ${DRMINGW_LIBRARY})
|
||||
elseif (KF5Crash_FOUND)
|
||||
add_definitions(-DKF5_USE_CRASH)
|
||||
target_link_libraries(kdenlive KF5::Crash)
|
||||
endif(DRMINGW_FOUND)
|
||||
|
||||
target_link_libraries(kdenlive Qt5::Widgets Qt5::Concurrent Qt5::Qml Qt5::Quick)
|
||||
|
||||
if (KF5_PURPOSE)
|
||||
add_definitions(-DKF5_USE_PURPOSE)
|
||||
target_link_libraries(kdenlive KF5::Purpose KF5::PurposeWidgets)
|
||||
endif()
|
||||
|
||||
if (Qt5WebKitWidgets_FOUND)
|
||||
message(STATUS "Found Qt5 WebKitWidgets. You can use your Freesound.org credentials to download files")
|
||||
@@ -292,9 +307,11 @@ if(Q_WS_X11)
|
||||
target_link_libraries(kdenlive ${X11_LIBRARIES})
|
||||
endif(Q_WS_X11)
|
||||
|
||||
if(SDL_FOUND)
|
||||
if(SDL2_FOUND)
|
||||
target_link_libraries(kdenlive ${SDL2_LIBRARY})
|
||||
elseif(SDL_FOUND)
|
||||
target_link_libraries(kdenlive ${SDL_LIBRARY})
|
||||
endif(SDL_FOUND)
|
||||
endif(SDL2_FOUND)
|
||||
|
||||
if(LIBV4L2_FOUND)
|
||||
include_directories(${LIBV4L2_INCLUDE_DIR})
|
||||
|
||||
@@ -45,7 +45,7 @@ class EqualizerWidget : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit EqualizerWidget(QWidget *parent = 0);
|
||||
explicit EqualizerWidget(QWidget *parent = nullptr);
|
||||
|
||||
};
|
||||
|
||||
@@ -53,7 +53,7 @@ class AudioGraphWidget : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit AudioGraphWidget(QWidget *parent = 0);
|
||||
explicit AudioGraphWidget(QWidget *parent = nullptr);
|
||||
void drawBackground();
|
||||
|
||||
public slots:
|
||||
@@ -78,7 +78,7 @@ class AudioGraphSpectrum : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
AudioGraphSpectrum(MonitorManager *manager, QWidget *parent = 0);
|
||||
AudioGraphSpectrum(MonitorManager *manager, QWidget *parent = nullptr);
|
||||
virtual ~AudioGraphSpectrum();
|
||||
private:
|
||||
MonitorManager *m_manager;
|
||||
|
||||
@@ -59,7 +59,7 @@ public:
|
||||
* @brief Constructor.
|
||||
* @param parent parent this item should be added to
|
||||
*/
|
||||
AbstractProjectItem(PROJECTITEMTYPE type, const QString &id, AbstractProjectItem *parent = Q_NULLPTR);
|
||||
AbstractProjectItem(PROJECTITEMTYPE type, const QString &id, AbstractProjectItem *parent = nullptr);
|
||||
/**
|
||||
* @brief Creates a project item upon project load.
|
||||
* @param description element for this item.
|
||||
@@ -67,7 +67,7 @@ public:
|
||||
*
|
||||
* We try to read the attributes "name" and "description"
|
||||
*/
|
||||
AbstractProjectItem(PROJECTITEMTYPE type, const QDomElement &description, AbstractProjectItem *parent = Q_NULLPTR);
|
||||
AbstractProjectItem(PROJECTITEMTYPE type, const QDomElement &description, AbstractProjectItem *parent = nullptr);
|
||||
virtual ~AbstractProjectItem();
|
||||
|
||||
bool operator==(const AbstractProjectItem *projectItem) const;
|
||||
@@ -87,7 +87,7 @@ public:
|
||||
|
||||
/**
|
||||
* @brief Removes a child item and notifies the bin model about it (before and after).
|
||||
* @param child project which sould be removed from the child list
|
||||
* @param child project which should be removed from the child list
|
||||
*
|
||||
* This function is called when a child's parent is changed through setParent
|
||||
*/
|
||||
|
||||
399
src/bin/bin.cpp
@@ -21,6 +21,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "bin.h"
|
||||
#include "kdenlive_debug.h"
|
||||
#include "mainwindow.h"
|
||||
#include "projectitemmodel.h"
|
||||
#include "projectclip.h"
|
||||
@@ -62,7 +63,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#include <QTimeLine>
|
||||
#include <QSlider>
|
||||
#include <QMenu>
|
||||
#include "kdenlive_debug.h"
|
||||
#include <QtConcurrent>
|
||||
#include <QUndoCommand>
|
||||
#include <QCryptographicHash>
|
||||
@@ -136,7 +136,7 @@ void MyTreeView::editorDestroyed(QObject *editor)
|
||||
|
||||
void MyTreeView::keyPressEvent(QKeyEvent *event)
|
||||
{
|
||||
if (isEditing() == true) {
|
||||
if (isEditing()) {
|
||||
QTreeView::keyPressEvent(event);
|
||||
return;
|
||||
}
|
||||
@@ -151,14 +151,14 @@ void MyTreeView::keyPressEvent(QKeyEvent *event)
|
||||
QTreeView::keyPressEvent(event);
|
||||
}
|
||||
|
||||
bool MyTreeView::isEditing()
|
||||
bool MyTreeView::isEditing() const
|
||||
{
|
||||
return m_editing;
|
||||
return state() == QAbstractItemView::EditingState;
|
||||
}
|
||||
|
||||
void MyTreeView::setEditing(bool edit)
|
||||
{
|
||||
m_editing = edit;
|
||||
setState(edit ? QAbstractItemView::EditingState : QAbstractItemView::NoState);
|
||||
}
|
||||
|
||||
bool MyTreeView::performDrag()
|
||||
@@ -175,7 +175,7 @@ bool MyTreeView::performDrag()
|
||||
}
|
||||
QDrag *drag = new QDrag(this);
|
||||
drag->setMimeData(model()->mimeData(indexes));
|
||||
QModelIndex ix = indexes.first();
|
||||
QModelIndex ix = indexes.constFirst();
|
||||
if (ix.isValid()) {
|
||||
QIcon icon = ix.data(AbstractProjectItem::DataThumbnail).value<QIcon>();
|
||||
QPixmap pix = icon.pixmap(iconSize());
|
||||
@@ -301,6 +301,208 @@ void SmallJobLabel::slotSetJobCount(int jobCount)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @class BinItemDelegate
|
||||
* @brief This class is responsible for drawing items in the QTreeView.
|
||||
*/
|
||||
|
||||
class BinItemDelegate: public QStyledItemDelegate
|
||||
{
|
||||
public:
|
||||
explicit BinItemDelegate(QObject *parent = nullptr): QStyledItemDelegate(parent)
|
||||
, m_editorOpen(false)
|
||||
{
|
||||
connect(this, &QStyledItemDelegate::closeEditor, [&]() {
|
||||
m_editorOpen = false;
|
||||
});
|
||||
}
|
||||
void setEditorData(QWidget *w, const QModelIndex &i) const override
|
||||
{
|
||||
if (!m_editorOpen) {
|
||||
QStyledItemDelegate::setEditorData(w, i);
|
||||
m_editorOpen = true;
|
||||
}
|
||||
}
|
||||
|
||||
void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const Q_DECL_OVERRIDE
|
||||
{
|
||||
if (index.column() != 0) {
|
||||
return QStyledItemDelegate::updateEditorGeometry(editor, option, index);
|
||||
}
|
||||
QStyleOptionViewItem opt = option;
|
||||
initStyleOption(&opt, index);
|
||||
QRect r1 = option.rect;
|
||||
QStyle *style = opt.widget ? opt.widget->style() : QApplication::style();
|
||||
const int textMargin = style->pixelMetric(QStyle::PM_FocusFrameHMargin) + 1;
|
||||
int type = index.data(AbstractProjectItem::ItemTypeRole).toInt();
|
||||
double factor = (double) opt.decorationSize.height() / r1.height();
|
||||
int decoWidth = 2 * textMargin;
|
||||
int mid = 0;
|
||||
if (factor > 0) {
|
||||
decoWidth += opt.decorationSize.width() / factor;
|
||||
}
|
||||
if (type == AbstractProjectItem::ClipItem || type == AbstractProjectItem::SubClipItem) {
|
||||
mid = (int)((r1.height() / 2));
|
||||
}
|
||||
r1.adjust(decoWidth, 0, 0, -mid);
|
||||
QFont ft = option.font;
|
||||
ft.setBold(true);
|
||||
QFontMetricsF fm(ft);
|
||||
QRect r2 = fm.boundingRect(r1, Qt::AlignLeft | Qt::AlignTop, index.data(AbstractProjectItem::DataName).toString()).toRect();
|
||||
editor->setGeometry(r2);
|
||||
}
|
||||
|
||||
QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const Q_DECL_OVERRIDE
|
||||
{
|
||||
QSize hint = QStyledItemDelegate::sizeHint(option, index);
|
||||
QString text = index.data(AbstractProjectItem::DataName).toString();
|
||||
QRectF r = option.rect;
|
||||
QFont ft = option.font;
|
||||
ft.setBold(true);
|
||||
QFontMetricsF fm(ft);
|
||||
QStyle *style = option.widget ? option.widget->style() : QApplication::style();
|
||||
const int textMargin = style->pixelMetric(QStyle::PM_FocusFrameHMargin) + 1;
|
||||
int width = fm.boundingRect(r, Qt::AlignLeft | Qt::AlignTop, text).width() + option.decorationSize.width() + 2 * textMargin;
|
||||
hint.setWidth(width);
|
||||
int type = index.data(AbstractProjectItem::ItemTypeRole).toInt();
|
||||
if (type == AbstractProjectItem::FolderItem || type == AbstractProjectItem::FolderUpItem) {
|
||||
return QSize(hint.width(), qMin(option.fontMetrics.lineSpacing() + 4, hint.height()));
|
||||
}
|
||||
if (type == AbstractProjectItem::ClipItem) {
|
||||
return QSize(hint.width(), qMax(option.fontMetrics.lineSpacing() * 2 + 4, qMax(hint.height(), option.decorationSize.height())));
|
||||
}
|
||||
if (type == AbstractProjectItem::SubClipItem) {
|
||||
return QSize(hint.width(), qMax(option.fontMetrics.lineSpacing() * 2 + 4, qMin(hint.height(), (int)(option.decorationSize.height() / 1.5))));
|
||||
}
|
||||
QIcon icon = qvariant_cast<QIcon>(index.data(Qt::DecorationRole));
|
||||
QString line1 = index.data(Qt::DisplayRole).toString();
|
||||
QString line2 = index.data(Qt::UserRole).toString();
|
||||
|
||||
int textW = qMax(option.fontMetrics.width(line1), option.fontMetrics.width(line2));
|
||||
QSize iconSize = icon.actualSize(option.decorationSize);
|
||||
return QSize(qMax(textW, iconSize.width()) + 4, option.fontMetrics.lineSpacing() * 2 + 4);
|
||||
}
|
||||
|
||||
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const Q_DECL_OVERRIDE
|
||||
{
|
||||
if (index.column() == 0 && !index.data().isNull()) {
|
||||
QRect r1 = option.rect;
|
||||
painter->save();
|
||||
painter->setClipRect(r1);
|
||||
QStyleOptionViewItem opt(option);
|
||||
initStyleOption(&opt, index);
|
||||
int type = index.data(AbstractProjectItem::ItemTypeRole).toInt();
|
||||
QStyle *style = opt.widget ? opt.widget->style() : QApplication::style();
|
||||
const int textMargin = style->pixelMetric(QStyle::PM_FocusFrameHMargin) + 1;
|
||||
//QRect r = QStyle::alignedRect(opt.direction, Qt::AlignVCenter | Qt::AlignLeft, opt.decorationSize, r1);
|
||||
|
||||
style->drawPrimitive(QStyle::PE_PanelItemViewItem, &opt, painter, opt.widget);
|
||||
if (option.state & QStyle::State_Selected) {
|
||||
painter->setPen(option.palette.highlightedText().color());
|
||||
} else {
|
||||
painter->setPen(option.palette.text().color());
|
||||
}
|
||||
QRect r = r1;
|
||||
QFont font = painter->font();
|
||||
font.setBold(true);
|
||||
painter->setFont(font);
|
||||
if (type == AbstractProjectItem::ClipItem || type == AbstractProjectItem::SubClipItem) {
|
||||
double factor = (double) opt.decorationSize.height() / r1.height();
|
||||
int decoWidth = 2 * textMargin;
|
||||
if (factor > 0) {
|
||||
r.setWidth(opt.decorationSize.width() / factor);
|
||||
// Draw thumbnail
|
||||
opt.icon.paint(painter, r);
|
||||
decoWidth += r.width();
|
||||
}
|
||||
int mid = (int)((r1.height() / 2));
|
||||
r1.adjust(decoWidth, 0, 0, -mid);
|
||||
QRect r2 = option.rect;
|
||||
r2.adjust(decoWidth, mid, 0, 0);
|
||||
QRectF bounding;
|
||||
painter->drawText(r1, Qt::AlignLeft | Qt::AlignTop, index.data(AbstractProjectItem::DataName).toString(), &bounding);
|
||||
font.setBold(false);
|
||||
painter->setFont(font);
|
||||
QString subText = index.data(AbstractProjectItem::DataDuration).toString();
|
||||
if (!subText.isEmpty()) {
|
||||
r2.adjust(0, bounding.bottom() - r2.top(), 0, 0);
|
||||
QColor subTextColor = painter->pen().color();
|
||||
subTextColor.setAlphaF(.5);
|
||||
painter->setPen(subTextColor);
|
||||
painter->drawText(r2, Qt::AlignLeft | Qt::AlignTop, subText, &bounding);
|
||||
// Draw usage counter
|
||||
int usage = index.data(AbstractProjectItem::UsageCount).toInt();
|
||||
if (usage > 0) {
|
||||
bounding.moveLeft(bounding.right() + (2 * textMargin));
|
||||
QString us = QString().sprintf("[%d]", usage);
|
||||
painter->drawText(bounding, Qt::AlignLeft | Qt::AlignTop, us, &bounding);
|
||||
}
|
||||
}
|
||||
if (type == AbstractProjectItem::ClipItem) {
|
||||
// Overlay icon if necessary
|
||||
QVariant v = index.data(AbstractProjectItem::IconOverlay);
|
||||
if (!v.isNull()) {
|
||||
QIcon reload = QIcon::fromTheme(v.toString());
|
||||
r.setTop(r.bottom() - bounding.height());
|
||||
r.setWidth(bounding.height());
|
||||
reload.paint(painter, r);
|
||||
}
|
||||
|
||||
int jobProgress = index.data(AbstractProjectItem::JobProgress).toInt();
|
||||
if (jobProgress > 0 || jobProgress == JobWaiting) {
|
||||
// Draw job progress bar
|
||||
int progressWidth = option.fontMetrics.averageCharWidth() * 8;
|
||||
int progressHeight = option.fontMetrics.ascent() / 4;
|
||||
QRect progress(r1.x() + 1, opt.rect.bottom() - progressHeight - 2, progressWidth, progressHeight);
|
||||
painter->setPen(Qt::NoPen);
|
||||
painter->setBrush(Qt::darkGray);
|
||||
if (jobProgress > 0) {
|
||||
painter->drawRoundedRect(progress, 2, 2);
|
||||
painter->setBrush(option.state & QStyle::State_Selected ? option.palette.text() : option.palette.highlight());
|
||||
progress.setWidth((progressWidth - 2) * jobProgress / 100);
|
||||
painter->drawRoundedRect(progress, 2, 2);
|
||||
} else if (jobProgress == JobWaiting) {
|
||||
// Draw kind of a pause icon
|
||||
progress.setWidth(3);
|
||||
painter->drawRect(progress);
|
||||
progress.moveLeft(progress.right() + 3);
|
||||
painter->drawRect(progress);
|
||||
}
|
||||
} else if (jobProgress == JobCrashed) {
|
||||
QString jobText = index.data(AbstractProjectItem::JobMessage).toString();
|
||||
if (!jobText.isEmpty()) {
|
||||
QRectF txtBounding = painter->boundingRect(r2, Qt::AlignRight | Qt::AlignVCenter, " " + jobText + " ");
|
||||
painter->setPen(Qt::NoPen);
|
||||
painter->setBrush(option.palette.highlight());
|
||||
painter->drawRoundedRect(txtBounding, 2, 2);
|
||||
painter->setPen(option.palette.highlightedText().color());
|
||||
painter->drawText(txtBounding, Qt::AlignCenter, jobText);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Folder or Folder Up items
|
||||
double factor = (double) opt.decorationSize.height() / r1.height();
|
||||
int decoWidth = 2 * textMargin;
|
||||
if (factor > 0) {
|
||||
r.setWidth(opt.decorationSize.width() / factor);
|
||||
// Draw thumbnail
|
||||
opt.icon.paint(painter, r);
|
||||
decoWidth += r.width();
|
||||
}
|
||||
r1.adjust(decoWidth, 0, 0, 0);
|
||||
QRectF bounding;
|
||||
painter->drawText(r1, Qt::AlignLeft | Qt::AlignTop, index.data(AbstractProjectItem::DataName).toString(), &bounding);
|
||||
}
|
||||
painter->restore();
|
||||
} else {
|
||||
QStyledItemDelegate::paint(painter, option, index);
|
||||
}
|
||||
}
|
||||
private:
|
||||
mutable bool m_editorOpen;
|
||||
};
|
||||
|
||||
LineEventEater::LineEventEater(QObject *parent) : QObject(parent)
|
||||
{
|
||||
}
|
||||
@@ -421,10 +623,16 @@ Bin::Bin(QWidget *parent) :
|
||||
disableEffects->setChecked(false);
|
||||
pCore->window()->actionCollection()->addAction(QStringLiteral("disable_bin_effects"), disableEffects);
|
||||
|
||||
m_renameFolderAction = new QAction(i18n("Rename Folder"), this);
|
||||
connect(m_renameFolderAction, &QAction::triggered, this, &Bin::slotRenameFolder);
|
||||
m_renameFolderAction->setData("rename_folder");
|
||||
pCore->window()->actionCollection()->addAction(QStringLiteral("rename_folder"), m_renameFolderAction);
|
||||
#if KXMLGUI_VERSION_MINOR > 24 || KXMLGUI_VERSION_MAJOR > 5
|
||||
m_renameAction = KStandardAction::renameFile(this, SLOT(slotRenameItem()), this);
|
||||
m_renameAction->setText(i18n("Rename"));
|
||||
#else
|
||||
m_renameAction = new QAction(i18n("Rename"), this);
|
||||
connect(m_renameAction, &QAction::triggered, this, &Bin::slotRenameItem);
|
||||
m_renameAction->setShortcut(Qt::Key_F2);
|
||||
#endif
|
||||
m_renameAction->setData("rename");
|
||||
pCore->window()->actionCollection()->addAction(QStringLiteral("rename"), m_renameAction);
|
||||
|
||||
listType->setToolBarMode(KSelectAction::MenuMode);
|
||||
connect(listType, SIGNAL(triggered(QAction *)), this, SLOT(slotInitView(QAction *)));
|
||||
@@ -740,7 +948,7 @@ const QStringList Bin::getFolderInfo(const QModelIndex &selectedIx)
|
||||
folderInfo << QString();
|
||||
return folderInfo;
|
||||
}
|
||||
QModelIndex ix = indexes.first();
|
||||
QModelIndex ix = indexes.constFirst();
|
||||
if (ix.isValid() && (m_proxyModel->selectionModel()->isSelected(ix) || selectedIx.isValid())) {
|
||||
AbstractProjectItem *currentItem = static_cast<AbstractProjectItem *>(m_proxyModel->mapToSource(ix).internalPointer());
|
||||
while (currentItem->itemType() != AbstractProjectItem::FolderItem) {
|
||||
@@ -791,11 +999,11 @@ void Bin::deleteClip(const QString &id)
|
||||
|
||||
ProjectClip *Bin::getFirstSelectedClip()
|
||||
{
|
||||
QModelIndexList indexes = m_proxyModel->selectionModel()->selectedIndexes();
|
||||
const QModelIndexList indexes = m_proxyModel->selectionModel()->selectedIndexes();
|
||||
if (indexes.isEmpty()) {
|
||||
return nullptr;
|
||||
}
|
||||
foreach (const QModelIndex &ix, indexes) {
|
||||
for (const QModelIndex &ix : indexes) {
|
||||
AbstractProjectItem *item = static_cast<AbstractProjectItem *>(m_proxyModel->mapToSource(ix).internalPointer());
|
||||
ProjectClip *clip = qobject_cast<ProjectClip *>(item);
|
||||
if (clip) {
|
||||
@@ -807,15 +1015,15 @@ ProjectClip *Bin::getFirstSelectedClip()
|
||||
|
||||
void Bin::slotDeleteClip()
|
||||
{
|
||||
QModelIndexList indexes = m_proxyModel->selectionModel()->selectedIndexes();
|
||||
QStringList clipIds;
|
||||
QStringList subClipIds;
|
||||
QStringList foldersIds;
|
||||
ProjectSubClip *sub;
|
||||
ProjectSubClip *sub = nullptr;
|
||||
QPoint zone;
|
||||
bool usedFolder = false;
|
||||
// check folders, remove child folders if there is any
|
||||
QList<ProjectFolder *> topFolders;
|
||||
const QModelIndexList indexes = m_proxyModel->selectionModel()->selectedIndexes();
|
||||
foreach (const QModelIndex &ix, indexes) {
|
||||
if (!ix.isValid() || ix.column() != 0) {
|
||||
continue;
|
||||
@@ -828,7 +1036,7 @@ void Bin::slotDeleteClip()
|
||||
QString subId = item->clipId();
|
||||
sub = static_cast<ProjectSubClip *>(item);
|
||||
zone = sub->zone();
|
||||
subId.append(":" + QString::number(zone.x()) + ":" + QString::number(zone.y()));
|
||||
subId.append(QLatin1Char(':') + QString::number(zone.x()) + QLatin1Char(':') + QString::number(zone.y()));
|
||||
subClipIds << subId;
|
||||
continue;
|
||||
}
|
||||
@@ -909,8 +1117,8 @@ void Bin::slotDeleteClip()
|
||||
|
||||
void Bin::slotReloadClip()
|
||||
{
|
||||
QModelIndexList indexes = m_proxyModel->selectionModel()->selectedIndexes();
|
||||
foreach (const QModelIndex &ix, indexes) {
|
||||
const QModelIndexList indexes = m_proxyModel->selectionModel()->selectedIndexes();
|
||||
for (const QModelIndex &ix : indexes) {
|
||||
if (!ix.isValid() || ix.column() != 0) {
|
||||
continue;
|
||||
}
|
||||
@@ -955,8 +1163,8 @@ void Bin::slotReloadClip()
|
||||
|
||||
void Bin::slotLocateClip()
|
||||
{
|
||||
QModelIndexList indexes = m_proxyModel->selectionModel()->selectedIndexes();
|
||||
foreach (const QModelIndex &ix, indexes) {
|
||||
const QModelIndexList indexes = m_proxyModel->selectionModel()->selectedIndexes();
|
||||
for (const QModelIndex &ix : indexes) {
|
||||
if (!ix.isValid() || ix.column() != 0) {
|
||||
continue;
|
||||
}
|
||||
@@ -970,7 +1178,7 @@ void Bin::slotLocateClip()
|
||||
qCDebug(KDENLIVE_LOG) << " / / " + url.toString();
|
||||
} else {
|
||||
if(!exists) {
|
||||
emitMessage(i18n("Couldn't locate ") + QString(" (" + url.toString() + ")"), 100, ErrorMessage);
|
||||
emitMessage(i18n("Couldn't locate ") + QString(" (" + url.toString() + QLatin1Char(')')), 100, ErrorMessage);
|
||||
}
|
||||
return;
|
||||
}
|
||||
@@ -980,8 +1188,8 @@ void Bin::slotLocateClip()
|
||||
|
||||
void Bin::slotDuplicateClip()
|
||||
{
|
||||
QModelIndexList indexes = m_proxyModel->selectionModel()->selectedIndexes();
|
||||
foreach (const QModelIndex &ix, indexes) {
|
||||
const QModelIndexList indexes = m_proxyModel->selectionModel()->selectedIndexes();
|
||||
for (const QModelIndex &ix : indexes) {
|
||||
if (!ix.isValid() || ix.column() != 0) {
|
||||
continue;
|
||||
}
|
||||
@@ -1020,7 +1228,7 @@ void Bin::setMonitor(Monitor *monitor)
|
||||
connect(m_monitor, SIGNAL(addClipToProject(QUrl)), this, SLOT(slotAddClipToProject(QUrl)));
|
||||
connect(m_monitor, SIGNAL(requestAudioThumb(QString)), this, SLOT(slotSendAudioThumb(QString)));
|
||||
connect(m_monitor, &Monitor::refreshCurrentClip, this, &Bin::slotOpenCurrent);
|
||||
connect(m_monitor, SIGNAL(updateClipMarker(QString, QList<CommentedTime>)), this, SLOT(slotAddClipMarker(QString, QList<CommentedTime>)));
|
||||
connect(m_monitor, SIGNAL(updateClipMarker(QString,QList<CommentedTime>)), this, SLOT(slotAddClipMarker(QString,QList<CommentedTime>)));
|
||||
connect(this, &Bin::openClip, m_monitor, &Monitor::slotOpenClip);
|
||||
}
|
||||
|
||||
@@ -1092,8 +1300,7 @@ void Bin::setDocument(KdenliveDoc *project)
|
||||
|
||||
void Bin::slotAddUrl(const QString &url, int folderId, const QMap<QString, QString> &data)
|
||||
{
|
||||
QList<QUrl>urls;
|
||||
urls << QUrl::fromLocalFile(url);
|
||||
const QList<QUrl> urls = QList<QUrl>() << QUrl::fromLocalFile(url);
|
||||
QStringList folderInfo;
|
||||
if (folderId >= 0) {
|
||||
QModelIndex ix = getIndexForId(QString::number(folderId), true);
|
||||
@@ -1108,9 +1315,8 @@ void Bin::slotAddUrl(const QString &url, int folderId, const QMap<QString, QStri
|
||||
|
||||
void Bin::slotAddUrl(const QString &url, const QMap<QString, QString> &data)
|
||||
{
|
||||
QList<QUrl>urls;
|
||||
urls << QUrl::fromLocalFile(url);
|
||||
QStringList folderInfo = getFolderInfo();
|
||||
const QList<QUrl> urls = QList<QUrl>() << QUrl::fromLocalFile(url);
|
||||
const QStringList folderInfo = getFolderInfo();
|
||||
ClipCreationDialog::createClipsCommand(m_doc, urls, folderInfo, this, data);
|
||||
}
|
||||
|
||||
@@ -1183,7 +1389,6 @@ QString Bin::slotAddFolder(const QString &folderName)
|
||||
if (id.isValid() && id2.isValid()) {
|
||||
m_proxyModel->selectionModel()->select(QItemSelection(m_proxyModel->mapFromSource(id), m_proxyModel->mapFromSource(id2)), QItemSelectionModel::Select);
|
||||
}
|
||||
m_itemView->setProperty("editing", true);
|
||||
m_itemView->edit(m_proxyModel->mapFromSource(ix));
|
||||
}
|
||||
return newId;
|
||||
@@ -1316,7 +1521,7 @@ void Bin::removeFolder(const QString &id, QUndoCommand *deleteCommand)
|
||||
// Check parent item
|
||||
ProjectFolder *folder = m_rootFolder->folder(id);
|
||||
AbstractProjectItem *parent = folder->parent();
|
||||
if (folder->count() > 0) {
|
||||
if (!folder->isEmpty()) {
|
||||
// Folder has clips inside, warn user
|
||||
if (KMessageBox::warningContinueCancel(this, i18np("Folder contains a clip, delete anyways ?", "Folder contains %1 clips, delete anyways ?", folder->count())) != KMessageBox::Continue) {
|
||||
return;
|
||||
@@ -1502,9 +1707,9 @@ void Bin::autoSelect()
|
||||
QList<ProjectClip *> Bin::selectedClips()
|
||||
{
|
||||
//TODO: handle clips inside folders
|
||||
QModelIndexList indexes = m_proxyModel->selectionModel()->selectedIndexes();
|
||||
const QModelIndexList indexes = m_proxyModel->selectionModel()->selectedIndexes();
|
||||
QList<ProjectClip *> list;
|
||||
foreach (const QModelIndex &ix, indexes) {
|
||||
for (const QModelIndex &ix : indexes) {
|
||||
if (!ix.isValid() || ix.column() != 0) {
|
||||
continue;
|
||||
}
|
||||
@@ -1706,7 +1911,6 @@ void Bin::contextMenuEvent(QContextMenuEvent *event)
|
||||
m_editAction->setVisible(!isFolder);
|
||||
m_clipsActionsMenu->setEnabled(enableClipActions);
|
||||
m_extractAudioAction->setEnabled(enableClipActions);
|
||||
m_renameFolderAction->setVisible(isFolder);
|
||||
m_openAction->setVisible(!isFolder);
|
||||
m_reloadAction->setVisible(!isFolder);
|
||||
m_duplicateAction->setVisible(!isFolder);
|
||||
@@ -1720,6 +1924,7 @@ void Bin::contextMenuEvent(QContextMenuEvent *event)
|
||||
m_locateAction->setVisible(!isFolder && (isImported));
|
||||
|
||||
// Show menu
|
||||
event->setAccepted(true);
|
||||
if (enableClipActions) {
|
||||
m_menu->exec(event->globalPos());
|
||||
} else {
|
||||
@@ -1750,18 +1955,21 @@ void Bin::slotItemDoubleClicked(const QModelIndex &ix, const QPoint pos)
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
if (item->count() > 0) {
|
||||
QTreeView *view = static_cast<QTreeView *>(m_itemView);
|
||||
view->setExpanded(ix, !view->isExpanded(ix));
|
||||
return;
|
||||
if (ix.column() == 0 && item->count() > 0) {
|
||||
QRect IconRect = m_itemView->visualRect(ix);
|
||||
IconRect.setWidth((double)IconRect.height() / m_itemView->iconSize().height() * m_itemView->iconSize().width());
|
||||
if (!pos.isNull() && (IconRect.contains(pos) || pos.y() > (IconRect.y() + IconRect.height()/2))) {
|
||||
QTreeView *view = static_cast<QTreeView *>(m_itemView);
|
||||
view->setExpanded(ix, !view->isExpanded(ix));
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (ix.isValid()) {
|
||||
QRect IconRect = m_itemView->visualRect(ix);
|
||||
IconRect.setSize(m_itemView->iconSize());
|
||||
if (!pos.isNull() && ((ix.column() == 2 && item->itemType() == AbstractProjectItem::ClipItem) || !IconRect.contains(pos))) {
|
||||
IconRect.setWidth((double)IconRect.height() / m_itemView->iconSize().height() * m_itemView->iconSize().width());
|
||||
if (!pos.isNull() && ((ix.column() == 2 && item->itemType() == AbstractProjectItem::ClipItem) || (!IconRect.contains(pos) && pos.y() < (IconRect.y() + IconRect.height()/2)))) {
|
||||
// User clicked outside icon, trigger rename
|
||||
m_itemView->setProperty("editing", true);
|
||||
m_itemView->edit(ix);
|
||||
return;
|
||||
}
|
||||
@@ -1877,7 +2085,7 @@ void Bin::showClipProperties(ProjectClip *clip, bool forceRefresh)
|
||||
connect(this, &Bin::refreshPanelMarkers, panel, &ClipPropertiesController::slotFillMarkers);
|
||||
connect(panel, SIGNAL(updateClipProperties(QString, QMap<QString, QString>, QMap<QString, QString>)), this, SLOT(slotEditClipCommand(QString, QMap<QString, QString>, QMap<QString, QString>)));
|
||||
connect(panel, SIGNAL(seekToFrame(int)), m_monitor, SLOT(slotSeek(int)));
|
||||
connect(panel, SIGNAL(addMarkers(QString, QList<CommentedTime>)), this, SLOT(slotAddClipMarker(QString, QList<CommentedTime>)));
|
||||
connect(panel, SIGNAL(addMarkers(QString,QList<CommentedTime>)), this, SLOT(slotAddClipMarker(QString,QList<CommentedTime>)));
|
||||
connect(panel, &ClipPropertiesController::editClip, this, &Bin::slotEditClip);
|
||||
connect(panel, SIGNAL(editAnalysis(QString, QString, QString)), this, SLOT(slotAddClipExtraData(QString, QString, QString)));
|
||||
|
||||
@@ -1913,7 +2121,7 @@ void Bin::slotThumbnailReady(const QString &id, const QImage &img, bool fromFile
|
||||
// Save thumbnail for later reuse
|
||||
bool ok = false;
|
||||
if (!fromFile) {
|
||||
img.save(m_doc->getCacheDir(CacheThumbs, &ok).absoluteFilePath(clip->hash() + ".png"));
|
||||
img.save(m_doc->getCacheDir(CacheThumbs, &ok).absoluteFilePath(clip->hash() + QStringLiteral(".png")));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2130,7 +2338,7 @@ void Bin::setupGeneratorMenu()
|
||||
}
|
||||
m_menu->addAction(m_editAction);
|
||||
m_menu->addAction(m_openAction);
|
||||
m_menu->addAction(m_renameFolderAction);
|
||||
m_menu->addAction(m_renameAction);
|
||||
m_menu->addAction(m_deleteAction);
|
||||
m_menu->insertSeparator(m_deleteAction);
|
||||
}
|
||||
@@ -2217,7 +2425,7 @@ void Bin::slotUpdateJobStatus(const QString &id, int jobType, int status, const
|
||||
|
||||
void Bin::doDisplayMessage(const QString &text, KMessageWidget::MessageType type, const QList<QAction *> &actions)
|
||||
{
|
||||
// Remove axisting actions if any
|
||||
// Remove existing actions if any
|
||||
QList<QAction *> acts = m_infoMessage->actions();
|
||||
while (!acts.isEmpty()) {
|
||||
QAction *a = acts.takeFirst();
|
||||
@@ -2312,9 +2520,9 @@ void Bin::refreshClipMarkers(const QString &id)
|
||||
}
|
||||
}
|
||||
|
||||
void Bin::discardJobs(const QString &id, AbstractClipJob::JOBTYPE type)
|
||||
bool Bin::discardJobs(const QString &id, AbstractClipJob::JOBTYPE type)
|
||||
{
|
||||
m_jobManager->discardJobs(id, type);
|
||||
return m_jobManager->discardJobs(id, type);
|
||||
}
|
||||
|
||||
void Bin::slotStartCutJob(const QString &id)
|
||||
@@ -2324,11 +2532,10 @@ void Bin::slotStartCutJob(const QString &id)
|
||||
|
||||
void Bin::startJob(const QString &id, AbstractClipJob::JOBTYPE type)
|
||||
{
|
||||
QList<ProjectClip *> clips;
|
||||
ProjectClip *clip = getBinClip(id);
|
||||
if (clip && !hasPendingJob(id, type)) {
|
||||
// Launch job
|
||||
clips << clip;
|
||||
const QList<ProjectClip *> clips = {clip};
|
||||
m_jobManager->prepareJobs(clips, m_doc->fps(), type);
|
||||
}
|
||||
}
|
||||
@@ -2426,7 +2633,7 @@ void Bin::slotEffectDropped(QString id, QDomElement effect)
|
||||
m_doc->commandStack()->push(command);
|
||||
}
|
||||
|
||||
void Bin::slotUpdateEffect(QString id, QDomElement oldEffect, QDomElement newEffect, int ix)
|
||||
void Bin::slotUpdateEffect(QString id, QDomElement oldEffect, QDomElement newEffect, int ix, bool refreshStack, bool updateClip)
|
||||
{
|
||||
if (id.isEmpty()) {
|
||||
id = m_monitor->activeClipId();
|
||||
@@ -2434,7 +2641,7 @@ void Bin::slotUpdateEffect(QString id, QDomElement oldEffect, QDomElement newEff
|
||||
if (id.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
UpdateBinEffectCommand *command = new UpdateBinEffectCommand(this, id, oldEffect, newEffect, ix);
|
||||
UpdateBinEffectCommand *command = new UpdateBinEffectCommand(this, id, oldEffect, newEffect, ix, refreshStack, updateClip);
|
||||
m_doc->commandStack()->push(command);
|
||||
}
|
||||
|
||||
@@ -2537,14 +2744,16 @@ void Bin::addEffect(const QString &id, QDomElement &effect)
|
||||
m_monitor->refreshMonitorIfActive();
|
||||
}
|
||||
|
||||
void Bin::updateEffect(const QString &id, QDomElement &effect, int ix, bool refreshStackWidget)
|
||||
void Bin::updateEffect(const QString &id, QDomElement &effect, int ix, bool refreshStackWidget, bool updateClip)
|
||||
{
|
||||
ProjectClip *currentItem = m_rootFolder->clip(id);
|
||||
if (!currentItem) {
|
||||
return;
|
||||
}
|
||||
currentItem->updateEffect(m_monitor->profileInfo(), effect, ix, refreshStackWidget);
|
||||
m_monitor->refreshMonitorIfActive();
|
||||
currentItem->updateEffect(m_monitor->profileInfo(), effect, ix, refreshStackWidget, updateClip);
|
||||
if (updateClip) {
|
||||
m_monitor->refreshMonitorIfActive();
|
||||
}
|
||||
}
|
||||
|
||||
void Bin::changeEffectState(const QString &id, const QList<int> &indexes, bool disable, bool refreshStack)
|
||||
@@ -2617,7 +2826,7 @@ void Bin::droppedUrls(const QList<QUrl> &urls, const QStringList &folderInfo)
|
||||
current = m_proxyModel->mapToSource(m_proxyModel->selectionModel()->currentIndex());
|
||||
} else {
|
||||
// get index for folder
|
||||
current = getIndexForId(folderInfo.first(), true);
|
||||
current = getIndexForId(folderInfo.constFirst(), true);
|
||||
}
|
||||
slotItemDropped(urls, current);
|
||||
}
|
||||
@@ -2634,7 +2843,7 @@ void Bin::slotItemDropped(const QList<QUrl> &urls, const QModelIndex &parent)
|
||||
{
|
||||
QStringList folderInfo;
|
||||
if (parent.isValid()) {
|
||||
// Check if drop occured on a folder
|
||||
// Check if drop occurred on a folder
|
||||
AbstractProjectItem *parentItem = static_cast<AbstractProjectItem *>(parent.internalPointer());
|
||||
while (parentItem->itemType() != AbstractProjectItem::FolderItem) {
|
||||
parentItem = parentItem->parent();
|
||||
@@ -2653,9 +2862,10 @@ void Bin::slotItemDropped(const QList<QUrl> &urls, const QModelIndex &parent)
|
||||
// user dropped a folder, import its files
|
||||
clipsToAdd.removeAll(file);
|
||||
QDir dir(file.toLocalFile());
|
||||
QStringList result = dir.entryList(QDir::Files);
|
||||
const QStringList result = dir.entryList(QDir::Files);
|
||||
QList<QUrl> folderFiles;
|
||||
foreach (const QString &path, result) {
|
||||
folderFiles.reserve(result.count());
|
||||
for (const QString &path : result) {
|
||||
folderFiles.append(QUrl::fromLocalFile(dir.absoluteFilePath(path)));
|
||||
}
|
||||
if (!folderFiles.isEmpty()) {
|
||||
@@ -2676,7 +2886,6 @@ void Bin::slotItemDropped(const QList<QUrl> &urls, const QModelIndex &parent)
|
||||
|
||||
void Bin::slotExpandUrl(const ItemInfo &info, const QString &url, QUndoCommand *command)
|
||||
{
|
||||
QStringList folderInfo;
|
||||
// Create folder to hold imported clips
|
||||
QString folderName = QFileInfo(url).fileName().section(QLatin1Char('.'), 0, 0);
|
||||
QString folderId = QString::number(getFreeFolderId());
|
||||
@@ -2734,18 +2943,20 @@ void Bin::slotExpandUrl(const ItemInfo &info, const QString &url, QUndoCommand *
|
||||
QString hash;
|
||||
QString mltService = EffectsList::property(prod, QStringLiteral("mlt_service"));
|
||||
if (mltService == QLatin1String("pixbuf")
|
||||
|| mltService == QLatin1String("qimage")
|
||||
|| mltService == QLatin1String("kdenlivetitle")
|
||||
|| mltService == QLatin1String("color")
|
||||
|| mltService == QLatin1String("colour")) {
|
||||
hash = mltService + QStringLiteral(":")
|
||||
+ EffectsList::property(prod, QStringLiteral("kdenlive:clipname")) + QStringLiteral(":")
|
||||
+ EffectsList::property(prod, QStringLiteral("kdenlive:folderid")) + QStringLiteral(":");
|
||||
hash = mltService + QLatin1Char(':')
|
||||
+ EffectsList::property(prod, QStringLiteral("kdenlive:clipname")) + QLatin1Char(':')
|
||||
+ EffectsList::property(prod, QStringLiteral("kdenlive:folderid")) + QLatin1Char(':');
|
||||
if (mltService == QLatin1String("kdenlivetitle")) {
|
||||
// Calculate hash based on title contents.
|
||||
hash.append(QString(QCryptographicHash::hash(EffectsList::property(prod, QStringLiteral("xmldata")).toUtf8(),
|
||||
QCryptographicHash::Md5
|
||||
).toHex()));
|
||||
} else if (mltService == QLatin1String("pixbuf")
|
||||
|| mltService == QLatin1String("qimage")
|
||||
|| mltService == QLatin1String("color")
|
||||
|| mltService == QLatin1String("colour")) {
|
||||
hash.append(EffectsList::property(prod, QStringLiteral("resource")));
|
||||
@@ -2760,7 +2971,7 @@ void Bin::slotExpandUrl(const ItemInfo &info, const QString &url, QUndoCommand *
|
||||
}
|
||||
}
|
||||
|
||||
// First occurence of a producer, so allocate new bin clip producer ID.
|
||||
// First occurrence of a producer, so allocate new bin clip producer ID.
|
||||
QString newId = QString::number(getFreeClipId());
|
||||
idMap.insert(originalId, newId);
|
||||
qCDebug(KDENLIVE_LOG) << "originalId: " << originalId << ", newId: " << newId;
|
||||
@@ -2833,7 +3044,7 @@ void Bin::renameSubClip(const QString &id, const QString &newName, const QString
|
||||
}
|
||||
sub->setName(newName);
|
||||
clip->setProducerProperty("kdenlive:clipzone." + oldName, QString());
|
||||
clip->setProducerProperty("kdenlive:clipzone." + newName, QString::number(in) + ";" + QString::number(out));
|
||||
clip->setProducerProperty("kdenlive:clipzone." + newName, QString::number(in) + QLatin1Char(';') + QString::number(out));
|
||||
emit itemUpdated(sub);
|
||||
}
|
||||
|
||||
@@ -3067,7 +3278,7 @@ void Bin::slotGotFilterJobResults(const QString &id, int startPos, int track, co
|
||||
EffectsList::setParameter(newEffect, i.key(), i.value());
|
||||
++i;
|
||||
}
|
||||
ctl->updateEffect(pCore->monitorManager()->projectMonitor()->profileInfo(), newEffect, effect.attribute(QStringLiteral("kdenlive_ix")).toInt());
|
||||
ctl->updateEffect(pCore->monitorManager()->projectMonitor()->profileInfo(), newEffect, effect.attribute(QStringLiteral("kdenlive_ix")).toInt(), true);
|
||||
emit masterClipUpdated(ctl, m_monitor);
|
||||
// TODO use undo / redo for bin clip edit effect
|
||||
/*EditEffectCommand *command = new EditEffectCommand(this, clip->track(), clip->startPos(), effect, newEffect, clip->selectedEffectIndex(), true, true);
|
||||
@@ -3101,7 +3312,7 @@ void Bin::slotGotFilterJobResults(const QString &id, int startPos, int track, co
|
||||
QString label = filterInfo.value(QStringLiteral("label"));
|
||||
QString key = filterInfo.value(QStringLiteral("key"));
|
||||
int offset = filterInfo.value(QStringLiteral("offset")).toInt();
|
||||
QStringList value = results.value(key).split(';', QString::SkipEmptyParts);
|
||||
QStringList value = results.value(key).split(QLatin1Char(';'), QString::SkipEmptyParts);
|
||||
//qCDebug(KDENLIVE_LOG)<<"// RESULT; "<<key<<" = "<<value;
|
||||
if (filterInfo.contains(QStringLiteral("resultmessage"))) {
|
||||
QString mess = filterInfo.value(QStringLiteral("resultmessage"));
|
||||
@@ -3161,7 +3372,7 @@ void Bin::slotGotFilterJobResults(const QString &id, int startPos, int track, co
|
||||
if (!pos.contains(QLatin1Char('='))) {
|
||||
continue;
|
||||
}
|
||||
int newPos = pos.section('=', 0, 0).toInt();
|
||||
int newPos = pos.section(QLatin1Char('='), 0, 0).toInt();
|
||||
// Don't use scenes shorter than 1 second
|
||||
if (newPos - cutPos < 24) {
|
||||
continue;
|
||||
@@ -3207,7 +3418,7 @@ void Bin::slotLoadClipMarkers(const QString &id)
|
||||
}
|
||||
cbox->setCurrentIndex(KdenliveSettings::default_marker_type());
|
||||
//TODO KF5 how to add custom cbox to Qfiledialog
|
||||
QPointer<QFileDialog> fd = new QFileDialog(this, i18n("Load Clip Markers"), m_doc->projectDataFolder());
|
||||
QScopedPointer<QFileDialog> fd(new QFileDialog(this, i18n("Load Clip Markers"), m_doc->projectDataFolder()));
|
||||
fd->setMimeTypeFilters(QStringList() << QStringLiteral("text/plain"));
|
||||
fd->setFileMode(QFileDialog::ExistingFile);
|
||||
if (fd->exec() != QDialog::Accepted) {
|
||||
@@ -3216,9 +3427,8 @@ void Bin::slotLoadClipMarkers(const QString &id)
|
||||
QStringList selection = fd->selectedFiles();
|
||||
QString url;
|
||||
if (!selection.isEmpty()) {
|
||||
url = selection.first();
|
||||
url = selection.constFirst();
|
||||
}
|
||||
delete fd;
|
||||
|
||||
//QUrl url = KFileDialog::getOpenUrl(QUrl("kfiledialog:///projectfolder"), "text/plain", this, i18n("Load marker file"));
|
||||
if (url.isEmpty()) {
|
||||
@@ -3242,7 +3452,7 @@ void Bin::slotLoadClipMarkers(const QString &id)
|
||||
QList<CommentedTime> markersList;
|
||||
foreach (const QString &line, lines) {
|
||||
markerText.clear();
|
||||
values = line.split('\t', QString::SkipEmptyParts);
|
||||
values = line.split(QLatin1Char('\t'), QString::SkipEmptyParts);
|
||||
double time1 = values.at(0).toDouble(&ok);
|
||||
double time2 = -1;
|
||||
if (!ok) {
|
||||
@@ -3300,7 +3510,7 @@ void Bin::slotSaveClipMarkers(const QString &id)
|
||||
}
|
||||
cbox->setCurrentIndex(0);
|
||||
//TODO KF5 how to add custom cbox to Qfiledialog
|
||||
QPointer<QFileDialog> fd = new QFileDialog(this, i18n("Save Clip Markers"), m_doc->projectDataFolder());
|
||||
QScopedPointer<QFileDialog> fd(new QFileDialog(this, i18n("Save Clip Markers"), m_doc->projectDataFolder()));
|
||||
fd->setMimeTypeFilters(QStringList() << QStringLiteral("text/plain"));
|
||||
fd->setFileMode(QFileDialog::AnyFile);
|
||||
fd->setAcceptMode(QFileDialog::AcceptSave);
|
||||
@@ -3310,9 +3520,8 @@ void Bin::slotSaveClipMarkers(const QString &id)
|
||||
QStringList selection = fd->selectedFiles();
|
||||
QString url;
|
||||
if (!selection.isEmpty()) {
|
||||
url = selection.first();
|
||||
url = selection.constFirst();
|
||||
}
|
||||
delete fd;
|
||||
//QString url = KFileDialog::getSaveFileName(QUrl("kfiledialog:///projectfolder"), "text/plain", this, i18n("Save markers"));
|
||||
if (url.isEmpty()) {
|
||||
return;
|
||||
@@ -3384,8 +3593,11 @@ void Bin::deleteAllClipMarkers(const QString &id)
|
||||
}
|
||||
}
|
||||
|
||||
void Bin::slotGetCurrentProjectImage(bool request)
|
||||
void Bin::slotGetCurrentProjectImage(const QString &clipId, bool request)
|
||||
{
|
||||
if (!clipId.isEmpty()) {
|
||||
(pCore->projectManager()->currentTimeline()->hideClip(clipId, request));
|
||||
}
|
||||
pCore->monitorManager()->projectMonitor()->slotGetCurrentImage(request);
|
||||
}
|
||||
|
||||
@@ -3396,7 +3608,7 @@ void Bin::showTitleWidget(ProjectClip *clip)
|
||||
QDir titleFolder(m_doc->projectDataFolder() + QStringLiteral("/titles"));
|
||||
titleFolder.mkpath(QStringLiteral("."));
|
||||
TitleWidget dia_ui(QUrl(), m_doc->timecode(), titleFolder.absolutePath(), pCore->monitorManager()->projectMonitor()->render, pCore->window());
|
||||
connect(&dia_ui, &TitleWidget::requestBackgroundFrame, pCore->monitorManager()->projectMonitor(), &Monitor::slotGetCurrentImage);
|
||||
connect(&dia_ui, &TitleWidget::requestBackgroundFrame, this, &Bin::slotGetCurrentProjectImage);
|
||||
QDomDocument doc;
|
||||
QString xmldata = clip->getProducerProperty(QStringLiteral("xmldata"));
|
||||
if (xmldata.isEmpty() && QFile::exists(path)) {
|
||||
@@ -3406,7 +3618,7 @@ void Bin::showTitleWidget(ProjectClip *clip)
|
||||
} else {
|
||||
doc.setContent(xmldata);
|
||||
}
|
||||
dia_ui.setXml(doc);
|
||||
dia_ui.setXml(doc, clip->clipId());
|
||||
if (dia_ui.exec() == QDialog::Accepted) {
|
||||
QMap<QString, QString> newprops;
|
||||
newprops.insert(QStringLiteral("xmldata"), dia_ui.xml().toString());
|
||||
@@ -3497,8 +3709,8 @@ void Bin::slotQueryRemoval(const QString &id, const QString &url, const QString
|
||||
m_invalidClipDialog->addClip(id, url);
|
||||
int result = m_invalidClipDialog->exec();
|
||||
if (result == QDialog::Accepted) {
|
||||
QStringList ids = m_invalidClipDialog->getIds();
|
||||
foreach (const QString &i, ids) {
|
||||
const QStringList ids = m_invalidClipDialog->getIds();
|
||||
for (const QString &i : ids) {
|
||||
deleteClip(i);
|
||||
}
|
||||
}
|
||||
@@ -3549,7 +3761,7 @@ void Bin::updateTimelineProducers(const QString &id, const QMap<QString, QString
|
||||
void Bin::showSlideshowWidget(ProjectClip *clip)
|
||||
{
|
||||
QString folder = QFileInfo(clip->url()).absolutePath();
|
||||
qDebug()<<" ** * CLIP ABS PATH: "<<clip->url()<<" = "<<folder;
|
||||
qCDebug(KDENLIVE_LOG)<<" ** * CLIP ABS PATH: "<<clip->url()<<" = "<<folder;
|
||||
SlideshowClip *dia = new SlideshowClip(m_doc->timecode(), folder, clip, this);
|
||||
if (dia->exec() == QDialog::Accepted) {
|
||||
// edit clip properties
|
||||
@@ -3580,6 +3792,7 @@ void Bin::showSlideshowWidget(ProjectClip *clip)
|
||||
oldProperties.insert(QStringLiteral("animation"), clip->getProducerProperty(QStringLiteral("animation")));
|
||||
slotEditClipCommand(clip->clipId(), oldProperties, properties);
|
||||
}
|
||||
delete dia;
|
||||
}
|
||||
|
||||
void Bin::slotDisableEffects(bool disable)
|
||||
@@ -3603,20 +3816,16 @@ void Bin::setBinEffectsDisabledStatus(bool disabled)
|
||||
pCore->projectManager()->disableBinEffects(disabled);
|
||||
}
|
||||
|
||||
void Bin::slotRenameFolder()
|
||||
void Bin::slotRenameItem()
|
||||
{
|
||||
QModelIndexList indexes = m_proxyModel->selectionModel()->selectedIndexes();
|
||||
foreach (const QModelIndex &ix, indexes) {
|
||||
if (!ix.isValid() || ix.column() != 0) {
|
||||
const QModelIndexList indexes = m_proxyModel->selectionModel()->selectedRows(0);
|
||||
for (const QModelIndex &ix : indexes) {
|
||||
if (!ix.isValid()) {
|
||||
continue;
|
||||
}
|
||||
AbstractProjectItem *item = static_cast<AbstractProjectItem *>(m_proxyModel->mapToSource(ix).internalPointer());
|
||||
ProjectFolder *currentItem = qobject_cast<ProjectFolder *>(item);
|
||||
if (currentItem) {
|
||||
m_itemView->setProperty("editing", true);
|
||||
m_itemView->edit(ix);
|
||||
return;
|
||||
}
|
||||
m_itemView->setCurrentIndex(ix);
|
||||
m_itemView->edit(ix);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3719,8 +3928,8 @@ void Bin::slotMessageActionTriggered()
|
||||
|
||||
void Bin::resetUsageCount()
|
||||
{
|
||||
QList<ProjectClip *> clipList = m_rootFolder->childClips();
|
||||
foreach (ProjectClip *clip, clipList) {
|
||||
const QList<ProjectClip *> clipList = m_rootFolder->childClips();
|
||||
for (ProjectClip *clip : clipList) {
|
||||
clip->setRefCount(0);
|
||||
}
|
||||
}
|
||||
@@ -3776,7 +3985,7 @@ QDir Bin::getCacheDir(CacheType type, bool *ok) const
|
||||
|
||||
bool Bin::addClip(QDomElement elem, const QString &clipId)
|
||||
{
|
||||
const QString producerId = clipId.section('_', 0, 0);
|
||||
const QString producerId = clipId.section(QLatin1Char('_'), 0, 0);
|
||||
elem.setAttribute(QStringLiteral("id"), producerId);
|
||||
if ((KdenliveSettings::default_profile().isEmpty() || KdenliveSettings::checkfirstprojectclip()) && isEmpty()) {
|
||||
elem.setAttribute(QStringLiteral("checkProfile"), 1);
|
||||
@@ -3818,7 +4027,7 @@ void Bin::saveZone(const QStringList &info, const QDir &dir)
|
||||
if (info.size() != 3) {
|
||||
return;
|
||||
}
|
||||
ProjectClip *clip = getBinClip(info.first());
|
||||
ProjectClip *clip = getBinClip(info.constFirst());
|
||||
if (clip && clip->controller()) {
|
||||
QPoint zone(info.at(1).toInt(), info.at(2).toInt());
|
||||
clip->controller()->saveZone(zone, dir);
|
||||
|
||||
241
src/bin/bin.h
@@ -60,17 +60,20 @@ class ProjectSortProxyModel;
|
||||
class JobManager;
|
||||
class ProjectFolderUp;
|
||||
class InvalidDialog;
|
||||
class BinItemDelegate;
|
||||
class BinMessageWidget;
|
||||
class SmallJobLabel;
|
||||
|
||||
namespace Mlt
|
||||
{
|
||||
class Producer;
|
||||
};
|
||||
}
|
||||
|
||||
class MyListView: public QListView
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit MyListView(QWidget *parent = Q_NULLPTR);
|
||||
explicit MyListView(QWidget *parent = nullptr);
|
||||
|
||||
protected:
|
||||
void focusInEvent(QFocusEvent *event) Q_DECL_OVERRIDE;
|
||||
@@ -83,7 +86,7 @@ class MyTreeView: public QTreeView
|
||||
Q_OBJECT
|
||||
Q_PROPERTY(bool editing READ isEditing WRITE setEditing)
|
||||
public:
|
||||
explicit MyTreeView(QWidget *parent = Q_NULLPTR);
|
||||
explicit MyTreeView(QWidget *parent = nullptr);
|
||||
void setEditing(bool edit);
|
||||
protected:
|
||||
void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
|
||||
@@ -99,7 +102,7 @@ private:
|
||||
QPoint m_startPos;
|
||||
bool m_editing;
|
||||
bool performDrag();
|
||||
bool isEditing();
|
||||
bool isEditing() const;
|
||||
|
||||
signals:
|
||||
void focusView();
|
||||
@@ -109,8 +112,8 @@ class BinMessageWidget: public KMessageWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit BinMessageWidget(QWidget *parent = Q_NULLPTR);
|
||||
BinMessageWidget(const QString &text, QWidget *parent = Q_NULLPTR);
|
||||
explicit BinMessageWidget(QWidget *parent = nullptr);
|
||||
BinMessageWidget(const QString &text, QWidget *parent = nullptr);
|
||||
|
||||
protected:
|
||||
bool event(QEvent *ev) Q_DECL_OVERRIDE;
|
||||
@@ -123,7 +126,7 @@ class SmallJobLabel: public QPushButton
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit SmallJobLabel(QWidget *parent = Q_NULLPTR);
|
||||
explicit SmallJobLabel(QWidget *parent = nullptr);
|
||||
static const QString getStyleSheet(const QPalette &p);
|
||||
void setAction(QAction *action);
|
||||
private:
|
||||
@@ -144,200 +147,11 @@ private slots:
|
||||
void slotTimeLineFinished();
|
||||
};
|
||||
|
||||
/**
|
||||
* @class BinItemDelegate
|
||||
* @brief This class is responsible for drawing items in the QTreeView.
|
||||
*/
|
||||
|
||||
class BinItemDelegate: public QStyledItemDelegate
|
||||
{
|
||||
public:
|
||||
explicit BinItemDelegate(QObject *parent = Q_NULLPTR): QStyledItemDelegate(parent)
|
||||
{
|
||||
}
|
||||
|
||||
void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const Q_DECL_OVERRIDE
|
||||
{
|
||||
if (index.column() != 0) {
|
||||
return QStyledItemDelegate::updateEditorGeometry(editor, option, index);
|
||||
}
|
||||
QStyleOptionViewItem opt = option;
|
||||
initStyleOption(&opt, index);
|
||||
QRect r1 = option.rect;
|
||||
QStyle *style = opt.widget ? opt.widget->style() : QApplication::style();
|
||||
const int textMargin = style->pixelMetric(QStyle::PM_FocusFrameHMargin) + 1;
|
||||
int type = index.data(AbstractProjectItem::ItemTypeRole).toInt();
|
||||
double factor = (double) opt.decorationSize.height() / r1.height();
|
||||
int decoWidth = 2 * textMargin;
|
||||
int mid = 0;
|
||||
if (factor != 0) {
|
||||
decoWidth += opt.decorationSize.width() / factor;
|
||||
}
|
||||
if (type == AbstractProjectItem::ClipItem || type == AbstractProjectItem::SubClipItem) {
|
||||
mid = (int)((r1.height() / 2));
|
||||
}
|
||||
r1.adjust(decoWidth, 0, 0, -mid);
|
||||
QFont ft = option.font;
|
||||
ft.setBold(true);
|
||||
QFontMetricsF fm(ft);
|
||||
QRect r2 = fm.boundingRect(r1, Qt::AlignLeft | Qt::AlignTop, index.data(AbstractProjectItem::DataName).toString()).toRect();
|
||||
editor->setGeometry(r2);
|
||||
}
|
||||
|
||||
QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const Q_DECL_OVERRIDE
|
||||
{
|
||||
QSize hint = QStyledItemDelegate::sizeHint(option, index);
|
||||
QString text = index.data(AbstractProjectItem::DataName).toString();
|
||||
QRectF r = option.rect;
|
||||
QFont ft = option.font;
|
||||
ft.setBold(true);
|
||||
QFontMetricsF fm(ft);
|
||||
QStyle *style = option.widget ? option.widget->style() : QApplication::style();
|
||||
const int textMargin = style->pixelMetric(QStyle::PM_FocusFrameHMargin) + 1;
|
||||
int width = fm.boundingRect(r, Qt::AlignLeft | Qt::AlignTop, text).width() + option.decorationSize.width() + 2 * textMargin;
|
||||
hint.setWidth(width);
|
||||
int type = index.data(AbstractProjectItem::ItemTypeRole).toInt();
|
||||
if (type == AbstractProjectItem::FolderItem || type == AbstractProjectItem::FolderUpItem) {
|
||||
return QSize(hint.width(), qMin(option.fontMetrics.lineSpacing() + 4, hint.height()));
|
||||
}
|
||||
if (type == AbstractProjectItem::ClipItem) {
|
||||
return QSize(hint.width(), qMax(option.fontMetrics.lineSpacing() * 2 + 4, qMax(hint.height(), option.decorationSize.height())));
|
||||
}
|
||||
if (type == AbstractProjectItem::SubClipItem) {
|
||||
return QSize(hint.width(), qMax(option.fontMetrics.lineSpacing() * 2 + 4, qMin(hint.height(), (int)(option.decorationSize.height() / 1.5))));
|
||||
}
|
||||
QIcon icon = qvariant_cast<QIcon>(index.data(Qt::DecorationRole));
|
||||
QString line1 = index.data(Qt::DisplayRole).toString();
|
||||
QString line2 = index.data(Qt::UserRole).toString();
|
||||
|
||||
int textW = qMax(option.fontMetrics.width(line1), option.fontMetrics.width(line2));
|
||||
QSize iconSize = icon.actualSize(option.decorationSize);
|
||||
return QSize(qMax(textW, iconSize.width()) + 4, option.fontMetrics.lineSpacing() * 2 + 4);
|
||||
}
|
||||
|
||||
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const Q_DECL_OVERRIDE
|
||||
{
|
||||
if (index.column() == 0 && !index.data().isNull()) {
|
||||
QRect r1 = option.rect;
|
||||
painter->save();
|
||||
painter->setClipRect(r1);
|
||||
QStyleOptionViewItem opt(option);
|
||||
initStyleOption(&opt, index);
|
||||
int type = index.data(AbstractProjectItem::ItemTypeRole).toInt();
|
||||
QStyle *style = opt.widget ? opt.widget->style() : QApplication::style();
|
||||
const int textMargin = style->pixelMetric(QStyle::PM_FocusFrameHMargin) + 1;
|
||||
//QRect r = QStyle::alignedRect(opt.direction, Qt::AlignVCenter | Qt::AlignLeft, opt.decorationSize, r1);
|
||||
|
||||
style->drawPrimitive(QStyle::PE_PanelItemViewItem, &opt, painter, opt.widget);
|
||||
if (option.state & QStyle::State_Selected) {
|
||||
painter->setPen(option.palette.highlightedText().color());
|
||||
} else {
|
||||
painter->setPen(option.palette.text().color());
|
||||
}
|
||||
QRect r = r1;
|
||||
QFont font = painter->font();
|
||||
font.setBold(true);
|
||||
painter->setFont(font);
|
||||
if (type == AbstractProjectItem::ClipItem || type == AbstractProjectItem::SubClipItem) {
|
||||
double factor = (double) opt.decorationSize.height() / r1.height();
|
||||
int decoWidth = 2 * textMargin;
|
||||
if (factor != 0) {
|
||||
r.setWidth(opt.decorationSize.width() / factor);
|
||||
// Draw thumbnail
|
||||
opt.icon.paint(painter, r);
|
||||
decoWidth += r.width();
|
||||
}
|
||||
int mid = (int)((r1.height() / 2));
|
||||
r1.adjust(decoWidth, 0, 0, -mid);
|
||||
QRect r2 = option.rect;
|
||||
r2.adjust(decoWidth, mid, 0, 0);
|
||||
QRectF bounding;
|
||||
painter->drawText(r1, Qt::AlignLeft | Qt::AlignTop, index.data(AbstractProjectItem::DataName).toString(), &bounding);
|
||||
font.setBold(false);
|
||||
painter->setFont(font);
|
||||
QString subText = index.data(AbstractProjectItem::DataDuration).toString();
|
||||
if (!subText.isEmpty()) {
|
||||
r2.adjust(0, bounding.bottom() - r2.top(), 0, 0);
|
||||
QColor subTextColor = painter->pen().color();
|
||||
subTextColor.setAlphaF(.5);
|
||||
painter->setPen(subTextColor);
|
||||
painter->drawText(r2, Qt::AlignLeft | Qt::AlignTop, subText, &bounding);
|
||||
// Draw usage counter
|
||||
int usage = index.data(AbstractProjectItem::UsageCount).toInt();
|
||||
if (usage > 0) {
|
||||
bounding.moveLeft(bounding.right() + (2 * textMargin));
|
||||
QString us = QString().sprintf("[%d]", usage);
|
||||
painter->drawText(bounding, Qt::AlignLeft | Qt::AlignTop, us, &bounding);
|
||||
}
|
||||
}
|
||||
if (type == AbstractProjectItem::ClipItem) {
|
||||
// Overlay icon if necessary
|
||||
QVariant v = index.data(AbstractProjectItem::IconOverlay);
|
||||
if (!v.isNull()) {
|
||||
QIcon reload = QIcon::fromTheme(v.toString());
|
||||
r.setTop(r.bottom() - bounding.height());
|
||||
r.setWidth(bounding.height());
|
||||
reload.paint(painter, r);
|
||||
}
|
||||
|
||||
int jobProgress = index.data(AbstractProjectItem::JobProgress).toInt();
|
||||
if (jobProgress > 0 || jobProgress == JobWaiting) {
|
||||
// Draw job progress bar
|
||||
int progressWidth = option.fontMetrics.averageCharWidth() * 8;
|
||||
int progressHeight = option.fontMetrics.ascent() / 4;
|
||||
QRect progress(r1.x() + 1, opt.rect.bottom() - progressHeight - 2, progressWidth, progressHeight);
|
||||
painter->setPen(Qt::NoPen);
|
||||
painter->setBrush(Qt::darkGray);
|
||||
if (jobProgress > 0) {
|
||||
painter->drawRoundedRect(progress, 2, 2);
|
||||
painter->setBrush(option.state & QStyle::State_Selected ? option.palette.text() : option.palette.highlight());
|
||||
progress.setWidth((progressWidth - 2) * jobProgress / 100);
|
||||
painter->drawRoundedRect(progress, 2, 2);
|
||||
} else if (jobProgress == JobWaiting) {
|
||||
// Draw kind of a pause icon
|
||||
progress.setWidth(3);
|
||||
painter->drawRect(progress);
|
||||
progress.moveLeft(progress.right() + 3);
|
||||
painter->drawRect(progress);
|
||||
}
|
||||
} else if (jobProgress == JobCrashed) {
|
||||
QString jobText = index.data(AbstractProjectItem::JobMessage).toString();
|
||||
if (!jobText.isEmpty()) {
|
||||
QRectF txtBounding = painter->boundingRect(r2, Qt::AlignRight | Qt::AlignVCenter, " " + jobText + " ");
|
||||
painter->setPen(Qt::NoPen);
|
||||
painter->setBrush(option.palette.highlight());
|
||||
painter->drawRoundedRect(txtBounding, 2, 2);
|
||||
painter->setPen(option.palette.highlightedText().color());
|
||||
painter->drawText(txtBounding, Qt::AlignCenter, jobText);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Folder or Folder Up items
|
||||
double factor = (double) opt.decorationSize.height() / r1.height();
|
||||
int decoWidth = 2 * textMargin;
|
||||
if (factor != 0) {
|
||||
r.setWidth(opt.decorationSize.width() / factor);
|
||||
// Draw thumbnail
|
||||
opt.icon.paint(painter, r);
|
||||
decoWidth += r.width();
|
||||
}
|
||||
r1.adjust(decoWidth, 0, 0, 0);
|
||||
QRectF bounding;
|
||||
painter->drawText(r1, Qt::AlignLeft | Qt::AlignTop, index.data(AbstractProjectItem::DataName).toString(), &bounding);
|
||||
}
|
||||
painter->restore();
|
||||
} else {
|
||||
QStyledItemDelegate::paint(painter, option, index);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
class LineEventEater : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit LineEventEater(QObject *parent = Q_NULLPTR);
|
||||
explicit LineEventEater(QObject *parent = nullptr);
|
||||
|
||||
protected:
|
||||
bool eventFilter(QObject *obj, QEvent *event) Q_DECL_OVERRIDE;
|
||||
@@ -347,6 +161,7 @@ signals:
|
||||
void showClearButton(bool);
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @class Bin
|
||||
* @brief The bin widget takes care of both item model and view upon project opening.
|
||||
@@ -360,7 +175,7 @@ class Bin : public QWidget
|
||||
enum BinViewType {BinTreeView, BinIconView };
|
||||
|
||||
public:
|
||||
explicit Bin(QWidget *parent = Q_NULLPTR);
|
||||
explicit Bin(QWidget *parent = nullptr);
|
||||
~Bin();
|
||||
|
||||
bool isLoading;
|
||||
@@ -399,8 +214,10 @@ public:
|
||||
/** @brief Start a job of selected type for a clip */
|
||||
void startJob(const QString &id, AbstractClipJob::JOBTYPE type);
|
||||
|
||||
/** @brief Discard jobs from a chosen type, use NOJOBTYPE to discard all jobs for this clip */
|
||||
void discardJobs(const QString &id, AbstractClipJob::JOBTYPE type = AbstractClipJob::NOJOBTYPE);
|
||||
/** @brief Discard jobs from a chosen type, use NOJOBTYPE to discard all jobs for this clip
|
||||
* @returns true if a job was found and discarded
|
||||
*/
|
||||
bool discardJobs(const QString &id, AbstractClipJob::JOBTYPE type = AbstractClipJob::NOJOBTYPE);
|
||||
|
||||
/** @brief Check if there is a job waiting / running for this clip */
|
||||
bool hasPendingJob(const QString &id, AbstractClipJob::JOBTYPE type);
|
||||
@@ -486,7 +303,7 @@ public:
|
||||
/** @brief Add an effect to a bin clip. */
|
||||
void addEffect(const QString &id, QDomElement &effect);
|
||||
/** @brief Update a bin clip effect. */
|
||||
void updateEffect(const QString &id, QDomElement &effect, int ix, bool refreshStackWidget);
|
||||
void updateEffect(const QString &id, QDomElement &effect, int ix, bool refreshStackWidget, bool updateClip);
|
||||
void changeEffectState(const QString &id, const QList<int> &indexes, bool disable, bool refreshStack);
|
||||
/** @brief Edit an effect settings to a bin clip. */
|
||||
void editMasterEffect(ClipController *ctl);
|
||||
@@ -541,7 +358,7 @@ private slots:
|
||||
void slotShowDescColumn(bool show);
|
||||
|
||||
/** @brief Setup the bin view type (icon view, tree view, ...).
|
||||
* @param action The action whose data defines the view type or Q_NULLPTR to keep default view */
|
||||
* @param action The action whose data defines the view type or nullptr to keep default view */
|
||||
void slotInitView(QAction *action);
|
||||
|
||||
/** @brief Update status for clip jobs */
|
||||
@@ -555,11 +372,12 @@ private slots:
|
||||
void slotItemDropped(const QStringList &ids, const QModelIndex &parent);
|
||||
void slotItemDropped(const QList<QUrl> &urls, const QModelIndex &parent);
|
||||
void slotEffectDropped(const QString &effect, const QModelIndex &parent);
|
||||
void slotUpdateEffect(QString id, QDomElement oldEffect, QDomElement newEffect, int ix);
|
||||
void slotUpdateEffect(QString id, QDomElement oldEffect, QDomElement newEffect, int ix, bool refreshStack = false, bool updateClip = true);
|
||||
void slotChangeEffectState(QString id, const QList<int> &indexes, bool disable);
|
||||
void slotItemEdited(const QModelIndex &, const QModelIndex &, const QVector<int> &);
|
||||
void slotAddUrl(const QString &url, int folderId, const QMap<QString, QString> &data = QMap<QString, QString>());
|
||||
void slotAddUrl(const QString &url, const QMap<QString, QString> &data = QMap<QString, QString>());
|
||||
|
||||
void slotPrepareJobsMenu();
|
||||
void slotShowJobLog();
|
||||
/** @brief process clip job result. */
|
||||
@@ -575,8 +393,8 @@ private slots:
|
||||
void slotGotFocus();
|
||||
/** @brief Dis/Enable all bin effects. */
|
||||
void slotDisableEffects(bool disable);
|
||||
/** @brief Rename a Bin Folder. */
|
||||
void slotRenameFolder();
|
||||
/** @brief Rename a Bin Item. */
|
||||
void slotRenameItem();
|
||||
void slotCreateAudioThumbs();
|
||||
void doRefreshPanel(const QString &id);
|
||||
/** @brief Send audio thumb data to monitor for display. */
|
||||
@@ -622,7 +440,7 @@ public slots:
|
||||
void slotAddClipCut(const QString &id, int in, int out);
|
||||
/** @brief Open current clip in an external editing application */
|
||||
void slotOpenClip();
|
||||
void slotAddClipMarker(const QString &id, const QList<CommentedTime> &newMarker, QUndoCommand *groupCommand = Q_NULLPTR);
|
||||
void slotAddClipMarker(const QString &id, const QList<CommentedTime> &newMarker, QUndoCommand *groupCommand = nullptr);
|
||||
void slotLoadClipMarkers(const QString &id);
|
||||
void slotSaveClipMarkers(const QString &id);
|
||||
void slotDuplicateClip();
|
||||
@@ -634,14 +452,17 @@ public slots:
|
||||
/** @brief Abort audio thumbnail for clip with id */
|
||||
void slotAbortAudioThumb(const QString &id, long duration);
|
||||
/** @brief Add extra data to a clip. */
|
||||
void slotAddClipExtraData(const QString &id, const QString &key, const QString &data = QString(), QUndoCommand *groupCommand = Q_NULLPTR);
|
||||
void slotAddClipExtraData(const QString &id, const QString &key, const QString &data = QString(), QUndoCommand *groupCommand = nullptr);
|
||||
void slotUpdateClipProperties(const QString &id, const QMap<QString, QString> &properties, bool refreshPropertiesPanel);
|
||||
/** @brief Pass some important properties to timeline track producers. */
|
||||
void updateTimelineProducers(const QString &id, const QMap<QString, QString> &passProperties);
|
||||
/** @brief Add effect to active Bin clip (used when double clicking an effect in list). */
|
||||
void slotEffectDropped(QString id, QDomElement);
|
||||
/** @brief Request current frame from project monitor. */
|
||||
void slotGetCurrentProjectImage(bool request);
|
||||
/** @brief Request current frame from project monitor.
|
||||
* @param clipId is the id of a clip we want to hide from screenshot
|
||||
* @param request true to start capture process, false to end it. It is necessary to emit a false after image is received
|
||||
**/
|
||||
void slotGetCurrentProjectImage(const QString &clipId, bool request);
|
||||
void slotExpandUrl(const ItemInfo &info, const QString &url, QUndoCommand *command);
|
||||
void abortAudioThumbs();
|
||||
/** @brief Abort all ongoing operations to prepare close. */
|
||||
@@ -702,7 +523,7 @@ private:
|
||||
QAction *m_locateAction;
|
||||
QAction *m_proxyAction;
|
||||
QAction *m_deleteAction;
|
||||
QAction *m_renameFolderAction;
|
||||
QAction *m_renameAction;
|
||||
QMenu *m_jobsMenu;
|
||||
QAction *m_cancelJobs;
|
||||
QAction *m_discardCurrentClipJobs;
|
||||
|
||||
@@ -154,26 +154,27 @@ void RemoveBinEffectCommand::redo()
|
||||
m_bin->removeEffect(m_clipId, m_effect);
|
||||
}
|
||||
|
||||
UpdateBinEffectCommand::UpdateBinEffectCommand(Bin *bin, const QString &clipId, QDomElement &oldEffect, QDomElement &newEffect, int ix, QUndoCommand *parent) :
|
||||
UpdateBinEffectCommand::UpdateBinEffectCommand(Bin *bin, const QString &clipId, QDomElement &oldEffect, QDomElement &newEffect, int ix, bool refreshStack, bool updateClip, QUndoCommand *parent) :
|
||||
QUndoCommand(parent),
|
||||
m_bin(bin),
|
||||
m_clipId(clipId),
|
||||
m_oldEffect(oldEffect),
|
||||
m_newEffect(newEffect),
|
||||
m_ix(ix),
|
||||
m_refreshStack(false)
|
||||
m_refreshStack(refreshStack),
|
||||
m_updateClip(updateClip)
|
||||
{
|
||||
setText(i18n("Edit Bin Effect"));
|
||||
}
|
||||
// virtual
|
||||
void UpdateBinEffectCommand::undo()
|
||||
{
|
||||
m_bin->updateEffect(m_clipId, m_oldEffect, m_ix, m_refreshStack);
|
||||
m_bin->updateEffect(m_clipId, m_oldEffect, m_ix, m_refreshStack, m_updateClip);
|
||||
}
|
||||
// virtual
|
||||
void UpdateBinEffectCommand::redo()
|
||||
{
|
||||
m_bin->updateEffect(m_clipId, m_newEffect, m_ix, m_refreshStack);
|
||||
m_bin->updateEffect(m_clipId, m_newEffect, m_ix, m_refreshStack, m_updateClip);
|
||||
m_refreshStack = true;
|
||||
}
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@ class Bin;
|
||||
class AddBinFolderCommand : public QUndoCommand
|
||||
{
|
||||
public:
|
||||
explicit AddBinFolderCommand(Bin *bin, const QString &id, const QString &name, const QString &parentId, bool remove = false, QUndoCommand *parent = Q_NULLPTR);
|
||||
explicit AddBinFolderCommand(Bin *bin, const QString &id, const QString &name, const QString &parentId, bool remove = false, QUndoCommand *parent = nullptr);
|
||||
void undo() Q_DECL_OVERRIDE;
|
||||
void redo() Q_DECL_OVERRIDE;
|
||||
private:
|
||||
@@ -43,7 +43,7 @@ private:
|
||||
class MoveBinClipCommand : public QUndoCommand
|
||||
{
|
||||
public:
|
||||
explicit MoveBinClipCommand(Bin *bin, const QString &clipId, const QString &oldParentId, const QString &newParentId, QUndoCommand *parent = Q_NULLPTR);
|
||||
explicit MoveBinClipCommand(Bin *bin, const QString &clipId, const QString &oldParentId, const QString &newParentId, QUndoCommand *parent = nullptr);
|
||||
void undo() Q_DECL_OVERRIDE;
|
||||
void redo() Q_DECL_OVERRIDE;
|
||||
private:
|
||||
@@ -56,7 +56,7 @@ private:
|
||||
class MoveBinFolderCommand : public QUndoCommand
|
||||
{
|
||||
public:
|
||||
explicit MoveBinFolderCommand(Bin *bin, const QString &clipId, const QString &oldParentId, const QString &newParentId, QUndoCommand *parent = Q_NULLPTR);
|
||||
explicit MoveBinFolderCommand(Bin *bin, const QString &clipId, const QString &oldParentId, const QString &newParentId, QUndoCommand *parent = nullptr);
|
||||
void undo() Q_DECL_OVERRIDE;
|
||||
void redo() Q_DECL_OVERRIDE;
|
||||
private:
|
||||
@@ -69,7 +69,7 @@ private:
|
||||
class RenameBinFolderCommand : public QUndoCommand
|
||||
{
|
||||
public:
|
||||
explicit RenameBinFolderCommand(Bin *bin, const QString &folderId, const QString &newName, const QString &oldName, QUndoCommand *parent = Q_NULLPTR);
|
||||
explicit RenameBinFolderCommand(Bin *bin, const QString &folderId, const QString &newName, const QString &oldName, QUndoCommand *parent = nullptr);
|
||||
void undo() Q_DECL_OVERRIDE;
|
||||
void redo() Q_DECL_OVERRIDE;
|
||||
private:
|
||||
@@ -82,7 +82,7 @@ private:
|
||||
class AddBinEffectCommand : public QUndoCommand
|
||||
{
|
||||
public:
|
||||
explicit AddBinEffectCommand(Bin *bin, const QString &clipId, QDomElement &effect, QUndoCommand *parent = Q_NULLPTR);
|
||||
explicit AddBinEffectCommand(Bin *bin, const QString &clipId, QDomElement &effect, QUndoCommand *parent = nullptr);
|
||||
void undo() Q_DECL_OVERRIDE;
|
||||
void redo() Q_DECL_OVERRIDE;
|
||||
private:
|
||||
@@ -94,7 +94,7 @@ private:
|
||||
class RemoveBinEffectCommand : public QUndoCommand
|
||||
{
|
||||
public:
|
||||
explicit RemoveBinEffectCommand(Bin *bin, const QString &clipId, QDomElement &effect, QUndoCommand *parent = Q_NULLPTR);
|
||||
explicit RemoveBinEffectCommand(Bin *bin, const QString &clipId, QDomElement &effect, QUndoCommand *parent = nullptr);
|
||||
void undo() Q_DECL_OVERRIDE;
|
||||
void redo() Q_DECL_OVERRIDE;
|
||||
private:
|
||||
@@ -106,7 +106,7 @@ private:
|
||||
class UpdateBinEffectCommand : public QUndoCommand
|
||||
{
|
||||
public:
|
||||
explicit UpdateBinEffectCommand(Bin *bin, const QString &clipId, QDomElement &oldEffect, QDomElement &newEffect, int ix, QUndoCommand *parent = Q_NULLPTR);
|
||||
explicit UpdateBinEffectCommand(Bin *bin, const QString &clipId, QDomElement &oldEffect, QDomElement &newEffect, int ix, bool refreshStack, bool updateClip, QUndoCommand *parent = nullptr);
|
||||
void undo() Q_DECL_OVERRIDE;
|
||||
void redo() Q_DECL_OVERRIDE;
|
||||
private:
|
||||
@@ -116,12 +116,13 @@ private:
|
||||
QDomElement m_newEffect;
|
||||
int m_ix;
|
||||
bool m_refreshStack;
|
||||
bool m_updateClip;
|
||||
};
|
||||
|
||||
class ChangeMasterEffectStateCommand : public QUndoCommand
|
||||
{
|
||||
public:
|
||||
ChangeMasterEffectStateCommand(Bin *bin, const QString &clipId, const QList<int> &effectIndexes, bool disable, QUndoCommand *parent = Q_NULLPTR);
|
||||
ChangeMasterEffectStateCommand(Bin *bin, const QString &clipId, const QList<int> &effectIndexes, bool disable, QUndoCommand *parent = nullptr);
|
||||
void undo() Q_DECL_OVERRIDE;
|
||||
void redo() Q_DECL_OVERRIDE;
|
||||
private:
|
||||
@@ -135,7 +136,7 @@ private:
|
||||
class MoveBinEffectCommand : public QUndoCommand
|
||||
{
|
||||
public:
|
||||
explicit MoveBinEffectCommand(Bin *bin, const QString &clipId, const QList<int> &oldPos, int newPos, QUndoCommand *parent = Q_NULLPTR);
|
||||
explicit MoveBinEffectCommand(Bin *bin, const QString &clipId, const QList<int> &oldPos, int newPos, QUndoCommand *parent = nullptr);
|
||||
void undo() Q_DECL_OVERRIDE;
|
||||
void redo() Q_DECL_OVERRIDE;
|
||||
private:
|
||||
@@ -148,7 +149,7 @@ private:
|
||||
class RenameBinSubClipCommand : public QUndoCommand
|
||||
{
|
||||
public:
|
||||
explicit RenameBinSubClipCommand(Bin *bin, const QString &clipId, const QString &newName, const QString &oldName, int in, int out, QUndoCommand *parent = Q_NULLPTR);
|
||||
explicit RenameBinSubClipCommand(Bin *bin, const QString &clipId, const QString &newName, const QString &oldName, int in, int out, QUndoCommand *parent = nullptr);
|
||||
void undo() Q_DECL_OVERRIDE;
|
||||
void redo() Q_DECL_OVERRIDE;
|
||||
private:
|
||||
@@ -163,7 +164,7 @@ private:
|
||||
class AddBinClipCutCommand : public QUndoCommand
|
||||
{
|
||||
public:
|
||||
explicit AddBinClipCutCommand(Bin *bin, const QString &clipId, int in, int out, bool add, QUndoCommand *parent = Q_NULLPTR);
|
||||
explicit AddBinClipCutCommand(Bin *bin, const QString &clipId, int in, int out, bool add, QUndoCommand *parent = nullptr);
|
||||
void undo() Q_DECL_OVERRIDE;
|
||||
void redo() Q_DECL_OVERRIDE;
|
||||
private:
|
||||
@@ -177,7 +178,7 @@ private:
|
||||
class EditClipCommand : public QUndoCommand
|
||||
{
|
||||
public:
|
||||
EditClipCommand(Bin *bin, const QString &id, const QMap<QString, QString> &oldparams, const QMap<QString, QString> &newparams, bool doIt, QUndoCommand *parent = Q_NULLPTR);
|
||||
EditClipCommand(Bin *bin, const QString &id, const QMap<QString, QString> &oldparams, const QMap<QString, QString> &newparams, bool doIt, QUndoCommand *parent = nullptr);
|
||||
void undo() Q_DECL_OVERRIDE;
|
||||
void redo() Q_DECL_OVERRIDE;
|
||||
private:
|
||||
@@ -196,7 +197,7 @@ private:
|
||||
class AddClipCommand : public QUndoCommand
|
||||
{
|
||||
public:
|
||||
AddClipCommand(Bin *bin, const QDomElement &xml, const QString &id, bool doIt, QUndoCommand *parent = Q_NULLPTR);
|
||||
AddClipCommand(Bin *bin, const QDomElement &xml, const QString &id, bool doIt, QUndoCommand *parent = nullptr);
|
||||
void undo() Q_DECL_OVERRIDE;
|
||||
void redo() Q_DECL_OVERRIDE;
|
||||
private:
|
||||
|
||||
@@ -170,7 +170,7 @@ QUrl Generators::getSavedClip(QString clipFolder)
|
||||
if (fd.exec() != QDialog::Accepted || fd.selectedUrls().isEmpty()) {
|
||||
return QUrl();
|
||||
}
|
||||
QUrl url = fd.selectedUrls().first();
|
||||
QUrl url = fd.selectedUrls().constFirst();
|
||||
|
||||
if (url.isValid()) {
|
||||
#if KXMLGUI_VERSION_MINOR < 23 && KXMLGUI_VERSION_MAJOR == 5
|
||||
|
||||
@@ -48,7 +48,7 @@ class Generators : public QDialog
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit Generators(Monitor *monitor, const QString &path, QWidget *parent = Q_NULLPTR);
|
||||
explicit Generators(Monitor *monitor, const QString &path, QWidget *parent = nullptr);
|
||||
virtual ~Generators();
|
||||
|
||||
static void getGenerators(const QStringList &producers, QMenu *menu);
|
||||
|
||||
@@ -76,7 +76,7 @@ ProjectClip::ProjectClip(const QDomElement &description, const QIcon &thumb, Pro
|
||||
, m_type(Unknown)
|
||||
, m_thumbsProducer(nullptr)
|
||||
{
|
||||
Q_ASSERT(description.hasAttribute("id"));
|
||||
Q_ASSERT(description.hasAttribute(QStringLiteral("id")));
|
||||
m_clipStatus = StatusWaiting;
|
||||
m_thumbnail = thumb;
|
||||
if (description.hasAttribute(QStringLiteral("type"))) {
|
||||
@@ -104,7 +104,9 @@ ProjectClip::~ProjectClip()
|
||||
// controller is deleted in bincontroller
|
||||
abortAudioThumbs();
|
||||
bin()->slotAbortAudioThumb(m_id, duration().ms());
|
||||
QMutexLocker audioLock(&m_audioMutex);
|
||||
if (m_controller) {
|
||||
QMutexLocker locker(&m_controller->producerMutex);
|
||||
}
|
||||
m_thumbMutex.lock();
|
||||
m_requestedThumbs.clear();
|
||||
m_thumbMutex.unlock();
|
||||
@@ -279,6 +281,22 @@ void ProjectClip::reloadProducer(bool refreshOnly)
|
||||
if (refreshOnly) {
|
||||
// set a special flag to request thumbnail only
|
||||
xml.setAttribute(QStringLiteral("refreshOnly"), QStringLiteral("1"));
|
||||
} else {
|
||||
if (bin()->discardJobs(m_id, AbstractClipJob::PROXYJOB)) {
|
||||
// A proxy job was running, reset proxy property to trigger proxy creation
|
||||
QString path = getProducerProperty(QStringLiteral("_proxy"));
|
||||
if (!path.isEmpty()) {
|
||||
EffectsList::setProperty(xml, QStringLiteral("kdenlive:proxy"), path.toUtf8().constData());
|
||||
}
|
||||
// If we have a proxy, delete it
|
||||
xml.setAttribute(QStringLiteral("overwriteproxy"), QStringLiteral("1"));
|
||||
setProducerProperty(QStringLiteral("_overwriteproxy"), QStringLiteral("1"));
|
||||
}
|
||||
else if (hasProxy()) {
|
||||
// If we have a proxy, delete it
|
||||
xml.setAttribute(QStringLiteral("overwriteproxy"), QStringLiteral("1"));
|
||||
setProducerProperty(QStringLiteral("_overwriteproxy"), QStringLiteral("1"));
|
||||
}
|
||||
}
|
||||
bin()->reloadProducer(m_id, xml);
|
||||
}
|
||||
@@ -399,13 +417,13 @@ Mlt::Producer *ProjectClip::originalProducer()
|
||||
|
||||
Mlt::Producer *ProjectClip::thumbProducer()
|
||||
{
|
||||
QMutexLocker locker(&m_producerMutex);
|
||||
if (m_thumbsProducer) {
|
||||
return m_thumbsProducer;
|
||||
}
|
||||
if (!m_controller || m_controller->clipType() == Unknown) {
|
||||
return nullptr;
|
||||
}
|
||||
QMutexLocker locker(&m_controller->producerMutex);
|
||||
Mlt::Producer prod = m_controller->originalProducer();
|
||||
if (!prod.is_valid()) {
|
||||
return nullptr;
|
||||
@@ -627,7 +645,7 @@ void ProjectClip::setProperties(const QMap<QString, QString> &properties, bool r
|
||||
bin()->emitItemUpdated(this);
|
||||
refreshPanel = true;
|
||||
}
|
||||
timelineProperties << QStringLiteral("force_aspect_ratio") << QStringLiteral("video_index") << QStringLiteral("audio_index") << QStringLiteral("set.force_full_luma") << QStringLiteral("full_luma") << QStringLiteral("threads") << QStringLiteral("force_colorspace") << QStringLiteral("force_tff") << QStringLiteral("force_progressive") << QStringLiteral("force_fps");
|
||||
timelineProperties << QStringLiteral("force_aspect_ratio") << QStringLiteral("video_index") << QStringLiteral("audio_index") << QStringLiteral("set.force_full_luma") << QStringLiteral("full_luma") << QStringLiteral("threads") << QStringLiteral("force_colorspace") << QStringLiteral("force_tff") << QStringLiteral("force_progressive") << QStringLiteral("force_fps") << QStringLiteral("autorotate");
|
||||
QStringList keys;
|
||||
keys << QStringLiteral("luma_duration") << QStringLiteral("luma_file") << QStringLiteral("fade") << QStringLiteral("ttl") << QStringLiteral("softness") << QStringLiteral("crop") << QStringLiteral("animation");
|
||||
while (i.hasNext()) {
|
||||
@@ -661,10 +679,9 @@ void ProjectClip::setProperties(const QMap<QString, QString> &properties, bool r
|
||||
}
|
||||
} else if (properties.contains(QStringLiteral("resource")) || properties.contains(QStringLiteral("templatetext")) || properties.contains(QStringLiteral("autorotate"))) {
|
||||
// Clip resource changed, update thumbnail
|
||||
reload = true;
|
||||
if (m_type != Color) {
|
||||
reloadProducer();
|
||||
} else {
|
||||
reload = true;
|
||||
refreshOnly = false;
|
||||
}
|
||||
}
|
||||
if (properties.contains(QStringLiteral("xmldata")) || !passProperties.isEmpty()) {
|
||||
@@ -674,6 +691,8 @@ void ProjectClip::setProperties(const QMap<QString, QString> &properties, bool r
|
||||
emit refreshAnalysisPanel();
|
||||
}
|
||||
if (properties.contains(QStringLiteral("length")) || properties.contains(QStringLiteral("kdenlive:duration"))) {
|
||||
refreshOnly = false;
|
||||
reload = true;
|
||||
m_duration = m_controller->getStringDuration();
|
||||
bin()->emitItemUpdated(this);
|
||||
}
|
||||
@@ -843,9 +862,9 @@ void ProjectClip::addEffect(const ProfileInfo &pInfo, QDomElement &effect)
|
||||
bin()->emitItemUpdated(this);
|
||||
}
|
||||
|
||||
void ProjectClip::updateEffect(const ProfileInfo &pInfo, QDomElement &effect, int ix, bool refreshStack)
|
||||
void ProjectClip::updateEffect(const ProfileInfo &pInfo, QDomElement &effect, int ix, bool refreshStack, bool updateClip)
|
||||
{
|
||||
m_controller->updateEffect(pInfo, effect, ix);
|
||||
m_controller->updateEffect(pInfo, effect, ix, updateClip);
|
||||
if (refreshStack) {
|
||||
bin()->updateMasterEffect(m_controller);
|
||||
}
|
||||
@@ -901,7 +920,7 @@ void ProjectClip::doExtractIntra()
|
||||
if (pos >= max) {
|
||||
pos = max - 1;
|
||||
}
|
||||
const QString path = url() + '_' + QString::number(pos);
|
||||
const QString path = url() + QLatin1Char('_') + QString::number(pos);
|
||||
QImage img = bin()->findCachedPixmap(path);
|
||||
if (!img.isNull()) {
|
||||
// Cache already contains image
|
||||
@@ -911,7 +930,7 @@ void ProjectClip::doExtractIntra()
|
||||
Mlt::Frame *frame = prod->get_frame();
|
||||
frame->set("deinterlace_method", "onefield");
|
||||
frame->set("top_field_first", -1);
|
||||
if (frame && frame->is_valid()) {
|
||||
if (frame->is_valid()) {
|
||||
img = KThumb::getFrame(frame, fullWidth, 150);
|
||||
bin()->cachePixmap(path, img);
|
||||
emit thumbReady(pos, img);
|
||||
@@ -948,14 +967,14 @@ void ProjectClip::doExtractImage()
|
||||
m_thumbMutex.lock();
|
||||
int pos = m_requestedThumbs.takeFirst();
|
||||
m_thumbMutex.unlock();
|
||||
if (ok && thumbFolder.exists(hash() + '#' + QString::number(pos) + ".png")) {
|
||||
emit thumbReady(pos, QImage(thumbFolder.absoluteFilePath(hash() + '#' + QString::number(pos) + ".png")));
|
||||
if (ok && thumbFolder.exists(hash() + QLatin1Char('#') + QString::number(pos) + QStringLiteral(".png"))) {
|
||||
emit thumbReady(pos, QImage(thumbFolder.absoluteFilePath(hash() + QLatin1Char('#') + QString::number(pos) + QStringLiteral(".png"))));
|
||||
continue;
|
||||
}
|
||||
if (pos >= max) {
|
||||
pos = max - 1;
|
||||
}
|
||||
const QString path = url() + '_' + QString::number(pos);
|
||||
const QString path = url() + QLatin1Char('_') + QString::number(pos);
|
||||
QImage img = bin()->findCachedPixmap(path);
|
||||
if (!img.isNull()) {
|
||||
emit thumbReady(pos, img);
|
||||
@@ -965,8 +984,8 @@ void ProjectClip::doExtractImage()
|
||||
Mlt::Frame *frame = prod->get_frame();
|
||||
frame->set("deinterlace_method", "onefield");
|
||||
frame->set("top_field_first", -1);
|
||||
if (frame && frame->is_valid()) {
|
||||
img = KThumb::getFrame(frame, frameWidth, 150);
|
||||
if (frame->is_valid()) {
|
||||
img = KThumb::getFrame(frame, frameWidth, 150, prod->profile()->sar() != 1);
|
||||
bin()->cachePixmap(path, img);
|
||||
emit thumbReady(pos, img);
|
||||
}
|
||||
@@ -1012,7 +1031,7 @@ const QString ProjectClip::getAudioThumbPath(AudioStreamInfo *audioInfo)
|
||||
QDir thumbFolder = bin()->getCacheDir(CacheAudio, &ok);
|
||||
QString audioPath = thumbFolder.absoluteFilePath(clipHash);
|
||||
if (audioStream > 0) {
|
||||
audioPath.append("_" + QString::number(audioInfo->audio_index()));
|
||||
audioPath.append(QLatin1Char('_') + QString::number(audioInfo->audio_index()));
|
||||
}
|
||||
int roundedFps = (int) m_controller->profile()->fps();
|
||||
audioPath.append(QStringLiteral("_%1_audio.png").arg(roundedFps));
|
||||
@@ -1021,7 +1040,10 @@ const QString ProjectClip::getAudioThumbPath(AudioStreamInfo *audioInfo)
|
||||
|
||||
void ProjectClip::slotCreateAudioThumbs()
|
||||
{
|
||||
QMutexLocker lock(&m_audioMutex);
|
||||
if (!m_controller) {
|
||||
return;
|
||||
}
|
||||
QMutexLocker locker(&m_controller->producerMutex);
|
||||
Mlt::Producer *prod = originalProducer();
|
||||
if (!prod || !prod->is_valid()) {
|
||||
return;
|
||||
@@ -1135,7 +1157,6 @@ void ProjectClip::slotCreateAudioThumbs()
|
||||
int dataSize = 0;
|
||||
QList<const qint16 *> rawChannels;
|
||||
QList<QByteArray> sourceChannels;
|
||||
QList<qint16> data2;
|
||||
for (int i = 0; i < channelFiles.count(); i++) {
|
||||
channelFiles[i]->open();
|
||||
QByteArray res = channelFiles[i]->readAll();
|
||||
@@ -1229,6 +1250,7 @@ void ProjectClip::slotCreateAudioThumbs()
|
||||
double framesPerSecond = audioProducer->get_fps();
|
||||
mlt_audio_format audioFormat = mlt_audio_s16;
|
||||
QStringList keys;
|
||||
keys.reserve(channels);
|
||||
for (int i = 0; i < channels; i++) {
|
||||
keys << "meta.media.audio_level." + QString::number(i);
|
||||
}
|
||||
@@ -1294,7 +1316,7 @@ void ProjectClip::updateFfmpegProgress()
|
||||
return;
|
||||
}
|
||||
QString result = callerProcess->readAllStandardOutput();
|
||||
const QStringList lines = result.split('\n');
|
||||
const QStringList lines = result.split(QLatin1Char('\n'));
|
||||
for (const QString &data : lines) {
|
||||
if (data.startsWith(QStringLiteral("out_time_ms"))) {
|
||||
long ms = data.section(QLatin1Char('='), 1).toLong();
|
||||
@@ -1351,7 +1373,7 @@ QStringList ProjectClip::updatedAnalysisData(const QString &name, const QString
|
||||
previous = m_controller->property("kdenlive:clipanalysis." + name + QString::number(i));
|
||||
}
|
||||
return QStringList() << QString("kdenlive:clipanalysis." + name + QString::number(i)) << geometryWithOffset(data, offset);
|
||||
//m_controller->setProperty("kdenlive:clipanalysis." + name + ' ' + QString::number(i), geometryWithOffset(data, offset));
|
||||
//m_controller->setProperty("kdenlive:clipanalysis." + name + QLatin1Char(' ') + QString::number(i), geometryWithOffset(data, offset));
|
||||
}
|
||||
} else {
|
||||
return QStringList() << QString("kdenlive:clipanalysis." + name) << geometryWithOffset(data, offset);
|
||||
@@ -1386,7 +1408,7 @@ const QString ProjectClip::geometryWithOffset(const QString &data, int offset)
|
||||
|
||||
QImage ProjectClip::findCachedThumb(int pos)
|
||||
{
|
||||
const QString path = url() + '_' + QString::number(pos);
|
||||
const QString path = url() + QLatin1Char('_') + QString::number(pos);
|
||||
return bin()->findCachedPixmap(path);
|
||||
}
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@ namespace Mlt
|
||||
{
|
||||
class Producer;
|
||||
class Properties;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* @class ProjectClip
|
||||
@@ -71,14 +71,14 @@ public:
|
||||
/** @brief Returns a unique hash identifier used to store clip thumbnails. */
|
||||
//virtual void hash() = 0;
|
||||
|
||||
/** @brief Returns this if @param id matches the clip's id or Q_NULLPTR otherwise. */
|
||||
/** @brief Returns this if @param id matches the clip's id or nullptr otherwise. */
|
||||
ProjectClip *clip(const QString &id) Q_DECL_OVERRIDE;
|
||||
|
||||
ProjectFolder *folder(const QString &id) Q_DECL_OVERRIDE;
|
||||
|
||||
ProjectSubClip *getSubClip(int in, int out);
|
||||
|
||||
/** @brief Returns this if @param ix matches the clip's index or Q_NULLPTR otherwise. */
|
||||
/** @brief Returns this if @param ix matches the clip's index or nullptr otherwise. */
|
||||
ProjectClip *clipAt(int ix) Q_DECL_OVERRIDE;
|
||||
|
||||
/** @brief Recursively disable/enable bin effects. */
|
||||
@@ -193,7 +193,7 @@ public:
|
||||
void addMarkers(QList<CommentedTime> &markers);
|
||||
/** @brief Add an effect to bin clip. */
|
||||
void addEffect(const ProfileInfo &pInfo, QDomElement &effect);
|
||||
void updateEffect(const ProfileInfo &pInfo, QDomElement &effect, int ix, bool refreshStack);
|
||||
void updateEffect(const ProfileInfo &pInfo, QDomElement &effect, int ix, bool refreshStack, bool updateClip);
|
||||
void removeEffect(int ix);
|
||||
/** @brief Create audio thumbnail for this clip. */
|
||||
void createAudioThumbs();
|
||||
@@ -213,7 +213,7 @@ public:
|
||||
/** @brief Returns a cached pixmap for a frame of this clip */
|
||||
QImage findCachedThumb(int pos);
|
||||
void slotQueryIntraThumbs(const QList<int> &frames);
|
||||
/** @brief Returns true if this producer has audio and can be splitted on timeline*/
|
||||
/** @brief Returns true if this producer has audio and can be split on timeline*/
|
||||
bool isSplittable() const;
|
||||
|
||||
public slots:
|
||||
@@ -241,7 +241,6 @@ private:
|
||||
QMutex m_producerMutex;
|
||||
QMutex m_thumbMutex;
|
||||
QMutex m_intraThumbMutex;
|
||||
QMutex m_audioMutex;
|
||||
QFuture <void> m_thumbThread;
|
||||
QList<int> m_requestedThumbs;
|
||||
QFuture <void> m_intraThread;
|
||||
|
||||
@@ -43,7 +43,7 @@ public:
|
||||
* @param description element describing the folder and its children
|
||||
* @param parent parent folder
|
||||
*/
|
||||
ProjectFolder(const QString &id, const QString &name, ProjectFolder *parent = 0);
|
||||
ProjectFolder(const QString &id, const QString &name, ProjectFolder *parent = nullptr);
|
||||
|
||||
/** @brief Creates an empty root folder. */
|
||||
explicit ProjectFolder(Bin *bin);
|
||||
|
||||
@@ -139,7 +139,7 @@ bool ProjectItemModel::dropMimeData(const QMimeData *data, Qt::DropAction action
|
||||
|
||||
if (data->hasFormat(QStringLiteral("kdenlive/producerslist"))) {
|
||||
// Dropping an Bin item
|
||||
QStringList ids = QString(data->data(QStringLiteral("kdenlive/producerslist"))).split(';');
|
||||
const QStringList ids = QString(data->data(QStringLiteral("kdenlive/producerslist"))).split(QLatin1Char(';'));
|
||||
emit itemDropped(ids, parent);
|
||||
return true;
|
||||
}
|
||||
@@ -152,7 +152,7 @@ bool ProjectItemModel::dropMimeData(const QMimeData *data, Qt::DropAction action
|
||||
}
|
||||
|
||||
if (data->hasFormat(QStringLiteral("kdenlive/clip"))) {
|
||||
QStringList list = QString(data->data(QStringLiteral("kdenlive/clip"))).split(';');
|
||||
const QStringList list = QString(data->data(QStringLiteral("kdenlive/clip"))).split(QLatin1Char(';'));
|
||||
emit addClipCut(list.at(0), list.at(1).toInt(), list.at(2).toInt());
|
||||
}
|
||||
|
||||
@@ -273,7 +273,7 @@ QMimeData *ProjectItemModel::mimeData(const QModelIndexList &indices) const
|
||||
list << item->clipId();
|
||||
} else if (type == AbstractProjectItem::SubClipItem) {
|
||||
QPoint p = item->zone();
|
||||
list << item->clipId() + "/" + QString::number(p.x()) + "/" + QString::number(p.y());
|
||||
list << item->clipId() + QLatin1Char('/') + QString::number(p.x()) + QLatin1Char('/') + QString::number(p.y());
|
||||
} else if (type == AbstractProjectItem::FolderItem) {
|
||||
list << "#" + item->clipId();
|
||||
}
|
||||
|
||||
@@ -58,7 +58,7 @@ public:
|
||||
int rowCount(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE;
|
||||
/** @brief Mandatory reimplementation from QAbstractItemModel */
|
||||
int columnCount(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE;
|
||||
/** @brief Returns the mimetype used for Drag actions */
|
||||
/** @brief Returns the MIME type used for Drag actions */
|
||||
QStringList mimeTypes() const Q_DECL_OVERRIDE;
|
||||
/** @brief Create data that will be used for Drag events */
|
||||
QMimeData *mimeData(const QModelIndexList &indices) const Q_DECL_OVERRIDE;
|
||||
|
||||
@@ -95,8 +95,16 @@ bool ProjectSortProxyModel::lessThan(const QModelIndex &left, const QModelIndex
|
||||
int rightType = sourceModel()->data(right, AbstractProjectItem::ItemTypeRole).toInt();
|
||||
if (leftType == rightType) {
|
||||
// Let the normal alphabetical sort happen
|
||||
QVariant leftData = sourceModel()->data(left, Qt::DisplayRole);
|
||||
QVariant rightData = sourceModel()->data(right, Qt::DisplayRole);
|
||||
QVariant leftData;
|
||||
QVariant rightData;
|
||||
if (leftType == AbstractProjectItem::SubClipItem) {
|
||||
// Subclips, sort by start position
|
||||
leftData = sourceModel()->data(left, AbstractProjectItem::DataDuration);
|
||||
rightData = sourceModel()->data(right, AbstractProjectItem::DataDuration);
|
||||
} else {
|
||||
leftData = sourceModel()->data(left, Qt::DisplayRole);
|
||||
rightData = sourceModel()->data(right, Qt::DisplayRole);
|
||||
}
|
||||
if (leftData.type() == QVariant::DateTime) {
|
||||
return leftData.toDateTime() < rightData.toDateTime();
|
||||
}
|
||||
|
||||