mirror of
https://invent.kde.org/multimedia/kdenlive
synced 2025-12-07 16:59:59 +01:00
Compare commits
314 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
600fea903e | ||
|
|
d9535b846b | ||
|
|
a7fea23596 | ||
|
|
2eee7e650e | ||
|
|
e90ba73f88 | ||
|
|
35ff94d85a | ||
|
|
4b9ba168de | ||
|
|
3644bf4707 | ||
|
|
c5e08a138d | ||
|
|
7dd8568550 | ||
|
|
accde60a20 | ||
|
|
2afedd7e86 | ||
|
|
890932ce1f | ||
|
|
b8c9e129f0 | ||
|
|
cc61d92399 | ||
|
|
58c916cb77 | ||
|
|
f35687ff26 | ||
|
|
225b9a9842 | ||
|
|
1e544d450d | ||
|
|
1dd9da542f | ||
|
|
f3021466cf | ||
|
|
219e941dc0 | ||
|
|
be792d35a9 | ||
|
|
17b33c2187 | ||
|
|
433ca07e9c | ||
|
|
3869e41922 | ||
|
|
20b7b7fab5 | ||
|
|
2ff5270c56 | ||
|
|
6aa5f54583 | ||
|
|
ce87c923bd | ||
|
|
485ab5f810 | ||
|
|
49d8dd6edc | ||
|
|
78958a039d | ||
|
|
21cecb0709 | ||
|
|
64c337496e | ||
|
|
e307ce736b | ||
|
|
be49eff2cf | ||
|
|
858140d9a8 | ||
|
|
b38510586e | ||
|
|
f894184fa3 | ||
|
|
ec3043abee | ||
|
|
2474e47a48 | ||
|
|
3a12d3e127 | ||
|
|
b3a3175167 | ||
|
|
ed46de1c19 | ||
|
|
360700e911 | ||
|
|
91dffb6851 | ||
|
|
af4b0d4671 | ||
|
|
1004cbd257 | ||
|
|
6a7a99fc22 | ||
|
|
f100c6b550 | ||
|
|
56e1fd4cd7 | ||
|
|
f550e2b889 | ||
|
|
2b230f24b2 | ||
|
|
03a2e90863 | ||
|
|
d6e55c3ede | ||
|
|
3192e15250 | ||
|
|
fe628bfda1 | ||
|
|
49bda92823 | ||
|
|
a44557c748 | ||
|
|
8ecf208fad | ||
|
|
d31733fca8 | ||
|
|
f341dd73e0 | ||
|
|
5f6255935b | ||
|
|
33ea09f206 | ||
|
|
f843be6206 | ||
|
|
379594c2e4 | ||
|
|
c428a5b77c | ||
|
|
59dad4d6de | ||
|
|
04e679dd46 | ||
|
|
5db25dc767 | ||
|
|
ffbe165040 | ||
|
|
10d9b15b77 | ||
|
|
ff83737cdf | ||
|
|
6e2297f201 | ||
|
|
b2acfc409b | ||
|
|
33bd9b2035 | ||
|
|
61b0188d42 | ||
|
|
5cc6c6a177 | ||
|
|
873fa9a755 | ||
|
|
11eb431aa0 | ||
|
|
b81944ffed | ||
|
|
8f76e7d029 | ||
|
|
902997ac80 | ||
|
|
14bf85958b | ||
|
|
cd67b9fabe | ||
|
|
5972b11e71 | ||
|
|
329f0b5d6f | ||
|
|
54225231f0 | ||
|
|
21fa2f24bb | ||
|
|
c6a3a5c5f4 | ||
|
|
8c6936858b | ||
|
|
8bf1b4441d | ||
|
|
579e6e7cb6 | ||
|
|
e38fe7920e | ||
|
|
956b77cb26 | ||
|
|
c8dd131157 | ||
|
|
1089e03902 | ||
|
|
997e9f8aae | ||
|
|
d31d2e7766 | ||
|
|
c539149fb7 | ||
|
|
b9ea4d89ea | ||
|
|
9f37e75c3b | ||
|
|
ec3d02320e | ||
|
|
bdb2285ec3 | ||
|
|
17d296dfa4 | ||
|
|
c202c7c684 | ||
|
|
49f7333d13 | ||
|
|
b42d2d40dd | ||
|
|
1e644b6f12 | ||
|
|
c2af27d220 | ||
|
|
8d7cacd456 | ||
|
|
291eed843d | ||
|
|
30576fe47b | ||
|
|
4d1579c77e | ||
|
|
d07455993c | ||
|
|
1e3a1ff857 | ||
|
|
7fc41642ed | ||
|
|
727438e4c2 | ||
|
|
8e7cd2d3f7 | ||
|
|
efb472bdbe | ||
|
|
8442dd89a1 | ||
|
|
2a2a4ea8f3 | ||
|
|
adbec30631 | ||
|
|
da670ef241 | ||
|
|
f9d3575987 | ||
|
|
fb2f811d44 | ||
|
|
261ff4478f | ||
|
|
5a0c3988f0 | ||
|
|
c3b8389721 | ||
|
|
6237663b5c | ||
|
|
45472fbfaf | ||
|
|
a8f2a03e53 | ||
|
|
abc78e1e58 | ||
|
|
6488d3981a | ||
|
|
ae841c77a9 | ||
|
|
f77d9908db | ||
|
|
9ee79fd845 | ||
|
|
675c2b2251 | ||
|
|
f7b6e23085 | ||
|
|
d43962a423 | ||
|
|
fc56d14bf2 | ||
|
|
181342c38b | ||
|
|
f65950c4e3 | ||
|
|
bb5aa13789 | ||
|
|
e30c1d6004 | ||
|
|
2dc08964d8 | ||
|
|
9cebbfefb3 | ||
|
|
2854b18ee5 | ||
|
|
f75a35f79e | ||
|
|
4a941ab84f | ||
|
|
d13349b058 | ||
|
|
fa56b65245 | ||
|
|
a956ade6f5 | ||
|
|
5c9bfe5534 | ||
|
|
4e221ad4ed | ||
|
|
6a9215dfb5 | ||
|
|
c0a967cd12 | ||
|
|
8d541f5376 | ||
|
|
e53a75c70a | ||
|
|
18a11334d8 | ||
|
|
2fd6b55add | ||
|
|
7caecc149e | ||
|
|
dafc76f3bf | ||
|
|
46d5b2c8d8 | ||
|
|
80c878e198 | ||
|
|
9b1a44b077 | ||
|
|
82b54def1c | ||
|
|
a036e36659 | ||
|
|
d0ab2b9986 | ||
|
|
f584ef97ee | ||
|
|
15651e2d47 | ||
|
|
8e582edc56 | ||
|
|
9dc09fe123 | ||
|
|
8c70676956 | ||
|
|
27c660bcee | ||
|
|
2f83ca3940 | ||
|
|
44dded23d2 | ||
|
|
c5720a8894 | ||
|
|
dc7c415e20 | ||
|
|
1398ea377d | ||
|
|
3469ed0167 | ||
|
|
7e7cc4de86 | ||
|
|
a164114aac | ||
|
|
6228b477d2 | ||
|
|
6f23a28814 | ||
|
|
aa191ff813 | ||
|
|
4319633b41 | ||
|
|
0b1e1a2eac | ||
|
|
d6b61b8b29 | ||
|
|
76835073aa | ||
|
|
3bcc664cb1 | ||
|
|
668a16378a | ||
|
|
972f5a9688 | ||
|
|
ff13434dae | ||
|
|
64cfba1eba | ||
|
|
8a39629b05 | ||
|
|
de10f08088 | ||
|
|
b769040273 | ||
|
|
29c08f32ad | ||
|
|
8191e28c24 | ||
|
|
a21559154d | ||
|
|
1f47f7d44c | ||
|
|
bd43e42d0d | ||
|
|
ba2c12510f | ||
|
|
07ac298e90 | ||
|
|
1ab9ec4cd1 | ||
|
|
d0a7184b48 | ||
|
|
7e3abf1c8e | ||
|
|
47294e2c4d | ||
|
|
a53a513195 | ||
|
|
0449cc5f42 | ||
|
|
0ed94c5e0e | ||
|
|
b140a26e6f | ||
|
|
86e7ae8be1 | ||
|
|
900ce81974 | ||
|
|
169d3d2e0e | ||
|
|
48a2397617 | ||
|
|
1930a8bde8 | ||
|
|
353c9896ce | ||
|
|
3ce9b14b33 | ||
|
|
e1f70636c5 | ||
|
|
4196639fc8 | ||
|
|
b885f7fa1f | ||
|
|
e681eaf755 | ||
|
|
6a67414cb9 | ||
|
|
8938773948 | ||
|
|
5fb0a5d3b0 | ||
|
|
1fee894dc7 | ||
|
|
3c60d4194a | ||
|
|
3e0775f80b | ||
|
|
5fe70d89ef | ||
|
|
010c83463c | ||
|
|
89e0a1ac52 | ||
|
|
1e72f355aa | ||
|
|
51c328d045 | ||
|
|
db3a514547 | ||
|
|
4be9030ba6 | ||
|
|
b0da79a805 | ||
|
|
460b09eb90 | ||
|
|
6180efd66c | ||
|
|
32c74060cc | ||
|
|
a87b910ae8 | ||
|
|
afc6fb7b25 | ||
|
|
f36e96d66c | ||
|
|
2504f50f0a | ||
|
|
64bfc766fd | ||
|
|
12a77f9338 | ||
|
|
1a563246f5 | ||
|
|
b699a00f32 | ||
|
|
62f7974e07 | ||
|
|
bcbaec964c | ||
|
|
40d8c63ec1 | ||
|
|
0820132b01 | ||
|
|
3bfae95d00 | ||
|
|
128e4b6759 | ||
|
|
6958f0d808 | ||
|
|
085ec2ecfa | ||
|
|
38d4758875 | ||
|
|
8ffde1dcbb | ||
|
|
5e09d46d72 | ||
|
|
a482c3b04c | ||
|
|
f8311341c9 | ||
|
|
77bc6b6e48 | ||
|
|
d0070c8b69 | ||
|
|
a36d4055db | ||
|
|
fe40c5d261 | ||
|
|
f966d381ad | ||
|
|
c83dd0ea05 | ||
|
|
4e64f0a97a | ||
|
|
be9f33fb28 | ||
|
|
5f927986ce | ||
|
|
4f4c324719 | ||
|
|
7bdee3646c | ||
|
|
26f30bafb1 | ||
|
|
5ce773f25e | ||
|
|
525e5dbded | ||
|
|
c1df0cdbab | ||
|
|
f7b21faa59 | ||
|
|
7fe12c8706 | ||
|
|
e405af45af | ||
|
|
4fc801f6cd | ||
|
|
525fc26b01 | ||
|
|
3915be0279 | ||
|
|
b72fb2155e | ||
|
|
84929e0436 | ||
|
|
4232bc24ba | ||
|
|
7437b79457 | ||
|
|
c9ef1035dd | ||
|
|
2d6fbdab2f | ||
|
|
ca3740fa6b | ||
|
|
28b6444243 | ||
|
|
be66261963 | ||
|
|
228b8f4201 | ||
|
|
86cb6a211b | ||
|
|
3d39d7bb33 | ||
|
|
e3ba1d3f71 | ||
|
|
5a72d8b2e0 | ||
|
|
e1e52667c2 | ||
|
|
27e46951a3 | ||
|
|
834cf8fde3 | ||
|
|
7aed2fb6d8 | ||
|
|
b7f8784570 | ||
|
|
8e62fa04cc | ||
|
|
0f0a9d1bd2 | ||
|
|
bb579bc380 | ||
|
|
46ca2c1b38 | ||
|
|
1315fdcdeb | ||
|
|
30cdea39ec | ||
|
|
ab13096c99 | ||
|
|
54e4784d6f | ||
|
|
c9f45827c1 | ||
|
|
7d58b3e254 | ||
|
|
89a0939d4a |
@@ -11,12 +11,10 @@ INCLUDE(FindGettext)
|
||||
include(MacroOptionalAddSubdirectory)
|
||||
set(catalogname kdenlive)
|
||||
|
||||
add_definitions (${QT_DEFINITIONS} ${KDE4_DEFINITIONS})
|
||||
include_directories (${QDBUS_INCLUDE_DIRS} ${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR} ${KDE4_INCLUDES} ${CMAKE_SOURCE_DIR}/widgets)
|
||||
add_definitions (${QT_DEFINITIONS})
|
||||
|
||||
FIND_PACKAGE(LIBMLT REQUIRED)
|
||||
FIND_PACKAGE(LIBMLTPLUS REQUIRED)
|
||||
FIND_PACKAGE(LIBFFMPEG REQUIRED)
|
||||
find_package(MSGFMT REQUIRED)
|
||||
|
||||
find_program(EXTRACTRC_EXECUTABLE extractrc)
|
||||
@@ -29,11 +27,13 @@ find_program(XGETTEXT_EXECUTABLE xgettext)
|
||||
add_subdirectory(src src/cmake_bindir)
|
||||
add_subdirectory(renderer renderer/cmake_bindir)
|
||||
add_subdirectory(thumbnailer thumbnailer/cmake_bindir)
|
||||
add_subdirectory(effects )
|
||||
add_subdirectory(export )
|
||||
add_subdirectory(icons )
|
||||
add_subdirectory(data )
|
||||
add_subdirectory(plugins)
|
||||
add_subdirectory(effects)
|
||||
add_subdirectory(export)
|
||||
add_subdirectory(icons)
|
||||
add_subdirectory(data)
|
||||
add_subdirectory(lumas)
|
||||
add_subdirectory(po)
|
||||
|
||||
add_subdirectory(man)
|
||||
|
||||
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
#! /bin/sh
|
||||
EXTRACTRC=`which extractrc`
|
||||
XGETTEXT="`which xgettext` --kde -ki18n --no-location -s "
|
||||
# XGETTEXT="`which xgettext` --kde -ki18n --no-location -s "
|
||||
XGETTEXT="`which xgettext` --kde -ki18n -s "
|
||||
podir=`pwd`/po
|
||||
kdenlive_subdirs="src src/widgets renderer `pwd`"
|
||||
kdenlive_subdirs="src src/widgets renderer"
|
||||
|
||||
|
||||
$EXTRACTRC --tag=name --tag=description --tag=label effects/*.xml >> rc.cpp || exit 11
|
||||
|
||||
8
README
8
README
@@ -1,8 +1,8 @@
|
||||
Kdenlive V 0.7 by Jean-Baptiste Mardelle <jb@kdenlive.org>
|
||||
Kdenlive V 0.7.2 by Jean-Baptiste Mardelle <jb@kdenlive.org>
|
||||
|
||||
Kdenlive is a video editing application for KDE.
|
||||
|
||||
This is a the first KDE4 release. Please check the
|
||||
Kdenlive for KDE4. Please check the
|
||||
project page for more information, and to report new bugs.
|
||||
|
||||
http://kdenlive.org
|
||||
@@ -12,14 +12,14 @@ the following webpage :
|
||||
|
||||
http://www.mltframework.org
|
||||
|
||||
This version of Kdenlive requires MLT version 0.3.2. It may work with different
|
||||
This version of Kdenlive requires MLT version >= 0.3.4. It may work with different
|
||||
versions, but this is not guaranteed, or (at this stage of development) likely.
|
||||
|
||||
|
||||
We welcome all bug reports, feedback and offers for help! so please visit our bugtracker and forums:
|
||||
|
||||
Forum:
|
||||
http://kdenlive.org/bbforum
|
||||
http://kdenlive.org/forum
|
||||
|
||||
Bug Tracker:
|
||||
http://kdenlive.org/mantis
|
||||
|
||||
@@ -1,53 +0,0 @@
|
||||
#
|
||||
# Find the FFMPEG includes and library
|
||||
#
|
||||
|
||||
FIND_PROGRAM(FFMPEG_CONFIG_EXECUTABLE pkg-config)
|
||||
EXEC_PROGRAM(${FFMPEG_CONFIG_EXECUTABLE} ARGS --variable=includedir libavformat OUTPUT_VARIABLE FFMPEG_HEADER_PATH )
|
||||
#MESSAGE(STATUS "Found FFmpeg header pkg-config: ${FFMPEG_CONFIG_EXECUTABLE} , ${FFMPEG_HEADER_PATH}")
|
||||
EXEC_PROGRAM(${FFMPEG_CONFIG_EXECUTABLE} ARGS --variable=libdir libavformat OUTPUT_VARIABLE FFMPEG_LIBS_PATH )
|
||||
#MESSAGE(STATUS "Found FFmpeg lib pkg-config: ${FFMPEG_CONFIG_EXECUTABLE} , ${FFMPEG_LIBS_PATH}")
|
||||
|
||||
FIND_PATH(LIBFFMPEG_INCLUDE_DIR
|
||||
NAMES avformat.h
|
||||
PATHS ${FFMPEG_HEADER_PATH}/ffmpeg ${FFMPEG_HEADER_PATH}/libavformat ${FFMPEG_HEADER_PATH}/ffmpeg/libavformat
|
||||
/usr/include/ffmpeg /usr/include/libavformat /usr/include/ffmpeg/libavformat
|
||||
/usr/local/include/ffmpeg /usr/local/include/libavformat /usr/local/include/ffmpeg/libavformat
|
||||
NO_DEFAULT_PATH
|
||||
)
|
||||
|
||||
IF (LIBFFMPEG_INCLUDE_DIR)
|
||||
MESSAGE(STATUS "Found FFmpeg Libavformat includes: ${LIBFFMPEG_INCLUDE_DIR}")
|
||||
ELSE (LIBFFMPEG_INCLUDE_DIR)
|
||||
MESSAGE(FATAL_ERROR "\n***************************\n"
|
||||
"Could not find FFmpeg Libavformat includes\n"
|
||||
"please install the libavformat-dev package or give the path manually using\n"
|
||||
"-DLIBFFMPEG_INCLUDE_DIR=PATH_TO_YOUR_AVFORMAT_HEADERS"
|
||||
"\n***************************\n")
|
||||
ENDIF (LIBFFMPEG_INCLUDE_DIR)
|
||||
|
||||
FIND_LIBRARY(LIBFFMPEG_LIBRARY
|
||||
NAMES avformat
|
||||
PATHS ${FFMPEG_LIBS_PATH}
|
||||
/usr/lib /usr/local/lib
|
||||
NO_DEFAULT_PATH
|
||||
)
|
||||
|
||||
IF (LIBFFMPEG_LIBRARY)
|
||||
MESSAGE(STATUS "Found FFmpeg Libavformat library: ${LIBFFMPEG_LIBRARY}")
|
||||
ELSE (LIBFFMPEG_LIBRARY)
|
||||
MESSAGE(FATAL_ERROR "\n***************************\n"
|
||||
"Could not find FFmpeg Libavformat library\n"
|
||||
"please install the libavformat package or give the path manually using\n"
|
||||
"-DLIBFFMPEG_LIBRARY=PATH_TO_YOUR_AVFORMAT_LIBRARY"
|
||||
"\n***************************\n")
|
||||
ENDIF (LIBFFMPEG_LIBRARY)
|
||||
|
||||
IF (LIBFFMPEG_LIBRARY AND LIBFFMPEG_INCLUDE_DIR)
|
||||
SET( LIBFFMPEG_FOUND 1 )
|
||||
SET( LIBFFMPEG_LIBRARIES ${LIBFFMPEG_LIBRARY} )
|
||||
ELSE (LIBFFMPEG_LIBRARY AND LIBFFMPEG_INCLUDE_DIR)
|
||||
SET( LIBFFMPEG_FOUND 0 )
|
||||
ENDIF (LIBFFMPEG_LIBRARY AND LIBFFMPEG_INCLUDE_DIR)
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
frei0r.squareblur
|
||||
frei0r.distort0r
|
||||
frei0r.water
|
||||
frei0r.facedetect
|
||||
|
||||
# duplicate effects
|
||||
frei0r.gamma
|
||||
|
||||
@@ -3,6 +3,7 @@ INSTALL (FILES
|
||||
automask.xml
|
||||
boxblur.xml
|
||||
brightness.xml
|
||||
channelcopy.xml
|
||||
charcoal.xml
|
||||
chroma_hold.xml
|
||||
chroma.xml
|
||||
@@ -26,11 +27,16 @@ normalise.xml
|
||||
obscure.xml
|
||||
rotation.xml
|
||||
sepia.xml
|
||||
sox_bass.xml
|
||||
sox_gain.xml
|
||||
sox_phaser.xml
|
||||
sox_band.xml
|
||||
sox_echo.xml
|
||||
sox_flanger.xml
|
||||
sox_pitch.xml
|
||||
sox_reverb.xml
|
||||
sox_vibro.xml
|
||||
sox_stretch.xml
|
||||
threshold.xml
|
||||
volume.xml
|
||||
wave.xml
|
||||
|
||||
6
effects/channelcopy.xml
Normal file
6
effects/channelcopy.xml
Normal file
@@ -0,0 +1,6 @@
|
||||
<!DOCTYPE kpartgui>
|
||||
<effect tag="volume" id="channelcopy" type="audio">
|
||||
<name>Mono to stereo</name>
|
||||
<description>Copy the left channel to the right</description>
|
||||
<author>Dan Dennedy</author>
|
||||
</effect>
|
||||
@@ -3,10 +3,10 @@
|
||||
<name>Fade in</name>
|
||||
<description>Fade in audio track</description>
|
||||
<author></author>
|
||||
<parameter type="position" name="in" max="15000" min="0" default="0">
|
||||
<name>Duration</name>
|
||||
<parameter type="fixed" name="in" max="0" min="0" default="0">
|
||||
<name></name>
|
||||
</parameter>
|
||||
<parameter type="position" name="out" max="15000" min="0" default="75">
|
||||
<parameter type="position" name="out" max="90000" min="0" default="75">
|
||||
<name>Duration</name>
|
||||
</parameter>
|
||||
<parameter type="fixed" name="gain" max="0" min="0" default="0">
|
||||
|
||||
@@ -3,11 +3,11 @@
|
||||
<name>Fade out</name>
|
||||
<description>Fade in audio track</description>
|
||||
<author></author>
|
||||
<parameter type="position" name="in" max="15000" min="0" default="0">
|
||||
<parameter type="position" name="in" max="0" min="0" default="75">
|
||||
<name>Duration</name>
|
||||
</parameter>
|
||||
<parameter type="position" name="out" max="15000" min="0" default="75">
|
||||
<name>Duration</name>
|
||||
<parameter type="fixed" name="out" max="90000" min="0" default="0">
|
||||
<name></name>
|
||||
</parameter>
|
||||
<parameter type="fixed" name="gain" max="1" min="1" default="1">
|
||||
<name>Start Gain</name>
|
||||
|
||||
@@ -4,10 +4,10 @@
|
||||
<description>LADSPA limiter audio effect</description>
|
||||
<author>http://www.ladspa.org</author>
|
||||
<parameter type="constant" name="gain" max="20" min="-20" default="0">
|
||||
<name>Input gain (db)</name>
|
||||
<name>Input gain (dB)</name>
|
||||
</parameter>
|
||||
<parameter type="constant" name="limit" max="0" min="-20" default="0">
|
||||
<name>Limit (db)</name>
|
||||
<name>Limit (dB)</name>
|
||||
</parameter>
|
||||
<parameter type="constant" name="release" max="200" min="1" default="50" factor="100">
|
||||
<name>Release time (s)</name>
|
||||
|
||||
12
effects/sox_band.xml
Normal file
12
effects/sox_band.xml
Normal file
@@ -0,0 +1,12 @@
|
||||
<!DOCTYPE kpartgui>
|
||||
<effect tag="sox" id="sox_band" type="audio">
|
||||
<name>Sox Band</name>
|
||||
<description>Sox band audio effect</description>
|
||||
<author>http://sox.sourceforge.net</author>
|
||||
<parameter type="constant" name="frequency" max="10000" min="1" default="3000">
|
||||
<name>Center Frequency</name>
|
||||
</parameter>
|
||||
<parameter type="constant" name="width" max="5000" min="1" default="300">
|
||||
<name>Width</name>
|
||||
</parameter>
|
||||
</effect>
|
||||
12
effects/sox_bass.xml
Normal file
12
effects/sox_bass.xml
Normal file
@@ -0,0 +1,12 @@
|
||||
<!DOCTYPE kpartgui>
|
||||
<effect tag="sox" id="sox_bass" type="audio">
|
||||
<name>Sox Bass</name>
|
||||
<description>Sox bass audio effect</description>
|
||||
<author>http://sox.sourceforge.net</author>
|
||||
<parameter type="constant" name="gain" max="100" min="1" default="5">
|
||||
<name>Gain</name>
|
||||
</parameter>
|
||||
<parameter type="constant" name="frequency" max="5000" min="1" default="100">
|
||||
<name>Frequency</name>
|
||||
</parameter>
|
||||
</effect>
|
||||
@@ -4,10 +4,10 @@
|
||||
<description>Sox echo audio effect</description>
|
||||
<author>http://sox.sourceforge.net</author>
|
||||
<parameter type="constant" name="gain-in" max="100" min="0" default="50" factor="100">
|
||||
<name>Gain in</name>
|
||||
<name>Gain In</name>
|
||||
</parameter>
|
||||
<parameter type="constant" name="gain-out" max="100" min="0" default="100" factor="100">
|
||||
<name>Gain out</name>
|
||||
<name>Gain Out</name>
|
||||
</parameter>
|
||||
<parameter type="constant" name="delay" max="500" min="100" default="150">
|
||||
<name>Delay</name>
|
||||
|
||||
@@ -4,10 +4,10 @@
|
||||
<description>Sox flanger audio effect</description>
|
||||
<author>http://sox.sourceforge.net</author>
|
||||
<parameter type="constant" name="gain-in" max="100" min="0" default="50" factor="100">
|
||||
<name>Gain in</name>
|
||||
<name>Gain In</name>
|
||||
</parameter>
|
||||
<parameter type="constant" name="gain-out" max="100" min="0" default="50" factor="100">
|
||||
<name>Gain out</name>
|
||||
<name>Gain Out</name>
|
||||
</parameter>
|
||||
<parameter type="constant" name="delay" max="500" min="0" default="100" factor="100">
|
||||
<name>Delay</name>
|
||||
|
||||
9
effects/sox_gain.xml
Normal file
9
effects/sox_gain.xml
Normal file
@@ -0,0 +1,9 @@
|
||||
<!DOCTYPE kpartgui>
|
||||
<effect tag="sox" id="sox_gain" type="audio">
|
||||
<name>Sox Gain</name>
|
||||
<description>Sox gain audio effect</description>
|
||||
<author>http://sox.sourceforge.net</author>
|
||||
<parameter type="constant" name="gain" max="50" min="-50" default="5">
|
||||
<name>Gain</name>
|
||||
</parameter>
|
||||
</effect>
|
||||
21
effects/sox_phaser.xml
Normal file
21
effects/sox_phaser.xml
Normal file
@@ -0,0 +1,21 @@
|
||||
<!DOCTYPE kpartgui>
|
||||
<effect tag="sox" id="sox_phaser" type="audio">
|
||||
<name>Sox Phaser</name>
|
||||
<description>Sox phaser audio effect</description>
|
||||
<author>http://sox.sourceforge.net</author>
|
||||
<parameter type="constant" name="gainin" max="10" min="1" default="10" factor="10">
|
||||
<name>Gain In</name>
|
||||
</parameter>
|
||||
<parameter type="constant" name="gainout" max="10" min="1" default="10" factor="10">
|
||||
<name>Gain Out</name>
|
||||
</parameter>
|
||||
<parameter type="constant" name="delay" max="5" min="0" default="2">
|
||||
<name>Delay</name>
|
||||
</parameter>
|
||||
<parameter type="constant" name="decay" max="99" min="0" default="80" factor="100">
|
||||
<name>Decay</name>
|
||||
</parameter>
|
||||
<parameter type="constant" name="speed" max="20" min="1" default="10" factor="10">
|
||||
<name>Speed</name>
|
||||
</parameter>
|
||||
</effect>
|
||||
12
effects/sox_stretch.xml
Normal file
12
effects/sox_stretch.xml
Normal file
@@ -0,0 +1,12 @@
|
||||
<!DOCTYPE kpartgui>
|
||||
<effect tag="sox" id="sox_stretch" type="audio">
|
||||
<name>Sox Stretch</name>
|
||||
<description>Sox stretch audio effect</description>
|
||||
<author>http://sox.sourceforge.net</author>
|
||||
<parameter type="constant" name="factor" max="100" min="0" default="10" factor="10">
|
||||
<name>Factor</name>
|
||||
</parameter>
|
||||
<parameter type="constant" name="window" max="100" min="1" default="20">
|
||||
<name>Window</name>
|
||||
</parameter>
|
||||
</effect>
|
||||
@@ -1,158 +1,205 @@
|
||||
<profiles version="0.1">
|
||||
<group name="HDV" renderer="avformat" extension="m2t" type="av">
|
||||
<profile name="PAL 1080 50i" standard="PAL" args="f=mpegts ab=384k ar=48000 vcodec=mpeg2video s=1440x1080 b=19700k g=12 profile=hdv_1080_50i" />
|
||||
<profile name="PAL 720 25p" standard="PAL" args="f=mpegts ab=384k ar=48000 vcodec=mpeg2video s=1280x720 b=19700k g=12 profile=hdv_720_25p" />
|
||||
<profile name="NTSC 1080 60i" standard="NTSC" args="f=mpegts ab=384k ar=48000 vcodec=mpeg2video s=1440x1080 b=19700k g=15 profile=hdv_1080_60i" />
|
||||
<profile name="NTSC 720 30p" standard="NTSC" args="f=mpegts ab=384k ar=48000 vcodec=mpeg2video s=1280x720 b=19700k g=15 profile=hdv_720_30p" />
|
||||
<profile name="PAL 1080 50i" standard="PAL" args="f=mpegts acodec=mp2 ab=384k ar=48000 ac=2 vcodec=mpeg2video s=1440x1080 b=25000k g=12 trellis=1 profile=hdv_1080_50i" />
|
||||
<profile name="PAL 1080 25p" standard="PAL" args="f=mpegts acodec=mp2 ab=384k ar=48000 ac=2 vcodec=mpeg2video s=1440x1080 b=25000k g=12 trellis=1 profile=hdv_1080_25p" />
|
||||
<profile name="PAL 720 25p" standard="PAL" args="f=mpegts acodec=mp2 ab=384k ar=48000 ac=2 vcodec=mpeg2video s=1280x720 b=19700k g=12 trellis=1 profile=hdv_720_25p" />
|
||||
<profile name="NTSC 1080 60i" standard="NTSC" args="f=mpegts acodec=mp2 ab=384k ar=48000 ac=2 vcodec=mpeg2video s=1440x1080 b=25000k g=15 trellis=1 profile=hdv_1080_60i" />
|
||||
<profile name="NTSC 1080 30p" standard="NTSC" args="f=mpegts acodec=mp2 ab=384k ar=48000 ac=2 vcodec=mpeg2video s=1440x1080 b=25000k g=15 trellis=1 profile=hdv_1080_30p" />
|
||||
<profile name="NTSC 720 30p" standard="NTSC" args="f=mpegts acodec=mp2 ab=384k ar=48000 ac=2 vcodec=mpeg2video s=1280x720 b=19700k g=15 trellis=1 profile=hdv_720_30p" />
|
||||
</group>
|
||||
|
||||
<group name="DV" renderer="avformat" type="av">
|
||||
<profile name="PAL Raw" standard="PAL" extension="dv" args="f=dv ildct=1 pix_fmt=yuv420p s=720x576 profile=dv_pal" />
|
||||
<profile name="PAL Raw DV50" standard="PAL" extension="dv" args="f=dv ildct=1 pix_fmt=yuv422p s=720x576 profile=dv_pal" />
|
||||
<profile name="PAL AVI" standard="PAL" extension="avi" args="f=avi vcodec=dvvideo ildct=1 pix_fmt=yuv420p acodec=pcm_s16le s=720x576 profile=dv_pal" />
|
||||
<profile name="PAL AVI DV50" standard="PAL" extension="avi" args="f=avi vcodec=dvvideo ildct=1 pix_fmt=yuv422p s=720x576 profile=dv_pal" />
|
||||
<group name="Raw DV" renderer="avformat" type="av" extension="dv">
|
||||
<profile name="DV PAL 4:3" standard="PAL" args="f=dv pix_fmt=yuv420p s=720x576 profile=dv_pal" />
|
||||
<profile name="DV PAL 16:9" standard="PAL" args="f=dv pix_fmt=yuv420p s=720x576 profile=dv_pal_wide" />
|
||||
<profile name="DVCPRO25 PAL 4:3" standard="PAL" args="f=dv pix_fmt=yuv411p s=720x576 profile=dv_pal" />
|
||||
<profile name="DVCPRO25 PAL 16:9" standard="PAL" args="f=dv pix_fmt=yuv411p s=720x576 profile=dv_pal_wide" />
|
||||
<profile name="DVCPRO50 PAL 4:3" standard="PAL" args="f=dv pix_fmt=yuv422p s=720x576 profile=dv_pal" />
|
||||
<profile name="DVCPRO50 PAL 16:9" standard="PAL" args="f=dv pix_fmt=yuv422p s=720x576 profile=dv_pal_wide" />
|
||||
|
||||
<profile name="NTSC Raw" standard="NTSC" extension="dv" args="f=dv ildct=1 pix_fmt=yuv411p s=720x480 profile=dv_ntsc" />
|
||||
<profile name="NTSC Raw DV50" standard="NTSC" extension="dv" args="f=dv ildct=1 pix_fmt=yuv422p s=720x480 profile=dv_ntsc" />
|
||||
<profile name="NTSC AVI" standard="NTSC" extension="avi" args="f=avi vcodec=dvvideo ildct=1 pix_fmt=yuv411p acodec=pcm_s16le s=720x480 profile=dv_ntsc" />
|
||||
<profile name="NTSC AVI DV50" standard="NTSC" extension="avi" args="f=avi vcodec=dvvideo ildct=1 pix_fmt=yuv422p s=720x480 profile=dv_ntsc" />
|
||||
|
||||
<profile name="DV NTSC 4:3" standard="NTSC" args="f=dv pix_fmt=yuv420p s=720x480 profile=dv_ntsc" />
|
||||
<profile name="DV NTSC 16:9" standard="NTSC" args="f=dv pix_fmt=yuv420p s=720x480 profile=dv_ntsc_wide" />
|
||||
<profile name="DVCPRO25 NTSC 4:3" standard="NTSC" args="f=dv pix_fmt=yuv411p s=720x480 profile=dv_ntsc" />
|
||||
<profile name="DVCPRO25 NTSC 16:9" standard="NTSC" args="f=dv pix_fmt=yuv411p s=720x480 profile=dv_ntsc_wide" />
|
||||
<profile name="DVCPRO50 NTSC 4:3" standard="NTSC" args="f=dv pix_fmt=yuv422p s=720x480 profile=dv_ntsc" />
|
||||
<profile name="DVCPRO50 NTSC 16:9" standard="NTSC" args="f=dv pix_fmt=yuv422p s=720x480 profile=dv_ntsc_wide" />
|
||||
</group>
|
||||
|
||||
<group name="AVI DV" renderer="avformat" type="av" extension="avi">
|
||||
<profile name="DV PAL 4:3" standard="PAL" args="f=avi vcodec=dvvideo pix_fmt=yuv420p acodec=pcm_s16le s=720x576 profile=dv_pal" />
|
||||
<profile name="DV PAL 16:9" standard="PAL" args="f=avi vcodec=dvvideo pix_fmt=yuv420p acodec=pcm_s16le s=720x576 profile=dv_pal_wide" />
|
||||
<profile name="DVCPRO25 PAL 4:3" standard="PAL" args="f=avi vcodec=dvvideo pix_fmt=yuv411p acodec=pcm_s16le s=720x576 profile=dv_pal" />
|
||||
<profile name="DVCPRO25 PAL 16:9" standard="PAL" args="f=avi vcodec=dvvideo pix_fmt=yuv411p acodec=pcm_s16le s=720x576 profile=dv_pal_wide" />
|
||||
<profile name="DVCPRO50 PAL 4:3" standard="PAL" args="f=avi vcodec=dvvideo pix_fmt=yuv422p acodec=pcm_s16le s=720x576 profile=dv_pal" />
|
||||
<profile name="DVCPRO50 PAL 16:9" standard="PAL" args="f=avi vcodec=dvvideo pix_fmt=yuv422p acodec=pcm_s16le s=720x576 profile=dv_pal_wide" />
|
||||
|
||||
<profile name="DV NTSC 4:3" standard="NTSC" args="f=avi vcodec=dvvideo pix_fmt=yuv411p acodec=pcm_s16le s=720x480 profile=dv_ntsc" />
|
||||
<profile name="DV NTSC 16:9" standard="NTSC" args="f=avi vcodec=dvvideo pix_fmt=yuv411p acodec=pcm_s16le s=720x480 profile=dv_ntsc_wide" />
|
||||
<profile name="DVCPRO25 NTSC 4:3" standard="NTSC" args="f=avi vcodec=dvvideo pix_fmt=yuv411p acodec=pcm_s16le s=720x480 profile=dv_ntsc" />
|
||||
<profile name="DVCPRO25 NTSC 16:9" standard="NTSC" args="f=avi vcodec=dvvideo pix_fmt=yuv411p acodec=pcm_s16le s=720x480 profile=dv_ntsc_wide" />
|
||||
<profile name="DVCPRO50 NTSC 4:3" standard="NTSC" args="f=avi vcodec=dvvideo pix_fmt=yuv422p acodec=pcm_s16le s=720x480 profile=dv_ntsc" />
|
||||
<profile name="DVCPRO50 NTSC 16:9" standard="NTSC" args="f=avi vcodec=dvvideo pix_fmt=yuv422p acodec=pcm_s16le s=720x480 profile=dv_ntsc_wide" />
|
||||
</group>
|
||||
|
||||
<group name="DVD" renderer="avformat" type="av">
|
||||
<profile name="PAL 4:3 vob" standard="PAL" extension="vob" args="f=dvd vcodec=mpeg2video acodec=ac3 b=5000k maxrate=8000000 minrate=0 bufsize=1835008 mux_packet_s=2048 mux_rate=10080000 ab=192000 ar=48000 s=720x576 g=15 me_range=63 profile=dv_pal" />
|
||||
<profile name="PAL 16:9 vob" standard="PAL" extension="vob" args="f=dvd vcodec=mpeg2video acodec=ac3 b=5000k maxrate=8000000 minrate=0 bufsize=1835008 mux_packet_s=2048 mux_rate=10080000 ab=192000 ar=48000 s=720x576 g=15 me_range=63 profile=dv_pal_wide" />
|
||||
|
||||
<profile name="NTSC 4:3 vob" standard="NTSC" extension="vob" args="f=dvd vcodec=mpeg2video acodec=ac3 s=720x480 b=6000k maxrate=9000000 minrate=0 bufsize=1835008 mux_packet_s=2048 mux_rate=10080000 ab=192000 ar=48000 g=18 me_range=63 profile=dv_ntsc" />
|
||||
<profile name="NTSC 16:9 vob" standard="NTSC" extension="vob" args="f=dvd vcodec=mpeg2video acodec=ac3 s=720x480 b=6000k maxrate=9000000 minrate=0 bufsize=1835008 mux_packet_s=2048 mux_rate=10080000 ab=192000 ar=48000 g=18 me_range=63 profile=dv_ntsc_wide" />
|
||||
<groupname id="dvd">DVD</groupname>
|
||||
<profile name="PAL 4:3 vob" standard="PAL" extension="vob" args="f=dvd vcodec=mpeg2video acodec=ac3 b=5000k maxrate=8000k minrate=0 bufsize=1835008 mux_packet_s=2048 mux_rate=10080000 ab=192k ar=48000 s=720x576 g=15 me_range=63 trellis=1 profile=dv_pal" />
|
||||
<profile name="PAL 16:9 vob" standard="PAL" extension="vob" args="f=dvd vcodec=mpeg2video acodec=ac3 b=5000k maxrate=8000k minrate=0 bufsize=1835008 mux_packet_s=2048 mux_rate=10080000 ab=192k ar=48000 s=720x576 g=15 me_range=63 trellis=1 profile=dv_pal_wide" />
|
||||
|
||||
<profile name="NTSC 4:3 vob" standard="NTSC" extension="vob" args="f=dvd vcodec=mpeg2video acodec=ac3 s=720x480 b=6000k maxrate=9000k minrate=0 bufsize=1835008 mux_packet_s=2048 mux_rate=10080000 ab=192k ar=48000 g=18 me_range=63 trellis=1 profile=dv_ntsc" />
|
||||
<profile name="NTSC 16:9 vob" standard="NTSC" extension="vob" args="f=dvd vcodec=mpeg2video acodec=ac3 s=720x480 b=6000k maxrate=9000k minrate=0 bufsize=1835008 mux_packet_s=2048 mux_rate=10080000 ab=192k ar=48000 g=18 me_range=63 trellis=1 profile=dv_ntsc_wide" />
|
||||
</group>
|
||||
|
||||
<group name="Web sites" renderer="avformat" type="av">
|
||||
<profile name="Dailymotion 320x240" extension="flv" args="f=flv acodec=libmp3lame ab=128k ar=44100 vcodec=flv minrate=0 b=800k s=320x240 aspect=%dar trell=1" />
|
||||
<profile name="Dailymotion 512x384" extension="mp4" args="f=mp4 acodec=libfaac ab=96k ar=44100 vcodec=libx264 minrate=0 b=600k s=512x384 aspect=%dar mbd=2 trell=1 mv4=1" />
|
||||
<profile name="Dailymotion 1280x720" extension="mp4" args="f=mp4 acodec=libfaac ab=96k ar=44100 vcodec=libx264 minrate=0 b=1500k s=1280x720 aspect=%dar mbd=2 trell=1 mv4=1" />
|
||||
<profile name="Vimeo 640x480" extension="mp4" args="f=mp4 acodec=libfaac ab=128k ar=44100 vcodec=libx264 minrate=0 b=3000k s=640x480 aspect=%dar mbd=2 trell=1 mv4=1" />
|
||||
<profile name="Vimeo 1280x720" extension="mp4" args="f=mp4 acodec=libfaac ab=128k ar=44100 vcodec=libx264 minrate=0 b=5000k s=1280x720 aspect=%dar mbd=2 trell=1 mv4=1" />
|
||||
<profile name="Youtube 640x480" extension="flv" args="f=flv acodec=libmp3lame ab=128k ar=44100 vcodec=flv minrate=0 b=800k s=640x480 aspect=%dar trell=1" />
|
||||
<group name="MPEG-2" renderer="avformat" extension="mpg" type="av">
|
||||
<profile name="MPEG-2 200k" args="f=mpeg acodec=mp2 ab=384k ar=48000 vcodec=mpeg2video minrate=0 b=200k bf=2 b_strategy=1 trellis=1 aspect=%dar" />
|
||||
<profile name="MPEG-2 400k" args="f=mpeg acodec=mp2 ab=384k ar=48000 vcodec=mpeg2video minrate=0 b=400k bf=2 b_strategy=1 trellis=1 aspect=%dar" />
|
||||
<profile name="MPEG-2 600k" args="f=mpeg acodec=mp2 ab=384k ar=48000 vcodec=mpeg2video minrate=0 b=600k bf=2 b_strategy=1 trellis=1 aspect=%dar" />
|
||||
<profile name="MPEG-2 800k" args="f=mpeg acodec=mp2 ab=384k ar=48000 vcodec=mpeg2video minrate=0 b=800k bf=2 b_strategy=1 trellis=1 aspect=%dar" />
|
||||
<profile name="MPEG-2 1000k" args="f=mpeg acodec=mp2 ab=384k ar=48000 vcodec=mpeg2video minrate=0 b=1000k bf=2 b_strategy=1 trellis=1 aspect=%dar" />
|
||||
<profile name="MPEG-2 2000k" args="f=mpeg acodec=mp2 ab=384k ar=48000 vcodec=mpeg2video minrate=0 b=2000k bf=2 b_strategy=1 trellis=1 aspect=%dar" />
|
||||
<profile name="MPEG-2 4000k" args="f=mpeg acodec=mp2 ab=384k ar=48000 vcodec=mpeg2video minrate=0 b=4000k bf=2 b_strategy=1 trellis=1 aspect=%dar" />
|
||||
<profile name="MPEG-2 6000k" args="f=mpeg acodec=mp2 ab=384k ar=48000 vcodec=mpeg2video minrate=0 b=6000k bf=2 b_strategy=1 trellis=1 aspect=%dar" />
|
||||
<profile name="MPEG-2 8000k" args="f=mpeg acodec=mp2 ab=384k ar=48000 vcodec=mpeg2video minrate=0 b=8000k bf=2 b_strategy=1 trellis=1 aspect=%dar" />
|
||||
<profile name="MPEG-2 1000k" args="f=mpeg acodec=mp2 ab=384k ar=48000 vcodec=mpeg2video minrate=0 b=10000k bf=2 b_strategy=1 trellis=1 aspect=%dar" />
|
||||
<profile name="MPEG-2 12000k" args="f=mpeg acodec=mp2 ab=384k ar=48000 vcodec=mpeg2video minrate=0 b=12000k bf=2 b_strategy=1 trellis=1 aspect=%dar" />
|
||||
<profile name="MPEG-2 18000k" args="f=mpeg acodec=mp2 ab=384k ar=48000 vcodec=mpeg2video minrate=0 b=18000k bf=2 b_strategy=1 trellis=1 aspect=%dar" />
|
||||
<profile name="MPEG-2 25000k" args="f=mpeg acodec=mp2 ab=384k ar=48000 vcodec=mpeg2video minrate=0 b=25000k bf=2 b_strategy=1 trellis=1 aspect=%dar" />
|
||||
</group>
|
||||
|
||||
<group name="Mpeg4" renderer="avformat" extension="mp4" type="av">
|
||||
<profile name="Mpeg4 200k" args="f=mp4 acodec=libmp3lame ab=128k ar=44100 vcodec=mpeg4 minrate=0 b=200k s=%widthx%height aspect=%dar mbd=2 trell=1 mv4=1" />
|
||||
<profile name="Mpeg4 400k" args="f=mp4 acodec=libmp3lame ab=128k ar=44100 vcodec=mpeg4 minrate=0 b=400k s=%widthx%height aspect=%dar mbd=2 trell=1 mv4=1" />
|
||||
<profile name="Mpeg4 600k" args="f=mp4 acodec=libmp3lame ab=128k ar=44100 vcodec=mpeg4 minrate=0 b=600k s=%widthx%height aspect=%dar mbd=2 trell=1 mv4=1" />
|
||||
<profile name="Mpeg4 800k" args="f=mp4 acodec=libmp3lame ab=128k ar=44100 vcodec=mpeg4 minrate=0 b=800k s=%widthx%height aspect=%dar mbd=2 trell=1 mv4=1" />
|
||||
<profile name="Mpeg4 1000k" args="f=mp4 acodec=libmp3lame ab=128k ar=44100 vcodec=mpeg4 minrate=0 b=1000k s=%widthx%height aspect=%dar mbd=2 trell=1 mv4=1" />
|
||||
<profile name="Mpeg4 2000k" args="f=mp4 acodec=libmp3lame ab=128k ar=44100 vcodec=mpeg4 minrate=0 b=2000k s=%widthx%height aspect=%dar mbd=2 trell=1 mv4=1" />
|
||||
<profile name="Mpeg4 4000k" args="f=mp4 acodec=libmp3lame ab=128k ar=44100 vcodec=mpeg4 minrate=0 b=4000k s=%widthx%height aspect=%dar mbd=2 trell=1 mv4=1" />
|
||||
<profile name="Mpeg4 6000k" args="f=mp4 acodec=libmp3lame ab=128k ar=44100 vcodec=mpeg4 minrate=0 b=6000k s=%widthx%height aspect=%dar mbd=2 trell=1 mv4=1" />
|
||||
<profile name="Mpeg4 8000k" args="f=mp4 acodec=libmp3lame ab=128k ar=44100 vcodec=mpeg4 minrate=0 b=8000k s=%widthx%height aspect=%dar mbd=2 trell=1 mv4=1" />
|
||||
<profile name="Mpeg4 10000k" args="f=mp4 acodec=libmp3lame ab=128k ar=44100 vcodec=mpeg4 minrate=0 b=10000k s=%widthx%height aspect=%dar mbd=2 trell=1 mv4=1" />
|
||||
<profile name="Mpeg4 12000k" args="f=mp4 acodec=libmp3lame ab=128k ar=44100 vcodec=mpeg4 minrate=0 b=12000k s=%widthx%height aspect=%dar mbd=2 trell=1 mv4=1" />
|
||||
<group name="MPEG-4" renderer="avformat" extension="mp4" type="av">
|
||||
<profile name="MPEG-4 200k" args="f=mp4 acodec=libmp3lame ab=128k ar=44100 vcodec=mpeg4 minrate=0 b=200k aspect=%dar mbd=2 trellis=1 mv4=1" />
|
||||
<profile name="MPEG-4 400k" args="f=mp4 acodec=libmp3lame ab=128k ar=44100 vcodec=mpeg4 minrate=0 b=400k aspect=%dar mbd=2 trellis=1 mv4=1" />
|
||||
<profile name="MPEG-4 600k" args="f=mp4 acodec=libmp3lame ab=128k ar=44100 vcodec=mpeg4 minrate=0 b=600k aspect=%dar mbd=2 trellis=1 mv4=1" />
|
||||
<profile name="MPEG-4 800k" args="f=mp4 acodec=libmp3lame ab=128k ar=44100 vcodec=mpeg4 minrate=0 b=800k aspect=%dar mbd=2 trellis=1 mv4=1" />
|
||||
<profile name="MPEG-4 1000k" args="f=mp4 acodec=libmp3lame ab=128k ar=44100 vcodec=mpeg4 minrate=0 b=1000k aspect=%dar mbd=2 trellis=1 mv4=1" />
|
||||
<profile name="MPEG-4 2000k" args="f=mp4 acodec=libmp3lame ab=128k ar=44100 vcodec=mpeg4 minrate=0 b=2000k aspect=%dar mbd=2 trellis=1 mv4=1" />
|
||||
<profile name="MPEG-4 4000k" args="f=mp4 acodec=libmp3lame ab=128k ar=44100 vcodec=mpeg4 minrate=0 b=4000k aspect=%dar mbd=2 trellis=1 mv4=1" />
|
||||
<profile name="MPEG-4 6000k" args="f=mp4 acodec=libmp3lame ab=128k ar=44100 vcodec=mpeg4 minrate=0 b=6000k aspect=%dar mbd=2 trellis=1 mv4=1" />
|
||||
<profile name="MPEG-4 8000k" args="f=mp4 acodec=libmp3lame ab=128k ar=44100 vcodec=mpeg4 minrate=0 b=8000k aspect=%dar mbd=2 trellis=1 mv4=1" />
|
||||
<profile name="MPEG-4 10000k" args="f=mp4 acodec=libmp3lame ab=128k ar=44100 vcodec=mpeg4 minrate=0 b=10000k aspect=%dar mbd=2 trellis=1 mv4=1" />
|
||||
<profile name="MPEG-4 12000k" args="f=mp4 acodec=libmp3lame ab=128k ar=44100 vcodec=mpeg4 minrate=0 b=12000k aspect=%dar mbd=2 trellis=1 mv4=1" />
|
||||
<profile name="MPEG-4 18000k" args="f=mp4 acodec=libmp3lame ab=128k ar=44100 vcodec=mpeg4 minrate=0 b=12000k aspect=%dar mbd=2 trellis=1 mv4=1" />
|
||||
<profile name="MPEG-4 25000k" args="f=mp4 acodec=libmp3lame ab=128k ar=44100 vcodec=mpeg4 minrate=0 b=12000k aspect=%dar mbd=2 trellis=1 mv4=1" />
|
||||
</group>
|
||||
|
||||
<group name="XVid4" renderer="avformat" extension="avi" type="av">
|
||||
<profile name="XVid4 200k" args="acodec=libmp3lame ab=128k ar=44100 vcodec=libxvid minrate=0 b=200k s=%widthx%height aspect=%dar mbd=2 trell=1 mv4=1" />
|
||||
<profile name="XVid4 400k" args="acodec=libmp3lame ab=128k ar=44100 vcodec=libxvid minrate=0 b=200k s=%widthx%height aspect=%dar mbd=2 trell=1 mv4=1" />
|
||||
<profile name="XVid4 600k" args="acodec=libmp3lame ab=128k ar=44100 vcodec=libxvid minrate=0 b=200k s=%widthx%height aspect=%dar mbd=2 trell=1 mv4=1" />
|
||||
<profile name="XVid4 800k" args="acodec=libmp3lame ab=128k ar=44100 vcodec=libxvid minrate=0 b=200k s=%widthx%height aspect=%dar mbd=2 trell=1 mv4=1" />
|
||||
<profile name="XVid4 1000k" args="acodec=libmp3lame ab=128k ar=44100 vcodec=libxvid minrate=0 b=200k s=%widthx%height aspect=%dar mbd=2 trell=1 mv4=1" />
|
||||
<profile name="XVid4 2000k" args="acodec=libmp3lame ab=128k ar=44100 vcodec=libxvid minrate=0 b=200k s=%widthx%height aspect=%dar mbd=2 trell=1 mv4=1" />
|
||||
<profile name="XVid4 4000k" args="acodec=libmp3lame ab=128k ar=44100 vcodec=libxvid minrate=0 b=200k s=%widthx%height aspect=%dar mbd=2 trell=1 mv4=1" />
|
||||
<profile name="XVid4 6000k" args="acodec=libmp3lame ab=128k ar=44100 vcodec=libxvid minrate=0 b=200k s=%widthx%height aspect=%dar mbd=2 trell=1 mv4=1" />
|
||||
<profile name="XVid4 8000k" args="acodec=libmp3lame ab=128k ar=44100 vcodec=libxvid minrate=0 b=200k s=%widthx%height aspect=%dar mbd=2 trell=1 mv4=1" />
|
||||
<profile name="XVid4 10000k" args="acodec=libmp3lame ab=128k ar=44100 vcodec=libxvid minrate=0 b=200k s=%widthx%height aspect=%dar mbd=2 trell=1 mv4=1" />
|
||||
<profile name="XVid4 12000k" args="acodec=libmp3lame ab=128k ar=44100 vcodec=libxvid minrate=0 b=200k s=%widthx%height aspect=%dar mbd=2 trell=1 mv4=1" />
|
||||
<profile name="XVid4 200k" args="acodec=libmp3lame ab=128k ar=44100 vcodec=libxvid minrate=0 b=200k aspect=%dar mbd=2 trellis=1 mv4=1" />
|
||||
<profile name="XVid4 400k" args="acodec=libmp3lame ab=128k ar=44100 vcodec=libxvid minrate=0 b=400k aspect=%dar mbd=2 trellis=1 mv4=1" />
|
||||
<profile name="XVid4 600k" args="acodec=libmp3lame ab=128k ar=44100 vcodec=libxvid minrate=0 b=600k aspect=%dar mbd=2 trellis=1 mv4=1" />
|
||||
<profile name="XVid4 800k" args="acodec=libmp3lame ab=128k ar=44100 vcodec=libxvid minrate=0 b=800k aspect=%dar mbd=2 trellis=1 mv4=1" />
|
||||
<profile name="XVid4 1000k" args="acodec=libmp3lame ab=128k ar=44100 vcodec=libxvid minrate=0 b=1000k aspect=%dar mbd=2 trellis=1 mv4=1" />
|
||||
<profile name="XVid4 2000k" args="acodec=libmp3lame ab=128k ar=44100 vcodec=libxvid minrate=0 b=2000k aspect=%dar mbd=2 trellis=1 mv4=1" />
|
||||
<profile name="XVid4 4000k" args="acodec=libmp3lame ab=128k ar=44100 vcodec=libxvid minrate=0 b=4000k aspect=%dar mbd=2 trellis=1 mv4=1" />
|
||||
<profile name="XVid4 6000k" args="acodec=libmp3lame ab=128k ar=44100 vcodec=libxvid minrate=0 b=6000k aspect=%dar mbd=2 trellis=1 mv4=1" />
|
||||
<profile name="XVid4 8000k" args="acodec=libmp3lame ab=128k ar=44100 vcodec=libxvid minrate=0 b=8000k aspect=%dar mbd=2 trellis=1 mv4=1" />
|
||||
<profile name="XVid4 10000k" args="acodec=libmp3lame ab=128k ar=44100 vcodec=libxvid minrate=0 b=10000k aspect=%dar mbd=2 trellis=1 mv4=1" />
|
||||
<profile name="XVid4 12000k" args="acodec=libmp3lame ab=128k ar=44100 vcodec=libxvid minrate=0 b=12000k aspect=%dar mbd=2 trellis=1 mv4=1" />
|
||||
</group>
|
||||
|
||||
<group name="h264" renderer="avformat" extension="mp4" type="av">
|
||||
<profile name="h264 200k" args="f=mp4 hq=1 acodec=libfaac ab=128k ar=44100 vcodec=libx264 minrate=0 b=200k size=%widthx%height aspect=%dar mbd=2 trell=1 mv4=1" />
|
||||
<profile name="h264 400k" args="f=mp4 hq=1 acodec=libfaac ab=128k ar=44100 vcodec=libx264 minrate=0 b=400k size=%widthx%height aspect=%dar mbd=2 trell=1 mv4=1" />
|
||||
<profile name="h264 600k" args="f=mp4 hq=1 acodec=libfaac ab=128k ar=44100 vcodec=libx264 minrate=0 b=600k size=%widthx%height aspect=%dar mbd=2 trell=1 mv4=1" />
|
||||
<profile name="h264 800k" args="f=mp4 hq=1 acodec=libfaac ab=128k ar=44100 vcodec=libx264 minrate=0 b=800k size=%widthx%height aspect=%dar mbd=2 trell=1 mv4=1" />
|
||||
<profile name="h264 1000k" args="f=mp4 hq=1 acodec=libfaac ab=128k ar=44100 vcodec=libx264 minrate=0 b=1000k size=%widthx%height aspect=%dar mbd=2 trell=1 mv4=1" />
|
||||
<profile name="h264 2000k" args="f=mp4 hq=1 acodec=libfaac ab=128k ar=44100 vcodec=libx264 minrate=0 b=2000k size=%widthx%height aspect=%dar mbd=2 trell=1 mv4=1" />
|
||||
<profile name="h264 4000k" args="f=mp4 hq=1 acodec=libfaac ab=128k ar=44100 vcodec=libx264 minrate=0 b=4000k size=%widthx%height aspect=%dar mbd=2 trell=1 mv4=1" />
|
||||
<profile name="h264 6000k" args="f=mp4 hq=1 acodec=libfaac ab=128k ar=44100 vcodec=libx264 minrate=0 b=6000k size=%widthx%height aspect=%dar mbd=2 trell=1 mv4=1" />
|
||||
<profile name="h264 8000k" args="f=mp4 hq=1 acodec=libfaac ab=128k ar=44100 vcodec=libx264 minrate=0 b=8000k size=%widthx%height aspect=%dar mbd=2 trell=1 mv4=1" />
|
||||
<profile name="h264 10000k" args="f=mp4 hq=1 acodec=libfaac ab=384k ar=44100 vcodec=libx264 minrate=0 b=10000k size=%widthx%height aspect=%dar mbd=2 trell=1 mv4=1" />
|
||||
<profile name="h264 12000k" args="f=mp4 hq=1 acodec=libfaac ab=384k ar=44100 vcodec=libx264 minrate=0 b=12000k size=%widthx%height aspect=%dar mbd=2 trell=1 mv4=1" />
|
||||
<group name="H.264" renderer="avformat" extension="mp4" type="av">
|
||||
<profile name="H.264 200k" args="f=mp4 hq=1 acodec=libfaac ab=128k ar=48000 pix_fmt=yuv420p vcodec=libx264 minrate=0 b=200k b_strategy=1 subcmp=2 cmp=2 coder=1 flags=+loop flags2=dct8x8 qmax=51 crf=1 trellis=1 aspect=%dar" />
|
||||
<profile name="H.264 400k" args="f=mp4 hq=1 acodec=libfaac ab=128k ar=48000 pix_fmt=yuv420p vcodec=libx264 minrate=0 b=400k b_strategy=1 subcmp=2 cmp=2 coder=1 flags=+loop flags2=dct8x8 qmax=51 crf=1 trellis=1 aspect=%dar" />
|
||||
<profile name="H.264 600k" args="f=mp4 hq=1 acodec=libfaac ab=128k ar=48000 pix_fmt=yuv420p vcodec=libx264 minrate=0 b=600k b_strategy=1 subcmp=2 cmp=2 coder=1 flags=+loop flags2=dct8x8 qmax=51 crf=1 trellis=1 aspect=%dar" />
|
||||
<profile name="H.264 800k" args="f=mp4 hq=1 acodec=libfaac ab=128k ar=48000 pix_fmt=yuv420p vcodec=libx264 minrate=0 b=800k b_strategy=1 subcmp=2 cmp=2 coder=1 flags=+loop flags2=dct8x8 qmax=51 crf=1 trellis=1 aspect=%dar" />
|
||||
<profile name="H.264 1000k" args="f=mp4 hq=1 acodec=libfaac ab=128k ar=48000 pix_fmt=yuv420p vcodec=libx264 minrate=0 b=1000k b_strategy=1 subcmp=2 cmp=2 coder=1 flags=+loop flags2=dct8x8 qmax=51 crf=1 trellis=1 aspect=%dar" />
|
||||
<profile name="H.264 2000k" args="f=mp4 hq=1 acodec=libfaac ab=128k ar=48000 pix_fmt=yuv420p vcodec=libx264 minrate=0 b=2000k b_strategy=1 subcmp=2 cmp=2 coder=1 flags=+loop flags2=dct8x8 qmax=51 crf=1 trellis=1 aspect=%dar" />
|
||||
<profile name="H.264 4000k" args="f=mp4 hq=1 acodec=libfaac ab=128k ar=48000 pix_fmt=yuv420p vcodec=libx264 minrate=0 b=4000k b_strategy=1 subcmp=2 cmp=2 coder=1 flags=+loop flags2=dct8x8 qmax=51 crf=1 trellis=1 aspect=%dar" />
|
||||
<profile name="H.264 6000k" args="f=mp4 hq=1 acodec=libfaac ab=128k ar=48000 pix_fmt=yuv420p vcodec=libx264 minrate=0 b=6000k b_strategy=1 subcmp=2 cmp=2 coder=1 flags=+loop flags2=dct8x8 qmax=51 crf=1 trellis=1 aspect=%dar" />
|
||||
<profile name="H.264 8000k" args="f=mp4 hq=1 acodec=libfaac ab=128k ar=48000 pix_fmt=yuv420p vcodec=libx264 minrate=0 b=8000k b_strategy=1 subcmp=2 cmp=2 coder=1 flags=+loop flags2=dct8x8 qmax=51 crf=1 trellis=1 aspect=%dar" />
|
||||
<profile name="H.264 10000k" args="f=mp4 hq=1 acodec=libfaac ab=384k ar=48000 pix_fmt=yuv420p vcodec=libx264 minrate=0 b=10000k b_strategy=1 subcmp=2 cmp=2 coder=1 flags=+loop flags2=dct8x8 qmax=51 crf=1 trellis=1 aspect=%dar" />
|
||||
<profile name="H.264 12000k" args="f=mp4 hq=1 acodec=libfaac ab=384k ar=48000 pix_fmt=yuv420p vcodec=libx264 minrate=0 b=12000k b_strategy=1 subcmp=2 cmp=2 coder=1 flags=+loop flags2=dct8x8 qmax=51 crf=1 trellis=1 aspect=%dar" />
|
||||
<profile name="H.264 18000k" args="f=mp4 hq=1 acodec=libfaac ab=384k ar=48000 pix_fmt=yuv420p vcodec=libx264 minrate=0 b=18000k b_strategy=1 subcmp=2 cmp=2 coder=1 flags=+loop flags2=dct8x8 qmax=51 crf=1 trellis=1 aspect=%dar" />
|
||||
<profile name="H.264 25000k" args="f=mp4 hq=1 acodec=libfaac ab=384k ar=48000 pix_fmt=yuv420p vcodec=libx264 minrate=0 b=25000k b_strategy=1 subcmp=2 cmp=2 coder=1 flags=+loop flags2=dct8x8 qmax=51 crf=1 trellis=1 aspect=%dar" />
|
||||
</group>
|
||||
|
||||
<group name="Flash" renderer="avformat" extension="flv" type="av">
|
||||
<profile name="Flash 200k" args="f=flv acodec=libmp3lame ab=128k ar=44100 vcodec=flv minrate=0 b=200k s=%widthx%height" />
|
||||
<profile name="Flash 400k" args="f=flv acodec=libmp3lame ab=128k ar=44100 vcodec=flv minrate=0 b=400k s=%widthx%height" />
|
||||
<profile name="Flash 600k" args="f=flv acodec=libmp3lame ab=128k ar=44100 vcodec=flv minrate=0 b=600k s=%widthx%height" />
|
||||
<profile name="Flash 800k" args="f=flv acodec=libmp3lame ab=128k ar=44100 vcodec=flv minrate=0 b=800k s=%widthx%height" />
|
||||
<profile name="Flash 1000k" args="f=flv acodec=libmp3lame ab=128k ar=44100 vcodec=flv minrate=0 b=1000k s=%widthx%height" />
|
||||
<profile name="Flash 2000k" args="f=flv acodec=libmp3lame ab=128k ar=44100 vcodec=flv minrate=0 b=2000k s=%widthx%height" />
|
||||
<profile name="Flash 4000k" args="f=flv acodec=libmp3lame ab=128k ar=44100 vcodec=flv minrate=0 b=4000k s=%widthx%height" />
|
||||
<profile name="Flash 6000k" args="f=flv acodec=libmp3lame ab=128k ar=44100 vcodec=flv minrate=0 b=6000k s=%widthx%height" />
|
||||
<profile name="Flash 8000k" args="f=flv acodec=libmp3lame ab=128k ar=44100 vcodec=flv minrate=0 b=8000k s=%widthx%height" />
|
||||
<profile name="Flash 10000k" args="f=flv acodec=libmp3lame ab=128k ar=44100 vcodec=flv minrate=0 b=10000k s=%widthx%height" />
|
||||
<profile name="Flash 12000k" args="f=flv acodec=libmp3lame ab=128k ar=44100 vcodec=flv minrate=0 b=12000k s=%widthx%height" />
|
||||
<profile name="Flash 200k" args="f=flv acodec=libmp3lame ab=128k ar=44100 vcodec=flv minrate=0 b=200k" />
|
||||
<profile name="Flash 400k" args="f=flv acodec=libmp3lame ab=128k ar=44100 vcodec=flv minrate=0 b=400k" />
|
||||
<profile name="Flash 600k" args="f=flv acodec=libmp3lame ab=128k ar=44100 vcodec=flv minrate=0 b=600k" />
|
||||
<profile name="Flash 800k" args="f=flv acodec=libmp3lame ab=128k ar=44100 vcodec=flv minrate=0 b=800k" />
|
||||
<profile name="Flash 1000k" args="f=flv acodec=libmp3lame ab=128k ar=44100 vcodec=flv minrate=0 b=1000k" />
|
||||
<profile name="Flash 2000k" args="f=flv acodec=libmp3lame ab=128k ar=44100 vcodec=flv minrate=0 b=2000k" />
|
||||
<profile name="Flash 4000k" args="f=flv acodec=libmp3lame ab=128k ar=44100 vcodec=flv minrate=0 b=4000k" />
|
||||
<profile name="Flash 6000k" args="f=flv acodec=libmp3lame ab=128k ar=44100 vcodec=flv minrate=0 b=6000k" />
|
||||
<profile name="Flash 8000k" args="f=flv acodec=libmp3lame ab=128k ar=44100 vcodec=flv minrate=0 b=8000k" />
|
||||
<profile name="Flash 10000k" args="f=flv acodec=libmp3lame ab=128k ar=44100 vcodec=flv minrate=0 b=10000k" />
|
||||
<profile name="Flash 12000k" args="f=flv acodec=libmp3lame ab=128k ar=44100 vcodec=flv minrate=0 b=12000k" />
|
||||
<profile name="Flash 720x576" standard="PAL" args="f=flv acodec=libmp3lame ab=128k ar=44100 vcodec=flv minrate=0 b=12000k s=720x576" />
|
||||
<profile name="Flash 720x480" standard="NTSC" args="f=flv acodec=libmp3lame ab=128k ar=44100 vcodec=flv minrate=0 b=12000k s=720x480" />
|
||||
</group>
|
||||
|
||||
<group name="RealVideo" renderer="avformat" extension="rm" type="av">
|
||||
<profile name="RealVideo 200k" args="f=rv10 minrate=0 b=200k ab=128k ar=44100 s=%widthx%height g=8" />
|
||||
<profile name="RealVideo 400k" args="f=rv10 minrate=0 b=400k ab=128k ar=44100 s=%widthx%height g=8" />
|
||||
<profile name="RealVideo 600k" args="f=rv10 minrate=0 b=600k ab=128k ar=44100 s=%widthx%height g=8" />
|
||||
<profile name="RealVideo 800k" args="f=rv10 minrate=0 b=800k ab=128k ar=44100 s=%widthx%height g=8" />
|
||||
<profile name="RealVideo 1000k" args="f=rv10 minrate=0 b=1000k ab=128k ar=44100 s=%widthx%height g=8" />
|
||||
<profile name="RealVideo 2000k" args="f=rv10 minrate=0 b=2000k ab=128k ar=44100 s=%widthx%height g=8" />
|
||||
<profile name="RealVideo 4000k" args="f=rv10 minrate=0 b=4000k ab=128k ar=44100 s=%widthx%height g=8" />
|
||||
<profile name="RealVideo 6000k" args="f=rv10 minrate=0 b=6000k ab=128k ar=44100 s=%widthx%height g=8" />
|
||||
<profile name="RealVideo 8000k" args="f=rv10 minrate=0 b=8000k ab=128k ar=44100 s=%widthx%height g=8" />
|
||||
<profile name="RealVideo 10000k" args="f=rv10 minrate=0 b=10000k ab=128k ar=44100 s=%widthx%height g=8" />
|
||||
<profile name="RealVideo 12000k" args="f=rv10 minrate=0 b=12000k ab=128k ar=44100 s=%widthx%height g=8" />
|
||||
<profile name="RealVideo 720x576" standard="PAL" args="f=rv10 minrate=0 b=12000k ab=384k ar=48000 s=720x576 g=8" />
|
||||
<profile name="RealVideo 720x480" standard="NTSC" args="f=rv10 minrate=0 b=12000k ab=384k ar=48000 s=720x480 g=8" />
|
||||
<profile name="RealVideo 200k" args="vcodec=rv20 acodec=ac3 minrate=0 b=200k ab=128k ar=44100 g=8" />
|
||||
<profile name="RealVideo 400k" args="vcodec=rv20 acodec=ac3 minrate=0 b=400k ab=128k ar=44100 g=8" />
|
||||
<profile name="RealVideo 600k" args="vcodec=rv20 acodec=ac3 minrate=0 b=600k ab=128k ar=44100 g=8" />
|
||||
<profile name="RealVideo 800k" args="vcodec=rv20 acodec=ac3 minrate=0 b=800k ab=128k ar=44100 g=8" />
|
||||
<profile name="RealVideo 1000k" args="vcodec=rv20 acodec=ac3 minrate=0 b=1000k ab=128k ar=44100 g=8" />
|
||||
<profile name="RealVideo 2000k" args="vcodec=rv20 acodec=ac3 minrate=0 b=2000k ab=128k ar=44100 g=8" />
|
||||
<profile name="RealVideo 4000k" args="vcodec=rv20 acodec=ac3 minrate=0 b=4000k ab=128k ar=44100 g=8" />
|
||||
<profile name="RealVideo 6000k" args="vcodec=rv20 acodec=ac3 minrate=0 b=6000k ab=128k ar=44100 g=8" />
|
||||
<profile name="RealVideo 8000k" args="vcodec=rv20 acodec=ac3 minrate=0 b=8000k ab=128k ar=44100 g=8" />
|
||||
<profile name="RealVideo 10000k" args="vcodec=rv20 acodec=ac3 minrate=0 b=10000k ab=128k ar=44100 g=8" />
|
||||
<profile name="RealVideo 12000k" args="vcodec=rv20 acodec=ac3 minrate=0 b=12000k ab=128k ar=44100 g=8" />
|
||||
<profile name="RealVideo 720x576" standard="PAL" args="vcodec=rv20 acodec=ac3 minrate=0 b=12000k ab=384k ar=48000 s=720x576 g=8" />
|
||||
<profile name="RealVideo 720x480" standard="NTSC" args="vcodec=rv20 acodec=ac3 minrate=0 b=12000k ab=384k ar=48000 s=720x480 g=8" />
|
||||
</group>
|
||||
|
||||
<group name="Theora" renderer="avformat" extension="ogg" type="av">
|
||||
<profile name="Theora 200k" args="acodec=vorbis ab=128k ar=44100 vcodec=libtheora minrate=0 b=200k s=%widthx%height aspect=%dar" />
|
||||
<profile name="Theora 400k" args="acodec=vorbis ab=128k ar=44100 vcodec=libtheora minrate=0 b=400k s=%widthx%height aspect=%dar" />
|
||||
<profile name="Theora 600k" args="acodec=vorbis ab=128k ar=44100 vcodec=libtheora minrate=0 b=600k s=%widthx%height aspect=%dar" />
|
||||
<profile name="Theora 800k" args="acodec=vorbis ab=128k ar=44100 vcodec=libtheora minrate=0 b=800k s=%widthx%height aspect=%dar" />
|
||||
<profile name="Theora 1000k" args="acodec=vorbis ab=128k ar=44100 vcodec=libtheora minrate=0 b=1000k s=%widthx%height aspect=%dar" />
|
||||
<profile name="Theora 2000k" args="acodec=vorbis ab=128k ar=44100 vcodec=libtheora minrate=0 b=2000k s=%widthx%height aspect=%dar" />
|
||||
<profile name="Theora 4000k" args="acodec=vorbis ab=128k ar=44100 vcodec=libtheora minrate=0 b=4000k s=%widthx%height aspect=%dar" />
|
||||
<profile name="Theora 6000k" args="acodec=vorbis ab=128k ar=44100 vcodec=libtheora minrate=0 b=6000k s=%widthx%height aspect=%dar" />
|
||||
<profile name="Theora 8000k" args="acodec=vorbis ab=128k ar=44100 vcodec=libtheora minrate=0 b=8000k s=%widthx%height aspect=%dar" />
|
||||
<profile name="Theora 10000k" args="acodec=vorbis ab=128k ar=44100 vcodec=libtheora minrate=0 b=10000k s=%widthx%height aspect=%dar" />
|
||||
<profile name="Theora 12000k" args="acodec=vorbis ab=128k ar=44100 vcodec=libtheora minrate=0 b=12000k s=%widthx%height aspect=%dar" />
|
||||
<profile name="Theora 200k" args="acodec=vorbis ab=128k ar=44100 vcodec=libtheora minrate=0 b=200k aspect=%dar" />
|
||||
<profile name="Theora 400k" args="acodec=vorbis ab=128k ar=44100 vcodec=libtheora minrate=0 b=400k aspect=%dar" />
|
||||
<profile name="Theora 600k" args="acodec=vorbis ab=128k ar=44100 vcodec=libtheora minrate=0 b=600k aspect=%dar" />
|
||||
<profile name="Theora 800k" args="acodec=vorbis ab=128k ar=44100 vcodec=libtheora minrate=0 b=800k aspect=%dar" />
|
||||
<profile name="Theora 1000k" args="acodec=vorbis ab=128k ar=44100 vcodec=libtheora minrate=0 b=1000k aspect=%dar" />
|
||||
<profile name="Theora 2000k" args="acodec=vorbis ab=128k ar=44100 vcodec=libtheora minrate=0 b=2000k aspect=%dar" />
|
||||
<profile name="Theora 4000k" args="acodec=vorbis ab=128k ar=44100 vcodec=libtheora minrate=0 b=4000k aspect=%dar" />
|
||||
<profile name="Theora 6000k" args="acodec=vorbis ab=128k ar=44100 vcodec=libtheora minrate=0 b=6000k aspect=%dar" />
|
||||
<profile name="Theora 8000k" args="acodec=vorbis ab=128k ar=44100 vcodec=libtheora minrate=0 b=8000k aspect=%dar" />
|
||||
<profile name="Theora 10000k" args="acodec=vorbis ab=128k ar=44100 vcodec=libtheora minrate=0 b=10000k aspect=%dar" />
|
||||
<profile name="Theora 12000k" args="acodec=vorbis ab=128k ar=44100 vcodec=libtheora minrate=0 b=12000k aspect=%dar" />
|
||||
<profile name="Theora 720x576" standard="PAL" args="acodec=vorbis ab=128k ar=44100 vcodec=libtheora minrate=0 b=12000k s=720x576 aspect=%dar" />
|
||||
<profile name="Theora 720x480" standard="NTSC" args="acodec=vorbis ab=128k ar=44100 vcodec=libtheora minrate=0 b=12000k s=720x480 aspect=%dar" />
|
||||
</group>
|
||||
|
||||
<group name="Mpeg2ts" renderer="avformat" extension="m2t" type="av">
|
||||
<profile name="Mpeg2ts 200k" args="f=mpegts acodec=mp2 ab=384k ar=48000 vcodec=mpeg2video minrate=0 b=200k s=%widthx%height aspect=%dar" />
|
||||
<profile name="Mpeg2ts 400k" args="f=mpegts acodec=mp2 ab=384k ar=48000 vcodec=mpeg2video minrate=0 b=400k s=%widthx%height aspect=%dar" />
|
||||
<profile name="Mpeg2ts 600k" args="f=mpegts acodec=mp2 ab=384k ar=48000 vcodec=mpeg2video minrate=0 b=600k s=%widthx%height aspect=%dar" />
|
||||
<profile name="Mpeg2ts 800k" args="f=mpegts acodec=mp2 ab=384k ar=48000 vcodec=mpeg2video minrate=0 b=800k s=%widthx%height aspect=%dar" />
|
||||
<profile name="Mpeg2ts 1000k" args="f=mpegts acodec=mp2 ab=384k ar=48000 vcodec=mpeg2video minrate=0 b=1000k s=%widthx%height aspect=%dar" />
|
||||
<profile name="Mpeg2ts 2000k" args="f=mpegts acodec=mp2 ab=384k ar=48000 vcodec=mpeg2video minrate=0 b=2000k s=%widthx%height aspect=%dar" />
|
||||
<profile name="Mpeg2ts 4000k" args="f=mpegts acodec=mp2 ab=384k ar=48000 vcodec=mpeg2video minrate=0 b=4000k s=%widthx%height aspect=%dar" />
|
||||
<profile name="Mpeg2ts 6000k" args="f=mpegts acodec=mp2 ab=384k ar=48000 vcodec=mpeg2video minrate=0 b=6000k s=%widthx%height aspect=%dar" />
|
||||
<profile name="Mpeg2ts 8000k" args="f=mpegts acodec=mp2 ab=384k ar=48000 vcodec=mpeg2video minrate=0 b=8000k s=%widthx%height aspect=%dar" />
|
||||
<profile name="Mpeg2ts 1000k" args="f=mpegts acodec=mp2 ab=384k ar=48000 vcodec=mpeg2video minrate=0 b=10000k s=%widthx%height aspect=%dar" />
|
||||
<profile name="Mpeg2ts 12000k" args="f=mpegts acodec=mp2 ab=384k ar=48000 vcodec=mpeg2video minrate=0 b=12000k s=%widthx%height aspect=%dar" />
|
||||
<profile name="Mpeg2ts 18000k" args="f=mpegts acodec=mp2 ab=384k ar=48000 vcodec=mpeg2video minrate=0 b=18000k s=%widthx%height aspect=%dar" />
|
||||
<profile name="Mpeg2ts 720x576" standard="PAL" args="f=mpegts acodec=mp2 ab=384k ar=48000 vcodec=mpeg2video minrate=0 b=12000k s=720x576 aspect=%dar" />
|
||||
<profile name="Mpeg2ts 720x480" standard="NTSC" args="f=mpegts acodec=mp2 ab=384k ar=48000 vcodec=mpeg2video minrate=0 b=12000k s=720x480 aspect=%dar" />
|
||||
<group name="Media players" renderer="avformat" type="av">
|
||||
<groupname id="mediaplayers">Media players</groupname>
|
||||
<profile name="Windows Media Player wmv7 400k" extension="avi" args="acodec=libmp3lame ab=128k ar=48000 ac=2 vcodec=wmv1 minrate=0 b=400k aspect=%dar" />
|
||||
<profile name="Windows Media Player wmv7 1000k" extension="avi" args="acodec=libmp3lame ab=128k ar=48000 ac=2 vcodec=wmv1 minrate=0 b=1000k aspect=%dar" />
|
||||
<profile name="Windows Media Player wmv7 2000k" extension="avi" args="acodec=libmp3lame ab=128k ar=48000 ac=2 vcodec=wmv1 minrate=0 b=2000k aspect=%dar" />
|
||||
<profile name="Apple Quicktime Player Mpeg4 400k" extension="mov" args="acodec=libfaac ab=128k ac=2 ar=48000 vcodec=mpeg4 minrate=0 b=400k aspect=%dar" />
|
||||
<profile name="Apple Quicktime Player Mpeg4 1000k" extension="mov" args="acodec=libfaac ab=128k ac=2 ar=48000 vcodec=mpeg4 minrate=0 b=2000k aspect=%dar" />
|
||||
<profile name="Apple Quicktime Player Mpeg4 2000k" extension="mov" args="acodec=libfaac ab=128k ac=2 ar=48000 vcodec=mpeg4 minrate=0 b=2000k aspect=%dar" />
|
||||
</group>
|
||||
|
||||
<group name="Web sites" renderer="avformat" type="av">
|
||||
<groupname id="websites">Web sites</groupname>
|
||||
<profile name="Dailymotion 320x240" extension="flv" args="f=flv acodec=libmp3lame ab=128k ar=44100 vcodec=flv minrate=0 b=800k s=320x240 aspect=%dar trellis=1" url="http://www.dailymotion.com/upload" />
|
||||
<profile name="Dailymotion 512x384" extension="mp4" args="f=mp4 acodec=libfaac ab=96k ar=44100 vcodec=libx264 minrate=0 b=600k s=512x384 aspect=%dar mbd=2 trellis=1 mv4=1" url="http://www.dailymotion.com/upload" />
|
||||
<profile name="Dailymotion 1280x720" extension="mp4" args="f=mp4 acodec=libfaac ab=96k ar=44100 vcodec=libx264 minrate=0 b=1500k s=1280x720 aspect=%dar mbd=2 trellis=1 mv4=1" url="http://www.dailymotion.com/upload" />
|
||||
<profile name="Vimeo 640x480" extension="mp4" args="f=mp4 acodec=libfaac ab=128k ar=44100 vcodec=libx264 minrate=0 b=3000k s=640x480 aspect=%dar mbd=2 trellis=1 mv4=1" url="http://www.vimeo.com/upload" />
|
||||
<profile name="Vimeo 1280x720" extension="mp4" args="f=mp4 acodec=libfaac ab=128k ar=44100 vcodec=libx264 minrate=0 b=5000k s=1280x720 aspect=%dar mbd=2 trellis=1 mv4=1" url="http://www.vimeo.com/upload" />
|
||||
<profile name="Youtube 640x480" extension="mp4" args="f=mp4 acodec=libmp3lame ab=128k ar=44100 vcodec=mpeg4 minrate=0 b=800k s=640x480 aspect=%dar mbd=2 trellis=1 mv4=1" url="http://www.youtube.com/upload" />
|
||||
<profile name="Youtube 1290x720" extension="mp4" args="f=mp4 hq=1 acodec=libfaac ab=128k ar=41100 vcodec=mpeg4 minrate=0 b=2000k s=1290x720 aspect=%dar mbd=2 trellis=1 mv4=1" url="http://www.youtube.com/upload" />
|
||||
|
||||
</group>
|
||||
|
||||
|
||||
<group name="Wav" renderer="avformat" type="audio">
|
||||
<profile name="22050" extension="wav" args="f=wav ar=22050" />
|
||||
<profile name="32000" extension="wav" args="f=wav ar=32000" />
|
||||
<profile name="44100" extension="wav" args="f=wav ar=44100" />
|
||||
<profile name="48000" extension="wav" args="f=wav ar=48000" />
|
||||
<groupname id="audioonly">Audio only</groupname>
|
||||
<profile name="wav 22050" extension="wav" args="f=wav ar=22050" />
|
||||
<profile name="wav 32000" extension="wav" args="f=wav ar=32000" />
|
||||
<profile name="wav 44100" extension="wav" args="f=wav ar=44100" />
|
||||
<profile name="wav 48000" extension="wav" args="f=wav ar=48000" />
|
||||
</group>
|
||||
|
||||
<group name="Lossless" renderer="avformat" type="av">
|
||||
<profile name="ffv1 (video) + flac (sound)" extension="avi" args="f=avi acodec=flac acodec=flac ar=48000 ab=1024k vcodec=ffv1 qscale=255 aspect=%dar" />
|
||||
<profile name="huffyuv (video) + pcm_s16le (sound)" extension="avi" args="f=avi acodec=pcm_s16le vcodec=huffyuv aspect=%dar" />
|
||||
|
||||
<group name="Lossless/HQ" renderer="avformat" type="av">
|
||||
<groupname id="lossless">Lossless / HQ</groupname>
|
||||
<profile name="ffv1 lossless (video) + flac (sound)" extension="mp4" args="f=mp4 acodec=flac acodec=flac ar=48000 ab=1024k ac=2 vcodec=ffv1 qscale=1 aspect=%dar" />
|
||||
<profile name="huffyuv lossless (video) + pcm_s16le (sound)" extension="avi" args="f=avi acodec=pcm_s16le ac=2 vcodec=huffyuv aspect=%dar" />
|
||||
<profile name="MPEG-2 I-frame only (video) + mp2 (sound)" extension="mpg" args="f=mpeg acodec=mp2 ab=384k ar=48000 ac=2 vcodec=mpeg2video qscale=1 qmin=1 aspect=%dar intra=1" />
|
||||
<profile name="MPEG-4 I-frame only (video) + mp3 (sound)" extension="mp4" args="f=mp4 acodec=libmp3lame ab=384k ar=48000 ac=2 vcodec=mpeg4 qscale=1 qmin=1 aspect=%dar intra=1" />
|
||||
<profile name="H.264 I-frame only (video) + aac (sound)" extension="mp4" args="f=mp4 acodec=libfaac ab=384k ar=48000 ac=2 pix_fmt=yuv420p vcodec=libx264 cqp=1 coder=ac trellis=1 aspect=%dar intra=1" />
|
||||
<profile name="H.264 lossless fast (video) + aac (sound)" extension="mp4" args="f=mp4 acodec=libfaac ab=384k ar=48000 ac=2 pix_fmt=yuv420p vcodec=libx264 cqp=0 me_method=esa subq=8 coder=ac partitions=+parti4x4+parti8x8+partp4x4+partp8x8+partb8x8 refs=16 flags2=+dct8x8+mixed_refs trellis=1 aspect=%dar" />
|
||||
<profile name="H.264 lossless slow (video) + aac (sound)" extension="mp4" args="f=mp4 acodec=libfaac ab=384k ar=48000 ac=2 pix_fmt=yuv420p vcodec=libx264 cqp=0 me_method=dia subq=1 partitions=-parti4x4-parti8x8-partp4x4-partp8x8-partb8x8 trellis=1 aspect=%dar" />
|
||||
</group>
|
||||
</profiles>
|
||||
|
||||
|
||||
BIN
icons/hisc-action-kdenlive-spacer-tool.svgz
Normal file
BIN
icons/hisc-action-kdenlive-spacer-tool.svgz
Normal file
Binary file not shown.
BIN
icons/oxsc-action-kdenlive-spacer-tool.svgz
Normal file
BIN
icons/oxsc-action-kdenlive-spacer-tool.svgz
Normal file
Binary file not shown.
132
kdenlive.spec
132
kdenlive.spec
@@ -9,11 +9,12 @@ URL: http://www.kdenlive.org/
|
||||
Source0: kdenlive-%{version}.tar.bz2
|
||||
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
|
||||
|
||||
BuildRequires: mlt-dev, mlt++-dev, libavformat-dev, libsdl-dev, kdelibs4-dev, libqt4-dev
|
||||
Requires: kdelibs4
|
||||
BuildRequires: mlt, mlt++, soprano-devel
|
||||
Requires: kdebase
|
||||
|
||||
%description
|
||||
Kdenlive is a non-linear video editor for GNU/Linux, which supports DV, HDV and AVCHD(not complete yet) editing.
|
||||
Kdenlive is a non-linear video editor for GNU/Linux, which supports
|
||||
DV, HDV and AVCHD(not complete yet) editing.
|
||||
|
||||
%prep
|
||||
%setup -q
|
||||
@@ -38,119 +39,16 @@ rm -rf $RPM_BUILD_ROOT
|
||||
%doc
|
||||
|
||||
%{_bindir}/kdenlive
|
||||
/usr/bin/kdenlive
|
||||
/usr/share/apps/kdenlive/kdenliveui.rc
|
||||
/usr/share/apps/kdenlive/kdenlive.notifyrc
|
||||
/usr/share/config.kcfg/kdenlivesettings.kcfg
|
||||
/usr/share/applications/kde/kdenlive.desktop
|
||||
/usr/share/icons/oxygen/scalable/mimetypes/application-x-kdenlive.svgz
|
||||
/usr/share/icons/oxygen/scalable/mimetypes/video-mlt-playlist.svgz
|
||||
/usr/share/icons/oxygen/64x64/apps/./kdenlive.png
|
||||
/usr/share/icons/oxygen/48x48/apps/./kdenlive.png
|
||||
/usr/share/icons/oxygen/32x32/apps/./kdenlive.png
|
||||
/usr/share/icons/hicolor/64x64/apps/./kdenlive.png
|
||||
/usr/share/icons/hicolor/48x48/apps/./kdenlive.png
|
||||
/usr/share/icons/hicolor/32x32/apps/./kdenlive.png
|
||||
/usr/share/mime/packages/kdenlive.xml
|
||||
/usr/share/mime/packages/westley.xml
|
||||
/usr/bin/kdenlive_render
|
||||
/usr/lib/kde4/westleypreview.so
|
||||
/usr/share/kde4/services/westleypreview.desktop
|
||||
/usr/share/apps/kdenlive/effects/automask.xml
|
||||
/usr/share/apps/kdenlive/effects/boxblur.xml
|
||||
/usr/share/apps/kdenlive/effects/brightness.xml
|
||||
/usr/share/apps/kdenlive/effects/charcoal.xml
|
||||
/usr/share/apps/kdenlive/effects/chroma_hold.xml
|
||||
/usr/share/apps/kdenlive/effects/chroma.xml
|
||||
/usr/share/apps/kdenlive/effects/freeze.xml
|
||||
/usr/share/apps/kdenlive/effects/gamma.xml
|
||||
/usr/share/apps/kdenlive/effects/greyscale.xml
|
||||
/usr/share/apps/kdenlive/effects/invert.xml
|
||||
/usr/share/apps/kdenlive/effects/ladspa_declipper.xml
|
||||
/usr/share/apps/kdenlive/effects/ladspa_equalizer.xml
|
||||
/usr/share/apps/kdenlive/effects/ladspa_limiter.xml
|
||||
/usr/share/apps/kdenlive/effects/ladspa_phaser.xml
|
||||
/usr/share/apps/kdenlive/effects/ladspa_pitch_scale.xml
|
||||
/usr/share/apps/kdenlive/effects/ladspa_pitch.xml
|
||||
/usr/share/apps/kdenlive/effects/ladspa_rate_scale.xml
|
||||
/usr/share/apps/kdenlive/effects/ladspa_reverb.xml
|
||||
/usr/share/apps/kdenlive/effects/ladspa_room_reverb.xml
|
||||
/usr/share/apps/kdenlive/effects/ladspa_vinyl.xml
|
||||
/usr/share/apps/kdenlive/effects/mirror.xml
|
||||
/usr/share/apps/kdenlive/effects/mute.xml
|
||||
/usr/share/apps/kdenlive/effects/normalise.xml
|
||||
/usr/share/apps/kdenlive/effects/obscure.xml
|
||||
/usr/share/apps/kdenlive/effects/rotation.xml
|
||||
/usr/share/apps/kdenlive/effects/sepia.xml
|
||||
/usr/share/apps/kdenlive/effects/sox_echo.xml
|
||||
/usr/share/apps/kdenlive/effects/sox_flanger.xml
|
||||
/usr/share/apps/kdenlive/effects/sox_pitch.xml
|
||||
/usr/share/apps/kdenlive/effects/sox_reverb.xml
|
||||
/usr/share/apps/kdenlive/effects/sox_vibro.xml
|
||||
/usr/share/apps/kdenlive/effects/threshold.xml
|
||||
/usr/share/apps/kdenlive/effects/volume.xml
|
||||
/usr/share/apps/kdenlive/effects/wave.xml
|
||||
/usr/share/apps/kdenlive/effects/fadein.xml
|
||||
/usr/share/apps/kdenlive/effects/fadeout.xml
|
||||
/usr/share/apps/kdenlive/effects/frei0r_squareblur.xml
|
||||
/usr/share/apps/kdenlive/effects/frei0r_distort0r.xml
|
||||
/usr/share/apps/kdenlive/export/profiles.xml
|
||||
/usr/share/apps/kdenlive/icons/hicolor/16x16/actions/./kdenlive-add-clip.png
|
||||
/usr/share/apps/kdenlive/icons/hicolor/22x22/actions/./kdenlive-add-clip.png
|
||||
/usr/share/apps/kdenlive/icons/hicolor/32x32/actions/./kdenlive-add-clip.png
|
||||
/usr/share/apps/kdenlive/icons/hicolor/16x16/actions/./kdenlive-add-color-clip.png
|
||||
/usr/share/apps/kdenlive/icons/hicolor/16x16/actions/./kdenlive-add-text-clip.png
|
||||
/usr/share/apps/kdenlive/icons/hicolor/16x16/actions/./kdenlive-add-slide-clip.png
|
||||
/usr/share/apps/kdenlive/icons/hicolor/16x16/actions/./kdenlive-show-video.png
|
||||
/usr/share/apps/kdenlive/icons/hicolor/16x16/actions/./kdenlive-show-audio.png
|
||||
/usr/share/apps/kdenlive/icons/hicolor/16x16/actions/./kdenlive-show-videothumb.png
|
||||
/usr/share/apps/kdenlive/icons/hicolor/16x16/actions/./kdenlive-show-audiothumb.png
|
||||
/usr/share/apps/kdenlive/icons/hicolor/16x16/actions/./kdenlive-show-markers.png
|
||||
/usr/share/apps/kdenlive/icons/hicolor/16x16/actions/./kdenlive-snap.png
|
||||
/usr/share/apps/kdenlive/icons/hicolor/16x16/actions/./kdenlive-insert-rect.png
|
||||
/usr/share/apps/kdenlive/icons/hicolor/16x16/actions/./kdenlive-align-vert.png
|
||||
/usr/share/apps/kdenlive/icons/hicolor/16x16/actions/./kdenlive-align-hor.png
|
||||
/usr/share/apps/kdenlive/icons/hicolor/16x16/actions/./kdenlive-hide-video.png
|
||||
/usr/share/apps/kdenlive/icons/hicolor/16x16/actions/./kdenlive-hide-audio.png
|
||||
/usr/share/apps/kdenlive/icons/oxygen/16x16/actions/./kdenlive-snap.png
|
||||
/usr/share/apps/kdenlive/icons/oxygen/16x16/actions/./kdenlive-show-videothumb.png
|
||||
/usr/share/apps/kdenlive/icons/oxygen/16x16/actions/./kdenlive-show-video.png
|
||||
/usr/share/apps/kdenlive/icons/oxygen/16x16/actions/./kdenlive-show-markers.png
|
||||
/usr/share/apps/kdenlive/icons/oxygen/16x16/actions/./kdenlive-show-audiothumb.png
|
||||
/usr/share/apps/kdenlive/icons/oxygen/16x16/actions/./kdenlive-show-audio.png
|
||||
/usr/share/apps/kdenlive/icons/oxygen/16x16/actions/./kdenlive-insert-rect.png
|
||||
/usr/share/apps/kdenlive/icons/oxygen/16x16/actions/./kdenlive-hide-video.png
|
||||
/usr/share/apps/kdenlive/icons/oxygen/16x16/actions/./kdenlive-hide-audio.png
|
||||
/usr/share/apps/kdenlive/icons/oxygen/16x16/actions/./kdenlive-align-vert.png
|
||||
/usr/share/apps/kdenlive/icons/oxygen/16x16/actions/./kdenlive-align-hor.png
|
||||
/usr/share/apps/kdenlive/icons/oxygen/16x16/actions/./kdenlive-add-text-clip.png
|
||||
/usr/share/apps/kdenlive/icons/oxygen/16x16/actions/./kdenlive-add-slide-clip.png
|
||||
/usr/share/apps/kdenlive/icons/oxygen/16x16/actions/./kdenlive-add-color-clip.png
|
||||
/usr/share/apps/kdenlive/icons/oxygen/16x16/actions/./kdenlive-add-clip.png
|
||||
/usr/share/apps/kdenlive/icons/hicolor/scalable/actions/./kdenlive-select-tool.svgz
|
||||
/usr/share/apps/kdenlive/icons/hicolor/scalable/actions/./kdenlive-add-clip.svgz
|
||||
/usr/share/apps/kdenlive/icons/hicolor/scalable/actions/./kdenlive-zone-end.svgz
|
||||
/usr/share/apps/kdenlive/icons/hicolor/scalable/actions/./kdenlive-zone-start.svgz
|
||||
/usr/share/apps/kdenlive/icons/oxygen/scalable/actions/./kdenlive-zone-start.svgz
|
||||
/usr/share/apps/kdenlive/icons/oxygen/scalable/actions/./kdenlive-zone-end.svgz
|
||||
/usr/share/apps/kdenlive/icons/oxygen/scalable/actions/./kdenlive-select-tool.svgz
|
||||
/usr/share/apps/kdenlive/banner.png
|
||||
/usr/share/apps/kdenlive/timeline_nothumbs.png
|
||||
/usr/share/apps/kdenlive/timeline_athumbs.png
|
||||
/usr/share/apps/kdenlive/timeline_vthumbs.png
|
||||
/usr/share/apps/kdenlive/timeline_avthumbs.png
|
||||
/usr/share/apps/kdenlive/transition.png
|
||||
/usr/share/apps/kdenlive/metadata.properties
|
||||
/usr/share/apps/kdenlive/blacklisted_effects.txt
|
||||
/usr/share/apps/kdenlive/blacklisted_transitions.txt
|
||||
/usr/share/locale/it/LC_MESSAGES/kdenlive.mo
|
||||
/usr/share/locale/ca/LC_MESSAGES/kdenlive.mo
|
||||
/usr/share/locale/cs/LC_MESSAGES/kdenlive.mo
|
||||
/usr/share/locale/da/LC_MESSAGES/kdenlive.mo
|
||||
/usr/share/locale/de/LC_MESSAGES/kdenlive.mo
|
||||
/usr/share/locale/es/LC_MESSAGES/kdenlive.mo
|
||||
/usr/share/locale/fr/LC_MESSAGES/kdenlive.mo
|
||||
/usr/share/locale/nl/LC_MESSAGES/kdenlive.mo
|
||||
/usr/share/locale/zh/LC_MESSAGES/kdenlive.mo
|
||||
/usr/bin/kdenlive_render
|
||||
/usr/lib/kde4/westleypreview.so
|
||||
/usr/share/applications/kde/kdenlive.desktop
|
||||
/usr/share/config.kcfg/kdenlivesettings.kcfg
|
||||
/usr/share/icons/oxygen/scalable/mimetypes/application-x-kdenlive.svgz
|
||||
/usr/share/icons/oxygen/scalable/mimetypes/video-mlt-playlist.svgz
|
||||
/usr/share/kde4/apps/kdenlive/*
|
||||
/usr/share/kde4/services/westleypreview.desktop
|
||||
/usr/share/locale/*/LC_MESSAGES/kdenlive.mo
|
||||
/usr/share/mime/packages/kdenlive.xml
|
||||
/usr/share/mime/packages/westley.xml
|
||||
|
||||
%changelog
|
||||
|
||||
22
lumas/CMakeLists.txt
Normal file
22
lumas/CMakeLists.txt
Normal file
@@ -0,0 +1,22 @@
|
||||
INSTALL(FILES
|
||||
bi-linear_x.pgm
|
||||
bi-linear_y.pgm
|
||||
burst.pgm
|
||||
checkerboard_small.pgm
|
||||
clock.pgm
|
||||
cloud.pgm
|
||||
curtain.pgm
|
||||
horizontal_blinds.pgm
|
||||
linear_x.pgm
|
||||
linear_y.pgm
|
||||
radial-bars.pgm
|
||||
radial.pgm
|
||||
spiral.pgm
|
||||
spiral2.pgm
|
||||
square.pgm
|
||||
square2-bars.pgm
|
||||
square2.pgm
|
||||
symmetric_clock.pgm
|
||||
|
||||
DESTINATION ${DATA_INSTALL_DIR}/kdenlive/lumas)
|
||||
|
||||
BIN
lumas/bi-linear_x.pgm
Normal file
BIN
lumas/bi-linear_x.pgm
Normal file
Binary file not shown.
1445
lumas/bi-linear_y.pgm
Normal file
1445
lumas/bi-linear_y.pgm
Normal file
File diff suppressed because one or more lines are too long
5
lumas/burst.pgm
Executable file
5
lumas/burst.pgm
Executable file
File diff suppressed because one or more lines are too long
5005
lumas/checkerboard_small.pgm
Executable file
5005
lumas/checkerboard_small.pgm
Executable file
File diff suppressed because one or more lines are too long
BIN
lumas/clock.pgm
Normal file
BIN
lumas/clock.pgm
Normal file
Binary file not shown.
1379
lumas/cloud.pgm
Normal file
1379
lumas/cloud.pgm
Normal file
File diff suppressed because one or more lines are too long
1213
lumas/curtain.pgm
Normal file
1213
lumas/curtain.pgm
Normal file
File diff suppressed because one or more lines are too long
BIN
lumas/horizontal_blinds.pgm
Executable file
BIN
lumas/horizontal_blinds.pgm
Executable file
Binary file not shown.
BIN
lumas/linear_x.pgm
Normal file
BIN
lumas/linear_x.pgm
Normal file
Binary file not shown.
BIN
lumas/linear_y.pgm
Normal file
BIN
lumas/linear_y.pgm
Normal file
Binary file not shown.
BIN
lumas/radial-bars.pgm
Normal file
BIN
lumas/radial-bars.pgm
Normal file
Binary file not shown.
209
lumas/radial.pgm
Normal file
209
lumas/radial.pgm
Normal file
File diff suppressed because one or more lines are too long
5
lumas/spiral.pgm
Normal file
5
lumas/spiral.pgm
Normal file
File diff suppressed because one or more lines are too long
5
lumas/spiral2.pgm
Normal file
5
lumas/spiral2.pgm
Normal file
File diff suppressed because one or more lines are too long
125
lumas/square.pgm
Normal file
125
lumas/square.pgm
Normal file
File diff suppressed because one or more lines are too long
BIN
lumas/square2-bars.pgm
Normal file
BIN
lumas/square2-bars.pgm
Normal file
Binary file not shown.
389
lumas/square2.pgm
Normal file
389
lumas/square2.pgm
Normal file
File diff suppressed because one or more lines are too long
BIN
lumas/symmetric_clock.pgm
Executable file
BIN
lumas/symmetric_clock.pgm
Executable file
Binary file not shown.
1
man/CMakeLists.txt
Normal file
1
man/CMakeLists.txt
Normal file
@@ -0,0 +1 @@
|
||||
install(FILES kdenlive.1 kdenlive_render.1 DESTINATION ${MAN_INSTALL_DIR}/man1 )
|
||||
149
man/kdenlive.1
Normal file
149
man/kdenlive.1
Normal file
@@ -0,0 +1,149 @@
|
||||
.\" This file was generated by kdemangen.pl
|
||||
.TH KDENLIVE 1 "Nov 2008" "K Desktop Environment" "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.
|
||||
.SH OPTIONS
|
||||
.SS
|
||||
.SS Arguments:
|
||||
.TP
|
||||
.B file
|
||||
Document to open
|
||||
.SS Options:
|
||||
.TP
|
||||
.B \-\-mlt\-path <path>
|
||||
Set the path for MLT environnement
|
||||
.SS
|
||||
.SS Generic options:
|
||||
.TP
|
||||
.B \-\-help
|
||||
Show help about options
|
||||
.TP
|
||||
.B \-\-help\-qt
|
||||
Show Qt specific options
|
||||
.TP
|
||||
.B \-\-help\-kde
|
||||
Show KDE specific options
|
||||
.TP
|
||||
.B \-\-help\-all
|
||||
Show all options
|
||||
.TP
|
||||
.B \-\-author
|
||||
Show author information
|
||||
.TP
|
||||
.B \-v, \-\-version
|
||||
Show version information
|
||||
.TP
|
||||
.B \-\-license
|
||||
Show license information
|
||||
.TP
|
||||
.B \-\-
|
||||
End of options
|
||||
.SS
|
||||
.SS KDE options:
|
||||
.TP
|
||||
.B \-\-caption <caption>
|
||||
Use 'caption' as name in the titlebar
|
||||
.TP
|
||||
.B \-\-icon <icon>
|
||||
Use 'icon' as the application icon
|
||||
.TP
|
||||
.B \-\-config <filename>
|
||||
Use alternative configuration file
|
||||
.TP
|
||||
.B \-\-nocrashhandler
|
||||
Disable crash handler, to get core dumps
|
||||
.TP
|
||||
.B \-\-waitforwm
|
||||
Waits for a WM_NET compatible windowmanager
|
||||
.TP
|
||||
.B \-\-style <style>
|
||||
sets the application GUI style
|
||||
.TP
|
||||
.B \-\-geometry <geometry>
|
||||
sets the client geometry of the main widget \- see man X for the argument format
|
||||
.SS
|
||||
.SS Qt options:
|
||||
.TP
|
||||
.B \-\-display <displayname>
|
||||
Use the X\-server display 'displayname'
|
||||
.TP
|
||||
.B \-\-session <sessionId>
|
||||
Restore the application for the given 'sessionId'
|
||||
.TP
|
||||
.B \-\-cmap
|
||||
Causes the application to install a private color
|
||||
map on an 8\-bit display
|
||||
.TP
|
||||
.B \-\-ncols <count>
|
||||
Limits the number of colors allocated in the color
|
||||
cube on an 8\-bit display, if the application is
|
||||
using the QApplication::ManyColor color
|
||||
specification
|
||||
.TP
|
||||
.B \-\-nograb
|
||||
tells Qt to never grab the mouse or the keyboard
|
||||
.TP
|
||||
.B \-\-dograb
|
||||
running under a debugger can cause an implicit
|
||||
\-nograb, use \-dograb to override
|
||||
.TP
|
||||
.B \-\-sync
|
||||
switches to synchronous mode for debugging
|
||||
.TP
|
||||
.B \-\-fn, \-\-font <fontname>
|
||||
defines the application font
|
||||
.TP
|
||||
.B \-\-bg, \-\-background <color>
|
||||
sets the default background color and an
|
||||
application palette (light and dark shades are
|
||||
calculated)
|
||||
.TP
|
||||
.B \-\-fg, \-\-foreground <color>
|
||||
sets the default foreground color
|
||||
.TP
|
||||
.B \-\-btn, \-\-button <color>
|
||||
sets the default button color
|
||||
.TP
|
||||
.B \-\-name <name>
|
||||
sets the application name
|
||||
.TP
|
||||
.B \-\-title <title>
|
||||
sets the application title (caption)
|
||||
.TP
|
||||
.B \-\-visual TrueColor
|
||||
forces the application to use a TrueColor visual on
|
||||
an 8\-bit display
|
||||
.TP
|
||||
.B \-\-inputstyle <inputstyle>
|
||||
sets XIM (X Input Method) input style. Possible
|
||||
values are onthespot, overthespot, offthespot and
|
||||
root
|
||||
.TP
|
||||
.B \-\-im <XIM server>
|
||||
set XIM server
|
||||
.TP
|
||||
.B \-\-noxim
|
||||
disable XIM
|
||||
.TP
|
||||
.B \-\-reverse
|
||||
mirrors the whole layout of widgets
|
||||
.TP
|
||||
.B \-\-stylesheet
|
||||
<file.qss> applies the Qt stylesheet to the application widgets
|
||||
.SS
|
||||
|
||||
.SH SEE ALSO
|
||||
Please see the homepage at
|
||||
.BR http://www.kdenlive.org/
|
||||
.br
|
||||
.SH AUTHORS
|
||||
.nf
|
||||
Jean\-Baptiste Mardelle <jb@kdenlive.org>
|
||||
.br
|
||||
Marco Gittler <g.marco@freenet.de>
|
||||
.br
|
||||
55
man/kdenlive_render.1
Normal file
55
man/kdenlive_render.1
Normal file
@@ -0,0 +1,55 @@
|
||||
.\" This file was generated by kdemangen.pl
|
||||
.TH KDENLIVE_RENDER 1 "Dec 2008" "K Desktop Environment" "Render program for Kdenlive."
|
||||
.SH NAME
|
||||
kdenlive_render
|
||||
\- Render program for Kdenlive.
|
||||
.SH SYNOPSIS
|
||||
kdenlive_render [\-erase] [in=pos] [out=pos] [render] [profile] [rendermodule] [player] [src] [dest] [[arg1] [arg2] ...]
|
||||
.SH DESCRIPTION
|
||||
Render program for Kdenlive. Renders kdenlive project detached from Kdenlive, while providing feedback through kuiserver. This program is not meant to be called directly by users, but is called from Kdenlive, when a rendering process is started.
|
||||
.SH OPTIONS
|
||||
.SS
|
||||
.SS Options:
|
||||
.TP
|
||||
.B \-erase
|
||||
If present, src file will be erased after rendering
|
||||
.TP
|
||||
.B in=pos
|
||||
Start rendering at frame pos
|
||||
.TP
|
||||
.B out=pos
|
||||
End rendering at frame pos
|
||||
.TP
|
||||
.B render
|
||||
Path to MLT inigo render program
|
||||
.TP
|
||||
.B profile
|
||||
The MLT video profile
|
||||
.TP
|
||||
.B rendermodule
|
||||
The MLT consumer used for rendering, usually it is avformat
|
||||
.TP
|
||||
.B player
|
||||
Path to video player to play when rendering is over, use '\-' to disable playing
|
||||
.TP
|
||||
.B src
|
||||
Source file \- usually MLT Westley playlist
|
||||
.TP
|
||||
.B dest
|
||||
Destination file
|
||||
.TP
|
||||
.B args
|
||||
Space separated libavformat arguments
|
||||
.SS
|
||||
|
||||
.SH SEE ALSO
|
||||
Please see the homepage at
|
||||
.BR http://www.kdenlive.org/
|
||||
.br
|
||||
.SH AUTHORS
|
||||
.nf
|
||||
Jean\-Baptiste Mardelle <jb@kdenlive.org>
|
||||
.br
|
||||
Marco Gittler <g.marco@freenet.de>
|
||||
.br
|
||||
|
||||
7
plugins/CMakeLists.txt
Normal file
7
plugins/CMakeLists.txt
Normal file
@@ -0,0 +1,7 @@
|
||||
|
||||
INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/src
|
||||
${KDE4_INCLUDES}
|
||||
${QT4_INCLUDES}
|
||||
)
|
||||
|
||||
ADD_SUBDIRECTORY(sampleplugin)
|
||||
27
plugins/sampleplugin/CMakeLists.txt
Normal file
27
plugins/sampleplugin/CMakeLists.txt
Normal file
@@ -0,0 +1,27 @@
|
||||
|
||||
include_directories (
|
||||
${CMAKE_SOURCE_DIR}
|
||||
${CMAKE_BINARY_DIR}
|
||||
${CMAKE_CURRENT_BINARY_DIR}
|
||||
${KDE4_INCLUDES}
|
||||
)
|
||||
|
||||
add_definitions( ${KDE4_DEFINITIONS} )
|
||||
|
||||
#add_definitions (${QT_DEFINITIONS})
|
||||
ADD_DEFINITIONS(-DQT_PLUGIN)
|
||||
#ADD_DEFINITIONS(-DQT_NO_DEBUG)
|
||||
ADD_DEFINITIONS(-DQT_SHARED)
|
||||
|
||||
kde4_add_ui_files(plugin_UI countdown_ui.ui)
|
||||
|
||||
SET(sampleplugindir_SRCS
|
||||
sampleplugin.cpp)
|
||||
|
||||
KDE4_ADD_PLUGIN(kdenlive_sampleplugin WITH_PREFIX ${sampleplugindir_SRCS} ${plugin_UI})
|
||||
#ADD_LIBRARY(kdenlive_sampleplugin SHARED ${sampleplugindir_SRCS})
|
||||
|
||||
TARGET_LINK_LIBRARIES(kdenlive_sampleplugin ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} ${KDE4_KDEUI_LIBS} ${KDE4_KDECORE_LIBS} ${KDE4_KIO_LIBS})
|
||||
|
||||
INSTALL(TARGETS kdenlive_sampleplugin DESTINATION ${PLUGIN_INSTALL_DIR})
|
||||
|
||||
115
plugins/sampleplugin/countdown_ui.ui
Normal file
115
plugins/sampleplugin/countdown_ui.ui
Normal file
@@ -0,0 +1,115 @@
|
||||
<ui version="4.0" >
|
||||
<class>CountDown_UI</class>
|
||||
<widget class="QDialog" name="CountDown_UI" >
|
||||
<property name="geometry" >
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>288</width>
|
||||
<height>98</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle" >
|
||||
<string>Dialog</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout" >
|
||||
<item row="0" column="0" >
|
||||
<widget class="QLabel" name="label" >
|
||||
<property name="text" >
|
||||
<string>Save to</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="2" >
|
||||
<widget class="KUrlRequester" name="path" />
|
||||
</item>
|
||||
<item row="1" column="0" >
|
||||
<widget class="QLabel" name="label_2" >
|
||||
<property name="text" >
|
||||
<string>Duration (seconds)</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0" colspan="3" >
|
||||
<widget class="QDialogButtonBox" name="buttonBox" >
|
||||
<property name="orientation" >
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="standardButtons" >
|
||||
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0" >
|
||||
<spacer name="verticalSpacer" >
|
||||
<property name="orientation" >
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0" >
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="1" column="2" >
|
||||
<widget class="KIntSpinBox" name="duration" >
|
||||
<property name="maximum" >
|
||||
<number>10000</number>
|
||||
</property>
|
||||
<property name="value" >
|
||||
<number>10</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>KIntSpinBox</class>
|
||||
<extends>QSpinBox</extends>
|
||||
<header>knuminput.h</header>
|
||||
</customwidget>
|
||||
<customwidget>
|
||||
<class>KUrlRequester</class>
|
||||
<extends>QFrame</extends>
|
||||
<header>kurlrequester.h</header>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>accepted()</signal>
|
||||
<receiver>CountDown_UI</receiver>
|
||||
<slot>accept()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel" >
|
||||
<x>248</x>
|
||||
<y>254</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel" >
|
||||
<x>157</x>
|
||||
<y>274</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>rejected()</signal>
|
||||
<receiver>CountDown_UI</receiver>
|
||||
<slot>reject()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel" >
|
||||
<x>316</x>
|
||||
<y>260</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel" >
|
||||
<x>286</x>
|
||||
<y>274</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
</connections>
|
||||
</ui>
|
||||
94
plugins/sampleplugin/sampleplugin.cpp
Normal file
94
plugins/sampleplugin/sampleplugin.cpp
Normal file
@@ -0,0 +1,94 @@
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2009 by Jean-Baptiste Mardelle (jb@kdenlive.org) *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
|
||||
***************************************************************************/
|
||||
|
||||
|
||||
#include <QtGui>
|
||||
#include <QDialog>
|
||||
#include <QDomDocument>
|
||||
#include <QInputDialog>
|
||||
|
||||
#include <KUrlRequester>
|
||||
#include <KIntSpinBox>
|
||||
#include <KDebug>
|
||||
#include <KMessageBox>
|
||||
|
||||
#include "sampleplugin.h"
|
||||
#include "ui_countdown_ui.h"
|
||||
|
||||
QStringList SamplePlugin::generators() const {
|
||||
return QStringList() << i18n("Countdown") << i18n("Noise");
|
||||
}
|
||||
|
||||
|
||||
KUrl SamplePlugin::generatedClip(const QString &generator, const KUrl &projectFolder, const QStringList &lumaNames, const QStringList &lumaFiles, const double fps, const int width, const int height) {
|
||||
QString prePath;
|
||||
if (generator == i18n("Noise")) {
|
||||
prePath = projectFolder.path() + "/noise";
|
||||
} else prePath = projectFolder.path() + "/counter";
|
||||
int ct = 0;
|
||||
QString counter = QString::number(ct).rightJustified(5, '0', false);
|
||||
while (QFile::exists(prePath + counter + ".westley")) {
|
||||
ct++;
|
||||
counter = QString::number(ct).rightJustified(5, '0', false);
|
||||
}
|
||||
QDialog d;
|
||||
if (generator == i18n("Noise")) d.setWindowTitle(tr("Create Noise Clip"));
|
||||
else d.setWindowTitle(tr("Create Countdown Clip"));
|
||||
Ui::CountDown_UI view;
|
||||
view.setupUi(&d);
|
||||
QString clipFile = prePath + counter + ".westley";
|
||||
view.path->setPath(clipFile);
|
||||
if (d.exec() == QDialog::Accepted) {
|
||||
QDomDocument doc;
|
||||
QDomElement westley = doc.createElement("westley");
|
||||
QDomElement playlist = doc.createElement("playlist");
|
||||
if (generator == i18n("Noise")) {
|
||||
QDomElement prod = doc.createElement("producer");
|
||||
prod.setAttribute("mlt_service", "noise");
|
||||
prod.setAttribute("in", "0");
|
||||
prod.setAttribute("out", QString::number((int) fps * view.duration->value()));
|
||||
playlist.appendChild(prod);
|
||||
} else {
|
||||
for (int i = 0; i < view.duration->value(); i++) {
|
||||
// Create the producers
|
||||
QDomElement prod = doc.createElement("producer");
|
||||
prod.setAttribute("mlt_service", "pango");
|
||||
prod.setAttribute("in", "0");
|
||||
prod.setAttribute("out", QString::number((int) fps));
|
||||
prod.setAttribute("markup", QString::number(view.duration->value() - i));
|
||||
playlist.appendChild(prod);
|
||||
}
|
||||
}
|
||||
westley.appendChild(playlist);
|
||||
doc.appendChild(westley);
|
||||
QFile file(view.path->url().path());
|
||||
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
|
||||
kWarning() << "////// ERROR writing to file: " << view.path->url().path();
|
||||
KMessageBox::error(0, i18n("Cannot write to file %1", view.path->url().path()));
|
||||
return KUrl();
|
||||
}
|
||||
QTextStream out(&file);
|
||||
out << doc.toString();
|
||||
file.close();
|
||||
return view.path->url();
|
||||
}
|
||||
return KUrl();
|
||||
}
|
||||
|
||||
Q_EXPORT_PLUGIN2(kdenlive_sampleplugin, SamplePlugin)
|
||||
41
plugins/sampleplugin/sampleplugin.h
Normal file
41
plugins/sampleplugin/sampleplugin.h
Normal file
@@ -0,0 +1,41 @@
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2009 by Jean-Baptiste Mardelle (jb@kdenlive.org) *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
|
||||
***************************************************************************/
|
||||
|
||||
|
||||
#ifndef SAMPLEPLUGIN_H
|
||||
#define SAMPLEPLUGIN_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QStringList>
|
||||
|
||||
#include <KUrl>
|
||||
|
||||
#include "interfaces.h"
|
||||
|
||||
class SamplePlugin : public QObject, public ClipGenerator {
|
||||
Q_OBJECT
|
||||
Q_INTERFACES(ClipGenerator)
|
||||
|
||||
public:
|
||||
QStringList generators() const;
|
||||
KUrl generatedClip(const QString &generator, const KUrl &projectFolder, const QStringList &lumaNames, const QStringList &lumaFiles, const double fps, const int width, const int height);
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
@@ -1 +1 @@
|
||||
SUBDIRS(it ca cs da de es fr nl zh)
|
||||
SUBDIRS(ca cs da de es fr he hu it nl pt_BR ru sl zh)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: kdenlive\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2008-11-11 21:47+0100\n"
|
||||
"POT-Creation-Date: 2008-12-25 11:24+0100\n"
|
||||
"PO-Revision-Date: 2008-11-12 00:13+0100\n"
|
||||
"Last-Translator: Mads Bondo Dydensborg <mads@dydensborg.dk>\n"
|
||||
"Language-Team: Dansk <da@li.org>\n"
|
||||
@@ -38,18 +38,33 @@ msgstr "0"
|
||||
msgid "100%"
|
||||
msgstr "100%"
|
||||
|
||||
msgid "11250"
|
||||
msgstr "11250"
|
||||
|
||||
msgid "200%"
|
||||
msgstr "200%"
|
||||
|
||||
msgid "22500"
|
||||
msgstr "22500"
|
||||
|
||||
msgid "25/1"
|
||||
msgstr "25/1"
|
||||
|
||||
msgid "32000"
|
||||
msgstr "32000"
|
||||
|
||||
msgid "320x240"
|
||||
msgstr "320x240"
|
||||
|
||||
msgid "4/3"
|
||||
msgstr "4/3"
|
||||
|
||||
msgid "41000"
|
||||
msgstr "41000"
|
||||
|
||||
msgid "48000"
|
||||
msgstr "48000"
|
||||
|
||||
msgid "50%"
|
||||
msgstr "50%"
|
||||
|
||||
@@ -65,9 +80,31 @@ msgstr "99:99:99:99; "
|
||||
msgid ":::"
|
||||
msgstr ":::"
|
||||
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"<b>Frame size:</b>%1x%2<br><b>Frame rate:</b>%3/%4<br><b>Aspect ratio:</b>%5/"
|
||||
"%6<br><b>Display ratio:</b>%7/%8"
|
||||
msgstr ""
|
||||
"<b>Framestørrelse:</b>%1x%2<br><b>Framerate:</b>%3/%4<br><b>Aspektratio:</b>%5/"
|
||||
"%6<br><b>Vis ratio:</b>%7/%8"
|
||||
|
||||
msgid "<b>Recordmydesktop utility not found, please install it for screen grabs</b>"
|
||||
msgstr "<b>Recordmydesktop programmet blev ikke fundet. Installér det venligst for skærmindfangning</b>"
|
||||
|
||||
msgid "<b>dvgrab utility not found, please install it for firewire capture</b>"
|
||||
msgstr "<b>dvgrab programmet blev ikke fundet. Installér det venligst for firewire indfangning</b>"
|
||||
|
||||
msgid "<br><b>Author:</b> "
|
||||
msgstr "<br><b>Forfatter:</b> "
|
||||
|
||||
#, kde-format
|
||||
msgid "<qt>Clip <b>%1</b><br>is invalid or missing, what do you want to do?"
|
||||
msgstr "<qt>Klip <b>%1</b><br>er ugyldigt eller manger, hvad ønsker du at gøre?"
|
||||
|
||||
#, kde-format
|
||||
msgid "<qt>Clip <b>%1</b><br>is invalid, what do you want to do?"
|
||||
msgstr "<qt>Klip <b>%1</b><br>er ugyldigt, hvad ønsker du at gøre?"
|
||||
|
||||
#, kde-format
|
||||
msgid "<qt>Clip <b>%1</b><br>is invalid, will be removed from project."
|
||||
msgstr "<qt>Klip <b>%1</b><br>er ugyldigt, vil blive fjernet fra projekt."
|
||||
@@ -75,8 +112,9 @@ msgstr "<qt>Klip <b>%1</b><br>er ugyldigt, vil blive fjernet fra projekt."
|
||||
msgid "A"
|
||||
msgstr "A"
|
||||
|
||||
msgid "A guide already exists at that position"
|
||||
msgstr "En hjælpelinie eksisterer allerede på den position"
|
||||
#, kde-format
|
||||
msgid "A guide already exists at position %1"
|
||||
msgstr "En hjælpelinie eksisterer allerede på position %1"
|
||||
|
||||
msgid ""
|
||||
"A profile with same name already exists in MLT's default profiles, please "
|
||||
@@ -164,9 +202,15 @@ msgstr "Tilføj ny effekt"
|
||||
msgid "Add recording time to captured file name"
|
||||
msgstr "Tilføj optagelsestid til indspillet filnavn"
|
||||
|
||||
msgid "Add space"
|
||||
msgstr "Tilføj tomrum"
|
||||
|
||||
msgid "Add timeline clip"
|
||||
msgstr "Tilføj tidslinie klip"
|
||||
|
||||
msgid "Add track"
|
||||
msgstr "Tilføj spor"
|
||||
|
||||
msgid "Add transition"
|
||||
msgstr "Tilføj overgang"
|
||||
|
||||
@@ -197,6 +241,9 @@ msgstr "Juster..."
|
||||
msgid "All"
|
||||
msgstr "Alle"
|
||||
|
||||
msgid "All tracks"
|
||||
msgstr "Alle spor"
|
||||
|
||||
msgid "Allow horizontal moves"
|
||||
msgstr "Tillad horisontal flytning"
|
||||
|
||||
@@ -218,12 +265,18 @@ msgstr "Aspektratio:"
|
||||
msgid "Audio"
|
||||
msgstr "Lyd"
|
||||
|
||||
msgid "Audio channels"
|
||||
msgstr "Lyd kanaler"
|
||||
|
||||
msgid "Audio clip"
|
||||
msgstr "Lyd klip"
|
||||
|
||||
msgid "Audio codec"
|
||||
msgstr "Lyd kodning"
|
||||
|
||||
msgid "Audio device"
|
||||
msgstr "Lydenhed"
|
||||
|
||||
msgid "Audio device:"
|
||||
msgstr "Lydenhed:"
|
||||
|
||||
@@ -237,12 +290,21 @@ msgstr "Lydredigering"
|
||||
msgid "Audio fade duration: %1s"
|
||||
msgstr "Lyd udfasningslængde: %1s"
|
||||
|
||||
msgid "Audio frequency"
|
||||
msgstr "Lyd frekvens"
|
||||
|
||||
msgid "Audio index"
|
||||
msgstr "Lydindeks"
|
||||
|
||||
msgid "Audio track"
|
||||
msgstr "Lydspor"
|
||||
|
||||
msgid "Audio tracks"
|
||||
msgstr "Lydspor"
|
||||
|
||||
msgid "Auto"
|
||||
msgstr "Automatisk"
|
||||
|
||||
msgid "Auto Mask"
|
||||
msgstr "Automaske"
|
||||
|
||||
@@ -255,6 +317,9 @@ msgstr "Autogemte filer findes. Vil du gendanne dem nu?"
|
||||
msgid "Automatic"
|
||||
msgstr "Automatisk"
|
||||
|
||||
msgid "Automatic Transition"
|
||||
msgstr "Automatisk overgang"
|
||||
|
||||
msgid "Automatically start a new file on scene cut"
|
||||
msgstr "Automatisk starte en ny fil ved scene skift"
|
||||
|
||||
@@ -267,6 +332,9 @@ msgstr "Baggrund"
|
||||
msgid "BasicOperations"
|
||||
msgstr "Basale operationer"
|
||||
|
||||
msgid "Black"
|
||||
msgstr "Sort"
|
||||
|
||||
msgid "Blue Screen"
|
||||
msgstr "Blå skærm"
|
||||
|
||||
@@ -288,6 +356,9 @@ msgstr "Box sløring"
|
||||
msgid "Brightness"
|
||||
msgstr "Lysstyrke"
|
||||
|
||||
msgid "Buffer"
|
||||
msgstr "Buffer"
|
||||
|
||||
msgid "Button 1"
|
||||
msgstr "Knap 1"
|
||||
|
||||
@@ -314,24 +385,21 @@ msgstr ""
|
||||
"Kan ikke tilgå skrivebordssøgningsinformation for %1.\n"
|
||||
"Deaktiverer skrivebordssøgningsintegration."
|
||||
|
||||
msgid "Cannot add marker if more than one clip is selected"
|
||||
msgstr "Kan ikke tilføje markør, hvis mere end et klip er valgt"
|
||||
|
||||
msgid "Cannot cut a transition"
|
||||
msgstr "Kan ikke klippe i en overgang"
|
||||
|
||||
msgid "Cannot delete marker if more than one clip is selected"
|
||||
msgstr "Kan ikke slette en markør, hvis mere end et klip er valgt"
|
||||
|
||||
msgid "Cannot edit marker if more than one clip is selected"
|
||||
msgstr "Kan ikke redigere markør, hvis mere end et klip er valgt"
|
||||
|
||||
msgid "Cannot find clip to add effect"
|
||||
msgstr "Kan ikke finde klip for at tilføje effekt"
|
||||
|
||||
msgid "Cannot find clip to add marker"
|
||||
msgstr "Kan ikke finde klip for at tilføje markør"
|
||||
|
||||
msgid "Cannot find clip to cut"
|
||||
msgstr "Kan ikke finde klip at klippe"
|
||||
|
||||
msgid "Cannot find clip to remove marker"
|
||||
msgstr "Kan ikke finde klip for at fjerne markør"
|
||||
|
||||
msgid "Cannot find clip to uncut"
|
||||
msgstr "Kan ikke finde klip at splejse"
|
||||
|
||||
@@ -345,16 +413,24 @@ msgid "Cannot find your Mlt profiles, please give the path"
|
||||
msgstr "Kan ikke finde MLT profiler, angiv venligst en sti"
|
||||
|
||||
#, kde-format
|
||||
msgid "Cannot move clip at time: %1s on track %2"
|
||||
msgstr "Kan ikke flytte klip fra tid: %1s på spor %2"
|
||||
|
||||
#, c-format, kde-format
|
||||
msgid "Cannot move clip to position %1seconds"
|
||||
msgstr "Kan ikke flytte klip til position %1sekunder"
|
||||
msgid "Cannot move clip at position %1, track %2"
|
||||
msgstr "Kan ikke flytte klip fra position: %1, spor %2"
|
||||
|
||||
#, kde-format
|
||||
msgid "Cannot move transition at time: %1s on track %2"
|
||||
msgstr "Kan ikke flytte overgang fra tid: %1s på spor %2"
|
||||
msgid "Cannot move clip at time: %1 on track %2"
|
||||
msgstr "Kan ikke flytte klip fra tid: %1 på spor %2"
|
||||
|
||||
#, kde-format
|
||||
msgid "Cannot move clip to position %1"
|
||||
msgstr "Kan ikke flytte klip til position %1"
|
||||
|
||||
#, kde-format
|
||||
msgid "Cannot move transition at position %1, track %2"
|
||||
msgstr "Kan ikke flytte overgang fra position: %1, spor %2"
|
||||
|
||||
#, kde-format
|
||||
msgid "Cannot move transition at time: %1 on track %2"
|
||||
msgstr "Kan ikke flytte overgang fra tid: %1 på spor %2"
|
||||
|
||||
msgid "Cannot paste clip to selected place"
|
||||
msgstr "Kan ikke indsætte klip det valgte sted"
|
||||
@@ -406,9 +482,6 @@ msgstr "Indspilningsparametre"
|
||||
msgid "Captured files"
|
||||
msgstr "Indspillede filer"
|
||||
|
||||
msgid "Capturing..."
|
||||
msgstr "Indspiller..."
|
||||
|
||||
msgid "Center"
|
||||
msgstr "Center"
|
||||
|
||||
@@ -418,12 +491,24 @@ msgstr "Ændre"
|
||||
msgid "Change Clip Speed"
|
||||
msgstr "Skift klip hastighed"
|
||||
|
||||
msgid "Change Track"
|
||||
msgstr "Ændre spor"
|
||||
|
||||
msgid "Change Track Type"
|
||||
msgstr "Ændre sportype"
|
||||
|
||||
msgid "Change gamma color value"
|
||||
msgstr "Skift gamma farve værdi"
|
||||
|
||||
msgid "Change image brightness with keyframes"
|
||||
msgstr "Skidt billede lysstyrke med keyframes"
|
||||
|
||||
msgid "Change track"
|
||||
msgstr "Ændre spor"
|
||||
|
||||
msgid "Change track type"
|
||||
msgstr "Ændre sportype"
|
||||
|
||||
msgid ""
|
||||
"Changing the size of video when rendering\n"
|
||||
"is not fully supported, you may have problems\n"
|
||||
@@ -449,6 +534,9 @@ msgstr "Kultegning effekt"
|
||||
msgid "CheckBox"
|
||||
msgstr "Afkrydsningsfelt"
|
||||
|
||||
msgid "Checking system"
|
||||
msgstr "Tjekker system"
|
||||
|
||||
msgid "Chroma Hold"
|
||||
msgstr "Chroma hold"
|
||||
|
||||
@@ -462,6 +550,9 @@ msgstr "Chrominance V"
|
||||
msgid "Clean"
|
||||
msgstr "Tom"
|
||||
|
||||
msgid "Clip"
|
||||
msgstr "Klip"
|
||||
|
||||
msgid "Clip Color"
|
||||
msgstr "Klipfarve"
|
||||
|
||||
@@ -600,6 +691,9 @@ msgstr "Standard programmer"
|
||||
msgid "Default capture device"
|
||||
msgstr "Standard indspilningsenhed"
|
||||
|
||||
msgid "Default folder for project files"
|
||||
msgstr "Standard mappe til projekt filer"
|
||||
|
||||
msgid "Default folders"
|
||||
msgstr "Standard mapper"
|
||||
|
||||
@@ -634,6 +728,9 @@ msgstr "Slet markør"
|
||||
msgid "Delete Selected Item"
|
||||
msgstr "Slet valgt element"
|
||||
|
||||
msgid "Delete Track"
|
||||
msgstr "Slet spor"
|
||||
|
||||
msgid "Delete clip"
|
||||
msgstr "Slep klip"
|
||||
|
||||
@@ -670,6 +767,9 @@ msgstr "Slet valgt element"
|
||||
msgid "Delete timeline clip"
|
||||
msgstr "Slet tidslinie klip"
|
||||
|
||||
msgid "Delete track"
|
||||
msgstr "Slet spor"
|
||||
|
||||
msgid "Delete transition from clip"
|
||||
msgstr "Slet overgang fra klip"
|
||||
|
||||
@@ -730,9 +830,15 @@ msgstr "Dokument at åbne"
|
||||
msgid "Don't recover"
|
||||
msgstr "Gendan ikke"
|
||||
|
||||
msgid "Download New Lumas..."
|
||||
msgstr "Hent nye lumaer..."
|
||||
|
||||
msgid "Duration"
|
||||
msgstr "Længde"
|
||||
|
||||
msgid "Dvgrab"
|
||||
msgstr "Dvgrab"
|
||||
|
||||
msgid "Dw"
|
||||
msgstr "Dw"
|
||||
|
||||
@@ -793,11 +899,11 @@ msgstr "Effektstak"
|
||||
msgid "Enable Jog Shuttle device"
|
||||
msgstr "Aktiver Jog Shuttle enhed"
|
||||
|
||||
msgid "Encoding"
|
||||
msgstr "Indkodning"
|
||||
msgid "Encoding captured video..."
|
||||
msgstr "Indkoder indfanget video..."
|
||||
|
||||
msgid "Encoding parameters"
|
||||
msgstr "Indkodningsparametre"
|
||||
msgid "Encoding params"
|
||||
msgstr "Indkodningsarametre"
|
||||
|
||||
msgid "End"
|
||||
msgstr "Slut"
|
||||
@@ -814,6 +920,10 @@ msgstr "Omgivelser"
|
||||
msgid "Equalizer"
|
||||
msgstr "Equalizer"
|
||||
|
||||
#, kde-format
|
||||
msgid "Error removing clip at %1 on track %2"
|
||||
msgstr "Fejl ved sletning af clip fra %1 på spor %2"
|
||||
|
||||
msgid "Error starting MLT's command line player (inigo)"
|
||||
msgstr "Fejl ved start af MLT's kommandolinieafspiller (inigo)"
|
||||
|
||||
@@ -835,6 +945,9 @@ msgstr "Ekstra værktøjslinie"
|
||||
msgid "Extract frame"
|
||||
msgstr "Udtræk frame"
|
||||
|
||||
msgid "FFmpeg & ffplay"
|
||||
msgstr "FFmpeg & ffplay"
|
||||
|
||||
msgid "Fade in"
|
||||
msgstr "Indfasning"
|
||||
|
||||
@@ -867,12 +980,12 @@ msgstr ""
|
||||
msgid "File already exists. Do you want to overwrite it ?"
|
||||
msgstr "Filen eksisterer allerede. Vil du overskrive den?"
|
||||
|
||||
msgid "File extension"
|
||||
msgstr "Filendelse"
|
||||
|
||||
msgid "File name"
|
||||
msgstr "Filnavn"
|
||||
|
||||
msgid "File not found"
|
||||
msgstr "Fil ikke fundet"
|
||||
|
||||
msgid "File size"
|
||||
msgstr "Filstørrelse"
|
||||
|
||||
@@ -894,9 +1007,6 @@ msgstr "Find stoppet"
|
||||
msgid "Firewire"
|
||||
msgstr "Firewire"
|
||||
|
||||
msgid "Firewire / dvgrab"
|
||||
msgstr "Firewire / dvgrab"
|
||||
|
||||
msgid ""
|
||||
"Firewire is not enabled on your system.\n"
|
||||
" Please install Libiec61883 and recompile Kdenlive"
|
||||
@@ -913,6 +1023,9 @@ msgstr "Flip billede i vilkårlig retning"
|
||||
msgid "Folder"
|
||||
msgstr "Mappe"
|
||||
|
||||
msgid "Follow mouse"
|
||||
msgstr "Følg musen"
|
||||
|
||||
msgid "Force pixel aspect ratio"
|
||||
msgstr "Tving pixel aspekratio"
|
||||
|
||||
@@ -925,6 +1038,9 @@ msgstr "Fremad"
|
||||
msgid "Forward 1 Frame"
|
||||
msgstr "Fremad 1 frame"
|
||||
|
||||
msgid "Forward 1 Second"
|
||||
msgstr "Fremad 1 sekund"
|
||||
|
||||
msgid "Forward 1 frame"
|
||||
msgstr "Fremad 1 frame"
|
||||
|
||||
@@ -980,6 +1096,9 @@ msgstr "Fuldt projekt"
|
||||
msgid "Full screen capture"
|
||||
msgstr "Fuldskærmsindfangning"
|
||||
|
||||
msgid "Full shots"
|
||||
msgstr "Fuldt skud"
|
||||
|
||||
msgid "Gain"
|
||||
msgstr "Gain"
|
||||
|
||||
@@ -1061,6 +1180,9 @@ msgstr "Skjul et område af klippet"
|
||||
msgid "Hide a selected zone and follow its movements"
|
||||
msgstr "Skjul en valgt zone og følg dens bevægelser"
|
||||
|
||||
msgid "Hide frame"
|
||||
msgstr "Skjul ramme"
|
||||
|
||||
msgid "Hor. Center"
|
||||
msgstr "Hor. centrér"
|
||||
|
||||
@@ -1100,6 +1222,12 @@ msgstr "Billedestørrelse"
|
||||
msgid "Image type"
|
||||
msgstr "Billedetype"
|
||||
|
||||
msgid "In Point"
|
||||
msgstr "Indpunkt"
|
||||
|
||||
msgid "Inigo"
|
||||
msgstr "Inigo"
|
||||
|
||||
msgid "Inigo path"
|
||||
msgstr "Inigo sti"
|
||||
|
||||
@@ -1109,6 +1237,18 @@ msgstr "Initialiserer..."
|
||||
msgid "Input gain (db)"
|
||||
msgstr "Input gain (db)"
|
||||
|
||||
msgid "Insert Space"
|
||||
msgstr "Indsæt tomrum"
|
||||
|
||||
msgid "Insert Track"
|
||||
msgstr "Indsæt spor"
|
||||
|
||||
msgid "Insert space"
|
||||
msgstr "Indsæt tomrum"
|
||||
|
||||
msgid "Insert track"
|
||||
msgstr "Indsæt spor"
|
||||
|
||||
msgid "Install extra video mimetypes"
|
||||
msgstr "Installer ekstra video mimetyper"
|
||||
|
||||
@@ -1118,12 +1258,18 @@ msgstr "Intensitet"
|
||||
msgid "Interlaced"
|
||||
msgstr "Interlaced"
|
||||
|
||||
msgid "Invalid action"
|
||||
msgstr "Ugyldig handling"
|
||||
|
||||
msgid "Invert"
|
||||
msgstr "Invertér"
|
||||
|
||||
msgid "Invert colors"
|
||||
msgstr "Invertér farver"
|
||||
|
||||
msgid "Jack"
|
||||
msgstr "Jack"
|
||||
|
||||
msgid "Jean-Baptiste Mardelle"
|
||||
msgstr "Jean-Baptiste Mardelle"
|
||||
|
||||
@@ -1136,12 +1282,12 @@ msgstr "JogShuttle"
|
||||
msgid "Kdenlive"
|
||||
msgstr "Kdenlive"
|
||||
|
||||
msgid "Keep as placeholder"
|
||||
msgstr "Behold som pladsholder"
|
||||
|
||||
msgid "Kernel size"
|
||||
msgstr "Kernestørrelse"
|
||||
|
||||
msgid "Keyframe"
|
||||
msgstr "Keyframe"
|
||||
|
||||
msgid "LADSPA change pitch audio effect"
|
||||
msgstr "LADSPA ændre pitch lydeffekt"
|
||||
|
||||
@@ -1193,11 +1339,15 @@ msgstr "Indlæser spilleliste..."
|
||||
msgid "Loading project clips"
|
||||
msgstr "Indlæser projekt klip"
|
||||
|
||||
#, kde-format
|
||||
msgid "Looking for %1"
|
||||
msgstr "Kigger efter %1"
|
||||
|
||||
msgid "Loop"
|
||||
msgstr "Loop"
|
||||
|
||||
msgid "Loop Section"
|
||||
msgstr "Loop sektion"
|
||||
msgid "Loop Zone"
|
||||
msgstr "Loop zone"
|
||||
|
||||
msgid "Luma File"
|
||||
msgstr "Luma fil"
|
||||
@@ -1294,6 +1444,9 @@ msgstr "Flyt effekt ned"
|
||||
msgid "Move effect up"
|
||||
msgstr "Flyt effekt op"
|
||||
|
||||
msgid "Move group"
|
||||
msgstr "Flyt gruppe"
|
||||
|
||||
msgid "Move guide"
|
||||
msgstr "Flyt hjælpelinie"
|
||||
|
||||
@@ -1330,15 +1483,9 @@ msgstr "Nano X"
|
||||
msgid "New speed (percents)"
|
||||
msgstr "Ny hastighed (procent)"
|
||||
|
||||
msgid "No clip at cursor time"
|
||||
msgstr "Intet klip ved pegertid"
|
||||
|
||||
msgid "No clip copied"
|
||||
msgstr "Intet klip kopieret"
|
||||
|
||||
msgid "No clip selected"
|
||||
msgstr "Intet klip valgt"
|
||||
|
||||
msgid "No guide at cursor time"
|
||||
msgstr "Ingen hjælpelinie ved pegertid"
|
||||
|
||||
@@ -1348,9 +1495,6 @@ msgstr "Intet billede fundet"
|
||||
msgid "No marker found at cursor time"
|
||||
msgstr "Ingen markør fundet ved pegertid"
|
||||
|
||||
msgid "No selected clip at cursor time"
|
||||
msgstr "Intet valgt klip ved pegertid"
|
||||
|
||||
msgid "Normalise"
|
||||
msgstr "Normaliser"
|
||||
|
||||
@@ -1376,6 +1520,9 @@ msgstr "OSS med DMA adgang"
|
||||
msgid "Obscure"
|
||||
msgstr "Obskur"
|
||||
|
||||
msgid "Offset"
|
||||
msgstr "Offset"
|
||||
|
||||
msgid "Opacity"
|
||||
msgstr "Uigennemsigtighed"
|
||||
|
||||
@@ -1388,6 +1535,9 @@ msgstr "Åben sidste projekt ved start"
|
||||
msgid "Open projects in new tabs"
|
||||
msgstr "Åben projekter i nye faneblade"
|
||||
|
||||
msgid "Out Point"
|
||||
msgstr "Udpunkt"
|
||||
|
||||
msgid "Output file"
|
||||
msgstr "Uddatafil"
|
||||
|
||||
@@ -1436,8 +1586,8 @@ msgstr "Afspil"
|
||||
msgid "Play / Pause"
|
||||
msgstr "Spil / Pause"
|
||||
|
||||
msgid "Play Section"
|
||||
msgstr "Afspil sektion"
|
||||
msgid "Play Zone"
|
||||
msgstr "Afspil zone"
|
||||
|
||||
msgid "Play after render"
|
||||
msgstr "Afspil efter generéring"
|
||||
@@ -1448,9 +1598,6 @@ msgstr "Afspil..."
|
||||
msgid "Playback"
|
||||
msgstr "Afspilning"
|
||||
|
||||
msgid "Playback params"
|
||||
msgstr "Afspilningsparametre"
|
||||
|
||||
msgid "Playlist clip"
|
||||
msgstr "Spilleliste klip"
|
||||
|
||||
@@ -1464,8 +1611,8 @@ msgstr ""
|
||||
msgid "Please report bugs to http://kdenlive.org/mantis"
|
||||
msgstr "Rapportér venligst fejl til http://kdenlive.org/mantis"
|
||||
|
||||
msgid "Please set your default video format"
|
||||
msgstr "Vær venlig at indstille standard video format"
|
||||
msgid "Please set your default video profile"
|
||||
msgstr "Vær venlig at indstille standard video profil"
|
||||
|
||||
#, kde-format
|
||||
msgid ""
|
||||
@@ -1481,6 +1628,9 @@ msgstr ""
|
||||
"Filer bliver gemt in:\n"
|
||||
"%1"
|
||||
|
||||
msgid "Ports:"
|
||||
msgstr "Porte:"
|
||||
|
||||
msgid "Pos"
|
||||
msgstr "Pos"
|
||||
|
||||
@@ -1583,15 +1733,44 @@ msgstr "Optag"
|
||||
msgid "Record Monitor"
|
||||
msgstr "Optagmonitor"
|
||||
|
||||
msgid "Recordmydesktop"
|
||||
msgstr "Recordmydesktop"
|
||||
|
||||
#, kde-format
|
||||
msgid "Recordmydesktop found at: %1"
|
||||
msgstr "Recordmydesktop fundet: %1"
|
||||
|
||||
msgid ""
|
||||
"Recordmydesktop utility not found,\n"
|
||||
" please install it for screen grabs"
|
||||
msgstr ""
|
||||
"Recordmydesktop program ikke fundet,\n"
|
||||
" venligst installér det for skærmindfangning"
|
||||
|
||||
msgid "Recover"
|
||||
msgstr "Gendan"
|
||||
|
||||
msgid "Region"
|
||||
msgstr "Region"
|
||||
|
||||
msgid "Region capture"
|
||||
msgstr "Delområdeindfangning"
|
||||
|
||||
msgid "Release time (s)"
|
||||
msgstr "Udgivelsestidspunkt (s)"
|
||||
|
||||
msgid "Remaining time"
|
||||
msgstr "Tilbageværende tid"
|
||||
|
||||
msgid "Remove Space"
|
||||
msgstr "Fjern tomrum"
|
||||
|
||||
msgid "Remove Track"
|
||||
msgstr "Fjern spor"
|
||||
|
||||
msgid "Remove space"
|
||||
msgstr "Fjern spor"
|
||||
|
||||
msgid "Rename folder"
|
||||
msgstr "Omdøb mappe"
|
||||
|
||||
@@ -1601,17 +1780,43 @@ msgstr "Generér"
|
||||
msgid "Rendering"
|
||||
msgstr "Generéring"
|
||||
|
||||
#, kde-format
|
||||
msgid "Rendering %1"
|
||||
msgstr "Generérer %1"
|
||||
|
||||
#, kde-format
|
||||
msgid "Rendering <i>%1</i> started"
|
||||
msgstr "Generéring <i>%1</i> begyndt"
|
||||
|
||||
msgid "Rendering Crashed"
|
||||
msgstr "Generéring brudt sammen"
|
||||
|
||||
#, kde-format
|
||||
msgid "Rendering of %1 aborted, resulting video will probably be corrupted."
|
||||
msgstr "Generering af %1 afbrudt, resultatvideoen er formentlig defekt."
|
||||
|
||||
#, kde-format
|
||||
msgid "Rendering of %1 is over"
|
||||
msgstr "Generéring af %1 er færdig"
|
||||
msgid "Rendering of %1 crashed"
|
||||
msgstr "Generéring af %1 brød sammen"
|
||||
|
||||
#, kde-format
|
||||
msgid "Rendering of %1 finished in %2"
|
||||
msgstr "Generéring af %1 afsluttede i %2"
|
||||
|
||||
msgid "Rendering to"
|
||||
msgstr "Generérer til"
|
||||
|
||||
msgid "Required for firewire capture"
|
||||
msgstr "Krævet for firewire indfangning"
|
||||
|
||||
msgid "Required for rendering (part of MLT package)"
|
||||
msgstr "Krævet for at generére (del af MLT)"
|
||||
|
||||
msgid "Required for screen capture"
|
||||
msgstr "Krævet for skærmindfangning"
|
||||
|
||||
msgid "Required for webcam capture"
|
||||
msgstr "Krævet for indfangning fra webcams"
|
||||
|
||||
msgid "Reset effect"
|
||||
msgstr "Nulstil effekt"
|
||||
@@ -1646,6 +1851,9 @@ msgstr "Tilbage"
|
||||
msgid "Rewind 1 Frame"
|
||||
msgstr "Tilbage 1 frame"
|
||||
|
||||
msgid "Rewind 1 Second"
|
||||
msgstr "Tilbage 1 sekund"
|
||||
|
||||
msgid "Rewind 1 frame"
|
||||
msgstr "Tilbage 1 frame"
|
||||
|
||||
@@ -1676,6 +1884,9 @@ msgstr "Rotation y"
|
||||
msgid "Rotation z"
|
||||
msgstr "Rotation z"
|
||||
|
||||
msgid "Run Config Wizard"
|
||||
msgstr "Kør opsætningsguide"
|
||||
|
||||
msgid "S"
|
||||
msgstr "S"
|
||||
|
||||
@@ -1715,12 +1926,15 @@ msgstr "Skalér"
|
||||
msgid "Screen Grab"
|
||||
msgstr "Skærmindfangning"
|
||||
|
||||
msgid "Screen Grab / FFmpeg"
|
||||
msgstr "Skærmindfangning / FFmpeg"
|
||||
|
||||
msgid "Screen grab"
|
||||
msgstr "Skærmindfangning"
|
||||
|
||||
msgid "Search automatically"
|
||||
msgstr "Søg automatisk"
|
||||
|
||||
msgid "Search manually"
|
||||
msgstr "Søg manuelt"
|
||||
|
||||
msgid "Select a clip before copying"
|
||||
msgstr "Vælg et klip før kopiér"
|
||||
|
||||
@@ -1750,9 +1964,6 @@ msgstr "Vælg standard billedredigeringsprogram"
|
||||
msgid "Select default video player"
|
||||
msgstr "Vælg standard videoafspilningsprogram"
|
||||
|
||||
msgid "Select region..."
|
||||
msgstr "Vælg region..."
|
||||
|
||||
msgid "Selected zone"
|
||||
msgstr "Valgt zone"
|
||||
|
||||
@@ -1786,12 +1997,18 @@ msgstr "Sæt zone start"
|
||||
msgid "Shift"
|
||||
msgstr "Skift"
|
||||
|
||||
msgid "Show All"
|
||||
msgstr "Vis all"
|
||||
|
||||
msgid "Show audio thumbnails"
|
||||
msgstr "Vis lydminiaturer"
|
||||
|
||||
msgid "Show background"
|
||||
msgstr "Vis baggrund"
|
||||
|
||||
msgid "Show crash log"
|
||||
msgstr "Vis nedbrudslog"
|
||||
|
||||
msgid "Show experimental formats"
|
||||
msgstr "Vis eksperimentielle profiler"
|
||||
|
||||
@@ -1858,6 +2075,12 @@ msgstr "Sox reverb lydeffekt"
|
||||
msgid "Sox vibro audio effect"
|
||||
msgstr "Sox vibro lydeffekt"
|
||||
|
||||
msgid "Space"
|
||||
msgstr "Tomrum"
|
||||
|
||||
msgid "Spacer tool"
|
||||
msgstr "Tomrumsværktøj"
|
||||
|
||||
msgid "Speed"
|
||||
msgstr "Hastighed"
|
||||
|
||||
@@ -1909,6 +2132,9 @@ msgstr "Tekstklip"
|
||||
msgid "TextLabel"
|
||||
msgstr "Tekstlabel"
|
||||
|
||||
msgid "The custom profile was modified, do you want to save it ?"
|
||||
msgstr "Den tilpassede profil blev ændret. Ønsker du at gemme den?"
|
||||
|
||||
msgid "There is no clip, cannot extract frame."
|
||||
msgstr "Der er ikke noget klip, kan ikke udtrække frame."
|
||||
|
||||
@@ -1921,6 +2147,9 @@ msgstr ""
|
||||
"nogle basale indstillinger. Du vil være klar til at redigere din først file "
|
||||
"i løbet af få sekunder..."
|
||||
|
||||
msgid "This project type is unsupported and can't be loaded."
|
||||
msgstr "Denne projekttype er ikke understøttet og kan ikke indlæses."
|
||||
|
||||
msgid "Threshold"
|
||||
msgstr "Grænse"
|
||||
|
||||
@@ -1960,15 +2189,18 @@ msgstr "Værktøj"
|
||||
msgid "Top"
|
||||
msgstr "Top"
|
||||
|
||||
msgid "Track"
|
||||
msgstr "Spor"
|
||||
|
||||
msgid "Track height"
|
||||
msgstr "Sporhøjde"
|
||||
|
||||
msgid "Tracks"
|
||||
msgstr "Spor"
|
||||
|
||||
msgid "Transition"
|
||||
msgstr "Overgang"
|
||||
|
||||
msgid "Transition type"
|
||||
msgstr "Overgangstype"
|
||||
|
||||
msgid "Transparency"
|
||||
msgstr "Gennemsigtighed"
|
||||
|
||||
@@ -1978,6 +2210,12 @@ msgstr "Gennemsigtig baggrund"
|
||||
msgid "Turn clip colors to sepia"
|
||||
msgstr "Ændre klipfarver til sepia"
|
||||
|
||||
msgid "Type"
|
||||
msgstr "Type"
|
||||
|
||||
msgid "Unable to open project"
|
||||
msgstr "Ude af stand til at åbne projekt"
|
||||
|
||||
#, kde-format
|
||||
msgid "Unable to write to file %1"
|
||||
msgstr "Kunne ikke skrive til fil %1"
|
||||
@@ -2036,15 +2274,15 @@ msgstr "Videoopløsning"
|
||||
msgid "Video Standard"
|
||||
msgstr "Videostandard"
|
||||
|
||||
msgid "Video capture params"
|
||||
msgstr "Videoindspilningsparametre"
|
||||
|
||||
msgid "Video clip"
|
||||
msgstr "Videoklip"
|
||||
|
||||
msgid "Video codec"
|
||||
msgstr "Videoindkodning"
|
||||
|
||||
msgid "Video device"
|
||||
msgstr "Videoenhed"
|
||||
|
||||
msgid "Video driver:"
|
||||
msgstr "Videodrivprogram"
|
||||
|
||||
@@ -2054,15 +2292,15 @@ msgstr "Videoindex"
|
||||
msgid "Video player"
|
||||
msgstr "Videoafspiller"
|
||||
|
||||
msgid "Video track"
|
||||
msgstr "Videospor"
|
||||
|
||||
msgid "Video tracks"
|
||||
msgstr "Videospor"
|
||||
|
||||
msgid "Video4Linux"
|
||||
msgstr "Video4Linux"
|
||||
|
||||
msgid "Video4Linux / FFmpeg"
|
||||
msgstr "Video4Linux / FFmpeg"
|
||||
|
||||
msgid "View"
|
||||
msgstr "Vis"
|
||||
|
||||
@@ -2121,21 +2359,59 @@ msgstr "Y:"
|
||||
msgid "Year"
|
||||
msgstr "År"
|
||||
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"You have changed the project folder. Do you want to copy the cached data "
|
||||
"from %1 to the new folder %2 ?"
|
||||
msgstr ""
|
||||
"Du har ændret projektmappen. Ønsker du at kopiere de mellemlagrede datat "
|
||||
"fra %1 til den nye mappe %2 ?"
|
||||
|
||||
#, kde-format
|
||||
msgid "You must be in an empty space to remove space (time=%1, track:%2)"
|
||||
msgstr "Du skal være i et tomrum for at fjerne tomrum (tid=%1, spor:%2)"
|
||||
|
||||
msgid "You must copy exactly one clip before pasting effects"
|
||||
msgstr "Du skal kopiere præcist et klip før du indsætter effekter"
|
||||
|
||||
msgid "You must select one clip for this action"
|
||||
msgstr "Du skal vælge et klip for denne handling"
|
||||
|
||||
msgid "You must select one transition for this action"
|
||||
msgstr "Du skal vælge en overgang for denne handling"
|
||||
|
||||
msgid "Z-Index:"
|
||||
msgstr "Z-index:"
|
||||
|
||||
msgid "Zoom In"
|
||||
msgstr "Zoom in"
|
||||
|
||||
msgid "Zoom Out"
|
||||
msgstr "Zoom ud"
|
||||
|
||||
msgid "Zoom:"
|
||||
msgstr "Zoom:"
|
||||
|
||||
msgid "after"
|
||||
msgstr "efter"
|
||||
|
||||
msgid "before"
|
||||
msgstr "før"
|
||||
|
||||
msgid "create new points"
|
||||
msgstr "opret nye punkter"
|
||||
|
||||
msgid ""
|
||||
"dvgrab utility not found,\n"
|
||||
" please install it for firewire capture"
|
||||
msgstr ""
|
||||
"dvgrab programmet ikke fundet,\n"
|
||||
" installér det venligst for firewire indfangning"
|
||||
|
||||
#, kde-format
|
||||
msgid "dvgrab version %1 at %2"
|
||||
msgstr "dvgrab version %1 i %2"
|
||||
|
||||
msgid "effect"
|
||||
msgstr "effekt"
|
||||
|
||||
@@ -2160,9 +2436,6 @@ msgstr "flyt på X akse"
|
||||
msgid "move on Y axis"
|
||||
msgstr "flyt på Y akse"
|
||||
|
||||
msgid "ogg"
|
||||
msgstr "ogg"
|
||||
|
||||
msgid "oss"
|
||||
msgstr "oss"
|
||||
|
||||
@@ -2184,6 +2457,9 @@ msgstr "opdater værder på tidslinie"
|
||||
msgid "video4linux2"
|
||||
msgstr "video4linux2"
|
||||
|
||||
msgid "with track"
|
||||
msgstr "med spor"
|
||||
|
||||
msgid "x"
|
||||
msgstr "x"
|
||||
|
||||
@@ -2193,3 +2469,54 @@ msgstr "x1"
|
||||
msgid "your MLT installation cannot be found. Install MLT and restart Kdenlive.\n"
|
||||
msgstr "din MLT installation kan ikke findes. Installér MLT og genstart Kdenlive.\n"
|
||||
|
||||
#~ msgid "Cannot add marker if more than one clip is selected"
|
||||
#~ msgstr "Kan ikke tilføje markør, hvis mere end et klip er valgt"
|
||||
|
||||
#~ msgid "Cannot delete marker if more than one clip is selected"
|
||||
#~ msgstr "Kan ikke slette en markør, hvis mere end et klip er valgt"
|
||||
|
||||
#~ msgid "Cannot edit marker if more than one clip is selected"
|
||||
#~ msgstr "Kan ikke redigere markør, hvis mere end et klip er valgt"
|
||||
|
||||
#~ msgid "Capturing..."
|
||||
#~ msgstr "Indspiller..."
|
||||
|
||||
#~ msgid "Encoding"
|
||||
#~ msgstr "Indkodning"
|
||||
|
||||
#~ msgid "File extension"
|
||||
#~ msgstr "Filendelse"
|
||||
|
||||
#~ msgid "Firewire / dvgrab"
|
||||
#~ msgstr "Firewire / dvgrab"
|
||||
|
||||
#~ msgid "No clip at cursor time"
|
||||
#~ msgstr "Intet klip ved pegertid"
|
||||
|
||||
#~ msgid "No clip selected"
|
||||
#~ msgstr "Intet klip valgt"
|
||||
|
||||
#~ msgid "No selected clip at cursor time"
|
||||
#~ msgstr "Intet valgt klip ved pegertid"
|
||||
|
||||
#~ msgid "Playback params"
|
||||
#~ msgstr "Afspilningsparametre"
|
||||
|
||||
#~ msgid "Screen Grab / FFmpeg"
|
||||
#~ msgstr "Skærmindfangning / FFmpeg"
|
||||
|
||||
#~ msgid "Select region..."
|
||||
#~ msgstr "Vælg region..."
|
||||
|
||||
#~ msgid "Transition type"
|
||||
#~ msgstr "Overgangstype"
|
||||
|
||||
#~ msgid "Video capture params"
|
||||
#~ msgstr "Videoindspilningsparametre"
|
||||
|
||||
#~ msgid "Video4Linux / FFmpeg"
|
||||
#~ msgstr "Video4Linux / FFmpeg"
|
||||
|
||||
#~ msgid "ogg"
|
||||
#~ msgstr "ogg"
|
||||
|
||||
|
||||
2038
po/de/kdenlive.po
2038
po/de/kdenlive.po
File diff suppressed because it is too large
Load Diff
3
po/de/todo.txt
Normal file
3
po/de/todo.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
s/sec/Sek./...
|
||||
dB instead of db (also cpp files)
|
||||
Spaces before ? (cpp)
|
||||
File diff suppressed because it is too large
Load Diff
1924
po/fr/kdenlive.po
1924
po/fr/kdenlive.po
File diff suppressed because it is too large
Load Diff
2
po/he/CMakeLists.txt
Normal file
2
po/he/CMakeLists.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
GETTEXT_PROCESS_PO_FILES(he ALL INSTALL_DESTINATION share/locale/ kdenlive.po)
|
||||
|
||||
3698
po/he/kdenlive.po
Normal file
3698
po/he/kdenlive.po
Normal file
File diff suppressed because it is too large
Load Diff
2
po/hu/CMakeLists.txt
Normal file
2
po/hu/CMakeLists.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
GETTEXT_PROCESS_PO_FILES(hu ALL INSTALL_DESTINATION share/locale/ kdenlive.po)
|
||||
|
||||
5346
po/hu/kdenlive.po
Normal file
5346
po/hu/kdenlive.po
Normal file
File diff suppressed because it is too large
Load Diff
2457
po/it/kdenlive.po
2457
po/it/kdenlive.po
File diff suppressed because it is too large
Load Diff
1642
po/kdenlive.pot
1642
po/kdenlive.pot
File diff suppressed because it is too large
Load Diff
2
po/pt_BR/CMakeLists.txt
Normal file
2
po/pt_BR/CMakeLists.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
GETTEXT_PROCESS_PO_FILES(pt_BR ALL INSTALL_DESTINATION share/locale/ kdenlive.po)
|
||||
|
||||
2159
po/pt_BR/kdenlive.po
Normal file
2159
po/pt_BR/kdenlive.po
Normal file
File diff suppressed because it is too large
Load Diff
3
po/ru/CMakeLists.txt
Normal file
3
po/ru/CMakeLists.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
|
||||
GETTEXT_PROCESS_PO_FILES(ru ALL INSTALL_DESTINATION share/locale/ kdenlive.po)
|
||||
|
||||
3600
po/ru/kdenlive.po
Normal file
3600
po/ru/kdenlive.po
Normal file
File diff suppressed because it is too large
Load Diff
2
po/sl/CMakeLists.txt
Normal file
2
po/sl/CMakeLists.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
GETTEXT_PROCESS_PO_FILES(sl ALL INSTALL_DESTINATION share/locale/ kdenlive.po)
|
||||
|
||||
2104
po/sl/kdenlive.po
Normal file
2104
po/sl/kdenlive.po
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
||||
#! /bin/sh
|
||||
|
||||
FILES="`find -type f -wholename './src/*.cpp'` `find -type f -wholename './src/*.h'`"
|
||||
FILES="`find -type f -wholename './src/*.cpp'` `find -type f -wholename './src/*.h'` `find -type f -wholename './renderer/*.cpp'` `find -type f -wholename './renderer/*.h'` `find -type f -wholename './plugins/*.cpp'` `find -type f -wholename './plugins/*.h'` `find -type f -wholename './thumbnailer/*.cpp'` `find -type f -wholename './thumbnailer/*.h'`"
|
||||
|
||||
if [ $# -gt 0 ]
|
||||
then
|
||||
|
||||
@@ -1,5 +1,18 @@
|
||||
|
||||
|
||||
|
||||
include_directories (
|
||||
${QDBUS_INCLUDE_DIRS}
|
||||
${KDE4_INCLUDES}
|
||||
${CMAKE_SOURCE_DIR}
|
||||
${CMAKE_BINARY_DIR}
|
||||
)
|
||||
|
||||
LINK_LIBRARIES(
|
||||
${LIBMLT_LIBRARY}
|
||||
${LIBMLTPLUS_LIBRARY}
|
||||
${NEPOMUK_LIBRARIES}
|
||||
)
|
||||
|
||||
set(kdenlive_render_SRCS
|
||||
kdenlive_render.cpp
|
||||
renderjob.cpp
|
||||
@@ -11,6 +24,6 @@ target_link_libraries(kdenlive_render
|
||||
${QT_QTCORE_LIBRARY}
|
||||
${QT_QTDBUS_LIBRARY}
|
||||
)
|
||||
|
||||
|
||||
install(TARGETS kdenlive_render DESTINATION ${BIN_INSTALL_DIR})
|
||||
|
||||
|
||||
@@ -38,6 +38,11 @@ int main(int argc, char **argv) {
|
||||
erase = true;
|
||||
args.takeFirst();
|
||||
}
|
||||
bool usekuiserver = false;
|
||||
if (args.at(0) == "-kuiserver") {
|
||||
usekuiserver = true;
|
||||
args.takeFirst();
|
||||
}
|
||||
if (args.at(0).startsWith("in=")) {
|
||||
in = args.at(0).section('=', -1).toInt();
|
||||
args.takeFirst();
|
||||
@@ -48,7 +53,7 @@ int main(int argc, char **argv) {
|
||||
}
|
||||
if (args.at(0).startsWith("preargs=")) {
|
||||
QString a = args.at(0).section('=', 1);
|
||||
preargs = a.split(" ", QString::SkipEmptyParts);
|
||||
preargs = a.split(" ", QString::SkipEmptyParts);
|
||||
args.takeFirst();
|
||||
}
|
||||
QString render = args.at(0);
|
||||
@@ -63,14 +68,15 @@ int main(int argc, char **argv) {
|
||||
args.takeFirst();
|
||||
QString dest = args.at(0);
|
||||
args.takeFirst();
|
||||
RenderJob *job = new RenderJob(erase, render, profile, rendermodule, player, src, dest, preargs, args, in, out);
|
||||
qDebug() << "//STARTING RENDERING: " << erase << "," << usekuiserver << "," << render << "," << profile << "," << rendermodule << "," << player << "," << src << "," << dest << "," << preargs << "," << args << "," << in << "," << out ;
|
||||
RenderJob *job = new RenderJob(erase, usekuiserver, render, profile, rendermodule, player, src, dest, preargs, args, in, out);
|
||||
job->start();
|
||||
qDebug()<<"//STARTING RENDERING: "<<erase<<","<<render<<","<<profile<<","<<rendermodule<<","<<player<<","<<src<<","<<dest<<","<<preargs<<","<<args<<","<<in<<","<<out;
|
||||
app.exec();
|
||||
} else {
|
||||
fprintf(stderr, "Kdenlive video renderer for MLT.\nUsage: "
|
||||
"kdenlive_render [-erase] [in=pos] [out=pos] [render] [profile] [rendermodule] [player] [src] [dest] [[arg1] [arg2] ...]\n"
|
||||
"kdenlive_render [-erase] [-kuiserver] [in=pos] [out=pos] [render] [profile] [rendermodule] [player] [src] [dest] [[arg1] [arg2] ...]\n"
|
||||
" -erase: if that parameter is present, src file will be erased at the end\n"
|
||||
" -kuiserver: if that parameter is present, use KDE job tracker\n"
|
||||
" in=pos: start rendering at frame pos\n"
|
||||
" out=pos: end rendering at frame pos\n"
|
||||
" render: path to inigo render\n"
|
||||
|
||||
@@ -19,22 +19,21 @@
|
||||
|
||||
#include <QtDBus>
|
||||
#include <QFile>
|
||||
#include <QTime>
|
||||
#include <QThread>
|
||||
#include "renderjob.h"
|
||||
|
||||
// Can't believe I need to do this to sleep.
|
||||
class SleepThread : QThread {
|
||||
public:
|
||||
virtual void run() {};
|
||||
static void msleep(unsigned long msecs) {
|
||||
QThread::msleep(msecs);
|
||||
}
|
||||
};
|
||||
// Can't believe I need to do this to sleep.
|
||||
class SleepThread : QThread {
|
||||
public:
|
||||
virtual void run() {};
|
||||
static void msleep(unsigned long msecs) {
|
||||
QThread::msleep(msecs);
|
||||
}
|
||||
};
|
||||
|
||||
static QDBusConnection connection(QLatin1String(""));
|
||||
|
||||
RenderJob::RenderJob(bool erase, const QString &renderer, const QString &profile, const QString &rendermodule, const QString &player, const QString &scenelist, const QString &dest, const QStringList &preargs, const QStringList &args, int in, int out) : QObject(), m_jobUiserver(NULL) {
|
||||
RenderJob::RenderJob(bool erase, bool usekuiserver, const QString &renderer, const QString &profile, const QString &rendermodule, const QString &player, const QString &scenelist, const QString &dest, const QStringList &preargs, const QStringList &args, int in, int out) : QObject(), m_usekuiserver(usekuiserver), m_jobUiserver(NULL), m_kdenliveinterface(NULL) {
|
||||
m_scenelist = scenelist;
|
||||
m_dest = dest;
|
||||
m_player = player;
|
||||
@@ -47,125 +46,230 @@ RenderJob::RenderJob(bool erase, const QString &renderer, const QString &profile
|
||||
if (out != -1) m_args << "out=" + QString::number(out);
|
||||
m_args << preargs;
|
||||
//qDebug()<<"PRE ARGS: "<<preargs;
|
||||
m_args << "-profile" << profile;
|
||||
if (scenelist.startsWith("consumer:")) {
|
||||
// Use MLT's producer_consumer, needs a different syntax for profile:
|
||||
m_args << "profile=" + profile;
|
||||
} else m_args << "-profile" << profile;
|
||||
m_args << "-consumer" << rendermodule + ":" + m_dest << "progress=1" << args;
|
||||
connect(m_renderProcess, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(slotIsOver(int, QProcess::ExitStatus)));
|
||||
m_renderProcess->setReadChannel(QProcess::StandardError);
|
||||
|
||||
/*
|
||||
// Create a log of every render process.
|
||||
m_logfile.setAutoRemove(false);
|
||||
m_logfile.setFileTemplate(QDir::tempPath() + "/kdenlive_render.log.XXXXXXXX");
|
||||
if (m_logfile.open()) {
|
||||
qDebug() << "Writing render log to " << m_logfile.fileName();
|
||||
|
||||
} else {
|
||||
qDebug() << "Unable to log to " << m_logfile.fileName();
|
||||
}
|
||||
m_logstream.setDevice(&m_logfile);
|
||||
m_logstream << "Log starting. Dumping contents of " << scenelist << endl;
|
||||
QFile file(scenelist);
|
||||
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
||||
m_logstream << "Unable to read contents of " << scenelist << endl;
|
||||
} else {
|
||||
m_logstream.flush();
|
||||
QTextStream in(&file);
|
||||
m_logstream << in.readAll() << endl;
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
RenderJob::~RenderJob() {
|
||||
if (m_renderProcess) delete m_renderProcess;
|
||||
// m_logfile.close();
|
||||
}
|
||||
|
||||
void RenderJob::slotAbort(const QString& url) {
|
||||
if (m_dest == url) slotAbort();
|
||||
}
|
||||
|
||||
void RenderJob::slotAbort() {
|
||||
qDebug() << "Kdenlive-render: JOB ABORTED BY USER...";
|
||||
m_renderProcess->kill();
|
||||
if (m_jobUiserver) QDBusReply<QString> reply = m_jobUiserver->call("terminate", "");
|
||||
|
||||
if (m_kdenliveinterface) {
|
||||
m_dbusargs[1] = -3;
|
||||
m_dbusargs.append(QString());
|
||||
m_kdenliveinterface->callWithArgumentList(QDBus::NoBlock, "setRenderingFinished", m_dbusargs);
|
||||
}
|
||||
if (m_jobUiserver) m_jobUiserver->call("terminate", QString());
|
||||
if (m_erase) {
|
||||
QFile f(m_scenelist);
|
||||
f.remove();
|
||||
}
|
||||
QFile f(m_dest);
|
||||
f.remove();
|
||||
/*
|
||||
m_logstream << "Job aborted by user" << endl;
|
||||
m_logstream.flush();
|
||||
m_logfile.close();
|
||||
*/
|
||||
qApp->quit();
|
||||
}
|
||||
|
||||
void RenderJob::receivedStderr() {
|
||||
QString result = QString(m_renderProcess->readAllStandardError()).simplified();
|
||||
result = result.section(" ", -1);
|
||||
int pro = result.toInt();
|
||||
if (pro > m_progress) {
|
||||
m_progress = pro;
|
||||
if (m_jobUiserver) QDBusReply<QString> reply = m_jobUiserver->call("setPercent", (uint) m_progress);
|
||||
if (!result.startsWith("Current Frame")) m_errorMessage.append(result + "<br>");
|
||||
else {
|
||||
// m_logstream << "ReceivedStderr from inigo: " << result << endl;
|
||||
result = result.section(" ", -1);
|
||||
int pro = result.toInt();
|
||||
if (pro < 0 || pro > 100) return;
|
||||
if (pro > m_progress) {
|
||||
m_progress = pro;
|
||||
if (m_kdenliveinterface) {
|
||||
if (!m_kdenliveinterface->isValid()) {
|
||||
delete m_kdenliveinterface;
|
||||
m_kdenliveinterface = NULL;
|
||||
// qDebug() << "BROKEN COMMUNICATION WITH KDENLIVE";
|
||||
} else {
|
||||
m_dbusargs[1] = pro;
|
||||
m_kdenliveinterface->callWithArgumentList(QDBus::NoBlock, "setRenderingProgress", m_dbusargs);
|
||||
}
|
||||
} else if (pro % 5 == 0) {
|
||||
// Try to restart communication with Kdenlive every 5 percents
|
||||
// qDebug() << "TRYING TO RESTART COMMUNICATION WITH KDENLIVE";
|
||||
initKdenliveDbusInterface();
|
||||
}
|
||||
|
||||
if (m_jobUiserver) {
|
||||
m_jobUiserver->call("setPercent", (uint) m_progress);
|
||||
/*int seconds = m_startTime.secsTo(QTime::currentTime());
|
||||
seconds = seconds * (100 - m_progress) / m_progress;
|
||||
m_jobUiserver->call("setDescriptionField", (uint) 1, tr("Remaining time"), QTime().addSecs(seconds).toString("hh:mm:ss"));*/
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void RenderJob::start() {
|
||||
QDBusConnectionInterface* interface = QDBusConnection::sessionBus().interface();
|
||||
if (interface) {
|
||||
if (!interface->isServiceRegistered("org.kde.JobViewServer")) {
|
||||
qDebug() << "No org.kde.JobViewServer registered, trying to start kuiserver";
|
||||
if ( QProcess::startDetached( "kuiserver" ) ) {
|
||||
qDebug() << "Started kuiserver";
|
||||
// Give it a couple of seconds to start
|
||||
QTime t;
|
||||
t.start();
|
||||
while ( !interface->isServiceRegistered("org.kde.JobViewServer") && t.elapsed() < 3000 ) {
|
||||
SleepThread::msleep( 100 ); //Sleep 100 ms
|
||||
}
|
||||
} else {
|
||||
qDebug() << "Failed to start kuiserver";
|
||||
}
|
||||
}
|
||||
|
||||
if (interface->isServiceRegistered("org.kde.JobViewServer")) {
|
||||
QDBusInterface kuiserver("org.kde.JobViewServer", "/JobViewServer", "org.kde.JobViewServer");
|
||||
QDBusReply<QDBusObjectPath> objectPath = kuiserver.call("requestView", "kdenlive", "kdenlive", 1);
|
||||
QString reply = ((QDBusObjectPath) objectPath).path();
|
||||
m_jobUiserver = new QDBusInterface("org.kde.JobViewServer", reply, "org.kde.JobView");
|
||||
QDBusConnection::sessionBus().connect("org.kde.JobViewServer", reply, "org.kde.JobView", "cancelRequested", this, SLOT(slotAbort()));
|
||||
connect(m_renderProcess, SIGNAL(readyReadStandardError()), this, SLOT(receivedStderr()));
|
||||
}
|
||||
if (interface && m_usekuiserver) {
|
||||
if (!interface->isServiceRegistered("org.kde.JobViewServer")) {
|
||||
qDebug() << "No org.kde.JobViewServer registered, trying to start kuiserver";
|
||||
// m_logstream << "No org.kde.JobViewServer registered, trying to start kuiserver";
|
||||
if (QProcess::startDetached("kuiserver")) {
|
||||
qDebug() << "Started kuiserver";
|
||||
// m_logstream << "Started kuiserver";
|
||||
// Give it a couple of seconds to start
|
||||
QTime t;
|
||||
t.start();
|
||||
while (!interface->isServiceRegistered("org.kde.JobViewServer") && t.elapsed() < 3000) {
|
||||
SleepThread::msleep(100); //Sleep 100 ms
|
||||
}
|
||||
} else {
|
||||
qDebug() << "Failed to start kuiserver";
|
||||
// m_logstream << "Failed to start kuiserver";
|
||||
}
|
||||
}
|
||||
|
||||
if (interface->isServiceRegistered("org.kde.JobViewServer")) {
|
||||
QDBusInterface kuiserver("org.kde.JobViewServer", "/JobViewServer", "org.kde.JobViewServer");
|
||||
QDBusReply<QDBusObjectPath> objectPath = kuiserver.call("requestView", "kdenlive", "kdenlive", 0x0001);
|
||||
QString reply = ((QDBusObjectPath) objectPath).path();
|
||||
m_jobUiserver = new QDBusInterface("org.kde.JobViewServer", reply, "org.kde.JobView");
|
||||
if (m_jobUiserver) {
|
||||
m_startTime = QTime::currentTime();
|
||||
m_jobUiserver->call("setPercent", (uint) 0);
|
||||
m_jobUiserver->call("setInfoMessage", tr("Rendering %1").arg(QFileInfo(m_dest).fileName()));
|
||||
//m_jobUiserver->call("setDescriptionField", (uint) 0, tr("Rendering to"), m_dest);
|
||||
QDBusConnection::sessionBus().connect("org.kde.JobViewServer", reply, "org.kde.JobView", "cancelRequested", this, SLOT(slotAbort()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
initKdenliveDbusInterface();
|
||||
|
||||
// Because of the logging, we connect to stderr in all cases.
|
||||
connect(m_renderProcess, SIGNAL(readyReadStandardError()), this, SLOT(receivedStderr()));
|
||||
m_renderProcess->start(m_prog, m_args);
|
||||
// m_logstream << "Started render process: " << m_prog << " " << m_args.join(" ") << endl;
|
||||
qDebug() << "Started render process: " << m_prog << " " << m_args.join(" ");
|
||||
}
|
||||
|
||||
|
||||
void RenderJob::initKdenliveDbusInterface() {
|
||||
QString kdenliveId;
|
||||
QDBusConnection connection = QDBusConnection::sessionBus();
|
||||
QDBusConnectionInterface *ibus = connection.interface();
|
||||
const QStringList services = ibus->registeredServiceNames();
|
||||
foreach(const QString &service, services) {
|
||||
if (!service.startsWith("org.kde.kdenlive"))
|
||||
continue;
|
||||
kdenliveId = service;
|
||||
break;
|
||||
}
|
||||
m_dbusargs.clear();
|
||||
if (kdenliveId.isEmpty()) return;
|
||||
m_kdenliveinterface = new QDBusInterface(kdenliveId,
|
||||
"/MainWindow",
|
||||
"org.kdenlive.MainWindow",
|
||||
connection,
|
||||
this);
|
||||
|
||||
if (m_kdenliveinterface) {
|
||||
m_dbusargs.append(m_dest);
|
||||
m_dbusargs.append((int) 0);
|
||||
m_kdenliveinterface->callWithArgumentList(QDBus::NoBlock, "setRenderingProgress", m_dbusargs);
|
||||
connect(m_kdenliveinterface, SIGNAL(abortRenderJob(const QString &)),
|
||||
this, SLOT(slotAbort(const QString&)));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void RenderJob::slotIsOver(int exitcode, QProcess::ExitStatus status) {
|
||||
if (m_jobUiserver) QDBusReply<QString> reply = m_jobUiserver->call("terminate", "");
|
||||
if (m_jobUiserver) m_jobUiserver->call("terminate", QString());
|
||||
if (m_erase) {
|
||||
QFile f(m_scenelist);
|
||||
f.remove();
|
||||
}
|
||||
if (status == QProcess::CrashExit) {
|
||||
// rendering crashed
|
||||
if (m_kdenliveinterface) {
|
||||
m_dbusargs[1] = (int) - 2;
|
||||
m_dbusargs.append(m_errorMessage);
|
||||
m_kdenliveinterface->callWithArgumentList(QDBus::NoBlock, "setRenderingFinished", m_dbusargs);
|
||||
}
|
||||
QStringList args;
|
||||
args << "--error" << tr("Rendering of %1 aborted, resulting video will probably be corrupted.").arg(m_dest);
|
||||
// m_logstream << "Rendering of " << m_dest << " aborted, resulting video will probably be corrupted." << endl;
|
||||
qDebug() << "Rendering of " << m_dest << " aborted, resulting video will probably be corrupted.";
|
||||
QProcess::startDetached("kdialog", args);
|
||||
} else {
|
||||
if (m_kdenliveinterface) {
|
||||
m_dbusargs[1] = (int) - 1;
|
||||
m_dbusargs.append(QString());
|
||||
m_kdenliveinterface->callWithArgumentList(QDBus::NoBlock, "setRenderingFinished", m_dbusargs);
|
||||
}
|
||||
QDBusConnectionInterface* interface = QDBusConnection::sessionBus().interface();
|
||||
if (interface && interface->isServiceRegistered("org.kde.knotify")) {
|
||||
QDBusMessage m = QDBusMessage::createMethodCall("org.kde.knotify",
|
||||
"/Notify",
|
||||
"org.kde.KNotify",
|
||||
"event");
|
||||
|
||||
int seconds = m_startTime.secsTo(QTime::currentTime());
|
||||
QList<QVariant> args;
|
||||
args.append(QString("RenderFinished")); // action name
|
||||
args.append(QString("kdenlive")); // app name
|
||||
args.append(QVariantList()); // contexts
|
||||
args.append(tr("Rendering of %1 is over").arg(m_dest)); // body
|
||||
args.append(tr("Rendering of %1 finished in %2").arg(m_dest, QTime(0, 0, seconds).toString("hh:mm:ss"))); // body
|
||||
args.append(QByteArray()); // app icon
|
||||
QStringList actionList;
|
||||
args.append(actionList); // actions
|
||||
qlonglong wid;
|
||||
args.append(wid); // win id
|
||||
|
||||
/*
|
||||
uint id = 0;
|
||||
int timeout = 5000;
|
||||
QDBusMessage m = QDBusMessage::createMethodCall("org.kde.VisualNotifications",
|
||||
"/VisualNotifications",
|
||||
"org.kde.VisualNotifications",
|
||||
"Notify");
|
||||
|
||||
args.append( QString("kdenlive") ); // app_name
|
||||
args.append( id ); // replaces_id
|
||||
args.append( QString("kdenlive") ); // app_icon
|
||||
args.append( tr("Rendering finished")); // summary
|
||||
args.append( tr("Rendering of %1 is over").arg(m_dest) ); // body
|
||||
QStringList actionList;
|
||||
args.append( actionList ); // actions
|
||||
args.append( QVariantMap() ); // hints - unused atm
|
||||
args.append( timeout ); // expire timout
|
||||
*/
|
||||
|
||||
m.setArguments(args);
|
||||
QDBusMessage replyMsg = QDBusConnection::sessionBus().call(m);
|
||||
}
|
||||
|
||||
// m_logstream << "Rendering of " << m_dest << " finished" << endl;
|
||||
qDebug() << "Rendering of " << m_dest << " finished";
|
||||
if (m_player != "-") {
|
||||
// m_logstream << "Starting player" << endl;
|
||||
QStringList args;
|
||||
args << m_dest;
|
||||
QProcess::startDetached(m_player, args);
|
||||
|
||||
@@ -24,11 +24,15 @@
|
||||
#include <QProcess>
|
||||
#include <QObject>
|
||||
#include <QDBusInterface>
|
||||
#include <QTime>
|
||||
// Testing
|
||||
#include <QTemporaryFile>
|
||||
#include <QTextStream>
|
||||
|
||||
class RenderJob : public QObject {
|
||||
Q_OBJECT
|
||||
public:
|
||||
RenderJob(bool erase, const QString &renderer, const QString &profile, const QString &rendermodule, const QString &player, const QString &scenelist, const QString &dest, const QStringList &preargs, const QStringList &args, int in = -1, int out = -1);
|
||||
RenderJob(bool erase, bool usekuiserver, const QString &renderer, const QString &profile, const QString &rendermodule, const QString &player, const QString &scenelist, const QString &dest, const QStringList &preargs, const QStringList &args, int in = -1, int out = -1);
|
||||
~RenderJob();
|
||||
void start();
|
||||
|
||||
@@ -36,17 +40,28 @@ private slots:
|
||||
void slotIsOver(int exitcode, QProcess::ExitStatus status);
|
||||
void receivedStderr();
|
||||
void slotAbort();
|
||||
void slotAbort(const QString& url);
|
||||
|
||||
private:
|
||||
QString m_scenelist;
|
||||
QString m_dest;
|
||||
int m_progress;
|
||||
QProcess *m_renderProcess;
|
||||
QString m_errorMessage;
|
||||
QString m_prog;
|
||||
QString m_player;
|
||||
QStringList m_args;
|
||||
bool m_erase;
|
||||
QDBusInterface *m_jobUiserver;
|
||||
QDBusInterface *m_kdenliveinterface;
|
||||
QList<QVariant> m_dbusargs;
|
||||
QTime m_startTime;
|
||||
void initKdenliveDbusInterface();
|
||||
bool m_usekuiserver;
|
||||
/** \brief Used to create a temporary file for logging */
|
||||
QTemporaryFile m_logfile;
|
||||
/** \brief Used to write to the log file */
|
||||
QTextStream m_logstream;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -4,24 +4,25 @@ add_subdirectory( mimetypes )
|
||||
|
||||
find_package(Nepomuk REQUIRED)
|
||||
|
||||
include_directories(
|
||||
include_directories (
|
||||
${QDBUS_INCLUDE_DIRS}
|
||||
${CMAKE_SOURCE_DIR}
|
||||
${CMAKE_BINARY_DIR}
|
||||
${KDE4_INCLUDES}
|
||||
|
||||
${CMAKE_SOURCE_DIR}/src/widgets
|
||||
${LIBMLT_INCLUDE_DIR}
|
||||
${LIBMLTPLUS_INCLUDE_DIR}
|
||||
${LIBFFMPEG_INCLUDE_DIR}
|
||||
${FFMPEG_HEADER_PATH}
|
||||
${NEPOMUK_INCLUDES}
|
||||
)
|
||||
|
||||
LINK_LIBRARIES(
|
||||
${LIBMLT_LIBRARY}
|
||||
${LIBMLTPLUS_LIBRARY}
|
||||
${LIBFFMPEG_LIBRARY}
|
||||
${NEPOMUK_LIBRARIES}
|
||||
)
|
||||
|
||||
|
||||
|
||||
kde4_add_ui_files(kdenlive_UI
|
||||
widgets/timeline_ui.ui
|
||||
widgets/monitor_ui.ui
|
||||
@@ -43,6 +44,7 @@ kde4_add_ui_files(kdenlive_UI
|
||||
widgets/wipeval_ui.ui
|
||||
widgets/boolval_ui.ui
|
||||
widgets/colorval_ui.ui
|
||||
widgets/positionval_ui.ui
|
||||
widgets/titlewidget_ui.ui
|
||||
widgets/timelinebuttons_ui.ui
|
||||
widgets/renderwidget_ui.ui
|
||||
@@ -58,6 +60,14 @@ kde4_add_ui_files(kdenlive_UI
|
||||
widgets/geometryval_ui.ui
|
||||
widgets/wizardstandard_ui.ui
|
||||
widgets/wizardextra_ui.ui
|
||||
widgets/wizardcheck_ui.ui
|
||||
widgets/wizardmltcheck_ui.ui
|
||||
widgets/spacerdialog_ui.ui
|
||||
widgets/addtrack_ui.ui
|
||||
widgets/dvdwizardvob_ui.ui
|
||||
widgets/dvdwizardmenu_ui.ui
|
||||
widgets/dvdwizardiso_ui.ui
|
||||
widgets/dvdwizardstatus_ui.ui
|
||||
)
|
||||
|
||||
set(kdenlive_SRCS
|
||||
@@ -131,8 +141,18 @@ set(kdenlive_SRCS
|
||||
abstractgroupitem.cpp
|
||||
keyframehelper.cpp
|
||||
editclipcommand.cpp
|
||||
insertspacecommand.cpp
|
||||
spacerdialog.cpp
|
||||
addtrackcommand.cpp
|
||||
changetrackcommand.cpp
|
||||
movegroupcommand.cpp
|
||||
dvdwizardvob.cpp
|
||||
dvdwizardmenu.cpp
|
||||
dvdwizard.cpp
|
||||
)
|
||||
|
||||
add_definitions( ${KDE4_DEFINITIONS} )
|
||||
|
||||
if(NO_JOGSHUTTLE)
|
||||
add_definitions(-DNO_JOGSHUTTLE)
|
||||
else(NO_JOGSHUTTLE)
|
||||
@@ -140,23 +160,31 @@ else(NO_JOGSHUTTLE)
|
||||
endif(NO_JOGSHUTTLE)
|
||||
|
||||
kde4_add_kcfg_files(kdenlive_SRCS GENERATE_MOC kdenlivesettings.kcfgc )
|
||||
|
||||
QT4_ADD_DBUS_ADAPTOR(kdenlive_SRCS org.kdenlive.MainWindow.xml mainwindow.h MainWindow)
|
||||
kde4_add_executable(kdenlive ${kdenlive_SRCS} ${kdenlive_UI})
|
||||
|
||||
|
||||
target_link_libraries(kdenlive
|
||||
${KDE4_KDEUI_LIBS}
|
||||
${KDE4_KIO_LIBS}
|
||||
${KDE4_KIO_LIBS}
|
||||
${KDE4_KNEWSTUFF2_LIBS}
|
||||
${LIBMLTPLUS_LIBRARY}
|
||||
${LIBMLT_LIBRARY}
|
||||
${NEPOMUK_LIBRARIES}
|
||||
${KDE4_KNOTIFYCONFIG_LIBRARY}
|
||||
)
|
||||
|
||||
|
||||
if (APPLE)
|
||||
find_package(SDL REQUIRED)
|
||||
target_link_libraries(kdenlive ${SDL_LIBRARY})
|
||||
endif (APPLE)
|
||||
|
||||
install(TARGETS kdenlive DESTINATION ${BIN_INSTALL_DIR})
|
||||
install( FILES kdenliveui.rc kdenlive.notifyrc DESTINATION ${DATA_INSTALL_DIR}/kdenlive )
|
||||
install (FILES kdenlivesettings.kcfg DESTINATION share/config.kcfg)
|
||||
install (FILES kdenlive.desktop DESTINATION share/applications/kde)
|
||||
install (FILES application-x-kdenlive.svgz video-mlt-playlist.svgz DESTINATION share/icons/oxygen/scalable/mimetypes)
|
||||
install( FILES kdenlive.knsrc DESTINATION ${CONFIG_INSTALL_DIR} )
|
||||
kde4_install_icons( ${ICON_INSTALL_DIR} )
|
||||
|
||||
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
|
||||
#include "abstractclipitem.h"
|
||||
#include "customtrackscene.h"
|
||||
#include "kdenlivesettings.h"
|
||||
|
||||
AbstractClipItem::AbstractClipItem(const ItemInfo info, const QRectF& rect, double fps): QGraphicsRectItem(rect), m_track(0), m_fps(fps), m_editedKeyframe(-1), m_selectedKeyframe(0), m_keyframeFactor(1) {
|
||||
setFlags(/*QGraphicsItem::ItemClipsToShape | */QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
|
||||
@@ -65,6 +66,11 @@ void AbstractClipItem::setCropStart(GenTime pos) {
|
||||
m_cropStart = pos;
|
||||
}
|
||||
|
||||
void AbstractClipItem::updateItem() {
|
||||
m_track = (int)(scenePos().y() / KdenliveSettings::trackheight());
|
||||
m_startPos = GenTime((int) scenePos().x(), m_fps);
|
||||
}
|
||||
|
||||
void AbstractClipItem::updateRectGeometry() {
|
||||
setRect(0, 0, cropDuration().frames(m_fps) - 0.02, rect().height());
|
||||
}
|
||||
@@ -77,7 +83,9 @@ void AbstractClipItem::resizeStart(int posx, double speed) {
|
||||
if (type() == AVWIDGET && cropStart() + durationDiff < GenTime()) {
|
||||
durationDiff = GenTime() - cropStart();
|
||||
} else if (durationDiff >= m_cropDuration) {
|
||||
durationDiff = m_cropDuration - GenTime(3, m_fps);
|
||||
return;
|
||||
if (m_cropDuration > GenTime(3, m_fps)) durationDiff = GenTime(3, m_fps);
|
||||
else return;
|
||||
}
|
||||
|
||||
m_startPos += durationDiff;
|
||||
@@ -85,41 +93,49 @@ void AbstractClipItem::resizeStart(int posx, double speed) {
|
||||
m_cropDuration = m_cropDuration - durationDiff * speed;
|
||||
|
||||
setRect(0, 0, cropDuration().frames(m_fps) - 0.02, rect().height());
|
||||
setPos((qreal) m_startPos.frames(m_fps), pos().y());
|
||||
setPos(m_startPos.frames(m_fps), pos().y());
|
||||
if ((int) pos().x() != posx) {
|
||||
//kDebug()<<"////// WARNING, DIFF IN XPOS: "<<pos().x()<<" == "<<m_startPos.frames(m_fps);
|
||||
GenTime diff = GenTime((int) pos().x() - posx, m_fps);
|
||||
if (type() == AVWIDGET) m_cropStart = m_cropStart + diff;
|
||||
m_cropDuration = m_cropDuration - diff;
|
||||
setRect(0, 0, cropDuration().frames(m_fps) - 0.02, rect().height());
|
||||
//kDebug()<<"// NEW START: "<<m_startPos.frames(25)<<", NW DUR: "<<m_cropDuration.frames(25);
|
||||
}
|
||||
|
||||
|
||||
//kDebug() << "-- NEW CLIP=" << startPos().frames(25) << "-" << endPos().frames(25);
|
||||
|
||||
//setRect((double) m_startPos.frames(m_fps) * scale, rect().y(), (double) m_cropDuration.frames(m_fps) * scale, rect().height());
|
||||
if (durationDiff < GenTime()) {
|
||||
QList <QGraphicsItem *> collisionList = collidingItems(Qt::IntersectsItemBoundingRect);
|
||||
for (int i = 0; i < collisionList.size(); ++i) {
|
||||
QGraphicsItem *item = collisionList.at(i);
|
||||
if (item->type() == type() && item->pos().x() < pos().x()) {
|
||||
kDebug() << "///////// COLLISION DETECTED!!!!!!!!!";
|
||||
GenTime diff = ((AbstractClipItem *)item)->endPos() + GenTime(1, m_fps) - m_startPos;
|
||||
setRect(0, 0, (m_cropDuration - diff).frames(m_fps) - 0.02, rect().height());
|
||||
setPos((qreal)(m_startPos + diff).frames(m_fps), pos().y());
|
||||
m_startPos += diff;
|
||||
if (type() == AVWIDGET) m_cropStart += diff;
|
||||
m_cropDuration = m_cropDuration - diff;
|
||||
break;
|
||||
|
||||
/* if (durationDiff < GenTime()) {
|
||||
QList <QGraphicsItem *> collisionList = collidingItems(Qt::IntersectsItemBoundingRect);
|
||||
for (int i = 0; i < collisionList.size(); ++i) {
|
||||
QGraphicsItem *item = collisionList.at(i);
|
||||
if (item->type() == type() && item->pos().x() < pos().x()) {
|
||||
kDebug() << "///////// COLLISION DETECTED!!!!!!!!!";
|
||||
GenTime diff = ((AbstractClipItem *)item)->endPos() + GenTime(1, m_fps) - m_startPos;
|
||||
setRect(0, 0, (m_cropDuration - diff).frames(m_fps) - 0.02, rect().height());
|
||||
setPos((m_startPos + diff).frames(m_fps), pos().y());
|
||||
m_startPos += diff;
|
||||
if (type() == AVWIDGET) m_cropStart += diff;
|
||||
m_cropDuration = m_cropDuration - diff;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
||||
void AbstractClipItem::resizeEnd(int posx, double speed, bool updateKeyFrames) {
|
||||
GenTime durationDiff = GenTime(posx, m_fps) - endPos();
|
||||
if (durationDiff == GenTime()) return;
|
||||
//kDebug() << "-- RESCALE: CROP=" << m_cropStart << ", DIFF = " << durationDiff;
|
||||
kDebug() << "// DUR DIFF1:" << durationDiff.frames(25) << ", ADJUSTED: " << durationDiff.frames(25) * speed << ", SPED:" << speed;
|
||||
//kDebug() << "// DUR DIFF1:" << durationDiff.frames(25) << ", ADJUSTED: " << durationDiff.frames(25) * speed << ", SPED:" << speed;
|
||||
if (cropDuration() + durationDiff <= GenTime()) {
|
||||
durationDiff = GenTime() - (cropDuration() - GenTime(3, m_fps));
|
||||
} else if (cropStart() + cropDuration() + durationDiff >= maxDuration()) {
|
||||
kDebug() << "// MAX OVERLOAD:" << cropDuration().frames(25) << " + " << durationDiff.frames(25) << ", MAX:" << maxDuration().frames(25);
|
||||
//kDebug() << "// MAX OVERLOAD:" << cropDuration().frames(25) << " + " << durationDiff.frames(25) << ", MAX:" << maxDuration().frames(25);
|
||||
durationDiff = maxDuration() - cropDuration() - cropStart();
|
||||
}
|
||||
kDebug() << "// DUR DIFF2:" << durationDiff.frames(25) << ", ADJUSTED: " << durationDiff.frames(25) * speed << ", SPED:" << speed;
|
||||
//kDebug() << "// DUR DIFF2:" << durationDiff.frames(25) << ", ADJUSTED: " << durationDiff.frames(25) * speed << ", SPED:" << speed;
|
||||
m_cropDuration += durationDiff * speed;
|
||||
setRect(0, 0, cropDuration().frames(m_fps) - 0.02, rect().height());
|
||||
if (durationDiff > GenTime()) {
|
||||
@@ -127,12 +143,12 @@ void AbstractClipItem::resizeEnd(int posx, double speed, bool updateKeyFrames) {
|
||||
for (int i = 0; i < collisionList.size(); ++i) {
|
||||
QGraphicsItem *item = collisionList.at(i);
|
||||
if (item->type() == type() && item->pos().x() > pos().x()) {
|
||||
kDebug() << "///////// COLLISION DETECTED!!!!!!!!!";
|
||||
/*kDebug() << "///////// COLLISION DETECTED!!!!!!!!!";
|
||||
kDebug() << "///////// CURRENT: " << startPos().frames(25) << "x" << endPos().frames(25) << ", RECT: " << rect() << "-" << pos();
|
||||
kDebug() << "///////// COLLISION: " << ((AbstractClipItem *)item)->startPos().frames(25) << "x" << ((AbstractClipItem *)item)->endPos().frames(25) << ", RECT: " << ((AbstractClipItem *)item)->rect() << "-" << item->pos();
|
||||
kDebug() << "///////// COLLISION: " << ((AbstractClipItem *)item)->startPos().frames(25) << "x" << ((AbstractClipItem *)item)->endPos().frames(25) << ", RECT: " << ((AbstractClipItem *)item)->rect() << "-" << item->pos();*/
|
||||
GenTime diff = ((AbstractClipItem *)item)->startPos() - GenTime(1, m_fps) - startPos();
|
||||
m_cropDuration = diff;
|
||||
setRect(0, 0, (m_cropDuration.frames(m_fps)) - 0.02, rect().height());
|
||||
m_cropDuration = diff * speed;
|
||||
setRect(0, 0, cropDuration().frames(m_fps) - 0.02, rect().height());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,6 +41,7 @@ public:
|
||||
ItemInfo info() const;
|
||||
CustomTrackScene* projectScene();
|
||||
void updateRectGeometry();
|
||||
void updateItem();
|
||||
|
||||
virtual OPERATIONTYPE operationMode(QPointF pos) = 0;
|
||||
virtual GenTime startPos() const ;
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
#include <QGraphicsScene>
|
||||
#include <QGraphicsView>
|
||||
#include <QScrollBar>
|
||||
#include <QStyleOptionGraphicsItem>
|
||||
#include <QToolTip>
|
||||
|
||||
#include <KDebug>
|
||||
@@ -32,6 +33,7 @@
|
||||
#include "customtrackscene.h"
|
||||
|
||||
AbstractGroupItem::AbstractGroupItem(double fps): QGraphicsItemGroup(), m_fps(fps) {
|
||||
setZValue(2);
|
||||
setFlags(QGraphicsItem::ItemClipsToShape | QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
|
||||
}
|
||||
|
||||
@@ -48,17 +50,16 @@ CustomTrackScene* AbstractGroupItem::projectScene() {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
QPolygonF AbstractGroupItem::groupShape(QPointF offset) {
|
||||
QPainterPath AbstractGroupItem::groupShape(QPointF offset) {
|
||||
QPainterPath path;
|
||||
QList<QGraphicsItem *> children = childItems();
|
||||
QPolygonF path;
|
||||
for (int i = 0; i < children.count(); i++) {
|
||||
if (children.at(i)->type() == AVWIDGET) {
|
||||
QPolygonF r = QPolygonF(children.at(i)->sceneBoundingRect());
|
||||
path = path.united(r);
|
||||
QRectF r(children.at(i)->sceneBoundingRect());
|
||||
r.translate(offset);
|
||||
path.addRect(r);
|
||||
}
|
||||
}
|
||||
path.translate(offset);
|
||||
return path;
|
||||
}
|
||||
|
||||
@@ -76,101 +77,105 @@ void AbstractGroupItem::fixItemRect() {
|
||||
}
|
||||
|
||||
// virtual
|
||||
void AbstractGroupItem::paint(QPainter *p, const QStyleOptionGraphicsItem *, QWidget *) {
|
||||
p->fillRect(boundingRect(), QColor(200, 100, 100, 100));
|
||||
void AbstractGroupItem::paint(QPainter *p, const QStyleOptionGraphicsItem *option, QWidget *) {
|
||||
p->fillRect(option->exposedRect, QColor(200, 100, 100, 100));
|
||||
}
|
||||
|
||||
//virtual
|
||||
QVariant AbstractGroupItem::itemChange(GraphicsItemChange change, const QVariant &value) {
|
||||
if (change == ItemPositionChange && scene()) {
|
||||
// calculate new position.
|
||||
const int trackHeight = KdenliveSettings::trackheight();
|
||||
QPointF newPos = value.toPointF();
|
||||
int xpos = projectScene()->getSnapPointForPos((int) newPos.x(), KdenliveSettings::snaptopoints());
|
||||
xpos = qMax(xpos, 0);
|
||||
newPos.setX(xpos);
|
||||
|
||||
//kDebug()<<"// GRP MOVE: "<<pos().y()<<"->"<<newPos.y();
|
||||
QPointF start = pos();//sceneBoundingRect().topLeft();
|
||||
int posx = start.x() + newPos.x(); //projectScene()->getSnapPointForPos(start.x() + sc.x(), KdenliveSettings::snaptopoints());
|
||||
|
||||
int startTrack = (start.y() + KdenliveSettings::trackheight() / 2) / KdenliveSettings::trackheight();
|
||||
int newTrack = (newPos.y()) / KdenliveSettings::trackheight();
|
||||
QPointF start = pos();
|
||||
int startTrack = (start.y() + trackHeight / 2) / trackHeight;
|
||||
int newTrack = (newPos.y()) / trackHeight;
|
||||
//kDebug()<<"// GROUP NEW T:"<<newTrack<<",START T:"<<startTrack<<",MAX:"<<projectScene()->tracksCount() - 1;
|
||||
newTrack = qMin(newTrack, projectScene()->tracksCount() - (int)(boundingRect().height() + 5) / KdenliveSettings::trackheight());
|
||||
newTrack = qMin(newTrack, projectScene()->tracksCount() - (int)(boundingRect().height() + 5) / trackHeight);
|
||||
newTrack = qMax(newTrack, 0);
|
||||
newPos.setY((int)((newTrack) * KdenliveSettings::trackheight()));
|
||||
|
||||
//kDebug() << "------------------------------------GRUOP MOVE";
|
||||
// Check if top item is a clip or a transition
|
||||
int offset = 0;
|
||||
int topTrack = -1;
|
||||
QList<QGraphicsItem *> children = childItems();
|
||||
for (int i = 0; i < children.count(); i++) {
|
||||
int currentTrack = (int)(children.at(i)->scenePos().y() / trackHeight);
|
||||
if (children.at(i)->type() == AVWIDGET) {
|
||||
if (topTrack == -1 || currentTrack <= topTrack) {
|
||||
offset = 0;
|
||||
topTrack = currentTrack;
|
||||
}
|
||||
} else if (children.at(i)->type() == TRANSITIONWIDGET) {
|
||||
if (topTrack == -1 || currentTrack < topTrack) {
|
||||
offset = (int)(trackHeight / 3 * 2 - 1);
|
||||
topTrack = currentTrack;
|
||||
}
|
||||
}
|
||||
}
|
||||
newPos.setY((int)((newTrack) * trackHeight) + offset);
|
||||
if (newPos == start) return start;
|
||||
|
||||
if (start.x() + newPos.x() - pos().x() < 0) {
|
||||
if (newPos.x() < 0) {
|
||||
// If group goes below 0, adjust position to 0
|
||||
return QPointF(pos().x() - start.x(), pos().y());
|
||||
}
|
||||
|
||||
QPolygonF sceneShape = groupShape(newPos - pos());
|
||||
QList<QGraphicsItem*> collindingItems = scene()->items(sceneShape, Qt::IntersectsItemShape);
|
||||
QList<QGraphicsItem *> children = childItems();
|
||||
QPainterPath shape = groupShape(newPos - pos());
|
||||
QList<QGraphicsItem*> collindingItems = scene()->items(shape, Qt::IntersectsItemShape);
|
||||
for (int i = 0; i < children.count(); i++) {
|
||||
collindingItems.removeAll(children.at(i));
|
||||
}
|
||||
if (collindingItems.isEmpty()) return newPos;
|
||||
else {
|
||||
bool forwardMove = newPos.x() > start.x();
|
||||
int offset = 0;
|
||||
const double width = sceneBoundingRect().width() + 1;
|
||||
for (int i = 0; i < collindingItems.count(); i++) {
|
||||
QGraphicsItem *collision = collindingItems.at(i);
|
||||
if (collision->type() == AVWIDGET) {
|
||||
// Collision
|
||||
return pos();
|
||||
//TODO: improve movement when collision happens
|
||||
/*if (startTrack != newTrack) return pos();
|
||||
if (collision->pos().x() > pos().x()) {
|
||||
return QPointF(collision->sceneBoundingRect().x() - sceneBoundingRect().width() + pos().x() - start.x() - 1, newPos.y());
|
||||
}*/
|
||||
//kDebug()<<"// COLLISION WIT:"<<collision->sceneBoundingRect();
|
||||
if (newPos.y() != start.y()) {
|
||||
// Track change results in collision, restore original position
|
||||
return start;
|
||||
}
|
||||
AbstractClipItem *item = static_cast <AbstractClipItem *>(collision);
|
||||
if (forwardMove) {
|
||||
// Moving forward, determine best pos
|
||||
QPainterPath clipPath;
|
||||
clipPath.addRect(item->sceneBoundingRect());
|
||||
QPainterPath res = shape.intersected(clipPath);
|
||||
offset = qMax(offset, (int)(res.boundingRect().width() + 0.5));
|
||||
} else {
|
||||
// Moving backward, determine best pos
|
||||
QPainterPath clipPath;
|
||||
clipPath.addRect(item->sceneBoundingRect());
|
||||
QPainterPath res = shape.intersected(clipPath);
|
||||
offset = qMax(offset, (int)(res.boundingRect().width() + 0.5));
|
||||
}
|
||||
}
|
||||
}
|
||||
if (offset > 0) {
|
||||
if (forwardMove) {
|
||||
newPos.setX(newPos.x() - offset);
|
||||
} else {
|
||||
newPos.setX(newPos.x() + offset);
|
||||
}
|
||||
// If there is still a collision after our position adjust, restore original pos
|
||||
collindingItems = scene()->items(groupShape(newPos - pos()), Qt::IntersectsItemShape);
|
||||
for (int i = 0; i < children.count(); i++) {
|
||||
collindingItems.removeAll(children.at(i));
|
||||
}
|
||||
for (int i = 0; i < collindingItems.count(); i++)
|
||||
if (collindingItems.at(i)->type() == AVWIDGET) return pos();
|
||||
}
|
||||
return newPos;
|
||||
}
|
||||
|
||||
//else posx -= startx;
|
||||
//posx = qMax(posx, 0);
|
||||
//newPos.setX(posx);
|
||||
//kDebug()<<"Y POS: "<<start.y() + newPos.y()<<"SCN MP: "<<sc;
|
||||
/*int newTrack = (start.y() + newPos.y()) / KdenliveSettings::trackheight();
|
||||
int oldTrack = (start.y() + pos().y()) / KdenliveSettings::trackheight();
|
||||
newPos.setY((newTrack) * KdenliveSettings::trackheight() - start.y() + 1);*/
|
||||
|
||||
|
||||
//if (start.y() + newPos.y() < 1) newTrack = oldTrack;
|
||||
|
||||
return newPos;
|
||||
|
||||
// Only one clip is moving
|
||||
|
||||
QList<QGraphicsItem*> items = scene()->items(sceneShape, Qt::IntersectsItemShape);
|
||||
|
||||
|
||||
if (!items.isEmpty()) {
|
||||
for (int i = 0; i < items.count(); i++) {
|
||||
if (items.at(i)->type() == AVWIDGET) {
|
||||
// Collision!
|
||||
//kDebug()<<"/// COLLISION WITH ITEM: "<<items.at(i)->sceneBoundingRect();
|
||||
return pos();
|
||||
QPointF otherPos = items.at(i)->pos();
|
||||
if ((int) otherPos.y() != (int) pos().y()) return pos();
|
||||
if (pos().x() < otherPos.x()) {
|
||||
// move clip just before colliding clip
|
||||
int npos = (static_cast < AbstractClipItem* >(items.at(i))->startPos()).frames(m_fps) - sceneBoundingRect().width();
|
||||
newPos.setX(npos);
|
||||
} else {
|
||||
// get pos just after colliding clip
|
||||
int npos = static_cast < AbstractClipItem* >(items.at(i))->endPos().frames(m_fps);
|
||||
newPos.setX(npos);
|
||||
}
|
||||
return newPos;
|
||||
}
|
||||
}
|
||||
}
|
||||
return newPos;
|
||||
}
|
||||
return QGraphicsItem::itemChange(change, value);
|
||||
return QGraphicsItemGroup::itemChange(change, value);
|
||||
}
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ protected:
|
||||
virtual void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *);
|
||||
|
||||
private:
|
||||
QPolygonF groupShape(QPointF);
|
||||
QPainterPath groupShape(QPointF);
|
||||
void fixItemRect();
|
||||
double m_fps;
|
||||
};
|
||||
|
||||
@@ -20,23 +20,22 @@
|
||||
#include <KLocale>
|
||||
|
||||
#include "addfoldercommand.h"
|
||||
#include "kdenlivedoc.h"
|
||||
#include "projectlist.h"
|
||||
|
||||
AddFolderCommand::AddFolderCommand(KdenliveDoc *doc, const QString folderName, const QString &clipId, bool doIt)
|
||||
: m_doc(doc), m_name(folderName), m_id(clipId), m_doIt(doIt) {
|
||||
AddFolderCommand::AddFolderCommand(ProjectList *view, const QString folderName, const QString &clipId, bool doIt, QUndoCommand *parent) : QUndoCommand(parent), m_view(view), m_name(folderName), m_id(clipId), m_doIt(doIt) {
|
||||
if (doIt) setText(i18n("Add folder"));
|
||||
else setText(i18n("Delete folder"));
|
||||
}
|
||||
|
||||
// virtual
|
||||
void AddFolderCommand::undo() {
|
||||
if (m_doIt) m_doc->deleteFolder(m_name, m_id);
|
||||
else m_doc->addFolder(m_name, m_id, false);
|
||||
if (m_doIt) m_view->slotAddFolder(m_name, m_id, true);
|
||||
else m_view->slotAddFolder(m_name, m_id, false);
|
||||
}
|
||||
// virtual
|
||||
void AddFolderCommand::redo() {
|
||||
if (m_doIt) m_doc->addFolder(m_name, m_id, false);
|
||||
else m_doc->deleteFolder(m_name, m_id);
|
||||
if (m_doIt) m_view->slotAddFolder(m_name, m_id, false);
|
||||
else m_view->slotAddFolder(m_name, m_id, true);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -23,17 +23,17 @@
|
||||
|
||||
#include <QUndoCommand>
|
||||
|
||||
class KdenliveDoc;
|
||||
class ProjectList;
|
||||
|
||||
class AddFolderCommand : public QUndoCommand {
|
||||
public:
|
||||
AddFolderCommand(KdenliveDoc *doc, const QString folderName, const QString &clipId, bool doIt);
|
||||
AddFolderCommand(ProjectList *view, const QString folderName, const QString &clipId, bool doIt, QUndoCommand *parent = 0);
|
||||
|
||||
virtual void undo();
|
||||
virtual void redo();
|
||||
|
||||
private:
|
||||
KdenliveDoc *m_doc;
|
||||
ProjectList *m_view;
|
||||
QString m_name;
|
||||
QString m_id;
|
||||
bool m_doIt;
|
||||
|
||||
@@ -31,7 +31,7 @@ AddTimelineClipCommand::AddTimelineClipCommand(CustomTrackView *view, QDomElemen
|
||||
// virtual
|
||||
void AddTimelineClipCommand::undo() {
|
||||
if (!m_remove) m_view->deleteClip(m_clipInfo);
|
||||
else m_view->addClip(m_xml, m_clipId, m_clipInfo);
|
||||
else m_view->addClip(m_xml, m_clipId, m_clipInfo, m_effects);
|
||||
}
|
||||
// virtual
|
||||
void AddTimelineClipCommand::redo() {
|
||||
|
||||
47
src/addtrackcommand.cpp
Normal file
47
src/addtrackcommand.cpp
Normal file
@@ -0,0 +1,47 @@
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007 by Jean-Baptiste Mardelle (jb@kdenlive.org) *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
|
||||
***************************************************************************/
|
||||
|
||||
#include <KLocale>
|
||||
|
||||
#include "addtrackcommand.h"
|
||||
#include "customtrackview.h"
|
||||
|
||||
AddTrackCommand::AddTrackCommand(CustomTrackView *view, int ix, TrackInfo info, bool addTrack, bool doIt, QUndoCommand * parent) : QUndoCommand(parent), m_view(view), m_ix(ix), m_info(info), m_addTrack(addTrack), m_doIt(doIt) {
|
||||
if (addTrack) setText(i18n("Add track"));
|
||||
else setText(i18n("Delete track"));
|
||||
}
|
||||
|
||||
|
||||
// virtual
|
||||
void AddTrackCommand::undo() {
|
||||
// kDebug()<<"---- undoing action";
|
||||
m_doIt = true;
|
||||
if (m_addTrack) m_view->removeTrack(m_ix);
|
||||
else m_view->addTrack(m_info, m_ix);
|
||||
}
|
||||
// virtual
|
||||
void AddTrackCommand::redo() {
|
||||
kDebug() << "---- redoing action";
|
||||
if (m_doIt) {
|
||||
if (m_addTrack) m_view->addTrack(m_info, m_ix);
|
||||
else m_view->removeTrack(m_ix);
|
||||
}
|
||||
m_doIt = true;
|
||||
}
|
||||
|
||||
48
src/addtrackcommand.h
Normal file
48
src/addtrackcommand.h
Normal file
@@ -0,0 +1,48 @@
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007 by Jean-Baptiste Mardelle (jb@kdenlive.org) *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
|
||||
***************************************************************************/
|
||||
|
||||
|
||||
#ifndef ADDTRACKCOMMAND_H
|
||||
#define ADDTRACKCOMMAND_H
|
||||
|
||||
#include <QUndoCommand>
|
||||
#include <QGraphicsView>
|
||||
#include <QPointF>
|
||||
|
||||
#include <KDebug>
|
||||
#include "definitions.h"
|
||||
|
||||
class CustomTrackView;
|
||||
|
||||
class AddTrackCommand : public QUndoCommand {
|
||||
public:
|
||||
AddTrackCommand(CustomTrackView *view, int ix, TrackInfo info, bool addTrack, bool doIt, QUndoCommand * parent = 0);
|
||||
virtual void undo();
|
||||
virtual void redo();
|
||||
|
||||
private:
|
||||
CustomTrackView *m_view;
|
||||
int m_ix;
|
||||
bool m_doIt;
|
||||
bool m_addTrack;
|
||||
TrackInfo m_info;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
41
src/changetrackcommand.cpp
Normal file
41
src/changetrackcommand.cpp
Normal file
@@ -0,0 +1,41 @@
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007 by Jean-Baptiste Mardelle (jb@kdenlive.org) *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
|
||||
***************************************************************************/
|
||||
|
||||
#include <KLocale>
|
||||
|
||||
#include "changetrackcommand.h"
|
||||
#include "customtrackview.h"
|
||||
|
||||
ChangeTrackCommand::ChangeTrackCommand(CustomTrackView *view, int ix, TrackInfo oldInfo, TrackInfo newInfo, bool doIt, QUndoCommand * parent) : QUndoCommand(parent), m_view(view), m_ix(ix), m_oldinfo(oldInfo), m_newinfo(newInfo), m_doIt(doIt) {
|
||||
setText(i18n("Change track type"));
|
||||
}
|
||||
|
||||
|
||||
// virtual
|
||||
void ChangeTrackCommand::undo() {
|
||||
// kDebug()<<"---- undoing action";
|
||||
m_doIt = true;
|
||||
m_view->changeTrack(m_ix, m_oldinfo);
|
||||
}
|
||||
// virtual
|
||||
void ChangeTrackCommand::redo() {
|
||||
if (m_doIt) m_view->changeTrack(m_ix, m_newinfo);
|
||||
m_doIt = true;
|
||||
}
|
||||
|
||||
48
src/changetrackcommand.h
Normal file
48
src/changetrackcommand.h
Normal file
@@ -0,0 +1,48 @@
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007 by Jean-Baptiste Mardelle (jb@kdenlive.org) *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
|
||||
***************************************************************************/
|
||||
|
||||
|
||||
#ifndef CHANGETRACKCOMMAND_H
|
||||
#define CHANGETRACKCOMMAND_H
|
||||
|
||||
#include <QUndoCommand>
|
||||
#include <QGraphicsView>
|
||||
#include <QPointF>
|
||||
|
||||
#include <KDebug>
|
||||
#include "definitions.h"
|
||||
|
||||
class CustomTrackView;
|
||||
|
||||
class ChangeTrackCommand : public QUndoCommand {
|
||||
public:
|
||||
ChangeTrackCommand(CustomTrackView *view, int ix, TrackInfo oldInfo, TrackInfo newInfo, bool doIt, QUndoCommand * parent = 0);
|
||||
virtual void undo();
|
||||
virtual void redo();
|
||||
|
||||
private:
|
||||
CustomTrackView *m_view;
|
||||
int m_ix;
|
||||
bool m_doIt;
|
||||
TrackInfo m_oldinfo;
|
||||
TrackInfo m_newinfo;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
213
src/clipitem.cpp
213
src/clipitem.cpp
@@ -40,12 +40,17 @@
|
||||
#include "kthumb.h"
|
||||
|
||||
|
||||
ClipItem::ClipItem(DocClipBase *clip, ItemInfo info, double fps, bool generateThumbs)
|
||||
: AbstractClipItem(info, QRectF(), fps), m_clip(clip), m_resizeMode(NONE), m_grabPoint(0), m_maxTrack(0), m_hasThumbs(false), startThumbTimer(NULL), endThumbTimer(NULL), audioThumbWasDrawn(false), m_opacity(1.0), m_timeLine(0), m_startThumbRequested(false), m_endThumbRequested(false), m_startFade(0), m_endFade(0), m_hover(false), m_selectedEffect(-1), m_speed(1.0), framePixelWidth(0), m_startPix(QPixmap()), m_endPix(QPixmap()) {
|
||||
setRect(0, 0, (info.endPos - info.startPos).frames(fps) - 0.02, (qreal)(KdenliveSettings::trackheight() - 2));
|
||||
setPos((qreal) info.startPos.frames(fps), (qreal)(info.track * KdenliveSettings::trackheight()) + 1);
|
||||
ClipItem::ClipItem(DocClipBase *clip, ItemInfo info, double fps, double speed, bool generateThumbs)
|
||||
: AbstractClipItem(info, QRectF(), fps), m_clip(clip), m_resizeMode(NONE), m_grabPoint(0), m_maxTrack(0), m_hasThumbs(false), startThumbTimer(NULL), endThumbTimer(NULL), audioThumbWasDrawn(false), m_opacity(1.0), m_timeLine(0), m_startThumbRequested(false), m_endThumbRequested(false), m_startFade(0), m_endFade(0), m_hover(false), m_selectedEffect(-1), m_speed(speed), framePixelWidth(0), m_startPix(QPixmap()), m_endPix(QPixmap()) {
|
||||
setZValue(1);
|
||||
setRect(0, 0, (info.endPos - info.startPos).frames(fps) - 0.02, (double)(KdenliveSettings::trackheight() - 2));
|
||||
setPos(info.startPos.frames(fps), (double)(info.track * KdenliveSettings::trackheight()) + 1);
|
||||
|
||||
m_clipName = clip->name();
|
||||
if (m_speed == 1.0) m_clipName = clip->name();
|
||||
else {
|
||||
m_clipName = clip->name() + " - " + QString::number(m_speed * 100, 'f', 0) + "%";
|
||||
m_cropDuration = m_cropDuration * m_speed;
|
||||
}
|
||||
m_producer = clip->getId();
|
||||
m_clipType = clip->clipType();
|
||||
m_cropStart = info.cropStart;
|
||||
@@ -107,12 +112,12 @@ ClipItem::~ClipItem() {
|
||||
}
|
||||
|
||||
ClipItem *ClipItem::clone(ItemInfo info) const {
|
||||
ClipItem *duplicate = new ClipItem(m_clip, info, m_fps);
|
||||
ClipItem *duplicate = new ClipItem(m_clip, info, m_fps, m_speed);
|
||||
if (info.cropStart == cropStart()) duplicate->slotSetStartThumb(m_startPix);
|
||||
if (info.cropStart + (info.endPos - info.startPos) == m_cropStart + m_cropDuration) duplicate->slotSetEndThumb(m_endPix);
|
||||
kDebug() << "// CLoning clip: " << (info.cropStart + (info.endPos - info.startPos)).frames(m_fps) << ", CURRENT end: " << (cropStart() + duration()).frames(m_fps);
|
||||
duplicate->setEffectList(m_effectList.clone());
|
||||
duplicate->setSpeed(m_speed);
|
||||
//duplicate->setSpeed(m_speed);
|
||||
return duplicate;
|
||||
}
|
||||
|
||||
@@ -138,6 +143,7 @@ void ClipItem::initEffect(QDomElement effect) {
|
||||
QDomNodeList params = effect.elementsByTagName("parameter");
|
||||
for (int i = 0; i < params.count(); i++) {
|
||||
QDomElement e = params.item(i).toElement();
|
||||
kDebug() << "// inint eff: " << e.attribute("name");
|
||||
if (!e.isNull() && e.attribute("type") == "keyframe") {
|
||||
QString def = e.attribute("default");
|
||||
// Effect has a keyframe type parameter, we need to set the values
|
||||
@@ -152,7 +158,7 @@ void ClipItem::initEffect(QDomElement effect) {
|
||||
if (effect.attribute("tag") == "volume") {
|
||||
if (effect.attribute("id") == "fadeout") {
|
||||
int end = (duration() + cropStart()).frames(m_fps);
|
||||
int start = end - EffectsList::parameter(effect, "out").toInt();
|
||||
int start = end - EffectsList::parameter(effect, "in").toInt();
|
||||
EffectsList::setParameter(effect, "in", QString::number(start));
|
||||
EffectsList::setParameter(effect, "out", QString::number(end));
|
||||
} else if (effect.attribute("id") == "fadein") {
|
||||
@@ -426,14 +432,22 @@ void ClipItem::slotThumbReady(int frame, QPixmap pix) {
|
||||
}
|
||||
}
|
||||
|
||||
void ClipItem::slotSetStartThumb(QPixmap pix) {
|
||||
void ClipItem::slotSetStartThumb(const QPixmap pix) {
|
||||
m_startPix = pix;
|
||||
}
|
||||
|
||||
void ClipItem::slotSetEndThumb(QPixmap pix) {
|
||||
void ClipItem::slotSetEndThumb(const QPixmap pix) {
|
||||
m_endPix = pix;
|
||||
}
|
||||
|
||||
QPixmap ClipItem::startThumb() const {
|
||||
return m_startPix;
|
||||
}
|
||||
|
||||
QPixmap ClipItem::endThumb() const {
|
||||
return m_endPix;
|
||||
}
|
||||
|
||||
void ClipItem::slotGotAudioData() {
|
||||
audioThumbReady = true;
|
||||
if (m_clipType == AV) {
|
||||
@@ -452,7 +466,9 @@ DocClipBase *ClipItem::baseClip() const {
|
||||
}
|
||||
|
||||
QDomElement ClipItem::xml() const {
|
||||
return m_clip->toXML();
|
||||
QDomElement xml = m_clip->toXML();
|
||||
if (m_speed != 1.0) xml.setAttribute("speed", m_speed);
|
||||
return xml;
|
||||
}
|
||||
|
||||
int ClipItem::clipType() const {
|
||||
@@ -463,6 +479,10 @@ QString ClipItem::clipName() const {
|
||||
return m_clipName;
|
||||
}
|
||||
|
||||
void ClipItem::setClipName(const QString &name) {
|
||||
m_clipName = name;
|
||||
}
|
||||
|
||||
const QString &ClipItem::clipProducer() const {
|
||||
return m_producer;
|
||||
}
|
||||
@@ -486,7 +506,9 @@ void ClipItem::animate(qreal value) {
|
||||
void ClipItem::paint(QPainter *painter,
|
||||
const QStyleOptionGraphicsItem *option,
|
||||
QWidget *) {
|
||||
painter->setOpacity(m_opacity);
|
||||
/*if (parentItem()) m_opacity = 0.5;
|
||||
else m_opacity = 1.0;
|
||||
painter->setOpacity(m_opacity);*/
|
||||
QBrush paintColor = brush();
|
||||
if (isSelected()) paintColor = QBrush(QColor(79, 93, 121));
|
||||
QRectF br = rect();
|
||||
@@ -506,7 +528,7 @@ void ClipItem::paint(QPainter *painter,
|
||||
//build path around clip
|
||||
//QPainterPath resultClipPath = roundRectPathUpper.united(roundRectPathLower);
|
||||
//painter->fillPath(resultClipPath, paintColor);
|
||||
painter->fillRect(br, paintColor);
|
||||
painter->fillRect(exposed, paintColor);
|
||||
|
||||
//painter->setClipPath(resultClipPath, Qt::IntersectClip);
|
||||
|
||||
@@ -881,7 +903,7 @@ void ClipItem::setFadeIn(int pos) {
|
||||
if (pos == m_startFade) return;
|
||||
int oldIn = m_startFade;
|
||||
if (pos < 0) pos = 0;
|
||||
if (pos > m_cropDuration.frames(m_fps)) pos = (int)(m_cropDuration.frames(m_fps) / 2);
|
||||
if (pos > m_cropDuration.frames(m_fps)) pos = (int)(m_cropDuration.frames(m_fps));
|
||||
m_startFade = pos;
|
||||
QRectF rect = boundingRect();
|
||||
update(rect.x(), rect.y(), qMax(oldIn, pos), rect.height());
|
||||
@@ -891,7 +913,7 @@ void ClipItem::setFadeOut(int pos) {
|
||||
if (pos == m_endFade) return;
|
||||
int oldOut = m_endFade;
|
||||
if (pos < 0) pos = 0;
|
||||
if (pos > m_cropDuration.frames(m_fps)) pos = (int)(m_cropDuration.frames(m_fps) / 2);
|
||||
if (pos > m_cropDuration.frames(m_fps)) pos = (int)(m_cropDuration.frames(m_fps));
|
||||
m_endFade = pos;
|
||||
QRectF rect = boundingRect();
|
||||
update(rect.x() + rect.width() - qMax(oldOut, pos), rect.y(), qMax(oldOut, pos), rect.height());
|
||||
@@ -943,10 +965,12 @@ void ClipItem::resizeStart(int posx, double speed) {
|
||||
if (posx == startPos().frames(m_fps)) return;
|
||||
const int previous = cropStart().frames(m_fps);
|
||||
AbstractClipItem::resizeStart(posx, m_speed);
|
||||
checkEffectsKeyframesPos(previous, cropStart().frames(m_fps), true);
|
||||
if (m_hasThumbs && KdenliveSettings::videothumbnails()) {
|
||||
/*connect(m_clip->thumbProducer(), SIGNAL(thumbReady(int, QPixmap)), this, SLOT(slotThumbReady(int, QPixmap)));*/
|
||||
startThumbTimer->start(100);
|
||||
if ((int) cropStart().frames(m_fps) != previous) {
|
||||
checkEffectsKeyframesPos(previous, cropStart().frames(m_fps), true);
|
||||
if (m_hasThumbs && KdenliveSettings::videothumbnails()) {
|
||||
/*connect(m_clip->thumbProducer(), SIGNAL(thumbReady(int, QPixmap)), this, SLOT(slotThumbReady(int, QPixmap)));*/
|
||||
startThumbTimer->start(150);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -954,13 +978,15 @@ void ClipItem::resizeEnd(int posx, double speed, bool updateKeyFrames) {
|
||||
const int max = (startPos() - cropStart() + maxDuration()).frames(m_fps) + 1;
|
||||
if (posx > max) posx = max;
|
||||
if (posx == endPos().frames(m_fps)) return;
|
||||
kDebug() << "// NEW POS: " << posx << ", OLD END: " << endPos().frames(m_fps);
|
||||
//kDebug() << "// NEW POS: " << posx << ", OLD END: " << endPos().frames(m_fps);
|
||||
const int previous = (cropStart() + duration()).frames(m_fps);
|
||||
AbstractClipItem::resizeEnd(posx, m_speed);
|
||||
if (updateKeyFrames) checkEffectsKeyframesPos(previous, (cropStart() + duration()).frames(m_fps), false);
|
||||
if (m_hasThumbs && KdenliveSettings::videothumbnails()) {
|
||||
/*connect(m_clip->thumbProducer(), SIGNAL(thumbReady(int, QPixmap)), this, SLOT(slotThumbReady(int, QPixmap)));*/
|
||||
endThumbTimer->start(100);
|
||||
if ((int)(cropStart() + duration()).frames(m_fps) != previous) {
|
||||
if (updateKeyFrames) checkEffectsKeyframesPos(previous, (cropStart() + duration()).frames(m_fps), false);
|
||||
if (m_hasThumbs && KdenliveSettings::videothumbnails()) {
|
||||
/*connect(m_clip->thumbProducer(), SIGNAL(thumbReady(int, QPixmap)), this, SLOT(slotThumbReady(int, QPixmap)));*/
|
||||
endThumbTimer->start(150);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1000,18 +1026,17 @@ void ClipItem::checkEffectsKeyframesPos(const int previous, const int current, b
|
||||
if (m_selectedEffect >= 0) setSelectedEffect(m_selectedEffect);
|
||||
}
|
||||
|
||||
|
||||
//virtual
|
||||
QVariant ClipItem::itemChange(GraphicsItemChange change, const QVariant &value) {
|
||||
if (change == ItemPositionChange && scene()) {
|
||||
// calculate new position.
|
||||
if (group() != 0) return pos();
|
||||
if (parentItem()) return pos();
|
||||
QPointF newPos = value.toPointF();
|
||||
//kDebug() << "/// MOVING CLIP ITEM.------------";
|
||||
//kDebug() << "/// MOVING CLIP ITEM.------------\n++++++++++";
|
||||
int xpos = projectScene()->getSnapPointForPos((int) newPos.x(), KdenliveSettings::snaptopoints());
|
||||
xpos = qMax(xpos, 0);
|
||||
newPos.setX(xpos);
|
||||
int newTrack = (newPos.y() + KdenliveSettings::trackheight() / 2) / KdenliveSettings::trackheight();
|
||||
int newTrack = newPos.y() / KdenliveSettings::trackheight();
|
||||
newTrack = qMin(newTrack, projectScene()->tracksCount() - 1);
|
||||
newTrack = qMax(newTrack, 0);
|
||||
newPos.setY((int)(newTrack * KdenliveSettings::trackheight() + 1));
|
||||
@@ -1020,38 +1045,40 @@ QVariant ClipItem::itemChange(GraphicsItemChange change, const QVariant &value)
|
||||
sceneShape.translate(newPos);
|
||||
QList<QGraphicsItem*> items = scene()->items(sceneShape, Qt::IntersectsItemShape);
|
||||
items.removeAll(this);
|
||||
|
||||
bool forwardMove = newPos.x() > pos().x();
|
||||
int offset = 0;
|
||||
if (!items.isEmpty()) {
|
||||
for (int i = 0; i < items.count(); i++) {
|
||||
if (items.at(i)->type() == type()) {
|
||||
// Collision!
|
||||
QPointF otherPos = items.at(i)->pos();
|
||||
if ((int) otherPos.y() != (int) pos().y()) return pos();
|
||||
if (pos().x() < otherPos.x()) {
|
||||
// move clip just before colliding clip
|
||||
int npos = (static_cast < AbstractClipItem* >(items.at(i))->startPos() - m_cropDuration).frames(m_fps);
|
||||
// check we don't run into another clip
|
||||
newPos.setX(npos);
|
||||
sceneShape = rect();
|
||||
sceneShape.translate(newPos);
|
||||
QList<QGraphicsItem*> subitems = scene()->items(sceneShape, Qt::IntersectsItemShape);
|
||||
items.removeAll(this);
|
||||
for (int j = 0; j < subitems.count(); j++) {
|
||||
if (subitems.at(j)->type() == type()) return pos();
|
||||
}
|
||||
if ((int) otherPos.y() != (int) pos().y()) {
|
||||
return pos();
|
||||
}
|
||||
if (forwardMove) {
|
||||
offset = qMax(offset, (int)(newPos.x() - (static_cast < AbstractClipItem* >(items.at(i))->startPos() - cropDuration()).frames(m_fps)));
|
||||
} else {
|
||||
// get pos just after colliding clip
|
||||
int npos = static_cast < AbstractClipItem* >(items.at(i))->endPos().frames(m_fps);
|
||||
// check we don't run into another clip
|
||||
newPos.setX(npos);
|
||||
sceneShape = rect();
|
||||
sceneShape.translate(newPos);
|
||||
offset = qMax(offset, (int)((static_cast < AbstractClipItem* >(items.at(i))->endPos().frames(m_fps)) - newPos.x()));
|
||||
}
|
||||
|
||||
if (offset > 0) {
|
||||
if (forwardMove) {
|
||||
sceneShape.translate(QPointF(-offset, 0));
|
||||
newPos.setX(newPos.x() - offset);
|
||||
} else {
|
||||
sceneShape.translate(QPointF(offset, 0));
|
||||
newPos.setX(newPos.x() + offset);
|
||||
}
|
||||
QList<QGraphicsItem*> subitems = scene()->items(sceneShape, Qt::IntersectsItemShape);
|
||||
items.removeAll(this);
|
||||
subitems.removeAll(this);
|
||||
for (int j = 0; j < subitems.count(); j++) {
|
||||
if (subitems.at(j)->type() == type()) return pos();
|
||||
if (subitems.at(j)->type() == type()) {
|
||||
m_startPos = GenTime((int) pos().x(), m_fps);
|
||||
return pos();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
m_track = newTrack;
|
||||
m_startPos = GenTime((int) newPos.x(), m_fps);
|
||||
return newPos;
|
||||
@@ -1105,38 +1132,47 @@ void ClipItem::setEffectAt(int ix, QDomElement effect) {
|
||||
}
|
||||
}
|
||||
|
||||
QHash <QString, QString> ClipItem::addEffect(QDomElement effect, bool animate) {
|
||||
QHash <QString, QString> effectParams;
|
||||
EffectsParameterList ClipItem::addEffect(QDomElement effect, bool animate) {
|
||||
|
||||
bool needRepaint = false;
|
||||
/*QDomDocument doc;
|
||||
doc.appendChild(doc.importNode(effect, true));
|
||||
kDebug() << "/////// CLIP ADD EFFECT: " << doc.toString();*/
|
||||
m_effectList.append(effect);
|
||||
effectParams["tag"] = effect.attribute("tag");
|
||||
|
||||
EffectsParameterList parameters;
|
||||
parameters.addParam("tag", effect.attribute("tag"));
|
||||
parameters.addParam("kdenlive_ix", effect.attribute("kdenlive_ix"));
|
||||
if (effect.hasAttribute("src")) parameters.addParam("src", effect.attribute("src"));
|
||||
|
||||
QString state = effect.attribute("disabled");
|
||||
if (!state.isEmpty()) {
|
||||
parameters.addParam("disabled", state);
|
||||
}
|
||||
|
||||
QString effectId = effect.attribute("id");
|
||||
if (effectId.isEmpty()) effectId = effect.attribute("tag");
|
||||
effectParams["id"] = effectId;
|
||||
effectParams["kdenlive_ix"] = effect.attribute("kdenlive_ix");
|
||||
QString state = effect.attribute("disabled");
|
||||
if (!state.isEmpty()) effectParams["disabled"] = state;
|
||||
parameters.addParam("id", effectId);
|
||||
|
||||
QDomNodeList params = effect.elementsByTagName("parameter");
|
||||
int fade = 0;
|
||||
for (int i = 0; i < params.count(); i++) {
|
||||
QDomElement e = params.item(i).toElement();
|
||||
if (!e.isNull()) {
|
||||
if (e.attribute("type") == "keyframe") {
|
||||
effectParams["keyframes"] = e.attribute("keyframes");
|
||||
effectParams["min"] = e.attribute("min");
|
||||
effectParams["max"] = e.attribute("max");
|
||||
effectParams["factor"] = e.attribute("factor", "1");
|
||||
effectParams["starttag"] = e.attribute("starttag", "start");
|
||||
effectParams["endtag"] = e.attribute("endtag", "end");
|
||||
parameters.addParam("keyframes", e.attribute("keyframes"));
|
||||
parameters.addParam("max", e.attribute("max"));
|
||||
parameters.addParam("min", e.attribute("min"));
|
||||
parameters.addParam("factor", e.attribute("factor", "1"));
|
||||
parameters.addParam("starttag", e.attribute("starttag", "start"));
|
||||
parameters.addParam("endtag", e.attribute("endtag", "end"));
|
||||
}
|
||||
|
||||
double f = e.attribute("factor", "1").toDouble();
|
||||
|
||||
if (f == 1) {
|
||||
effectParams[e.attribute("name")] = e.attribute("value");
|
||||
parameters.addParam(e.attribute("name"), e.attribute("value"));
|
||||
|
||||
// check if it is a fade effect
|
||||
if (effectId == "fadein") {
|
||||
needRepaint = true;
|
||||
@@ -1148,7 +1184,7 @@ QHash <QString, QString> ClipItem::addEffect(QDomElement effect, bool animate) {
|
||||
else if (e.attribute("name") == "in") fade += e.attribute("value").toInt();
|
||||
}
|
||||
} else {
|
||||
effectParams[e.attribute("name")] = QString::number(e.attribute("value").toDouble() / f);
|
||||
parameters.addParam(e.attribute("name"), QString::number(e.attribute("value").toDouble() / f));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1167,28 +1203,32 @@ QHash <QString, QString> ClipItem::addEffect(QDomElement effect, bool animate) {
|
||||
m_selectedEffect = 0;
|
||||
setSelectedEffect(m_selectedEffect);
|
||||
}
|
||||
return effectParams;
|
||||
return parameters;
|
||||
}
|
||||
|
||||
QHash <QString, QString> ClipItem::getEffectArgs(QDomElement effect) {
|
||||
QHash <QString, QString> effectParams;
|
||||
effectParams["tag"] = effect.attribute("tag");
|
||||
effectParams["kdenlive_ix"] = effect.attribute("kdenlive_ix");
|
||||
effectParams["id"] = effect.attribute("id");
|
||||
EffectsParameterList ClipItem::getEffectArgs(QDomElement effect) {
|
||||
EffectsParameterList parameters;
|
||||
parameters.addParam("tag", effect.attribute("tag"));
|
||||
parameters.addParam("kdenlive_ix", effect.attribute("kdenlive_ix"));
|
||||
parameters.addParam("id", effect.attribute("id"));
|
||||
if (effect.hasAttribute("src")) parameters.addParam("src", effect.attribute("src"));
|
||||
QString state = effect.attribute("disabled");
|
||||
if (!state.isEmpty()) effectParams["disabled"] = state;
|
||||
if (!state.isEmpty()) {
|
||||
parameters.addParam("disabled", state);
|
||||
}
|
||||
|
||||
QDomNodeList params = effect.elementsByTagName("parameter");
|
||||
for (int i = 0; i < params.count(); i++) {
|
||||
QDomElement e = params.item(i).toElement();
|
||||
//kDebug() << "/ / / /SENDING EFFECT PARAM: " << e.attribute("type") << ", NAME_ " << e.attribute("tag");
|
||||
if (e.attribute("type") == "keyframe") {
|
||||
kDebug() << "/ / / /SENDING KEYFR EFFECT TYPE";
|
||||
effectParams["keyframes"] = e.attribute("keyframes");
|
||||
effectParams["max"] = e.attribute("max");
|
||||
effectParams["min"] = e.attribute("min");
|
||||
effectParams["factor"] = e.attribute("factor", "1");
|
||||
effectParams["starttag"] = e.attribute("starttag", "start");
|
||||
effectParams["endtag"] = e.attribute("endtag", "end");
|
||||
parameters.addParam("keyframes", e.attribute("keyframes"));
|
||||
parameters.addParam("max", e.attribute("max"));
|
||||
parameters.addParam("min", e.attribute("min"));
|
||||
parameters.addParam("factor", e.attribute("factor", "1"));
|
||||
parameters.addParam("starttag", e.attribute("starttag", "start"));
|
||||
parameters.addParam("endtag", e.attribute("endtag", "end"));
|
||||
} else if (e.attribute("namedesc").contains(";")) {
|
||||
QString format = e.attribute("format");
|
||||
QStringList separators = format.split("%d", QString::SkipEmptyParts);
|
||||
@@ -1201,14 +1241,16 @@ QHash <QString, QString> ClipItem::getEffectArgs(QDomElement effect) {
|
||||
txtNeu << separators[i];
|
||||
txtNeu << (int)(values[i+1].toDouble());
|
||||
}
|
||||
effectParams["start"] = neu;
|
||||
parameters.addParam("start", neu);
|
||||
} else {
|
||||
if (e.attribute("factor", "1") != "1")
|
||||
effectParams[e.attribute("name")] = QString::number(e.attribute("value").toDouble() / e.attribute("factor").toDouble());
|
||||
else effectParams[e.attribute("name")] = e.attribute("value");
|
||||
if (e.attribute("factor", "1") != "1") {
|
||||
parameters.addParam(e.attribute("name"), QString::number(e.attribute("value").toDouble() / e.attribute("factor").toDouble()));
|
||||
} else {
|
||||
parameters.addParam(e.attribute("name"), e.attribute("value"));
|
||||
}
|
||||
}
|
||||
}
|
||||
return effectParams;
|
||||
return parameters;
|
||||
}
|
||||
|
||||
void ClipItem::deleteEffect(QString index) {
|
||||
@@ -1225,7 +1267,10 @@ void ClipItem::deleteEffect(QString index) {
|
||||
needRepaint = true;
|
||||
}
|
||||
m_effectList.removeAt(i);
|
||||
} else if (ix.toInt() > index.toInt()) m_effectList[i].setAttribute("kdenlive_ix", ix.toInt() - 1);
|
||||
i--;
|
||||
} else if (ix.toInt() > index.toInt()) {
|
||||
m_effectList[i].setAttribute("kdenlive_ix", ix.toInt() - 1);
|
||||
}
|
||||
}
|
||||
m_effectNames = m_effectList.effectNames().join(" / ");
|
||||
if (needRepaint) update(boundingRect());
|
||||
|
||||
@@ -40,7 +40,7 @@ class ClipItem : public AbstractClipItem {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
ClipItem(DocClipBase *clip, ItemInfo info, double fps, bool generateThumbs = true);
|
||||
ClipItem(DocClipBase *clip, ItemInfo info, double fps, double speed, bool generateThumbs = true);
|
||||
virtual ~ ClipItem();
|
||||
virtual void paint(QPainter *painter,
|
||||
const QStyleOptionGraphicsItem *option,
|
||||
@@ -53,6 +53,7 @@ public:
|
||||
int clipType() const;
|
||||
DocClipBase *baseClip() const;
|
||||
QString clipName() const;
|
||||
void setClipName(const QString &name);
|
||||
QDomElement xml() const;
|
||||
ClipItem *clone(ItemInfo info) const;
|
||||
const EffectsList effectList();
|
||||
@@ -61,9 +62,9 @@ public:
|
||||
/** Give a string list of the clip's effect names */
|
||||
QStringList effectNames();
|
||||
/** Add an effect to the clip and return the parameters that will be passed to Mlt */
|
||||
QHash <QString, QString> addEffect(QDomElement effect, bool animate = true);
|
||||
EffectsParameterList addEffect(QDomElement effect, bool animate = true);
|
||||
/** Get the effect parameters that will be passed to Mlt */
|
||||
QHash <QString, QString> getEffectArgs(QDomElement effect);
|
||||
EffectsParameterList getEffectArgs(QDomElement effect);
|
||||
/** Delete effect with id index */
|
||||
void deleteEffect(QString index);
|
||||
/** return the number of effects in that clip */
|
||||
@@ -101,6 +102,8 @@ public:
|
||||
GenTime cropDuration() const;
|
||||
int hasEffect(const QString &tag, const QString &id) const;
|
||||
bool checkKeyFrames();
|
||||
QPixmap startThumb() const;
|
||||
QPixmap endThumb() const;
|
||||
|
||||
protected:
|
||||
//virtual void mouseMoveEvent(QGraphicsSceneMouseEvent * event);
|
||||
@@ -157,10 +160,12 @@ private slots:
|
||||
void animate(qreal value);
|
||||
void slotSetStartThumb(QImage img);
|
||||
void slotSetEndThumb(QImage img);
|
||||
void slotSetStartThumb(QPixmap pix);
|
||||
void slotSetEndThumb(QPixmap pix);
|
||||
void slotThumbReady(int frame, QPixmap pix);
|
||||
|
||||
public slots:
|
||||
void slotSetStartThumb(const QPixmap pix);
|
||||
void slotSetEndThumb(const QPixmap pix);
|
||||
|
||||
signals:
|
||||
void getThumb(int, int);
|
||||
void prepareAudioThumb(double, int, int, int);
|
||||
|
||||
@@ -26,14 +26,26 @@
|
||||
#include "docclipbase.h"
|
||||
#include "kdenlivedoc.h"
|
||||
|
||||
#include <mlt++/Mlt.h>
|
||||
|
||||
ClipManager::ClipManager(KdenliveDoc *doc): m_doc(doc), m_audioThumbsEnabled(false), m_audioThumbsQueue(QList <QString> ()), m_generatingAudioId(QString()) {
|
||||
m_clipIdCounter = 1;
|
||||
m_folderIdCounter = 1;
|
||||
}
|
||||
|
||||
ClipManager::~ClipManager() {
|
||||
qDeleteAll(m_clipList);
|
||||
}
|
||||
|
||||
void ClipManager::clear() {
|
||||
qDeleteAll(m_clipList);
|
||||
m_clipList.clear();
|
||||
m_clipIdCounter = 1;
|
||||
m_folderIdCounter = 1;
|
||||
m_folderList.clear();
|
||||
m_audioThumbsQueue.clear();
|
||||
}
|
||||
|
||||
void ClipManager::checkAudioThumbs() {
|
||||
if (m_audioThumbsEnabled == KdenliveSettings::audiothumbnails()) return;
|
||||
m_audioThumbsEnabled = KdenliveSettings::audiothumbnails();
|
||||
@@ -92,14 +104,20 @@ void ClipManager::setThumbsProgress(const QString &message, int progress) {
|
||||
m_doc->setThumbsProgress(message, progress);
|
||||
}
|
||||
|
||||
QList <DocClipBase*> ClipManager::documentClipList() {
|
||||
QList <DocClipBase*> ClipManager::documentClipList() const {
|
||||
return m_clipList;
|
||||
}
|
||||
|
||||
QMap <QString, QString> ClipManager::documentFolderList() const {
|
||||
return m_folderList;
|
||||
}
|
||||
|
||||
void ClipManager::addClip(DocClipBase *clip) {
|
||||
m_clipList.append(clip);
|
||||
const QString id = clip->getId();
|
||||
if (id.toInt() >= m_clipIdCounter) m_clipIdCounter = id.toInt() + 1;
|
||||
const QString gid = clip->getProperty("groupid");
|
||||
if (!gid.isEmpty() && gid.toInt() >= m_folderIdCounter) m_folderIdCounter = gid.toInt() + 1;
|
||||
}
|
||||
|
||||
void ClipManager::slotDeleteClip(const QString &clipId) {
|
||||
@@ -115,7 +133,9 @@ void ClipManager::slotDeleteClip(const QString &clipId) {
|
||||
void ClipManager::deleteClip(const QString &clipId) {
|
||||
for (int i = 0; i < m_clipList.count(); i++) {
|
||||
if (m_clipList.at(i)->getId() == clipId) {
|
||||
m_clipList.removeAt(i);
|
||||
DocClipBase *clip = m_clipList.takeAt(i);
|
||||
delete clip;
|
||||
clip = NULL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -137,6 +157,49 @@ DocClipBase *ClipManager::getClipById(QString clipId) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
DocClipBase *ClipManager::getClipByResource(QString resource) {
|
||||
for (int i = 0; i < m_clipList.count(); i++) {
|
||||
if (m_clipList.at(i)->getProperty("resource") == resource) {
|
||||
return m_clipList.at(i);
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void ClipManager::updatePreviewSettings() {
|
||||
for (int i = 0; i < m_clipList.count(); i++) {
|
||||
if (m_clipList.at(i)->clipType() == AV || m_clipList.at(i)->clipType() == VIDEO) {
|
||||
if (m_clipList.at(i)->producerProperty("meta.media.0.codec.name") && strcmp(m_clipList.at(i)->producerProperty("meta.media.0.codec.name"), "h264") == 0) {
|
||||
if (KdenliveSettings::dropbframes()) {
|
||||
m_clipList[i]->setProducerProperty("skip_loop_filter", "all");
|
||||
m_clipList[i]->setProducerProperty("skip_frame", "bidir");
|
||||
} else {
|
||||
m_clipList[i]->setProducerProperty("skip_loop_filter", "");
|
||||
m_clipList[i]->setProducerProperty("skip_frame", "");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ClipManager::resetProducersList(QList <Mlt::Producer *> prods) {
|
||||
for (int i = 0; i < m_clipList.count(); i++) {
|
||||
if (m_clipList.at(i)->numReferences() > 0) {
|
||||
m_clipList.at(i)->deleteProducers();
|
||||
}
|
||||
}
|
||||
QString id;
|
||||
for (int i = 0; i < prods.count(); i++) {
|
||||
id = prods.at(i)->get("id");
|
||||
if (id.contains('_')) id = id.section('_', 0, 0);
|
||||
DocClipBase *clip = getClipById(id);
|
||||
if (clip) {
|
||||
clip->setProducer(prods.at(i));
|
||||
kDebug() << "// // // REPLACE CLIP: " << id;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ClipManager::slotAddClipList(const KUrl::List urls, const QString group, const QString &groupId) {
|
||||
QUndoCommand *addClips = new QUndoCommand();
|
||||
addClips->setText(i18n("Add clips"));
|
||||
@@ -254,8 +317,22 @@ int ClipManager::getFreeClipId() {
|
||||
return m_clipIdCounter++;
|
||||
}
|
||||
|
||||
int ClipManager::getFreeFolderId() {
|
||||
return m_folderIdCounter++;
|
||||
}
|
||||
|
||||
int ClipManager::lastClipId() const {
|
||||
return m_clipIdCounter - 1;
|
||||
}
|
||||
|
||||
QString ClipManager::projectFolder() const {
|
||||
return m_doc->projectFolder().path();
|
||||
}
|
||||
|
||||
void ClipManager::addFolder(const QString &id, const QString &name) {
|
||||
m_folderList.insert(id, name);
|
||||
}
|
||||
|
||||
void ClipManager::deleteFolder(const QString &id) {
|
||||
m_folderList.remove(id);
|
||||
}
|
||||
@@ -39,6 +39,10 @@
|
||||
class KdenliveDoc;
|
||||
class DocClipBase;
|
||||
|
||||
namespace Mlt {
|
||||
class Producer;
|
||||
};
|
||||
|
||||
class ClipManager: public QObject {
|
||||
Q_OBJECT public:
|
||||
|
||||
@@ -54,23 +58,36 @@ Q_OBJECT public:
|
||||
void slotAddColorClipFile(const QString name, const QString color, QString duration, const QString group, const QString &groupId);
|
||||
void slotAddSlideshowClipFile(const QString name, const QString path, int count, const QString duration, const bool loop, const bool fade, const QString &luma_duration, const QString &luma_file, const int softness, const QString group, const QString &groupId);
|
||||
DocClipBase *getClipById(QString clipId);
|
||||
DocClipBase *getClipByResource(QString resource);
|
||||
void slotDeleteClip(const QString & clipId);
|
||||
void setThumbsProgress(const QString &message, int progress);
|
||||
void checkAudioThumbs();
|
||||
QList <DocClipBase*> documentClipList();
|
||||
QList <DocClipBase*> documentClipList() const;
|
||||
QMap <QString, QString> documentFolderList() const;
|
||||
int getFreeClipId();
|
||||
int getFreeFolderId();
|
||||
int lastClipId() const;
|
||||
void startAudioThumbsGeneration();
|
||||
void endAudioThumbsGeneration(const QString &requestedId);
|
||||
void askForAudioThumb(const QString &id);
|
||||
QString projectFolder() const;
|
||||
void resetProducersList(QList <Mlt::Producer *> prods);
|
||||
void addFolder(const QString&, const QString&);
|
||||
void deleteFolder(const QString&);
|
||||
void clear();
|
||||
|
||||
public slots:
|
||||
void updatePreviewSettings();
|
||||
|
||||
private: // Private attributes
|
||||
/** the list of clips in the document */
|
||||
QList <DocClipBase*> m_clipList;
|
||||
QMap <QString, QString> m_folderList;
|
||||
QList <QString> m_audioThumbsQueue;
|
||||
/** the document undo stack*/
|
||||
KdenliveDoc *m_doc;
|
||||
int m_clipIdCounter;
|
||||
int m_folderIdCounter;
|
||||
bool m_audioThumbsEnabled;
|
||||
QString m_generatingAudioId;
|
||||
|
||||
|
||||
@@ -34,7 +34,8 @@ static const int COLORTAB = 2;
|
||||
static const int SLIDETAB = 3;
|
||||
static const int IMAGETAB = 4;
|
||||
static const int MARKERTAB = 5;
|
||||
static const int ADVANCEDTAB = 6;
|
||||
static const int METATAB = 6;
|
||||
static const int ADVANCEDTAB = 7;
|
||||
|
||||
static const int TYPE_JPEG = 0;
|
||||
static const int TYPE_PNG = 1;
|
||||
@@ -81,6 +82,16 @@ ClipProperties::ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidg
|
||||
m_view.clip_vindex->setMaximum(props.value("video_max").toInt());
|
||||
}
|
||||
|
||||
// Check for Metadata
|
||||
QMap<QString, QString> meta = m_clip->metadata();
|
||||
QMap<QString, QString>::const_iterator i = meta.constBegin();
|
||||
while (i != meta.constEnd()) {
|
||||
QTreeWidgetItem *metaitem = new QTreeWidgetItem(m_view.metadata_list);
|
||||
metaitem->setText(0, i.key()); //i18n(i.key().section('.', 2, 3).toUtf8().data()));
|
||||
metaitem->setText(1, i.value());
|
||||
++i;
|
||||
}
|
||||
|
||||
connect(m_view.clip_force_ar, SIGNAL(toggled(bool)), m_view.clip_ar, SLOT(setEnabled(bool)));
|
||||
connect(m_view.clip_force_threads, SIGNAL(toggled(bool)), m_view.clip_threads, SLOT(setEnabled(bool)));
|
||||
connect(m_view.clip_force_vindex, SIGNAL(toggled(bool)), m_view.clip_vindex, SLOT(setEnabled(bool)));
|
||||
@@ -113,6 +124,7 @@ ClipProperties::ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidg
|
||||
m_view.image_transparency->setChecked(props.value("transparency").toInt());
|
||||
} else if (t == COLOR) {
|
||||
m_view.clip_path->setEnabled(false);
|
||||
m_view.tabWidget->removeTab(METATAB);
|
||||
m_view.tabWidget->removeTab(IMAGETAB);
|
||||
m_view.tabWidget->removeTab(SLIDETAB);
|
||||
m_view.tabWidget->removeTab(AUDIOTAB);
|
||||
@@ -121,6 +133,7 @@ ClipProperties::ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidg
|
||||
m_view.clip_color->setColor(QColor("#" + props.value("colour").right(8).left(6)));
|
||||
} else if (t == SLIDESHOW) {
|
||||
m_view.clip_path->setText(url.directory());
|
||||
m_view.tabWidget->removeTab(METATAB);
|
||||
m_view.tabWidget->removeTab(IMAGETAB);
|
||||
m_view.tabWidget->removeTab(COLORTAB);
|
||||
m_view.tabWidget->removeTab(AUDIOTAB);
|
||||
@@ -140,27 +153,38 @@ ClipProperties::ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidg
|
||||
|
||||
m_view.luma_duration->setText(tc.getTimecodeFromFrames(props.value("luma_duration").toInt()));
|
||||
QString lumaFile = props.value("luma_file");
|
||||
QString profilePath = KdenliveSettings::mltpath();
|
||||
profilePath = profilePath.section('/', 0, -3);
|
||||
profilePath += "/lumas/PAL/";
|
||||
|
||||
QDir dir(profilePath);
|
||||
QStringList filter;
|
||||
filter << "*.pgm";
|
||||
const QStringList result = dir.entryList(filter, QDir::Files);
|
||||
QStringList imagefiles;
|
||||
QStringList imagenamelist;
|
||||
int current;
|
||||
foreach(const QString file, result) {
|
||||
m_view.luma_file->addItem(KIcon(profilePath + file), file, profilePath + file);
|
||||
if (!lumaFile.isEmpty() && lumaFile == QString(profilePath + file))
|
||||
current = m_view.luma_file->count() - 1;
|
||||
// Check for Kdenlive installed luma files
|
||||
QStringList filters;
|
||||
filters << "*.pgm" << "*.png";
|
||||
|
||||
QStringList customLumas = KGlobal::dirs()->findDirs("appdata", "lumas");
|
||||
foreach(const QString &folder, customLumas) {
|
||||
QStringList filesnames = QDir(folder).entryList(filters, QDir::Files);
|
||||
foreach(const QString &fname, filesnames) {
|
||||
m_view.luma_file->addItem(KIcon(folder + '/' + fname), fname, folder + '/' + fname);
|
||||
}
|
||||
}
|
||||
|
||||
// Check for MLT lumas
|
||||
QString profilePath = KdenliveSettings::mltpath();
|
||||
QString folder = profilePath.section('/', 0, -3);
|
||||
folder.append("/lumas/PAL"); // TODO: cleanup the PAL / NTSC mess in luma files
|
||||
QDir lumafolder(folder);
|
||||
QStringList filesnames = lumafolder.entryList(filters, QDir::Files);
|
||||
foreach(const QString &fname, filesnames) {
|
||||
m_view.luma_file->addItem(KIcon(folder + '/' + fname), fname, folder + '/' + fname);
|
||||
}
|
||||
|
||||
slotEnableLuma(m_view.slide_fade->isChecked());
|
||||
slotEnableLumaFile(m_view.slide_luma->isChecked());
|
||||
|
||||
if (!lumaFile.isEmpty()) {
|
||||
m_view.slide_luma->setChecked(true);
|
||||
m_view.luma_file->setCurrentIndex(current);
|
||||
}
|
||||
m_view.luma_file->setCurrentIndex(m_view.luma_file->findData(lumaFile));
|
||||
} else m_view.luma_file->setEnabled(false);
|
||||
connect(m_view.slide_fade, SIGNAL(stateChanged(int)), this, SLOT(slotEnableLuma(int)));
|
||||
connect(m_view.slide_luma, SIGNAL(stateChanged(int)), this, SLOT(slotEnableLumaFile(int)));
|
||||
|
||||
connect(m_view.image_type, SIGNAL(currentIndexChanged(int)), this, SLOT(parseFolder()));
|
||||
} else if (t != AUDIO) {
|
||||
@@ -186,11 +210,12 @@ ClipProperties::ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidg
|
||||
m_view.tabWidget->removeTab(VIDEOTAB);
|
||||
m_view.clip_thumb->setHidden(true);
|
||||
}
|
||||
if (t != IMAGE && t != COLOR && t != TEXT) m_view.clip_duration->setReadOnly(true);
|
||||
|
||||
KFileItem f(KFileItem::Unknown, KFileItem::Unknown, url, true);
|
||||
m_view.clip_filesize->setText(KIO::convertSize(f.size()));
|
||||
m_view.clip_duration->setText(tc.getTimecode(m_clip->duration(), m_fps));
|
||||
if (t != IMAGE && t != COLOR && t != TEXT) m_view.clip_duration->setReadOnly(true);
|
||||
else connect(m_view.clip_duration, SIGNAL(editingFinished()), this, SLOT(slotCheckMaxLength()));
|
||||
|
||||
// markers
|
||||
m_view.marker_new->setIcon(KIcon("document-new"));
|
||||
@@ -209,6 +234,26 @@ ClipProperties::ClipProperties(DocClipBase *clip, Timecode tc, double fps, QWidg
|
||||
adjustSize();
|
||||
}
|
||||
|
||||
void ClipProperties::slotEnableLuma(int state) {
|
||||
bool enable = false;
|
||||
if (state == Qt::Checked) enable = true;
|
||||
m_view.luma_duration->setEnabled(enable);
|
||||
m_view.slide_luma->setEnabled(enable);
|
||||
if (enable) {
|
||||
m_view.luma_file->setEnabled(m_view.slide_luma->isChecked());
|
||||
} else m_view.luma_file->setEnabled(false);
|
||||
m_view.label_softness->setEnabled(m_view.slide_luma->isChecked() && enable);
|
||||
m_view.luma_softness->setEnabled(m_view.label_softness->isEnabled());
|
||||
}
|
||||
|
||||
void ClipProperties::slotEnableLumaFile(int state) {
|
||||
bool enable = false;
|
||||
if (state == Qt::Checked) enable = true;
|
||||
m_view.luma_file->setEnabled(enable);
|
||||
m_view.luma_softness->setEnabled(enable);
|
||||
m_view.label_softness->setEnabled(enable);
|
||||
}
|
||||
|
||||
void ClipProperties::slotFillMarkersList() {
|
||||
m_view.markers_list->clear();
|
||||
QList < CommentedTime > marks = m_clip->commentedSnapMarkers();
|
||||
@@ -222,7 +267,7 @@ void ClipProperties::slotFillMarkersList() {
|
||||
|
||||
void ClipProperties::slotAddMarker() {
|
||||
CommentedTime marker(GenTime(), i18n("Marker"));
|
||||
MarkerDialog d(m_clip, marker, m_tc, this);
|
||||
MarkerDialog d(m_clip, marker, m_tc, i18n("Add Marker"), this);
|
||||
if (d.exec() == QDialog::Accepted) {
|
||||
emit addMarker(m_clip->getId(), d.newMarker().time(), d.newMarker().comment());
|
||||
}
|
||||
@@ -233,7 +278,7 @@ void ClipProperties::slotEditMarker() {
|
||||
QList < CommentedTime > marks = m_clip->commentedSnapMarkers();
|
||||
int pos = m_view.markers_list->currentIndex().row();
|
||||
if (pos < 0 || pos > marks.count() - 1) return;
|
||||
MarkerDialog d(m_clip, marks.at(pos), m_tc, this);
|
||||
MarkerDialog d(m_clip, marks.at(pos), m_tc, i18n("Edit Marker"), this);
|
||||
if (d.exec() == QDialog::Accepted) {
|
||||
emit addMarker(m_clip->getId(), d.newMarker().time(), d.newMarker().comment());
|
||||
}
|
||||
@@ -306,11 +351,19 @@ QMap <QString, QString> ClipProperties::properties() {
|
||||
m_clipNeedsRefresh = true;
|
||||
props["colour"] = "0x" + new_color.right(6) + "ff";
|
||||
}
|
||||
int duration = m_tc.getFrameCount(m_view.clip_duration->text(), m_fps);
|
||||
if (duration != m_clip->duration().frames(m_fps)) {
|
||||
props["out"] = QString::number(duration);
|
||||
}
|
||||
} else if (t == IMAGE) {
|
||||
if ((int) m_view.image_transparency->isChecked() != old_props.value("transparency").toInt()) {
|
||||
props["transparency"] = QString::number((int)m_view.image_transparency->isChecked());
|
||||
m_clipNeedsRefresh = true;
|
||||
}
|
||||
int duration = m_tc.getFrameCount(m_view.clip_duration->text(), m_fps);
|
||||
if (duration != m_clip->duration().frames(m_fps)) {
|
||||
props["out"] = QString::number(duration);
|
||||
}
|
||||
} else if (t == SLIDESHOW) {
|
||||
QString value = QString::number((int) m_view.slide_loop->isChecked());
|
||||
if (old_props.value("loop") != value) props["loop"] = value;
|
||||
@@ -415,6 +468,13 @@ void ClipProperties::parseFolder() {
|
||||
m_view.clip_thumb->setPixmap(pix);
|
||||
}
|
||||
|
||||
void ClipProperties::slotCheckMaxLength() {
|
||||
int duration = m_tc.getFrameCount(m_view.clip_duration->text(), m_fps);
|
||||
if (duration > m_clip->maxDuration().frames(m_fps)) {
|
||||
m_view.clip_duration->setText(m_tc.getTimecode(m_clip->maxDuration(), m_fps));
|
||||
}
|
||||
}
|
||||
|
||||
#include "clipproperties.moc"
|
||||
|
||||
|
||||
|
||||
@@ -43,6 +43,9 @@ private slots:
|
||||
void slotEditMarker();
|
||||
void slotDeleteMarker();
|
||||
void slotFillMarkersList();
|
||||
void slotCheckMaxLength();
|
||||
void slotEnableLuma(int state);
|
||||
void slotEnableLumaFile(int state);
|
||||
|
||||
private:
|
||||
Ui::ClipProperties_UI m_view;
|
||||
|
||||
@@ -60,8 +60,8 @@ CustomRuler::CustomRuler(Timecode tc, CustomTrackView *parent)
|
||||
littleMarkDistance = FRAME_SIZE;
|
||||
mediumMarkDistance = FRAME_SIZE * m_timecode.fps();
|
||||
bigMarkDistance = FRAME_SIZE * m_timecode.fps() * 60;
|
||||
m_zoneStart = 2 * m_timecode.fps();
|
||||
m_zoneEnd = 10 * m_timecode.fps();
|
||||
m_zoneStart = 0;
|
||||
m_zoneEnd = 100;
|
||||
m_contextMenu = new QMenu(this);
|
||||
QAction *addGuide = m_contextMenu->addAction(KIcon("document-new"), i18n("Add Guide"));
|
||||
connect(addGuide, SIGNAL(triggered()), m_view, SLOT(slotAddGuide()));
|
||||
@@ -110,6 +110,7 @@ void CustomRuler::mouseMoveEvent(QMouseEvent * event) {
|
||||
if (pos < 0) pos = 0;
|
||||
if (m_moveCursor == RULER_CURSOR) {
|
||||
m_view->setCursorPos(pos);
|
||||
m_view->slotCheckPositionScrolling();
|
||||
return;
|
||||
} else if (m_moveCursor == RULER_START) m_zoneStart = pos;
|
||||
else if (m_moveCursor == RULER_END) m_zoneEnd = pos;
|
||||
|
||||
@@ -77,7 +77,7 @@ double CustomTrackScene::scale() const {
|
||||
}
|
||||
|
||||
int CustomTrackScene::tracksCount() const {
|
||||
return m_tracksList.count();
|
||||
return m_document->tracksCount();
|
||||
}
|
||||
|
||||
#include "customtrackscene.moc"
|
||||
|
||||
@@ -28,7 +28,6 @@
|
||||
#include "gentime.h"
|
||||
|
||||
class KdenliveDoc;
|
||||
class TrackInfo;
|
||||
|
||||
/** This class holds all properties that need to be used by clip items */
|
||||
|
||||
@@ -44,7 +43,6 @@ public:
|
||||
double getSnapPointForPos(double pos, bool doSnap = true);
|
||||
void setScale(double scale);
|
||||
double scale() const;
|
||||
QList <TrackInfo> m_tracksList;
|
||||
int tracksCount() const;
|
||||
QPixmap m_transitionPixmap;
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -48,31 +48,31 @@ public:
|
||||
virtual void mouseReleaseEvent(QMouseEvent * event);
|
||||
virtual void mouseMoveEvent(QMouseEvent * event);
|
||||
virtual void mouseDoubleClickEvent(QMouseEvent *event);
|
||||
void addTrack(TrackInfo type);
|
||||
void removeTrack();
|
||||
void addTrack(TrackInfo type, int ix = -1);
|
||||
void removeTrack(int ix);
|
||||
void changeTrack(int ix, TrackInfo type);
|
||||
int cursorPos();
|
||||
void checkAutoScroll();
|
||||
void moveClip(const ItemInfo start, const ItemInfo end);
|
||||
void moveGroup(QList <ItemInfo> startClip, QList <ItemInfo> startTransition, const GenTime offset, const int trackOffset, bool reverseMove = false);
|
||||
/** move transition, startPos = (old start, old end), endPos = (new start, new end) */
|
||||
void moveTransition(const ItemInfo start, const ItemInfo end);
|
||||
void resizeClip(const ItemInfo start, const ItemInfo end);
|
||||
void addClip(QDomElement xml, const QString &clipId, ItemInfo info, EffectsList list = EffectsList());
|
||||
void deleteClip(ItemInfo info);
|
||||
void slotAddClipMarker();
|
||||
void slotEditClipMarker();
|
||||
void slotDeleteClipMarker();
|
||||
void slotDeleteAllClipMarkers();
|
||||
void slotDeleteClipMarker(const QString &comment, const QString &id, const GenTime &position);
|
||||
void slotDeleteAllClipMarkers(const QString &id);
|
||||
void addMarker(const QString &id, const GenTime &pos, const QString comment);
|
||||
void setScale(double scaleFactor);
|
||||
void deleteClip(const QString &clipId);
|
||||
void slotAddEffect(QDomElement effect, GenTime pos, int track);
|
||||
void addEffect(int track, GenTime pos, QDomElement effect);
|
||||
void deleteEffect(int track, GenTime pos, QDomElement effect);
|
||||
void updateEffect(int track, GenTime pos, QDomElement effect, int ix);
|
||||
void updateEffect(int track, GenTime pos, QDomElement effect, int ix, bool triggeredByUser = true);
|
||||
void moveEffect(int track, GenTime pos, int oldPos, int newPos);
|
||||
void addTransition(ItemInfo transitionInfo, int endTrack, QDomElement params);
|
||||
void deleteTransition(ItemInfo transitionInfo, int endTrack, QDomElement params);
|
||||
void updateTransition(int track, GenTime pos, QDomElement oldTransition, QDomElement transition);
|
||||
void updateTransition(int track, GenTime pos, QDomElement oldTransition, QDomElement transition, bool updateTransitionWidget);
|
||||
void moveTransition(GenTime oldpos, GenTime newpos);
|
||||
void activateMonitor();
|
||||
int duration() const;
|
||||
@@ -80,7 +80,7 @@ public:
|
||||
void cutSelectedClips();
|
||||
void setContextMenu(QMenu *timeline, QMenu *clip, QMenu *transition);
|
||||
void checkTrackHeight();
|
||||
QList <TrackInfo> tracksList() const;
|
||||
//QList <TrackInfo> tracksList() const;
|
||||
void setTool(PROJECTTOOL tool);
|
||||
void cutClip(ItemInfo info, GenTime cutTime, bool cut);
|
||||
void slotSeekToPreviousSnap();
|
||||
@@ -98,6 +98,16 @@ public:
|
||||
void setDocumentModified();
|
||||
void setInPoint();
|
||||
void setOutPoint();
|
||||
void slotInsertSpace();
|
||||
void slotRemoveSpace();
|
||||
void insertSpace(QList<ItemInfo> clipsToMove, QList<ItemInfo> transToMove, int track, const GenTime duration, const GenTime offset);
|
||||
ClipItem *getActiveClipUnderCursor(bool allowOutsideCursor = false) const;
|
||||
void deleteTimelineTrack(int ix, TrackInfo trackinfo);
|
||||
void changeTimelineTrack(int ix, TrackInfo trackinfo);
|
||||
void saveThumbnails();
|
||||
void autoTransition();
|
||||
QStringList getLadspaParams(QDomElement effect) const;
|
||||
void initCursorPos(int pos);
|
||||
|
||||
public slots:
|
||||
void setCursorPos(int pos, bool seek = true);
|
||||
@@ -112,6 +122,7 @@ public slots:
|
||||
void slotAddTransition(ClipItem* clip, ItemInfo transitionInfo, int endTrack, QDomElement transition = QDomElement());
|
||||
void slotAddTransitionToSelectedClips(QDomElement transition);
|
||||
void slotTransitionUpdated(Transition *, QDomElement);
|
||||
void slotTransitionTrackUpdated(Transition *tr, int track);
|
||||
void slotSwitchTrackAudio(int ix);
|
||||
void slotSwitchTrackVideo(int ix);
|
||||
void slotUpdateClip(const QString &clipId);
|
||||
@@ -127,6 +138,11 @@ public slots:
|
||||
void pasteClip();
|
||||
void pasteClipEffects();
|
||||
void slotUpdateAllThumbs();
|
||||
void slotCheckPositionScrolling();
|
||||
void slotInsertTrack(int ix);
|
||||
void slotDeleteTrack(int ix);
|
||||
void slotChangeTrack(int ix);
|
||||
void clipNameChanged(const QString id, const QString name);
|
||||
|
||||
protected:
|
||||
virtual void drawBackground(QPainter * painter, const QRectF & rect);
|
||||
@@ -167,8 +183,11 @@ private:
|
||||
void updateSnapPoints(AbstractClipItem *selected);
|
||||
ClipItem *getClipItemAt(int pos, int track);
|
||||
ClipItem *getClipItemAt(GenTime pos, int track);
|
||||
Transition *getTransitionItemAt(int pos, int track);
|
||||
ClipItem *getClipItemAtEnd(GenTime pos, int track);
|
||||
ClipItem *getClipItemAtStart(GenTime pos, int track);
|
||||
Transition *getTransitionItemAt(GenTime pos, int track);
|
||||
Transition *getTransitionItemAtEnd(GenTime pos, int track);
|
||||
Transition *getTransitionItemAtStart(GenTime pos, int track);
|
||||
void checkScrolling();
|
||||
/** Should we auto scroll while playing (keep in sync with KdenliveSettings::autoscroll() */
|
||||
bool m_autoScroll;
|
||||
@@ -176,11 +195,15 @@ private:
|
||||
QMenu *m_timelineContextMenu;
|
||||
QMenu *m_timelineContextClipMenu;
|
||||
QMenu *m_timelineContextTransitionMenu;
|
||||
QAction *m_autoTransition;
|
||||
QTimer m_scrollTimer;
|
||||
int m_scrollOffset;
|
||||
|
||||
QList <CommentedTime> m_searchStrings;
|
||||
int m_findIndex;
|
||||
PROJECTTOOL m_tool;
|
||||
QCursor m_razorCursor;
|
||||
QCursor m_spacerCursor;
|
||||
/** list containing items currently copied in the timeline */
|
||||
QList<AbstractClipItem *> m_copiedItems;
|
||||
/** Used to get the point in timeline where a context menu was opened */
|
||||
@@ -196,12 +219,14 @@ private:
|
||||
bool canBeMoved(QList<AbstractClipItem *> items, GenTime offset, int trackOffset) const;
|
||||
ClipItem *getClipUnderCursor() const;
|
||||
ClipItem *getMainActiveClip() const;
|
||||
ClipItem *getActiveClipUnderCursor() const;
|
||||
bool insertPossible(AbstractGroupItem *group, const QPoint &pos) const;
|
||||
void resetSelectionGroup(bool selectItems = true);
|
||||
void groupSelectedItems(bool force = false);
|
||||
|
||||
private slots:
|
||||
void slotRefreshGuides();
|
||||
void slotEnableRefresh();
|
||||
void slotCheckMouseScrolling();
|
||||
|
||||
signals:
|
||||
void cursorMoved(int, int);
|
||||
@@ -209,7 +234,7 @@ signals:
|
||||
void zoomOut();
|
||||
void mousePosition(int);
|
||||
void clipItemSelected(ClipItem*, int ix = -1);
|
||||
void transitionItemSelected(Transition*);
|
||||
void transitionItemSelected(Transition*, bool update = false);
|
||||
void activateDocumentMonitor();
|
||||
void trackHeightChanged();
|
||||
void displayMessage(const QString, MessageType);
|
||||
|
||||
@@ -28,11 +28,11 @@
|
||||
const int FRAME_SIZE = 90;
|
||||
const int MAXCLIPDURATION = 15000;
|
||||
|
||||
enum OPERATIONTYPE { NONE = 0, MOVE = 1, RESIZESTART = 2, RESIZEEND = 3, FADEIN = 4, FADEOUT = 5, TRANSITIONSTART = 6, TRANSITIONEND = 7, MOVEGUIDE = 8, KEYFRAME = 9};
|
||||
enum OPERATIONTYPE { NONE = 0, MOVE = 1, RESIZESTART = 2, RESIZEEND = 3, FADEIN = 4, FADEOUT = 5, TRANSITIONSTART = 6, TRANSITIONEND = 7, MOVEGUIDE = 8, KEYFRAME = 9, SEEK = 10, SPACER = 11, RUBBERSELECTION = 12};
|
||||
enum CLIPTYPE { UNKNOWN = 0, AUDIO = 1, VIDEO = 2, AV = 3, COLOR = 4, IMAGE = 5, TEXT = 6, SLIDESHOW = 7, VIRTUAL = 8, PLAYLIST = 9, FOLDER = 10};
|
||||
enum GRAPHICSRECTITEM { AVWIDGET = 70000 , LABELWIDGET , TRANSITIONWIDGET , GROUPWIDGET};
|
||||
|
||||
enum PROJECTTOOL { SELECTTOOL = 0 , RAZORTOOL = 1 };
|
||||
enum PROJECTTOOL { SELECTTOOL = 0 , RAZORTOOL = 1 , SPACERTOOL = 2 };
|
||||
|
||||
enum TRANSITIONTYPE {
|
||||
/** TRANSITIONTYPE: between 0-99: video trans, 100-199: video+audio trans, 200-299: audio trans */
|
||||
@@ -79,6 +79,55 @@ struct MltVideoProfile {
|
||||
int display_aspect_den;
|
||||
};
|
||||
|
||||
|
||||
class EffectParameter {
|
||||
public:
|
||||
EffectParameter(const QString name, const QString value): m_name(name), m_value(value) {}
|
||||
QString name() const {
|
||||
return m_name;
|
||||
}
|
||||
QString value() const {
|
||||
return m_value;
|
||||
}
|
||||
void setValue(const QString value) {
|
||||
m_value = value;
|
||||
}
|
||||
|
||||
private:
|
||||
QString m_name;
|
||||
QString m_value;
|
||||
};
|
||||
|
||||
/** Use our own list for effect parameters so that they are not sorted in any ways, because
|
||||
some effects like sox need a precise order
|
||||
*/
|
||||
class EffectsParameterList: public QList < EffectParameter > {
|
||||
public:
|
||||
EffectsParameterList(): QList < EffectParameter >() {}
|
||||
bool hasParam(const QString name) const {
|
||||
for (int i = 0; i < size(); i++)
|
||||
if (at(i).name() == name) return true;
|
||||
return false;
|
||||
}
|
||||
QString paramValue(const QString name, QString defaultValue = QString()) const {
|
||||
for (int i = 0; i < size(); i++) {
|
||||
if (at(i).name() == name) return at(i).value();
|
||||
}
|
||||
return defaultValue;
|
||||
}
|
||||
void addParam(const QString &name, const QString &value) {
|
||||
if (name.isEmpty()) return;
|
||||
append(EffectParameter(name, value));
|
||||
}
|
||||
void removeParam(const QString name) {
|
||||
for (int i = 0; i < size(); i++)
|
||||
if (at(i).name() == name) {
|
||||
removeAt(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
class CommentedTime {
|
||||
public:
|
||||
CommentedTime(): t(GenTime(0)) {}
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
* *
|
||||
***************************************************************************/
|
||||
|
||||
#include <QCryptographicHash>
|
||||
|
||||
#include <KDebug>
|
||||
|
||||
#include "kdenlivesettings.h"
|
||||
@@ -23,10 +25,9 @@
|
||||
#include "clipmanager.h"
|
||||
|
||||
DocClipBase::DocClipBase(ClipManager *clipManager, QDomElement xml, const QString &id):
|
||||
m_id(id), m_description(QString()), m_refcount(0), m_audioThumbCreated(false), m_duration(GenTime()), m_thumbProd(NULL), m_audioTimer(NULL), m_properties(QMap <QString, QString> ()), audioFrameChache(QMap<int, QMap<int, QByteArray> > ()), m_baseTrackProducers(QList <Mlt::Producer *>()) {
|
||||
m_id(id), m_description(QString()), m_refcount(0), m_audioThumbCreated(false), m_duration(GenTime()), m_thumbProd(NULL), m_audioTimer(NULL), m_properties(QMap <QString, QString> ()), audioFrameChache(QMap<int, QMap<int, QByteArray> > ()), m_baseTrackProducers(QList <Mlt::Producer *>()), m_snapMarkers(QList < CommentedTime > ()) {
|
||||
int type = xml.attribute("type").toInt();
|
||||
m_clipType = (CLIPTYPE) type;
|
||||
m_name = xml.attribute("name");
|
||||
|
||||
QDomNamedNodeMap attributes = xml.attributes();
|
||||
for (unsigned int i = 0; i < attributes.count(); i++) {
|
||||
@@ -34,6 +35,7 @@ DocClipBase::DocClipBase(ClipManager *clipManager, QDomElement xml, const QStrin
|
||||
}
|
||||
|
||||
KUrl url = KUrl(xml.attribute("resource"));
|
||||
if (!m_properties.contains("file_hash") && !url.isEmpty()) getFileHash(url.path());
|
||||
int out = xml.attribute("out").toInt();
|
||||
if (out != 0) {
|
||||
setDuration(GenTime(out, KdenliveSettings::project_fps()));
|
||||
@@ -41,11 +43,11 @@ DocClipBase::DocClipBase(ClipManager *clipManager, QDomElement xml, const QStrin
|
||||
out = xml.attribute("duration").toInt();
|
||||
if (out != 0) setDuration(GenTime(out, KdenliveSettings::project_fps()));
|
||||
}
|
||||
if (m_name.isEmpty()) m_name = url.fileName();
|
||||
if (!m_properties.contains("name")) m_properties.insert("name", url.fileName());
|
||||
|
||||
//if (!url.isEmpty() && QFile::exists(url.path()))
|
||||
{
|
||||
m_thumbProd = new KThumb(clipManager, url, m_id);
|
||||
m_thumbProd = new KThumb(clipManager, url, m_id, m_properties.value("file_hash"));
|
||||
if (m_clipType == AV || m_clipType == AUDIO) slotCreateAudioTimer();
|
||||
}
|
||||
//kDebug() << "type is video" << (m_clipType == AV) << " " << m_clipType;
|
||||
@@ -63,8 +65,27 @@ DocClipBase::DocClipBase(ClipManager *clipManager, QDomElement xml, const QStrin
|
||||
}*/
|
||||
|
||||
DocClipBase::~DocClipBase() {
|
||||
if (m_thumbProd) delete m_thumbProd;
|
||||
if (m_thumbProd) {
|
||||
delete m_thumbProd;
|
||||
}
|
||||
if (m_audioTimer) {
|
||||
m_audioTimer->stop();
|
||||
delete m_audioTimer;
|
||||
}
|
||||
qDeleteAll(m_baseTrackProducers);
|
||||
m_baseTrackProducers.clear();
|
||||
}
|
||||
|
||||
void DocClipBase::setZone(QPoint zone) {
|
||||
m_properties.insert("zone_in", QString::number(zone.x()));
|
||||
m_properties.insert("zone_out", QString::number(zone.y()));
|
||||
}
|
||||
|
||||
QPoint DocClipBase::zone() const {
|
||||
QPoint zone;
|
||||
zone.setX(m_properties.value("zone_in").toInt());
|
||||
zone.setY(m_properties.value("zone_out", "50").toInt());
|
||||
return zone;
|
||||
}
|
||||
|
||||
void DocClipBase::slotCreateAudioTimer() {
|
||||
@@ -97,13 +118,9 @@ bool DocClipBase::audioThumbCreated() const {
|
||||
return m_audioThumbCreated;
|
||||
}
|
||||
|
||||
void DocClipBase::setName(const QString name) {
|
||||
m_name = name;
|
||||
}
|
||||
|
||||
const QString & DocClipBase::name() const {
|
||||
|
||||
return m_name;
|
||||
return m_properties.value("name");
|
||||
}
|
||||
|
||||
const QString &DocClipBase::getId() const {
|
||||
@@ -163,7 +180,7 @@ const GenTime &DocClipBase::duration() const {
|
||||
|
||||
const GenTime &DocClipBase::maxDuration() const {
|
||||
if (m_clipType == COLOR || m_clipType == IMAGE || m_clipType == TEXT || (m_clipType == SLIDESHOW && m_properties.value("loop") == "1")) {
|
||||
const GenTime dur(10000, KdenliveSettings::project_fps());
|
||||
const GenTime dur(15000, KdenliveSettings::project_fps());
|
||||
return dur;
|
||||
}
|
||||
return m_duration;
|
||||
@@ -248,7 +265,7 @@ const QPixmap & DocClipBase::thumbnail() const {
|
||||
}
|
||||
|
||||
void DocClipBase::updateAudioThumbnail(QMap<int, QMap<int, QByteArray> > data) {
|
||||
kDebug() << "CLIPBASE RECIEDVED AUDIO DATA*********************************************";
|
||||
//kDebug() << "CLIPBASE RECIEDVED AUDIO DATA*********************************************";
|
||||
audioFrameChache = data;
|
||||
m_audioThumbCreated = true;
|
||||
emit gotAudioData();
|
||||
@@ -365,34 +382,44 @@ QString DocClipBase::markerComment(GenTime t) {
|
||||
return QString::null;
|
||||
}
|
||||
|
||||
void DocClipBase::deleteProducers() {
|
||||
qDeleteAll(m_baseTrackProducers);
|
||||
m_baseTrackProducers.clear();
|
||||
if (m_thumbProd) m_thumbProd->clearProducer();
|
||||
}
|
||||
|
||||
void DocClipBase::setProducer(Mlt::Producer *producer) {
|
||||
if (producer == NULL) return;
|
||||
QString id = producer->get("id");
|
||||
kDebug() << "// SET PRODUCER: " << id;
|
||||
if (id.contains('_')) {
|
||||
// this is a subtrack producer, insert it at correct place
|
||||
int pos = id.section('_', 1, 1).toInt();
|
||||
kDebug() << "// POS = " << pos << ", MAX: " << m_baseTrackProducers.count();
|
||||
if (pos >= m_baseTrackProducers.count()) {
|
||||
while (m_baseTrackProducers.count() - 1 < pos) {
|
||||
m_baseTrackProducers.append(NULL);
|
||||
}
|
||||
}
|
||||
kDebug() << "// POS = " << pos << ", NEW MAX: " << m_baseTrackProducers.count();
|
||||
if (m_baseTrackProducers.at(pos) == NULL) m_baseTrackProducers[pos] = producer;
|
||||
} else m_baseTrackProducers.append(producer);
|
||||
} else {
|
||||
if (m_baseTrackProducers.isEmpty()) m_baseTrackProducers.append(producer);
|
||||
else if (m_baseTrackProducers.at(0) == NULL) m_baseTrackProducers[0] = producer;
|
||||
}
|
||||
//m_clipProducer = producer;
|
||||
//m_clipProducer->set("transparency", m_properties.value("transparency").toInt());
|
||||
if (m_thumbProd && !m_thumbProd->hasProducer()) m_thumbProd->setProducer(producer);
|
||||
}
|
||||
|
||||
Mlt::Producer *DocClipBase::producer(int track) {
|
||||
/*for (int i = 0; i < m_baseTrackProducers.count(); i++) {
|
||||
if (m_baseTrackProducers.at(i)) kDebug() << "// PROD: " << i << ", ID: " << m_baseTrackProducers.at(i)->get("id");
|
||||
}*/
|
||||
if (track == -1 || (m_clipType != AUDIO && m_clipType != AV)) {
|
||||
if (m_baseTrackProducers.count() == 0) return NULL;
|
||||
int i;
|
||||
for (i = 0; i < m_baseTrackProducers.count(); i++)
|
||||
if (m_baseTrackProducers.at(i) != NULL) break;
|
||||
if (i < m_baseTrackProducers.count()) return m_baseTrackProducers.at(i);
|
||||
for (int i = 0; i < m_baseTrackProducers.count(); i++) {
|
||||
if (m_baseTrackProducers.at(i) != NULL)
|
||||
return m_baseTrackProducers.at(i);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
if (track >= m_baseTrackProducers.count()) {
|
||||
@@ -413,6 +440,10 @@ Mlt::Producer *DocClipBase::producer(int track) {
|
||||
char *tmp = (char *) qstrdup(QString(getId() + '_' + QString::number(track)).toUtf8().data());
|
||||
m_baseTrackProducers[track]->set("id", tmp);
|
||||
delete[] tmp;
|
||||
if (KdenliveSettings::dropbframes() && m_baseTrackProducers.at(i)->get("skip_loop_filter") && strcmp(m_baseTrackProducers.at(i)->get("skip_loop_filter"), "all") == 0) {
|
||||
m_baseTrackProducers[track]->set("skip_loop_filter", "all");
|
||||
m_baseTrackProducers[track]->set("skip_frame", "bidir");
|
||||
}
|
||||
}
|
||||
return m_baseTrackProducers.at(track);
|
||||
}
|
||||
@@ -431,6 +462,16 @@ void DocClipBase::setProducerProperty(const char *name, const char *data) {
|
||||
}
|
||||
}
|
||||
|
||||
const char *DocClipBase::producerProperty(const char *name) const {
|
||||
for (int i = 0; i < m_baseTrackProducers.count(); i++) {
|
||||
if (m_baseTrackProducers.at(i) != NULL) {
|
||||
return m_baseTrackProducers.at(i)->get(name);
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
void DocClipBase::slotRefreshProducer() {
|
||||
if (m_baseTrackProducers.count() == 0) return;
|
||||
kDebug() << "//////////// REFRESH CLIP !!!!!!!!!!!!!!!!";
|
||||
@@ -513,14 +554,61 @@ void DocClipBase::setProperties(QMap <QString, QString> properties) {
|
||||
if (refreshProducer) slotRefreshProducer();
|
||||
}
|
||||
|
||||
void DocClipBase::setMetadata(QMap <QString, QString> properties) {
|
||||
m_metadata = properties;
|
||||
}
|
||||
|
||||
QMap <QString, QString> DocClipBase::metadata() const {
|
||||
return m_metadata;
|
||||
}
|
||||
|
||||
void DocClipBase::clearProperty(const QString &key) {
|
||||
m_properties.remove(key);
|
||||
}
|
||||
|
||||
void DocClipBase::getFileHash(const QString &url) {
|
||||
if (m_clipType == SLIDESHOW) return;
|
||||
QFile file(url);
|
||||
if (file.open(QIODevice::ReadOnly)) { // write size and hash only if resource points to a file
|
||||
QByteArray fileData;
|
||||
QByteArray fileHash;
|
||||
//kDebug() << "SETTING HASH of" << value;
|
||||
m_properties.insert("file_size", QString::number(file.size()));
|
||||
/*
|
||||
* 1 MB = 1 second per 450 files (or faster)
|
||||
* 10 MB = 9 seconds per 450 files (or faster)
|
||||
*/
|
||||
if (file.size() > 1000000*2) {
|
||||
fileData = file.read(1000000);
|
||||
if (file.seek(file.size() - 1000000))
|
||||
fileData.append(file.readAll());
|
||||
} else
|
||||
fileData = file.readAll();
|
||||
file.close();
|
||||
fileHash = QCryptographicHash::hash(fileData, QCryptographicHash::Md5);
|
||||
m_properties.insert("file_hash", QString(fileHash.toHex()));
|
||||
//kDebug() << file.fileName() << file.size() << fileHash.toHex();
|
||||
}
|
||||
}
|
||||
|
||||
QString DocClipBase::getClipHash() const {
|
||||
QString hash;
|
||||
if (m_clipType == SLIDESHOW) hash = QCryptographicHash::hash(m_properties.value("resource").toAscii().data(), QCryptographicHash::Md5).toHex();
|
||||
else if (m_clipType == COLOR) hash = QCryptographicHash::hash(m_properties.value("colour").toAscii().data(), QCryptographicHash::Md5).toHex();
|
||||
else hash = m_properties.value("file_hash");
|
||||
return hash;
|
||||
}
|
||||
|
||||
void DocClipBase::refreshThumbUrl() {
|
||||
if (m_thumbProd) m_thumbProd->updateThumbUrl(m_properties.value("file_hash"));
|
||||
}
|
||||
|
||||
void DocClipBase::setProperty(const QString &key, const QString &value) {
|
||||
m_properties.insert(key, value);
|
||||
if (key == "resource") m_thumbProd->updateClipUrl(KUrl(value));
|
||||
else if (key == "out") setDuration(GenTime(value.toInt(), KdenliveSettings::project_fps()));
|
||||
if (key == "resource") {
|
||||
getFileHash(value);
|
||||
if (m_thumbProd) m_thumbProd->updateClipUrl(KUrl(value), m_properties.value("file_hash"));
|
||||
} else if (key == "out") setDuration(GenTime(value.toInt(), KdenliveSettings::project_fps()));
|
||||
//else if (key == "transparency") m_clipProducer->set("transparency", value.toInt());
|
||||
else if (key == "colour") {
|
||||
char *tmp = (char *) qstrdup(value.toUtf8().data());
|
||||
@@ -557,6 +645,10 @@ QMap <QString, QString> DocClipBase::properties() const {
|
||||
|
||||
bool DocClipBase::slotGetAudioThumbs() {
|
||||
if (m_thumbProd == NULL) return false;
|
||||
if (!KdenliveSettings::audiothumbnails()) {
|
||||
if (m_audioTimer != NULL) m_audioTimer->stop();
|
||||
return false;
|
||||
}
|
||||
if (m_audioThumbCreated) {
|
||||
if (m_audioTimer != NULL) m_audioTimer->stop();
|
||||
return false;
|
||||
|
||||
@@ -58,9 +58,6 @@ Q_OBJECT public:
|
||||
// DocClipBase & operator=(const DocClipBase & clip);
|
||||
virtual ~ DocClipBase();
|
||||
|
||||
/** sets the name of this clip. */
|
||||
void setName(const QString name);
|
||||
|
||||
/** returns the name of this clip. */
|
||||
const QString & name() const;
|
||||
|
||||
@@ -113,34 +110,11 @@ Q_OBJECT public:
|
||||
void setProducer(Mlt::Producer *producer);
|
||||
Mlt::Producer *producer(int track = -1);
|
||||
|
||||
/*virtual DocClipAVFile *toDocClipAVFile() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
virtual DocClipTextFile *toDocClipTextFile() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
virtual bool isDocClipTextFile() const {
|
||||
return false;
|
||||
}
|
||||
|
||||
virtual bool isDocClipVirtual() const {
|
||||
return false;
|
||||
}
|
||||
|
||||
virtual DocClipVirtual *toDocClipVirtual() {
|
||||
return 0;
|
||||
}*/
|
||||
|
||||
/** Returns true if this clip is a project clip, false otherwise. Overridden in DocClipProject,
|
||||
* where it returns true. */
|
||||
bool isProjectClip() const {
|
||||
return false;
|
||||
}
|
||||
// Appends scene times for this clip to the passed vector.
|
||||
/* virtual void populateSceneTimes(QList < GenTime >
|
||||
&toPopulate) const = 0;*/
|
||||
|
||||
/** Reads in the element structure and creates a clip out of it.*/
|
||||
// Returns an XML document that describes part of the current scene.
|
||||
@@ -188,10 +162,19 @@ Q_OBJECT public:
|
||||
/** Free cache data */
|
||||
void slotClearAudioCache();
|
||||
void askForAudioThumbs();
|
||||
QString getClipHash() const;
|
||||
void refreshThumbUrl();
|
||||
const char *producerProperty(const char *name) const;
|
||||
void setProducerProperty(const char *name, const char *data);
|
||||
void deleteProducers();
|
||||
|
||||
/** Set default play zone for clip monitor */
|
||||
void setZone(QPoint zone);
|
||||
/** Get default play zone for clip monitor */
|
||||
QPoint zone() const;
|
||||
|
||||
private: // Private attributes
|
||||
/** The name of this clip */
|
||||
QString m_name;
|
||||
|
||||
/** A description of this clip */
|
||||
QString m_description;
|
||||
/** The number of times this clip is used in the project - the number of references to this clip
|
||||
@@ -216,11 +199,13 @@ private: // Private attributes
|
||||
void setAudioThumbCreated(bool isDone);
|
||||
/** Holds clip infos like fps, size,... */
|
||||
QMap <QString, QString> m_properties;
|
||||
/** Holds clip metadata like author, copyright,... */
|
||||
QMap <QString, QString> m_metadata;
|
||||
/** Create connections for audio thumbnails */
|
||||
void slotCreateAudioTimer();
|
||||
void slotRefreshProducer();
|
||||
void setProducerProperty(const char *name, const char *data);
|
||||
void setProducerProperty(const char *name, int data);
|
||||
void getFileHash(const QString &url);
|
||||
|
||||
public slots:
|
||||
void updateAudioThumbnail(QMap<int, QMap<int, QByteArray> > data);
|
||||
@@ -238,7 +223,10 @@ public slots:
|
||||
void setClipThumbFrame(const uint &ix);
|
||||
uint getClipThumbFrame() const;
|
||||
void setProperties(QMap <QString, QString> properties);
|
||||
void setMetadata(QMap <QString, QString> properties);
|
||||
QMap <QString, QString> properties() const;
|
||||
QMap <QString, QString> metadata() const;
|
||||
|
||||
|
||||
signals:
|
||||
void getAudioThumbs();
|
||||
|
||||
433
src/dvdwizard.cpp
Normal file
433
src/dvdwizard.cpp
Normal file
@@ -0,0 +1,433 @@
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2007 by Jean-Baptiste Mardelle (jb@kdenlive.org) *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
|
||||
***************************************************************************/
|
||||
|
||||
#include <QLabel>
|
||||
#include <QFile>
|
||||
#include <QXmlStreamWriter>
|
||||
#include <QApplication>
|
||||
#include <QTimer>
|
||||
#include <QGraphicsView>
|
||||
#include <QDomDocument>
|
||||
|
||||
#include <KStandardDirs>
|
||||
#include <KLocale>
|
||||
#include <KFileDialog>
|
||||
#include <kmimetype.h>
|
||||
#include <KIO/NetAccess>
|
||||
#include <KMessageBox>
|
||||
|
||||
#include "kdenlivesettings.h"
|
||||
#include "profilesdialog.h"
|
||||
#include "dvdwizard.h"
|
||||
|
||||
DvdWizard::DvdWizard(const QString &url, const QString &profile, QWidget *parent): QWizard(parent), m_profile(profile) {
|
||||
//setPixmap(QWizard::WatermarkPixmap, QPixmap(KStandardDirs::locate("appdata", "banner.png")));
|
||||
setAttribute(Qt::WA_DeleteOnClose);
|
||||
m_pageVob = new DvdWizardVob(this);
|
||||
m_pageVob->setTitle(i18n("Select Files For Your DVD"));
|
||||
addPage(m_pageVob);
|
||||
|
||||
if (!url.isEmpty()) m_pageVob->setUrl(url);
|
||||
|
||||
m_pageMenu = new DvdWizardMenu(m_profile, this);
|
||||
m_pageMenu->setTitle(i18n("Create DVD Menu"));
|
||||
addPage(m_pageMenu);
|
||||
|
||||
|
||||
QWizardPage *page3 = new QWizardPage;
|
||||
page3->setTitle(i18n("DVD Image"));
|
||||
m_iso.setupUi(page3);
|
||||
m_iso.tmp_folder->setPath(KdenliveSettings::currenttmpfolder());
|
||||
m_iso.iso_image->setPath(QDir::homePath() + "/untitled.iso");
|
||||
m_iso.iso_image->setFilter("*.iso");
|
||||
m_iso.iso_image->fileDialog()->setOperationMode(KFileDialog::Saving);
|
||||
addPage(page3);
|
||||
|
||||
QWizardPage *page4 = new QWizardPage;
|
||||
page4->setTitle(i18n("Creating DVD Image"));
|
||||
m_status.setupUi(page4);
|
||||
addPage(page4);
|
||||
|
||||
connect(this, SIGNAL(currentIdChanged(int)), this, SLOT(slotPageChanged(int)));
|
||||
|
||||
// connect(m_standard.button_all, SIGNAL(toggled(bool)), this, SLOT(slotCheckStandard()));
|
||||
}
|
||||
|
||||
DvdWizard::~DvdWizard() {
|
||||
// m_menuFile.remove();
|
||||
}
|
||||
|
||||
|
||||
void DvdWizard::slotPageChanged(int page) {
|
||||
kDebug() << "// PAGE CHGD: " << page;
|
||||
if (page == 1) {
|
||||
m_pageMenu->setTargets(m_pageVob->selectedUrls());
|
||||
} else if (page == 2) {
|
||||
m_pageMenu->buttonsInfo();
|
||||
} else if (page == 3) {
|
||||
// clear job icons
|
||||
for (int i = 0; i < m_status.job_progress->count(); i++)
|
||||
m_status.job_progress->item(i)->setIcon(KIcon());
|
||||
QString warnMessage;
|
||||
if (KIO::NetAccess::exists(KUrl(m_iso.tmp_folder->url().path() + "/DVD"), KIO::NetAccess::SourceSide, this))
|
||||
warnMessage.append(i18n("Folder %1 already exists. Overwrite ?<br />", m_iso.tmp_folder->url().path() + "/DVD"));
|
||||
if (KIO::NetAccess::exists(KUrl(m_iso.iso_image->url().path()), KIO::NetAccess::SourceSide, this))
|
||||
warnMessage.append(i18n("Image file %1 already exists. Overwrite ?", m_iso.iso_image->url().path()));
|
||||
|
||||
if (!warnMessage.isEmpty() && KMessageBox::questionYesNo(this, warnMessage) == KMessageBox::No) {
|
||||
back();
|
||||
} else {
|
||||
KIO::NetAccess::del(KUrl(m_iso.tmp_folder->url().path() + "/DVD"), this);
|
||||
QTimer::singleShot(300, this, SLOT(generateDvd()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void DvdWizard::generateDvd() {
|
||||
KTemporaryFile temp1;
|
||||
temp1.setSuffix(".png");
|
||||
//temp1.setAutoRemove(false);
|
||||
temp1.open();
|
||||
|
||||
KTemporaryFile temp2;
|
||||
temp2.setSuffix(".png");
|
||||
//temp2.setAutoRemove(false);
|
||||
temp2.open();
|
||||
|
||||
KTemporaryFile temp3;
|
||||
temp3.setSuffix(".png");
|
||||
//temp3.setAutoRemove(false);
|
||||
temp3.open();
|
||||
|
||||
KTemporaryFile temp4;
|
||||
temp4.setSuffix(".png");
|
||||
//temp4.setAutoRemove(false);
|
||||
temp4.open();
|
||||
|
||||
KTemporaryFile temp5;
|
||||
temp5.setSuffix(".vob");
|
||||
//temp5.setAutoRemove(false);
|
||||
temp5.open();
|
||||
|
||||
KTemporaryFile temp6;
|
||||
temp6.setSuffix(".xml");
|
||||
//temp6.setAutoRemove(false);
|
||||
temp6.open();
|
||||
|
||||
m_menuFile.setSuffix(".mpg");
|
||||
m_menuFile.setAutoRemove(false);
|
||||
m_menuFile.open();
|
||||
|
||||
m_authorFile.setSuffix(".xml");
|
||||
m_authorFile.setAutoRemove(false);
|
||||
m_authorFile.open();
|
||||
|
||||
QListWidgetItem *images = m_status.job_progress->item(0);
|
||||
images->setIcon(KIcon("system-run"));
|
||||
qApp->processEvents();
|
||||
QMap <int, QRect> buttons = m_pageMenu->buttonsInfo();
|
||||
QStringList buttonsTarget;
|
||||
|
||||
if (m_pageMenu->createMenu()) {
|
||||
m_pageMenu->createButtonImages(temp1.fileName(), temp2.fileName(), temp3.fileName());
|
||||
m_pageMenu->createBackgroundImage(temp4.fileName());
|
||||
|
||||
|
||||
images->setIcon(KIcon("dialog-ok"));
|
||||
|
||||
kDebug() << "/// STARTING MLT VOB CREATION";
|
||||
if (!m_pageMenu->menuMovie()) {
|
||||
// create menu vob file
|
||||
QListWidgetItem *vobitem = m_status.job_progress->item(1);
|
||||
vobitem->setIcon(KIcon("system-run"));
|
||||
qApp->processEvents();
|
||||
|
||||
QStringList args;
|
||||
args.append("-profile");
|
||||
if (m_pageMenu->isPalMenu()) args.append("dv_pal");
|
||||
else args.append("dv_ntsc");
|
||||
args.append(temp4.fileName());
|
||||
args.append("in=0");
|
||||
args.append("out=100");
|
||||
args << "-consumer" << "avformat:" + temp5.fileName();
|
||||
if (m_pageMenu->isPalMenu()) {
|
||||
args << "f=dvd" << "vcodec=mpeg2video" << "acodec=ac3" << "b=5000k" << "maxrate=8000k" << "minrate=0" << "bufsize=1835008" << "mux_packet_s=2048" << "mux_rate=10080000" << "ab=192k" << "ar=48000" << "s=720x576" << "g=15" << "me_range=63" << "trellis=1" << "profile=dv_pal";
|
||||
} else {
|
||||
args << "f=dvd" << "vcodec=mpeg2video" << "acodec=ac3" << "b=6000k" << "maxrate=9000k" << "minrate=0" << "bufsize=1835008" << "mux_packet_s=2048" << "mux_rate=10080000" << "ab=192k" << "ar=48000" << "s=720x480" << "g=18" << "me_range=63" << "trellis=1" << "profile=dv_ntsc";
|
||||
}
|
||||
|
||||
kDebug() << "MLT ARGS: " << args;
|
||||
QProcess renderbg;
|
||||
renderbg.start("inigo", args);
|
||||
if (renderbg.waitForFinished()) {
|
||||
if (renderbg.exitStatus() == QProcess::CrashExit) {
|
||||
kDebug() << "/// RENDERING MENU vob crashed";
|
||||
vobitem->setIcon(KIcon("dialog-close"));
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
kDebug() << "/// RENDERING MENU vob timed out";
|
||||
vobitem->setIcon(KIcon("dialog-close"));
|
||||
return;
|
||||
}
|
||||
vobitem->setIcon(KIcon("dialog-ok"));
|
||||
}
|
||||
kDebug() << "/// STARTING SPUMUX";
|
||||
|
||||
// create xml spumux file
|
||||
QListWidgetItem *spuitem = m_status.job_progress->item(2);
|
||||
spuitem->setIcon(KIcon("system-run"));
|
||||
qApp->processEvents();
|
||||
QDomDocument doc;
|
||||
QDomElement sub = doc.createElement("subpictures");
|
||||
doc.appendChild(sub);
|
||||
QDomElement stream = doc.createElement("stream");
|
||||
sub.appendChild(stream);
|
||||
QDomElement spu = doc.createElement("spu");
|
||||
stream.appendChild(spu);
|
||||
spu.setAttribute("force", "yes");
|
||||
spu.setAttribute("start", "00:00:00.00");
|
||||
spu.setAttribute("image", temp1.fileName());
|
||||
spu.setAttribute("select", temp2.fileName());
|
||||
spu.setAttribute("highlight", temp3.fileName());
|
||||
/*spu.setAttribute("autooutline", "infer");
|
||||
spu.setAttribute("outlinewidth", "12");
|
||||
spu.setAttribute("autoorder", "rows");*/
|
||||
|
||||
int max = buttons.count() - 1;
|
||||
int i = 0;
|
||||
QMapIterator<int, QRect> it(buttons);
|
||||
while (it.hasNext()) {
|
||||
it.next();
|
||||
QDomElement but = doc.createElement("button");
|
||||
but.setAttribute("name", "b" + QString::number(i));
|
||||
if (i < max) but.setAttribute("down", "b" + QString::number(i + 1));
|
||||
else but.setAttribute("down", "b0");
|
||||
if (i > 0) but.setAttribute("up", "b" + QString::number(i - 1));
|
||||
else but.setAttribute("up", "b" + QString::number(max));
|
||||
QRect r = it.value();
|
||||
int target = it.key();
|
||||
// TODO: solve play all button
|
||||
if (target == 0) target = 1;
|
||||
buttonsTarget.append(QString::number(target));
|
||||
but.setAttribute("x0", QString::number(r.x()));
|
||||
but.setAttribute("y0", QString::number(r.y()));
|
||||
but.setAttribute("x1", QString::number(r.right()));
|
||||
but.setAttribute("y1", QString::number(r.bottom()));
|
||||
spu.appendChild(but);
|
||||
i++;
|
||||
}
|
||||
|
||||
kDebug() << "///// SPU: ";
|
||||
kDebug() << doc.toString();
|
||||
|
||||
QFile data(temp6.fileName());
|
||||
if (data.open(QFile::WriteOnly)) {
|
||||
QTextStream out(&data);
|
||||
out << doc.toString();
|
||||
}
|
||||
data.close();
|
||||
|
||||
kDebug() << " SPUMUX DATA: " << doc.toString();
|
||||
|
||||
QStringList args;
|
||||
args.append(temp6.fileName());
|
||||
kDebug() << "SPM ARGS: " << args << temp5.fileName() << m_menuFile.fileName();
|
||||
|
||||
QProcess spumux;
|
||||
|
||||
if (m_pageMenu->menuMovie()) spumux.setStandardInputFile(m_pageMenu->menuMoviePath());
|
||||
else spumux.setStandardInputFile(temp5.fileName());
|
||||
spumux.setStandardOutputFile(m_menuFile.fileName());
|
||||
spumux.start("spumux", args);
|
||||
spumux.setProcessChannelMode(QProcess::MergedChannels);
|
||||
if (spumux.waitForFinished()) {
|
||||
kDebug() << QString(spumux.readAll()).simplified();
|
||||
if (spumux.exitStatus() == QProcess::CrashExit) {
|
||||
kDebug() << "/// RENDERING SPUMUX MENU crashed";
|
||||
spuitem->setIcon(KIcon("dialog-close"));
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
kDebug() << "/// RENDERING SPUMUX MENU timed out";
|
||||
spuitem->setIcon(KIcon("dialog-close"));
|
||||
return;
|
||||
}
|
||||
|
||||
spuitem->setIcon(KIcon("dialog-ok"));
|
||||
kDebug() << "/// DONE: " << m_menuFile.fileName();
|
||||
}
|
||||
|
||||
// create dvdauthor xml
|
||||
QListWidgetItem *authitem = m_status.job_progress->item(3);
|
||||
authitem->setIcon(KIcon("system-run"));
|
||||
qApp->processEvents();
|
||||
KIO::NetAccess::mkdir(KUrl(m_iso.tmp_folder->url().path() + "/DVD"), this);
|
||||
|
||||
QDomDocument dvddoc;
|
||||
QDomElement auth = dvddoc.createElement("dvdauthor");
|
||||
auth.setAttribute("dest", m_iso.tmp_folder->url().path() + "/DVD");
|
||||
dvddoc.appendChild(auth);
|
||||
QDomElement vmgm = dvddoc.createElement("vmgm");
|
||||
auth.appendChild(vmgm);
|
||||
|
||||
if (m_pageMenu->createMenu() && !m_pageVob->introMovie().isEmpty()) {
|
||||
// intro movie
|
||||
QDomElement menus = dvddoc.createElement("menus");
|
||||
vmgm.appendChild(menus);
|
||||
QDomElement pgc = dvddoc.createElement("pgc");
|
||||
pgc.setAttribute("entry", "title");
|
||||
menus.appendChild(pgc);
|
||||
QDomElement menuvob = dvddoc.createElement("vob");
|
||||
menuvob.setAttribute("file", m_pageVob->introMovie());
|
||||
pgc.appendChild(menuvob);
|
||||
QDomElement post = dvddoc.createElement("post");
|
||||
QDomText call = dvddoc.createTextNode("jump titleset 1 menu;");
|
||||
post.appendChild(call);
|
||||
pgc.appendChild(post);
|
||||
}
|
||||
QDomElement titleset = dvddoc.createElement("titleset");
|
||||
auth.appendChild(titleset);
|
||||
|
||||
if (m_pageMenu->createMenu()) {
|
||||
|
||||
// DVD main menu
|
||||
QDomElement menus = dvddoc.createElement("menus");
|
||||
titleset.appendChild(menus);
|
||||
QDomElement pgc = dvddoc.createElement("pgc");
|
||||
pgc.setAttribute("entry", "root");
|
||||
menus.appendChild(pgc);
|
||||
for (int i = 0; i < buttons.count(); i++) {
|
||||
QDomElement button = dvddoc.createElement("button");
|
||||
button.setAttribute("name", "b" + QString::number(i));
|
||||
QDomText nametext = dvddoc.createTextNode("jump title " + buttonsTarget.at(i) + ";");
|
||||
button.appendChild(nametext);
|
||||
pgc.appendChild(button);
|
||||
}
|
||||
QDomElement menuvob = dvddoc.createElement("vob");
|
||||
menuvob.setAttribute("file", m_menuFile.fileName());
|
||||
menuvob.setAttribute("pause", "inf");
|
||||
pgc.appendChild(menuvob);
|
||||
}
|
||||
|
||||
QDomElement titles = dvddoc.createElement("titles");
|
||||
titleset.appendChild(titles);
|
||||
|
||||
QStringList voburls = m_pageVob->selectedUrls();
|
||||
|
||||
QDomElement pgc2 = dvddoc.createElement("pgc");
|
||||
titles.appendChild(pgc2);
|
||||
if (m_pageMenu->createMenu()) {
|
||||
QDomElement post = dvddoc.createElement("post");
|
||||
QDomText call = dvddoc.createTextNode("call menu;");
|
||||
post.appendChild(call);
|
||||
pgc2.appendChild(post);
|
||||
}
|
||||
|
||||
|
||||
for (int i = 0; i < voburls.count(); i++) {
|
||||
if (!voburls.at(i).isEmpty()) {
|
||||
// Add vob entry
|
||||
QDomElement vob = dvddoc.createElement("vob");
|
||||
vob.setAttribute("file", voburls.at(i));
|
||||
pgc2.appendChild(vob);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
// create one pgc for each video
|
||||
for (int i = 0; i < voburls.count(); i++) {
|
||||
if (!voburls.at(i).isEmpty()) {
|
||||
// Add vob entry
|
||||
|
||||
QDomElement pgc2 = dvddoc.createElement("pgc");
|
||||
titles.appendChild(pgc2);
|
||||
if (m_pageMenu->createMenu()) {
|
||||
QDomElement post = dvddoc.createElement("post");
|
||||
QDomText call = dvddoc.createTextNode("call vmgm menu 1;");
|
||||
post.appendChild(call);
|
||||
pgc2.appendChild(post);
|
||||
}
|
||||
|
||||
QDomElement vob = dvddoc.createElement("vob");
|
||||
vob.setAttribute("file", voburls.at(i));
|
||||
pgc2.appendChild(vob);
|
||||
}
|
||||
}
|
||||
*/
|
||||
QFile data2(m_authorFile.fileName());
|
||||
if (data2.open(QFile::WriteOnly)) {
|
||||
QTextStream out(&data2);
|
||||
out << dvddoc.toString();
|
||||
}
|
||||
data2.close();
|
||||
|
||||
|
||||
QStringList args;
|
||||
args << "-x" << m_authorFile.fileName();
|
||||
kDebug() << "// DVDAUTH ARGS: " << args;
|
||||
QProcess *dvdauth = new QProcess(this);
|
||||
connect(dvdauth, SIGNAL(finished(int , QProcess::ExitStatus)), this, SLOT(slotRenderFinished(int, QProcess::ExitStatus)));
|
||||
dvdauth->setProcessChannelMode(QProcess::MergedChannels);
|
||||
dvdauth->start("dvdauthor", args);
|
||||
|
||||
}
|
||||
|
||||
void DvdWizard::slotRenderFinished(int exitCode, QProcess::ExitStatus status) {
|
||||
QListWidgetItem *authitem = m_status.job_progress->item(3);
|
||||
if (status == QProcess::CrashExit) {
|
||||
kDebug() << "DVDAuthor process crashed";
|
||||
authitem->setIcon(KIcon("dialog-close"));
|
||||
return;
|
||||
}
|
||||
authitem->setIcon(KIcon("dialog-ok"));
|
||||
qApp->processEvents();
|
||||
QStringList args;
|
||||
args << "-dvd-video" << "-v" << "-o" << m_iso.iso_image->url().path() << m_iso.tmp_folder->url().path() + "/DVD";
|
||||
QProcess *mkiso = new QProcess(this);
|
||||
connect(mkiso, SIGNAL(finished(int , QProcess::ExitStatus)), this, SLOT(slotIsoFinished(int, QProcess::ExitStatus)));
|
||||
mkiso->setProcessChannelMode(QProcess::MergedChannels);
|
||||
QListWidgetItem *isoitem = m_status.job_progress->item(4);
|
||||
isoitem->setIcon(KIcon("system-run"));
|
||||
mkiso->start("mkisofs", args);
|
||||
|
||||
}
|
||||
|
||||
void DvdWizard::slotIsoFinished(int exitCode, QProcess::ExitStatus status) {
|
||||
QListWidgetItem *isoitem = m_status.job_progress->item(4);
|
||||
if (status == QProcess::CrashExit) {
|
||||
m_authorFile.remove();
|
||||
m_menuFile.remove();
|
||||
KIO::NetAccess::del(KUrl(m_iso.tmp_folder->url().path() + "/DVD"), this);
|
||||
kDebug() << "Iso process crashed";
|
||||
isoitem->setIcon(KIcon("dialog-close"));
|
||||
return;
|
||||
}
|
||||
isoitem->setIcon(KIcon("dialog-ok"));
|
||||
kDebug() << "ISO IMAGE " << m_iso.iso_image->url().path() << " Successfully created";
|
||||
m_authorFile.remove();
|
||||
m_menuFile.remove();
|
||||
KIO::NetAccess::del(KUrl(m_iso.tmp_folder->url().path() + "/DVD"), this);
|
||||
KMessageBox::information(this, i18n("DVD iso image %1 successfully created.", m_iso.iso_image->url().path()));
|
||||
|
||||
}
|
||||
|
||||
|
||||
62
src/dvdwizard.h
Normal file
62
src/dvdwizard.h
Normal file
@@ -0,0 +1,62 @@
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2008 by Jean-Baptiste Mardelle (jb@kdenlive.org) *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
|
||||
***************************************************************************/
|
||||
|
||||
|
||||
#ifndef DVDWIZARD_H
|
||||
#define DVDWIZARD_H
|
||||
|
||||
#include <QWizard>
|
||||
#include <QVBoxLayout>
|
||||
#include <QItemDelegate>
|
||||
#include <QPainter>
|
||||
#include <QProcess>
|
||||
|
||||
|
||||
#include <KDebug>
|
||||
#include <KTemporaryFile>
|
||||
|
||||
#include "dvdwizardvob.h"
|
||||
#include "dvdwizardmenu.h"
|
||||
#include "ui_dvdwizardiso_ui.h"
|
||||
#include "ui_dvdwizardstatus_ui.h"
|
||||
|
||||
class DvdWizard : public QWizard {
|
||||
Q_OBJECT
|
||||
public:
|
||||
DvdWizard(const QString &url = QString(), const QString &profile = "dv_pal", QWidget * parent = 0);
|
||||
virtual ~DvdWizard();
|
||||
|
||||
private:
|
||||
DvdWizardVob *m_pageVob;
|
||||
DvdWizardMenu *m_pageMenu;
|
||||
Ui::DvdWizardIso_UI m_iso;
|
||||
Ui::DvdWizardStatus_UI m_status;
|
||||
QString m_profile;
|
||||
KTemporaryFile m_menuFile;
|
||||
KTemporaryFile m_authorFile;
|
||||
|
||||
private slots:
|
||||
void slotPageChanged(int page);
|
||||
void slotRenderFinished(int exitCode, QProcess::ExitStatus status);
|
||||
void slotIsoFinished(int exitCode, QProcess::ExitStatus status);
|
||||
void generateDvd();
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user