diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1f52f2a0..43200d94 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -40,8 +40,8 @@ For more information, please visit .
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/Modules")
################ PROJECT VERSION ####################
-set(PROJECT_VERSION_FULL "0.2.4-dev1")
-set(PROJECT_SO_VERSION 18)
+set(PROJECT_VERSION_FULL "0.2.5-dev1")
+set(PROJECT_SO_VERSION 19)
# Remove the dash and anything following, to get the #.#.# version for project()
STRING(REGEX REPLACE "\-.*$" "" VERSION_NUM "${PROJECT_VERSION_FULL}")
diff --git a/cmake/Modules/CodeCoverage.cmake b/cmake/Modules/CodeCoverage.cmake
index 786a06b4..fde7f535 100644
--- a/cmake/Modules/CodeCoverage.cmake
+++ b/cmake/Modules/CodeCoverage.cmake
@@ -59,6 +59,13 @@
# 2019-12-19, FeRD (Frank Dana)
# - Rename Lcov outputs, make filtered file canonical, fix cleanup for targets
#
+# 2020-01-19, Bob Apthorpe
+# - Added gfortran support
+#
+# 2020-02-17, FeRD (Frank Dana)
+# - Make all add_custom_target()s VERBATIM to auto-escape wildcard characters
+# in EXCLUDEs, and remove manual escaping from gcovr targets
+#
# USAGE:
#
# 1. Copy this file into your cmake modules path.
@@ -122,12 +129,22 @@ if("${CMAKE_CXX_COMPILER_ID}" MATCHES "(Apple)?[Cc]lang")
message(FATAL_ERROR "Clang version must be 3.0.0 or greater! Aborting...")
endif()
elseif(NOT CMAKE_COMPILER_IS_GNUCXX)
- message(FATAL_ERROR "Compiler is not GNU gcc! Aborting...")
+ if("${CMAKE_Fortran_COMPILER_ID}" MATCHES "[Ff]lang")
+ # Do nothing; exit conditional without error if true
+ elseif("${CMAKE_Fortran_COMPILER_ID}" MATCHES "GNU")
+ # Do nothing; exit conditional without error if true
+ else()
+ message(FATAL_ERROR "Compiler is not GNU gcc! Aborting...")
+ endif()
endif()
set(COVERAGE_COMPILER_FLAGS "-g -fprofile-arcs -ftest-coverage"
CACHE INTERNAL "")
+set(CMAKE_Fortran_FLAGS_COVERAGE
+ ${COVERAGE_COMPILER_FLAGS}
+ CACHE STRING "Flags used by the Fortran compiler during coverage builds."
+ FORCE )
set(CMAKE_CXX_FLAGS_COVERAGE
${COVERAGE_COMPILER_FLAGS}
CACHE STRING "Flags used by the C++ compiler during coverage builds."
@@ -145,6 +162,7 @@ set(CMAKE_SHARED_LINKER_FLAGS_COVERAGE
CACHE STRING "Flags used by the shared libraries linker during coverage builds."
FORCE )
mark_as_advanced(
+ CMAKE_Fortran_FLAGS_COVERAGE
CMAKE_CXX_FLAGS_COVERAGE
CMAKE_C_FLAGS_COVERAGE
CMAKE_EXE_LINKER_FLAGS_COVERAGE
@@ -154,7 +172,7 @@ if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
message(WARNING "Code coverage results with an optimised (non-Debug) build may be misleading")
endif() # NOT CMAKE_BUILD_TYPE STREQUAL "Debug"
-if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
+if(CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_Fortran_COMPILER_ID STREQUAL "GNU")
link_libraries(gcov)
endif()
@@ -242,6 +260,7 @@ function(setup_target_for_coverage_lcov)
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
DEPENDS ${Coverage_DEPENDENCIES}
+ VERBATIM # Protect arguments to commands
COMMENT "Resetting code coverage counters to zero.\nProcessing code coverage counters and generating report."
)
@@ -304,9 +323,8 @@ function(setup_target_for_coverage_gcovr_xml)
# Combine excludes to several -e arguments
set(GCOVR_EXCLUDE_ARGS "")
foreach(EXCLUDE ${GCOVR_EXCLUDES})
- string(REPLACE "*" "\\*" EXCLUDE_REPLACED ${EXCLUDE})
list(APPEND GCOVR_EXCLUDE_ARGS "-e")
- list(APPEND GCOVR_EXCLUDE_ARGS "${EXCLUDE_REPLACED}")
+ list(APPEND GCOVR_EXCLUDE_ARGS "${EXCLUDE}")
endforeach()
add_custom_target(${Coverage_NAME}
@@ -321,6 +339,7 @@ function(setup_target_for_coverage_gcovr_xml)
BYPRODUCTS ${Coverage_NAME}.xml
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
DEPENDS ${Coverage_DEPENDENCIES}
+ VERBATIM # Protect arguments to commands
COMMENT "Running gcovr to produce Cobertura code coverage report."
)
@@ -376,9 +395,8 @@ function(setup_target_for_coverage_gcovr_html)
# Combine excludes to several -e arguments
set(GCOVR_EXCLUDE_ARGS "")
foreach(EXCLUDE ${GCOVR_EXCLUDES})
- string(REPLACE "*" "\\*" EXCLUDE_REPLACED ${EXCLUDE})
list(APPEND GCOVR_EXCLUDE_ARGS "-e")
- list(APPEND GCOVR_EXCLUDE_ARGS "${EXCLUDE_REPLACED}")
+ list(APPEND GCOVR_EXCLUDE_ARGS "${EXCLUDE}")
endforeach()
add_custom_target(${Coverage_NAME}
@@ -393,9 +411,11 @@ function(setup_target_for_coverage_gcovr_html)
-r ${BASEDIR} ${GCOVR_EXCLUDE_ARGS}
--object-directory=${PROJECT_BINARY_DIR}
-o ${Coverage_NAME}/index.html
+
BYPRODUCTS ${PROJECT_BINARY_DIR}/${Coverage_NAME} # report directory
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
DEPENDS ${Coverage_DEPENDENCIES}
+ VERBATIM # Protect arguments to commands
COMMENT "Running gcovr to produce HTML code coverage report."
)
@@ -410,5 +430,6 @@ endfunction() # setup_target_for_coverage_gcovr_html
function(append_coverage_compiler_flags)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COVERAGE_COMPILER_FLAGS}" PARENT_SCOPE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COVERAGE_COMPILER_FLAGS}" PARENT_SCOPE)
+ set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${COVERAGE_COMPILER_FLAGS}" PARENT_SCOPE)
message(STATUS "Appending code coverage compiler flags: ${COVERAGE_COMPILER_FLAGS}")
endfunction() # append_coverage_compiler_flags
diff --git a/include/CacheBase.h b/include/CacheBase.h
index aad65a84..da72e5db 100644
--- a/include/CacheBase.h
+++ b/include/CacheBase.h
@@ -110,9 +110,9 @@ namespace openshot {
/// Get and Set JSON methods
virtual std::string Json() = 0; ///< Generate JSON string of this object
- virtual void SetJson(std::string value) = 0; ///< Load JSON string into this object
- virtual Json::Value JsonValue() = 0; ///< Generate Json::JsonValue for this object
- virtual void SetJsonValue(Json::Value root) = 0; ///< Load Json::JsonValue into this object
+ virtual void SetJson(const std::string value) = 0; ///< Load JSON string into this object
+ virtual Json::Value JsonValue() = 0; ///< Generate Json::Value for this object
+ virtual void SetJsonValue(const Json::Value root) = 0; ///< Load Json::Value into this object
virtual ~CacheBase() = default;
};
diff --git a/include/CacheDisk.h b/include/CacheDisk.h
index e69cc357..09ebd4ab 100644
--- a/include/CacheDisk.h
+++ b/include/CacheDisk.h
@@ -129,9 +129,9 @@ namespace openshot {
/// Get and Set JSON methods
std::string Json(); ///< Generate JSON string of this object
- void SetJson(std::string value); ///< Load JSON string into this object
- Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
- void SetJsonValue(Json::Value root); ///< Load Json::JsonValue into this object
+ void SetJson(const std::string value); ///< Load JSON string into this object
+ Json::Value JsonValue(); ///< Generate Json::Value for this object
+ void SetJsonValue(const Json::Value root); ///< Load Json::Value into this object
};
}
diff --git a/include/CacheMemory.h b/include/CacheMemory.h
index fb3c75f6..ba771ced 100644
--- a/include/CacheMemory.h
+++ b/include/CacheMemory.h
@@ -111,9 +111,9 @@ namespace openshot {
/// Get and Set JSON methods
std::string Json(); ///< Generate JSON string of this object
- void SetJson(std::string value); ///< Load JSON string into this object
- Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
- void SetJsonValue(Json::Value root); ///< Load Json::JsonValue into this object
+ void SetJson(const std::string value); ///< Load JSON string into this object
+ Json::Value JsonValue(); ///< Generate Json::Value for this object
+ void SetJsonValue(const Json::Value root); ///< Load Json::Value into this object
};
}
diff --git a/include/ChunkReader.h b/include/ChunkReader.h
index 9d99fcd4..4d72c31d 100644
--- a/include/ChunkReader.h
+++ b/include/ChunkReader.h
@@ -157,10 +157,10 @@ namespace openshot
std::string Name() { return "ChunkReader"; };
/// Get and Set JSON methods
- std::string Json(); ///< Generate JSON string of this object
- void SetJson(std::string value); ///< Load JSON string into this object
- Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
- void SetJsonValue(Json::Value root); ///< Load Json::JsonValue into this object
+ std::string Json() const override; ///< Generate JSON string of this object
+ void SetJson(const std::string value); ///< Load JSON string into this object
+ Json::Value JsonValue() const override; ///< Generate Json::Value for this object
+ void SetJsonValue(const Json::Value root); ///< Load Json::Value into this object
/// Open the reader. This is required before you can access frames or data from the reader.
void Open();
diff --git a/include/Clip.h b/include/Clip.h
index 6fa02c9a..68d4622a 100644
--- a/include/Clip.h
+++ b/include/Clip.h
@@ -187,18 +187,18 @@ namespace openshot {
openshot::ReaderBase* Reader();
/// Override End() method
- float End(); ///< Get end position (in seconds) of clip (trim end of video), which can be affected by the time curve.
+ float End() const; ///< Get end position (in seconds) of clip (trim end of video), which can be affected by the time curve.
void End(float value) { end = value; } ///< Set end position (in seconds) of clip (trim end of video)
/// Get and Set JSON methods
- std::string Json(); ///< Generate JSON string of this object
- void SetJson(std::string value); ///< Load JSON string into this object
- Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
- void SetJsonValue(Json::Value root); ///< Load Json::JsonValue into this object
+ std::string Json() const override; ///< Generate JSON string of this object
+ void SetJson(const std::string value); ///< Load JSON string into this object
+ Json::Value JsonValue() const override; ///< Generate Json::Value for this object
+ void SetJsonValue(const Json::Value root); ///< Load Json::Value into this object
/// Get all properties for a specific frame (perfect for a UI to display the current state
/// of all properties at any time)
- std::string PropertiesJSON(int64_t requested_frame);
+ std::string PropertiesJSON(int64_t requested_frame) const override;
/// @brief Remove an effect from the clip
/// @param effect Remove an effect from the clip.
diff --git a/include/ClipBase.h b/include/ClipBase.h
index cf0d11fa..1f7f55c4 100644
--- a/include/ClipBase.h
+++ b/include/ClipBase.h
@@ -56,10 +56,10 @@ namespace openshot {
std::string previous_properties; ///< This string contains the previous JSON properties
/// Generate JSON for a property
- Json::Value add_property_json(std::string name, float value, std::string type, std::string memo, Keyframe* keyframe, float min_value, float max_value, bool readonly, int64_t requested_frame);
+ Json::Value add_property_json(std::string name, float value, std::string type, std::string memo, const Keyframe* keyframe, float min_value, float max_value, bool readonly, int64_t requested_frame) const;
/// Generate JSON choice for a property (dropdown properties)
- Json::Value add_property_choice_json(std::string name, int value, int selected_value);
+ Json::Value add_property_choice_json(std::string name, int value, int selected_value) const;
public:
@@ -73,12 +73,12 @@ namespace openshot {
bool operator>= ( ClipBase& a) { return (Position() >= a.Position()); }
/// Get basic properties
- std::string Id() { return id; } ///< Get the Id of this clip object
- float Position() { return position; } ///< Get position on timeline (in seconds)
- int Layer() { return layer; } ///< Get layer of clip on timeline (lower number is covered by higher numbers)
- float Start() { return start; } ///< Get start position (in seconds) of clip (trim start of video)
- float End() { return end; } ///< Get end position (in seconds) of clip (trim end of video)
- float Duration() { return end - start; } ///< Get the length of this clip (in seconds)
+ std::string Id() const { return id; } ///< Get the Id of this clip object
+ float Position() const { return position; } ///< Get position on timeline (in seconds)
+ int Layer() const { return layer; } ///< Get layer of clip on timeline (lower number is covered by higher numbers)
+ float Start() const { return start; } ///< Get start position (in seconds) of clip (trim start of video)
+ float End() const { return end; } ///< Get end position (in seconds) of clip (trim end of video)
+ float Duration() const { return end - start; } ///< Get the length of this clip (in seconds)
/// Set basic properties
void Id(std::string value) { id = value; } ///> Set the Id of this clip object
@@ -88,14 +88,14 @@ namespace openshot {
void End(float value) { end = value; } ///< Set end position (in seconds) of clip (trim end of video)
/// Get and Set JSON methods
- virtual std::string Json() = 0; ///< Generate JSON string of this object
- virtual void SetJson(std::string value) = 0; ///< Load JSON string into this object
- virtual Json::Value JsonValue() = 0; ///< Generate Json::JsonValue for this object
- virtual void SetJsonValue(Json::Value root) = 0; ///< Load Json::JsonValue into this object
+ virtual std::string Json() const = 0; ///< Generate JSON string of this object
+ virtual void SetJson(const std::string value) = 0; ///< Load JSON string into this object
+ virtual Json::Value JsonValue() const = 0; ///< Generate Json::Value for this object
+ virtual void SetJsonValue(const Json::Value root) = 0; ///< Load Json::Value into this object
/// Get all properties for a specific frame (perfect for a UI to display the current state
/// of all properties at any time)
- virtual std::string PropertiesJSON(int64_t requested_frame) = 0;
+ virtual std::string PropertiesJSON(int64_t requested_frame) const = 0;
virtual ~ClipBase() = default;
};
diff --git a/include/Color.h b/include/Color.h
index 47db29a7..2b4a6d77 100644
--- a/include/Color.h
+++ b/include/Color.h
@@ -69,10 +69,10 @@ namespace openshot {
static long GetDistance(long R1, long G1, long B1, long R2, long G2, long B2);
/// Get and Set JSON methods
- std::string Json(); ///< Generate JSON string of this object
- Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
- void SetJson(std::string value); ///< Load JSON string into this object
- void SetJsonValue(Json::Value root); ///< Load Json::JsonValue into this object
+ std::string Json() const; ///< Generate JSON string of this object
+ Json::Value JsonValue() const; ///< Generate Json::Value for this object
+ void SetJson(const std::string value); ///< Load JSON string into this object
+ void SetJsonValue(const Json::Value root); ///< Load Json::Value into this object
};
diff --git a/include/Coordinate.h b/include/Coordinate.h
index 5bfd893a..a4b9599d 100644
--- a/include/Coordinate.h
+++ b/include/Coordinate.h
@@ -66,10 +66,10 @@ namespace openshot {
Coordinate(double x, double y);
/// Get and Set JSON methods
- std::string Json(); ///< Generate JSON string of this object
- Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
- void SetJson(std::string value); ///< Load JSON string into this object
- void SetJsonValue(Json::Value root); ///< Load Json::JsonValue into this object
+ std::string Json() const; ///< Generate JSON string of this object
+ Json::Value JsonValue() const; ///< Generate Json::Value for this object
+ void SetJson(const std::string value); ///< Load JSON string into this object
+ void SetJsonValue(const Json::Value root); ///< Load Json::Value into this object
};
}
diff --git a/include/DecklinkReader.h b/include/DecklinkReader.h
index de077bdf..d846cca9 100644
--- a/include/DecklinkReader.h
+++ b/include/DecklinkReader.h
@@ -118,10 +118,10 @@ namespace openshot
std::string Name() { return "DecklinkReader"; };
/// Get and Set JSON methods
- std::string Json(); ///< Generate JSON string of this object
- void SetJson(std::string value); ///< Load JSON string into this object
- Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
- void SetJsonValue(Json::Value root); ///< Load Json::JsonValue into this object
+ std::string Json() const override; ///< Generate JSON string of this object
+ void SetJson(const std::string value); ///< Load JSON string into this object
+ Json::Value JsonValue() const; ///< Generate Json::Value for this object
+ void SetJsonValue(const Json::Value root); ///< Load Json::Value into this object
/// Open device and video stream - which is called by the constructor automatically
void Open();
diff --git a/include/DummyReader.h b/include/DummyReader.h
index 0b40f079..fd17bed1 100644
--- a/include/DummyReader.h
+++ b/include/DummyReader.h
@@ -87,10 +87,10 @@ namespace openshot
std::string Name() { return "DummyReader"; };
/// Get and Set JSON methods
- std::string Json(); ///< Generate JSON string of this object
- void SetJson(std::string value); ///< Load JSON string into this object
- Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
- void SetJsonValue(Json::Value root); ///< Load Json::JsonValue into this object
+ std::string Json() const override; ///< Generate JSON string of this object
+ void SetJson(const std::string value); ///< Load JSON string into this object
+ Json::Value JsonValue() const override; ///< Generate Json::Value for this object
+ void SetJsonValue(const Json::Value root); ///< Load Json::Value into this object
/// Open File - which is called by the constructor automatically
void Open();
diff --git a/include/EffectBase.h b/include/EffectBase.h
index f462526d..1f967a02 100644
--- a/include/EffectBase.h
+++ b/include/EffectBase.h
@@ -94,14 +94,14 @@ namespace openshot
void InitEffectInfo();
/// Get and Set JSON methods
- virtual std::string Json() = 0; ///< Generate JSON string of this object
- virtual void SetJson(std::string value) = 0; ///< Load JSON string into this object
- virtual Json::Value JsonValue() = 0; ///< Generate Json::JsonValue for this object
- virtual void SetJsonValue(Json::Value root) = 0; ///< Load Json::JsonValue into this object
- Json::Value JsonInfo(); ///< Generate JSON object of meta data / info
+ virtual std::string Json() const = 0; ///< Generate JSON string of this object
+ virtual void SetJson(const std::string value) = 0; ///< Load JSON string into this object
+ virtual Json::Value JsonValue() const = 0; ///< Generate Json::Value for this object
+ virtual void SetJsonValue(const Json::Value root) = 0; ///< Load Json::Value into this object
+ Json::Value JsonInfo() const; ///< Generate JSON object of meta data / info
/// Get the order that this effect should be executed.
- int Order() { return order; }
+ int Order() const { return order; }
/// Set the order that this effect should be executed.
void Order(int new_order) { order = new_order; }
diff --git a/include/EffectInfo.h b/include/EffectInfo.h
index 1015b0da..0e64327b 100644
--- a/include/EffectInfo.h
+++ b/include/EffectInfo.h
@@ -51,7 +51,7 @@ namespace openshot
/// JSON methods
static std::string Json(); ///< Generate JSON string of this object
- static Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
+ static Json::Value JsonValue(); ///< Generate Json::Value for this object
};
diff --git a/include/FFmpegReader.h b/include/FFmpegReader.h
index cc782cd5..e9cee579 100644
--- a/include/FFmpegReader.h
+++ b/include/FFmpegReader.h
@@ -76,11 +76,11 @@ namespace openshot {
*
* @code
* // Create a reader for a video
- * FFmpegReader r("MyAwesomeVideo.webm");
+ * openshot::FFmpegReader r("MyAwesomeVideo.webm");
* r.Open(); // Open the reader
*
* // Get frame number 1 from the video
- * std::shared_ptr f = r.GetFrame(1);
+ * std::shared_ptr f = r.GetFrame(1);
*
* // Now that we have an openshot::Frame object, lets have some fun!
* f->Display(); // Display the frame on the screen
@@ -264,10 +264,10 @@ namespace openshot {
std::string Name() { return "FFmpegReader"; };
/// Get and Set JSON methods
- std::string Json(); ///< Generate JSON string of this object
- void SetJson(std::string value); ///< Load JSON string into this object
- Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
- void SetJsonValue(Json::Value root); ///< Load Json::JsonValue into this object
+ std::string Json() const override; ///< Generate JSON string of this object
+ void SetJson(const std::string value); ///< Load JSON string into this object
+ Json::Value JsonValue() const override; ///< Generate Json::Value for this object
+ void SetJsonValue(const Json::Value root); ///< Load Json::Value into this object
/// Open File - which is called by the constructor automatically
void Open();
diff --git a/include/FFmpegWriter.h b/include/FFmpegWriter.h
index dc3a2cf7..1dfb21a9 100644
--- a/include/FFmpegWriter.h
+++ b/include/FFmpegWriter.h
@@ -75,15 +75,19 @@ namespace openshot {
* @code SIMPLE EXAMPLE
*
* // Create a reader for a video
- * FFmpegReader r("MyAwesomeVideo.webm");
- * r.Open(); // Open thetarget_ reader
+ * openshot::FFmpegReader r("MyAwesomeVideo.webm");
+ * r.Open(); // Open the target reader
*
* // Create a writer (which will create a WebM video)
- * FFmpegWriter w("/home/jonathan/NewVideo.webm");
+ * openshot::FFmpegWriter w("/home/jonathan/NewVideo.webm");
*
* // Set options
- * w.SetAudioOptions(true, "libvorbis", 44100, 2, ChannelLayout::LAYOUT_STEREO, 128000); // Sample Rate: 44100, Channels: 2, Bitrate: 128000
- * w.SetVideoOptions(true, "libvpx", openshot::Fraction(24,1), 720, 480, openshot::Fraction(1,1), false, false, 300000); // FPS: 24, Size: 720x480, Pixel Ratio: 1/1, Bitrate: 300000
+ *
+ * // Sample Rate: 44100, Channels: 2, Bitrate: 128000
+ * w.SetAudioOptions(true, "libvorbis", 44100, 2, openshot::ChannelLayout::LAYOUT_STEREO, 128000);
+ *
+ * // FPS: 24, Size: 720x480, Pixel Ratio: 1/1, Bitrate: 300000
+ * w.SetVideoOptions(true, "libvpx", openshot::Fraction(24,1), 720, 480, openshot::Fraction(1,1), false, false, 300000);
*
* // Open the writer
* w.Open();
@@ -102,15 +106,19 @@ namespace openshot {
* @code ADVANCED WRITER EXAMPLE
*
* // Create a reader for a video
- * FFmpegReader r("MyAwesomeVideo.webm");
+ * openshot::FFmpegReader r("MyAwesomeVideo.webm");
* r.Open(); // Open the reader
*
* // Create a writer (which will create a WebM video)
- * FFmpegWriter w("/home/jonathan/NewVideo.webm");
+ * openshot::FFmpegWriter w("/home/jonathan/NewVideo.webm");
*
* // Set options
- * w.SetAudioOptions(true, "libvorbis", 44100, 2, ChannelLayout::LAYOUT_STEREO, 128000); // Sample Rate: 44100, Channels: 2, Bitrate: 128000
- * w.SetVideoOptions(true, "libvpx", openshot::Fraction(24,1), 720, 480, openshot::Fraction(1,1), false, false, 300000); // FPS: 24, Size: 720x480, Pixel Ratio: 1/1, Bitrate: 300000
+ *
+ * // Sample Rate: 44100, Channels: 2, Bitrate: 128000
+ * w.SetAudioOptions(true, "libvorbis", 44100, 2, openshot::ChannelLayout::LAYOUT_STEREO, 128000);
+ *
+ * // FPS: 24, Size: 720x480, Pixel Ratio: 1/1, Bitrate: 300000
+ * w.SetVideoOptions(true, "libvpx", openshot::Fraction(24,1), 720, 480, openshot::Fraction(1,1), false, false, 300000);
*
* // Prepare Streams (Optional method that must be called before any SetOption calls)
* w.PrepareStreams();
@@ -285,8 +293,21 @@ namespace openshot {
/// @param channels The number of audio channels needed in this file
/// @param channel_layout The 'layout' of audio channels (i.e. mono, stereo, surround, etc...)
/// @param bit_rate The audio bit rate used during encoding
+ ///
+ /// \note This is an overloaded function.
void SetAudioOptions(bool has_audio, std::string codec, int sample_rate, int channels, openshot::ChannelLayout channel_layout, int bit_rate);
+ /// @brief Set audio export options.
+ ///
+ /// Enables the stream and configures a default 2-channel stereo layout.
+ ///
+ /// @param codec The codec used to encode the audio for this file
+ /// @param sample_rate The number of audio samples needed in this file
+ /// @param bit_rate The audio bit rate used during encoding
+ ///
+ /// \note This is an overloaded function.
+ void SetAudioOptions(std::string codec, int sample_rate, int bit_rate);
+
/// @brief Set the cache size
/// @param new_size The number of frames to queue before writing to the file
void SetCacheSize(int new_size) { cache_size = new_size; };
@@ -301,10 +322,27 @@ namespace openshot {
/// @param interlaced Does this video need to be interlaced?
/// @param top_field_first Which frame should be used as the top field?
/// @param bit_rate The video bit rate used during encoding
+ ///
+ /// \note This is an overloaded function.
void SetVideoOptions(bool has_video, std::string codec, openshot::Fraction fps, int width, int height, openshot::Fraction pixel_ratio, bool interlaced, bool top_field_first, int bit_rate);
+ /// @brief Set video export options.
+ ///
+ /// Enables the stream and configures non-interlaced video with a 1:1 pixel aspect ratio.
+ ///
+ /// @param codec The codec used to encode the images in this video
+ /// @param width The width in pixels of this video
+ /// @param height The height in pixels of this video
+ /// @param fps The number of frames per second
+ /// @param bit_rate The video bit rate used during encoding
+ ///
+ /// \note This is an overloaded function.
+ /// \warning Observe the argument order, which is consistent with the openshot::Timeline constructor, but differs from the other signature.
+ void SetVideoOptions(std::string codec, int width, int height, openshot::Fraction fps, int bit_rate);
+
/// @brief Set custom options (some codecs accept additional params). This must be called after the
/// PrepareStreams() method, otherwise the streams have not been initialized yet.
+ ///
/// @param stream The stream (openshot::StreamType) this option should apply to
/// @param name The name of the option you want to set (i.e. qmin, qmax, etc...)
/// @param value The new value of this option
@@ -316,12 +354,16 @@ namespace openshot {
/// @brief Add a frame to the stack waiting to be encoded.
/// @param frame The openshot::Frame object to write to this image
+ ///
+ /// \note This is an overloaded function.
void WriteFrame(std::shared_ptr frame);
/// @brief Write a block of frames from a reader
/// @param reader A openshot::ReaderBase object which will provide frames to be written
/// @param start The starting frame number of the reader
/// @param length The number of frames to write
+ ///
+ /// \note This is an overloaded function.
void WriteFrame(openshot::ReaderBase *reader, int64_t start, int64_t length);
/// @brief Write the file trailer (after all frames are written). This is called automatically
diff --git a/include/FrameMapper.h b/include/FrameMapper.h
index f2b030a3..8be4ec1b 100644
--- a/include/FrameMapper.h
+++ b/include/FrameMapper.h
@@ -199,10 +199,10 @@ namespace openshot
std::string Name() { return "FrameMapper"; };
/// Get and Set JSON methods
- std::string Json(); ///< Generate JSON string of this object
- void SetJson(std::string value); ///< Load JSON string into this object
- Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
- void SetJsonValue(Json::Value root); ///< Load Json::JsonValue into this object
+ std::string Json() const override; ///< Generate JSON string of this object
+ void SetJson(const std::string value); ///< Load JSON string into this object
+ Json::Value JsonValue() const override; ///< Generate Json::Value for this object
+ void SetJsonValue(const Json::Value root); ///< Load Json::Value into this object
/// Open the internal reader
void Open();
diff --git a/include/ImageReader.h b/include/ImageReader.h
index 8da450eb..bb19dd3d 100644
--- a/include/ImageReader.h
+++ b/include/ImageReader.h
@@ -106,10 +106,10 @@ namespace openshot
std::string Name() { return "ImageReader"; };
/// Get and Set JSON methods
- std::string Json(); ///< Generate JSON string of this object
- void SetJson(std::string value); ///< Load JSON string into this object
- Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
- void SetJsonValue(Json::Value root); ///< Load Json::JsonValue into this object
+ std::string Json() const override; ///< Generate JSON string of this object
+ void SetJson(const std::string value); ///< Load JSON string into this object
+ Json::Value JsonValue() const; ///< Generate Json::Value for this object
+ void SetJsonValue(const Json::Value root); ///< Load Json::Value into this object
/// Open File - which is called by the constructor automatically
void Open();
diff --git a/include/Json.h b/include/Json.h
index 3a10ab74..0bdf6e2c 100644
--- a/include/Json.h
+++ b/include/Json.h
@@ -31,6 +31,12 @@
#ifndef OPENSHOT_JSON_H
#define OPENSHOT_JSON_H
+#include
#include "json/json.h"
+#include "Exceptions.h"
+
+namespace openshot {
+ const Json::Value stringToJson(const std::string value);
+}
#endif
diff --git a/include/KeyFrame.h b/include/KeyFrame.h
index 6ed39553..ee58da8f 100644
--- a/include/KeyFrame.h
+++ b/include/KeyFrame.h
@@ -133,9 +133,9 @@ namespace openshot {
/// Get and Set JSON methods
std::string Json() const; ///< Generate JSON string of this object
- Json::Value JsonValue() const; ///< Generate Json::JsonValue for this object
- void SetJson(std::string value); ///< Load JSON string into this object
- void SetJsonValue(Json::Value root); ///< Load Json::JsonValue into this object
+ Json::Value JsonValue() const; ///< Generate Json::Value for this object
+ void SetJson(const std::string value); ///< Load JSON string into this object
+ void SetJsonValue(const Json::Value root); ///< Load Json::Value into this object
/// Remove a point by matching a coordinate
void RemovePoint(Point p);
diff --git a/include/Point.h b/include/Point.h
index 3fdcd917..4941c558 100644
--- a/include/Point.h
+++ b/include/Point.h
@@ -119,10 +119,10 @@ namespace openshot
void Initialize_RightHandle(float x, float y);
/// Get and Set JSON methods
- std::string Json(); ///< Generate JSON string of this object
- Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
- void SetJson(std::string value); ///< Load JSON string into this object
- void SetJsonValue(Json::Value root); ///< Load Json::JsonValue into this object
+ std::string Json() const; ///< Generate JSON string of this object
+ Json::Value JsonValue() const; ///< Generate Json::Value for this object
+ void SetJson(const std::string value); ///< Load JSON string into this object
+ void SetJsonValue(const Json::Value root); ///< Load Json::Value into this object
};
diff --git a/include/Profiles.h b/include/Profiles.h
index bc5fe3e0..3b5ebd0d 100644
--- a/include/Profiles.h
+++ b/include/Profiles.h
@@ -90,10 +90,10 @@ namespace openshot
Profile(std::string path);
/// Get and Set JSON methods
- std::string Json(); ///< Generate JSON string of this object
- Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
- void SetJson(std::string value); ///< Load JSON string into this object
- void SetJsonValue(Json::Value root); ///< Load Json::JsonValue into this object
+ std::string Json() const; ///< Generate JSON string of this object
+ Json::Value JsonValue() const; ///< Generate Json::Value for this object
+ void SetJson(const std::string value); ///< Load JSON string into this object
+ void SetJsonValue(const Json::Value root); ///< Load Json::Value into this object
};
}
diff --git a/include/QtHtmlReader.h b/include/QtHtmlReader.h
index c102038c..d7052d49 100644
--- a/include/QtHtmlReader.h
+++ b/include/QtHtmlReader.h
@@ -131,10 +131,10 @@ namespace openshot
std::string Name() { return "QtHtmlReader"; };
/// Get and Set JSON methods
- std::string Json(); ///< Generate JSON string of this object
- void SetJson(std::string value); ///< Load JSON string into this object
- Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
- void SetJsonValue(Json::Value root); ///< Load Json::JsonValue into this object
+ std::string Json() const override; ///< Generate JSON string of this object
+ void SetJson(const std::string value); ///< Load JSON string into this object
+ Json::Value JsonValue() const override; ///< Generate Json::Value for this object
+ void SetJsonValue(const Json::Value root); ///< Load Json::Value into this object
/// Open Reader - which is called by the constructor automatically
void Open();
diff --git a/include/QtImageReader.h b/include/QtImageReader.h
index 3153e7a3..3e456e39 100644
--- a/include/QtImageReader.h
+++ b/include/QtImageReader.h
@@ -104,10 +104,10 @@ namespace openshot
std::string Name() { return "QtImageReader"; };
/// Get and Set JSON methods
- std::string Json(); ///< Generate JSON string of this object
- void SetJson(std::string value); ///< Load JSON string into this object
- Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
- void SetJsonValue(Json::Value root); ///< Load Json::JsonValue into this object
+ std::string Json() const override; ///< Generate JSON string of this object
+ void SetJson(const std::string value); ///< Load JSON string into this object
+ Json::Value JsonValue() const override; ///< Generate Json::Value for this object
+ void SetJsonValue(const Json::Value root); ///< Load Json::Value into this object
/// Open File - which is called by the constructor automatically
void Open();
diff --git a/include/QtTextReader.h b/include/QtTextReader.h
index e6a8c84b..d226e920 100644
--- a/include/QtTextReader.h
+++ b/include/QtTextReader.h
@@ -142,10 +142,10 @@ namespace openshot
std::string Name() { return "QtTextReader"; };
/// Get and Set JSON methods
- std::string Json(); ///< Generate JSON string of this object
- void SetJson(std::string value); ///< Load JSON string into this object
- Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
- void SetJsonValue(Json::Value root); ///< Load Json::JsonValue into this object
+ std::string Json() const override; ///< Generate JSON string of this object
+ void SetJson(const std::string value); ///< Load JSON string into this object
+ Json::Value JsonValue() const override; ///< Generate Json::Value for this object
+ void SetJsonValue(const Json::Value root); ///< Load Json::Value into this object
/// Open Reader - which is called by the constructor automatically
void Open();
diff --git a/include/ReaderBase.h b/include/ReaderBase.h
index 26769338..dfb9873d 100644
--- a/include/ReaderBase.h
+++ b/include/ReaderBase.h
@@ -140,10 +140,10 @@ namespace openshot
virtual std::string Name() = 0;
/// Get and Set JSON methods
- virtual std::string Json() = 0; ///< Generate JSON string of this object
- virtual void SetJson(std::string value) = 0; ///< Load JSON string into this object
- virtual Json::Value JsonValue() = 0; ///< Generate Json::JsonValue for this object
- virtual void SetJsonValue(Json::Value root) = 0; ///< Load Json::JsonValue into this object
+ virtual std::string Json() const = 0; ///< Generate JSON string of this object
+ virtual void SetJson(const std::string value) = 0; ///< Load JSON string into this object
+ virtual Json::Value JsonValue() const = 0; ///< Generate Json::Value for this object
+ virtual void SetJsonValue(const Json::Value root) = 0; ///< Load Json::Value into this object
/// Open the reader (and start consuming resources, such as images or video files)
virtual void Open() = 0;
diff --git a/include/TextReader.h b/include/TextReader.h
index 57f36d0b..b6dbf5cd 100644
--- a/include/TextReader.h
+++ b/include/TextReader.h
@@ -142,10 +142,10 @@ namespace openshot
std::string Name() { return "TextReader"; };
/// Get and Set JSON methods
- std::string Json(); ///< Generate JSON string of this object
- void SetJson(std::string value); ///< Load JSON string into this object
- Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
- void SetJsonValue(Json::Value root); ///< Load Json::JsonValue into this object
+ std::string Json() const override; ///< Generate JSON string of this object
+ void SetJson(const std::string value); ///< Load JSON string into this object
+ Json::Value JsonValue() const override; ///< Generate Json::Value for this object
+ void SetJsonValue(const Json::Value root); ///< Load Json::Value into this object
/// Open Reader - which is called by the constructor automatically
void Open();
diff --git a/include/Timeline.h b/include/Timeline.h
index 2ff03d91..70c6e1a8 100644
--- a/include/Timeline.h
+++ b/include/Timeline.h
@@ -268,10 +268,10 @@ namespace openshot {
std::string Name() { return "Timeline"; };
/// Get and Set JSON methods
- std::string Json(); ///< Generate JSON string of this object
- void SetJson(std::string value); ///< Load JSON string into this object
- Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
- void SetJsonValue(Json::Value root); ///< Load Json::JsonValue into this object
+ std::string Json() const override; ///< Generate JSON string of this object
+ void SetJson(const std::string value); ///< Load JSON string into this object
+ Json::Value JsonValue() const override; ///< Generate Json::Value for this object
+ void SetJsonValue(const Json::Value root); ///< Load Json::Value into this object
/// Set Max Image Size (used for performance optimization). Convenience function for setting
/// Settings::Instance()->MAX_WIDTH and Settings::Instance()->MAX_HEIGHT.
diff --git a/include/WriterBase.h b/include/WriterBase.h
index 503be6bf..1b55c72b 100644
--- a/include/WriterBase.h
+++ b/include/WriterBase.h
@@ -107,10 +107,10 @@ namespace openshot
virtual void WriteFrame(openshot::ReaderBase* reader, int64_t start, int64_t length) = 0;
/// Get and Set JSON methods
- std::string Json(); ///< Generate JSON string of this object
- Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
- void SetJson(std::string value); ///< Load JSON string into this object
- void SetJsonValue(Json::Value root); ///< Load Json::JsonValue into this object
+ std::string Json() const; ///< Generate JSON string of this object
+ Json::Value JsonValue() const; ///< Generate Json::Value for this object
+ void SetJson(const std::string value); ///< Load JSON string into this object
+ void SetJsonValue(const Json::Value root); ///< Load Json::Value into this object
/// Display file information in the standard output stream (stdout)
void DisplayInfo();
diff --git a/include/effects/Bars.h b/include/effects/Bars.h
index 43a77a2f..fa9df6f8 100644
--- a/include/effects/Bars.h
+++ b/include/effects/Bars.h
@@ -89,14 +89,14 @@ namespace openshot
std::shared_ptr GetFrame(std::shared_ptr frame, int64_t frame_number);
/// Get and Set JSON methods
- std::string Json(); ///< Generate JSON string of this object
- void SetJson(std::string value); ///< Load JSON string into this object
- Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
- void SetJsonValue(Json::Value root); ///< Load Json::JsonValue into this object
+ std::string Json() const override; ///< Generate JSON string of this object
+ void SetJson(const std::string value); ///< Load JSON string into this object
+ Json::Value JsonValue() const override; ///< Generate Json::Value for this object
+ void SetJsonValue(const Json::Value root); ///< Load Json::Value into this object
/// Get all properties for a specific frame (perfect for a UI to display the current state
/// of all properties at any time)
- std::string PropertiesJSON(int64_t requested_frame);
+ std::string PropertiesJSON(int64_t requested_frame) const override;
};
}
diff --git a/include/effects/Blur.h b/include/effects/Blur.h
index 167e9303..c254b8cd 100644
--- a/include/effects/Blur.h
+++ b/include/effects/Blur.h
@@ -67,7 +67,6 @@ namespace openshot
void init_effect_details();
/// Internal blur methods (inspired and credited to http://blog.ivank.net/fastest-gaussian-blur.html)
- int* initBoxes(float sigma, int n);
void boxBlurH(unsigned char *scl, unsigned char *tcl, int w, int h, int r);
void boxBlurT(unsigned char *scl, unsigned char *tcl, int w, int h, int r);
@@ -102,14 +101,14 @@ namespace openshot
std::shared_ptr GetFrame(std::shared_ptr frame, int64_t frame_number);
/// Get and Set JSON methods
- std::string Json(); ///< Generate JSON string of this object
- void SetJson(std::string value); ///< Load JSON string into this object
- Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
- void SetJsonValue(Json::Value root); ///< Load Json::JsonValue into this object
+ std::string Json() const override; ///< Generate JSON string of this object
+ void SetJson(const std::string value); ///< Load JSON string into this object
+ Json::Value JsonValue() const override; ///< Generate Json::Value for this object
+ void SetJsonValue(const Json::Value root); ///< Load Json::Value into this object
/// Get all properties for a specific frame (perfect for a UI to display the current state
/// of all properties at any time)
- std::string PropertiesJSON(int64_t requested_frame);
+ std::string PropertiesJSON(int64_t requested_frame) const override;
};
}
diff --git a/include/effects/Brightness.h b/include/effects/Brightness.h
index 2a6ab912..69f2cf34 100644
--- a/include/effects/Brightness.h
+++ b/include/effects/Brightness.h
@@ -89,14 +89,14 @@ namespace openshot
std::shared_ptr GetFrame(std::shared_ptr frame, int64_t frame_number);
/// Get and Set JSON methods
- std::string Json(); ///< Generate JSON string of this object
- void SetJson(std::string value); ///< Load JSON string into this object
- Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
- void SetJsonValue(Json::Value root); ///< Load Json::JsonValue into this object
+ std::string Json() const override; ///< Generate JSON string of this object
+ void SetJson(const std::string value); ///< Load JSON string into this object
+ Json::Value JsonValue() const override; ///< Generate Json::Value for this object
+ void SetJsonValue(const Json::Value root); ///< Load Json::Value into this object
/// Get all properties for a specific frame (perfect for a UI to display the current state
/// of all properties at any time)
- std::string PropertiesJSON(int64_t requested_frame);
+ std::string PropertiesJSON(int64_t requested_frame) const override;
};
}
diff --git a/include/effects/ChromaKey.h b/include/effects/ChromaKey.h
index d0fa31d8..dbc81e9c 100644
--- a/include/effects/ChromaKey.h
+++ b/include/effects/ChromaKey.h
@@ -86,13 +86,13 @@ namespace openshot
std::shared_ptr GetFrame(std::shared_ptr frame, int64_t frame_number);
/// Get and Set JSON methods
- std::string Json(); ///< Generate JSON string of this object
- void SetJson(std::string value); ///< Load JSON string into this object
- Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
- void SetJsonValue(Json::Value root); ///< Load Json::JsonValue into this object
+ std::string Json() const override; ///< Generate JSON string of this object
+ void SetJson(const std::string value); ///< Load JSON string into this object
+ Json::Value JsonValue() const override; ///< Generate Json::Value for this object
+ void SetJsonValue(const Json::Value root); ///< Load Json::Value into this object
// Get all properties for a specific frame
- std::string PropertiesJSON(int64_t requested_frame);
+ std::string PropertiesJSON(int64_t requested_frame) const override;
};
}
diff --git a/include/effects/ColorShift.h b/include/effects/ColorShift.h
index e9c11d68..ada2acd6 100644
--- a/include/effects/ColorShift.h
+++ b/include/effects/ColorShift.h
@@ -93,14 +93,14 @@ namespace openshot
std::shared_ptr GetFrame(std::shared_ptr frame, int64_t frame_number);
/// Get and Set JSON methods
- std::string Json(); ///< Generate JSON string of this object
- void SetJson(std::string value); ///< Load JSON string into this object
- Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
- void SetJsonValue(Json::Value root); ///< Load Json::JsonValue into this object
+ std::string Json() const override; ///< Generate JSON string of this object
+ void SetJson(const std::string value); ///< Load JSON string into this object
+ Json::Value JsonValue() const override; ///< Generate Json::Value for this object
+ void SetJsonValue(const Json::Value root); ///< Load Json::Value into this object
/// Get all properties for a specific frame (perfect for a UI to display the current state
/// of all properties at any time)
- std::string PropertiesJSON(int64_t requested_frame);
+ std::string PropertiesJSON(int64_t requested_frame) const override;
};
}
diff --git a/include/effects/Crop.h b/include/effects/Crop.h
index 34cea89f..2d4a2b2e 100644
--- a/include/effects/Crop.h
+++ b/include/effects/Crop.h
@@ -88,14 +88,14 @@ namespace openshot
std::shared_ptr GetFrame(std::shared_ptr frame, int64_t frame_number);
/// Get and Set JSON methods
- std::string Json(); ///< Generate JSON string of this object
- void SetJson(std::string value); ///< Load JSON string into this object
- Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
- void SetJsonValue(Json::Value root); ///< Load Json::JsonValue into this object
+ std::string Json() const override; ///< Generate JSON string of this object
+ void SetJson(const std::string value); ///< Load JSON string into this object
+ Json::Value JsonValue() const override; ///< Generate Json::Value for this object
+ void SetJsonValue(const Json::Value root); ///< Load Json::Value into this object
/// Get all properties for a specific frame (perfect for a UI to display the current state
/// of all properties at any time)
- std::string PropertiesJSON(int64_t requested_frame);
+ std::string PropertiesJSON(int64_t requested_frame) const override;
};
}
diff --git a/include/effects/Deinterlace.h b/include/effects/Deinterlace.h
index b411b023..eff7b2fe 100644
--- a/include/effects/Deinterlace.h
+++ b/include/effects/Deinterlace.h
@@ -82,13 +82,13 @@ namespace openshot
std::shared_ptr GetFrame(std::shared_ptr frame, int64_t frame_number);
/// Get and Set JSON methods
- std::string Json(); ///< Generate JSON string of this object
- void SetJson(std::string value); ///< Load JSON string into this object
- Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
- void SetJsonValue(Json::Value root); ///< Load Json::JsonValue into this object
+ std::string Json() const override; ///< Generate JSON string of this object
+ void SetJson(const std::string value); ///< Load JSON string into this object
+ Json::Value JsonValue() const override; ///< Generate Json::Value for this object
+ void SetJsonValue(const Json::Value root); ///< Load Json::Value into this object
// Get all properties for a specific frame
- std::string PropertiesJSON(int64_t requested_frame);
+ std::string PropertiesJSON(int64_t requested_frame) const override;
};
}
diff --git a/include/effects/Hue.h b/include/effects/Hue.h
index 4670b6bf..9d86d5c2 100644
--- a/include/effects/Hue.h
+++ b/include/effects/Hue.h
@@ -79,14 +79,14 @@ namespace openshot
std::shared_ptr GetFrame(std::shared_ptr frame, int64_t frame_number);
/// Get and Set JSON methods
- std::string Json(); ///< Generate JSON string of this object
- void SetJson(std::string value); ///< Load JSON string into this object
- Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
- void SetJsonValue(Json::Value root); ///< Load Json::JsonValue into this object
+ std::string Json() const override; ///< Generate JSON string of this object
+ void SetJson(const std::string value); ///< Load JSON string into this object
+ Json::Value JsonValue() const override; ///< Generate Json::Value for this object
+ void SetJsonValue(const Json::Value root); ///< Load Json::Value into this object
/// Get all properties for a specific frame (perfect for a UI to display the current state
/// of all properties at any time)
- std::string PropertiesJSON(int64_t requested_frame);
+ std::string PropertiesJSON(int64_t requested_frame) const override;
};
}
diff --git a/include/effects/Mask.h b/include/effects/Mask.h
index dba3b2d8..390ffa36 100644
--- a/include/effects/Mask.h
+++ b/include/effects/Mask.h
@@ -101,14 +101,14 @@ namespace openshot
std::shared_ptr GetFrame(std::shared_ptr frame, int64_t frame_number);
/// Get and Set JSON methods
- std::string Json(); ///< Generate JSON string of this object
- void SetJson(std::string value); ///< Load JSON string into this object
- Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
- void SetJsonValue(Json::Value root); ///< Load Json::JsonValue into this object
+ std::string Json() const override; ///< Generate JSON string of this object
+ void SetJson(const std::string value); ///< Load JSON string into this object
+ Json::Value JsonValue() const override; ///< Generate Json::Value for this object
+ void SetJsonValue(const Json::Value root); ///< Load Json::Value into this object
/// Get all properties for a specific frame (perfect for a UI to display the current state
/// of all properties at any time)
- std::string PropertiesJSON(int64_t requested_frame);
+ std::string PropertiesJSON(int64_t requested_frame) const override;
/// Get the reader object of the mask grayscale image
ReaderBase* Reader() { return reader; };
diff --git a/include/effects/Negate.h b/include/effects/Negate.h
index 3cbc7988..6206a660 100644
--- a/include/effects/Negate.h
+++ b/include/effects/Negate.h
@@ -70,13 +70,13 @@ namespace openshot
std::shared_ptr GetFrame(std::shared_ptr frame, int64_t frame_number);
/// Get and Set JSON methods
- std::string Json(); ///< Generate JSON string of this object
- void SetJson(std::string value); ///< Load JSON string into this object
- Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
- void SetJsonValue(Json::Value root); ///< Load Json::JsonValue into this object
+ std::string Json() const override; ///< Generate JSON string of this object
+ void SetJson(const std::string value); ///< Load JSON string into this object
+ Json::Value JsonValue() const override; ///< Generate Json::Value for this object
+ void SetJsonValue(const Json::Value root); ///< Load Json::Value into this object
// Get all properties for a specific frame
- std::string PropertiesJSON(int64_t requested_frame);
+ std::string PropertiesJSON(int64_t requested_frame) const override;
};
}
diff --git a/include/effects/Pixelate.h b/include/effects/Pixelate.h
index 3146d456..9348ce86 100644
--- a/include/effects/Pixelate.h
+++ b/include/effects/Pixelate.h
@@ -88,14 +88,14 @@ namespace openshot
std::shared_ptr GetFrame(std::shared_ptr frame, int64_t frame_number);
/// Get and Set JSON methods
- std::string Json(); ///< Generate JSON string of this object
- void SetJson(std::string value); ///< Load JSON string into this object
- Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
- void SetJsonValue(Json::Value root); ///< Load Json::JsonValue into this object
+ std::string Json() const override; ///< Generate JSON string of this object
+ void SetJson(const std::string value); ///< Load JSON string into this object
+ Json::Value JsonValue() const override; ///< Generate Json::Value for this object
+ void SetJsonValue(const Json::Value root); ///< Load Json::Value into this object
/// Get all properties for a specific frame (perfect for a UI to display the current state
/// of all properties at any time)
- std::string PropertiesJSON(int64_t requested_frame);
+ std::string PropertiesJSON(int64_t requested_frame) const override;
};
}
diff --git a/include/effects/Saturation.h b/include/effects/Saturation.h
index de3cc771..e8d0d940 100644
--- a/include/effects/Saturation.h
+++ b/include/effects/Saturation.h
@@ -86,14 +86,14 @@ namespace openshot
std::shared_ptr GetFrame(std::shared_ptr frame, int64_t frame_number);
/// Get and Set JSON methods
- std::string Json(); ///< Generate JSON string of this object
- void SetJson(std::string value); ///< Load JSON string into this object
- Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
- void SetJsonValue(Json::Value root); ///< Load Json::JsonValue into this object
+ std::string Json() const override; ///< Generate JSON string of this object
+ void SetJson(const std::string value); ///< Load JSON string into this object
+ Json::Value JsonValue() const override; ///< Generate Json::Value for this object
+ void SetJsonValue(const Json::Value root); ///< Load Json::Value into this object
/// Get all properties for a specific frame (perfect for a UI to display the current state
/// of all properties at any time)
- std::string PropertiesJSON(int64_t requested_frame);
+ std::string PropertiesJSON(int64_t requested_frame) const override;
};
}
diff --git a/include/effects/Shift.h b/include/effects/Shift.h
index 243e442e..765da755 100644
--- a/include/effects/Shift.h
+++ b/include/effects/Shift.h
@@ -82,14 +82,14 @@ namespace openshot
std::shared_ptr GetFrame(std::shared_ptr frame, int64_t frame_number);
/// Get and Set JSON methods
- std::string Json(); ///< Generate JSON string of this object
- void SetJson(std::string value); ///< Load JSON string into this object
- Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
- void SetJsonValue(Json::Value root); ///< Load Json::JsonValue into this object
+ std::string Json() const override; ///< Generate JSON string of this object
+ void SetJson(const std::string value); ///< Load JSON string into this object
+ Json::Value JsonValue() const override; ///< Generate Json::Value for this object
+ void SetJsonValue(const Json::Value root); ///< Load Json::Value into this object
/// Get all properties for a specific frame (perfect for a UI to display the current state
/// of all properties at any time)
- std::string PropertiesJSON(int64_t requested_frame);
+ std::string PropertiesJSON(int64_t requested_frame) const override;
};
}
diff --git a/include/effects/Wave.h b/include/effects/Wave.h
index 62b08d1f..ad516bde 100644
--- a/include/effects/Wave.h
+++ b/include/effects/Wave.h
@@ -88,14 +88,14 @@ namespace openshot
std::shared_ptr GetFrame(std::shared_ptr frame, int64_t frame_number);
/// Get and Set JSON methods
- std::string Json(); ///< Generate JSON string of this object
- void SetJson(std::string value); ///< Load JSON string into this object
- Json::Value JsonValue(); ///< Generate Json::JsonValue for this object
- void SetJsonValue(Json::Value root); ///< Load Json::JsonValue into this object
+ std::string Json() const override; ///< Generate JSON string of this object
+ void SetJson(const std::string value); ///< Load JSON string into this object
+ Json::Value JsonValue() const override; ///< Generate Json::Value for this object
+ void SetJsonValue(const Json::Value root); ///< Load Json::Value into this object
/// Get all properties for a specific frame (perfect for a UI to display the current state
/// of all properties at any time)
- std::string PropertiesJSON(int64_t requested_frame);
+ std::string PropertiesJSON(int64_t requested_frame) const override;
};
}
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 619d78ed..a544982e 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -27,8 +27,6 @@
# Collect and display summary of options/dependencies
include(FeatureSummary)
-# Automatically process Qt classes with meta-object compiler
-set(CMAKE_AUTOMOC True)
################ WINDOWS ##################
# Set some compiler options for Windows
@@ -79,7 +77,7 @@ ENDIF (ImageMagick_FOUND)
################# LIBOPENSHOT-AUDIO ###################
# Find JUCE-based openshot Audio libraries
-FIND_PACKAGE(OpenShotAudio 0.1.9 REQUIRED)
+FIND_PACKAGE(OpenShotAudio 0.2.0 REQUIRED)
# Include Juce headers (needed for compile)
include_directories(${LIBOPENSHOT_AUDIO_INCLUDE_DIRS})
@@ -150,6 +148,7 @@ set(OPENSHOT_SOURCES
Fraction.cpp
Frame.cpp
FrameMapper.cpp
+ Json.cpp
KeyFrame.cpp
OpenShotVersion.cpp
ZmqLogger.cpp
@@ -190,9 +189,8 @@ set(QT_PLAYER_SOURCES
Qt/VideoRenderer.cpp
Qt/VideoRenderWidget.cpp)
-
-# Get list of headers
-file(GLOB_RECURSE headers ${CMAKE_SOURCE_DIR}/include/*.h)
+# Get list of MOC'able headers
+file(GLOB_RECURSE OPENSHOT_QT_HEADERS ${CMAKE_SOURCE_DIR}/include/Qt/*.h)
# Disable RPATH
SET(CMAKE_MACOSX_RPATH 0)
@@ -201,19 +199,20 @@ SET(CMAKE_MACOSX_RPATH 0)
# Create shared openshot library
add_library(openshot SHARED)
-target_sources(openshot
- PRIVATE
- ${OPENSHOT_SOURCES} ${EFFECTS_SOURCES} ${QT_PLAYER_SOURCES}
- PUBLIC
- ${headers})
+target_sources(openshot PRIVATE
+ ${OPENSHOT_SOURCES}
+ ${EFFECTS_SOURCES}
+ ${QT_PLAYER_SOURCES}
+ ${OPENSHOT_QT_HEADERS}
+ )
# Set SONAME and other library properties
-set_target_properties(openshot
- PROPERTIES
- VERSION ${PROJECT_VERSION}
- SOVERSION ${PROJECT_SO_VERSION}
- INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/lib"
- )
+set_target_properties(openshot PROPERTIES
+ AUTOMOC ON
+ VERSION ${PROJECT_VERSION}
+ SOVERSION ${PROJECT_SO_VERSION}
+ INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/lib"
+ )
# Add optional ImageMagic-dependent sources
if(ImageMagick_FOUND)
diff --git a/src/CacheBase.cpp b/src/CacheBase.cpp
index 4599d5ca..bc57f3f4 100644
--- a/src/CacheBase.cpp
+++ b/src/CacheBase.cpp
@@ -53,7 +53,7 @@ void CacheBase::SetMaxBytesFromInfo(int64_t number_of_frames, int width, int hei
SetMaxBytes(bytes);
}
-// Generate Json::JsonValue for this object
+// Generate Json::Value for this object
Json::Value CacheBase::JsonValue() {
// Create root json object
@@ -66,8 +66,8 @@ Json::Value CacheBase::JsonValue() {
return root;
}
-// Load Json::JsonValue into this object
-void CacheBase::SetJsonValue(Json::Value root) {
+// Load Json::Value into this object
+void CacheBase::SetJsonValue(const Json::Value root) {
// Set data from Json (if key is found)
if (!root["max_bytes"].isNull())
diff --git a/src/CacheDisk.cpp b/src/CacheDisk.cpp
index 3f8bf37e..9f67ce99 100644
--- a/src/CacheDisk.cpp
+++ b/src/CacheDisk.cpp
@@ -114,12 +114,8 @@ void CacheDisk::CalculateRanges() {
// Add JSON object with start/end attributes
// Use strings, since int64_ts are supported in JSON
- std::stringstream start_str;
- start_str << starting_frame;
- std::stringstream end_str;
- end_str << ending_frame;
- range["start"] = start_str.str();
- range["end"] = end_str.str();
+ range["start"] = std::to_string(starting_frame);
+ range["end"] = std::to_string(ending_frame);
ranges.append(range);
// Set new starting range
@@ -135,12 +131,8 @@ void CacheDisk::CalculateRanges() {
// Add JSON object with start/end attributes
// Use strings, since int64_ts are supported in JSON
- std::stringstream start_str;
- start_str << starting_frame;
- std::stringstream end_str;
- end_str << ending_frame;
- range["start"] = start_str.str();
- range["end"] = end_str.str();
+ range["start"] = std::to_string(starting_frame);
+ range["end"] = std::to_string(ending_frame);
ranges.append(range);
// Cache range JSON as string
@@ -469,7 +461,7 @@ std::string CacheDisk::Json() {
return JsonValue().toStyledString();
}
-// Generate Json::JsonValue for this object
+// Generate Json::Value for this object
Json::Value CacheDisk::JsonValue() {
// Process range data (if anything has changed)
@@ -486,41 +478,23 @@ Json::Value CacheDisk::JsonValue() {
root["version"] = range_version_str.str();
// Parse and append range data (if any)
- Json::Value ranges;
- Json::CharReaderBuilder rbuilder;
- Json::CharReader* reader(rbuilder.newCharReader());
-
- std::string errors;
- bool success = reader->parse( json_ranges.c_str(),
- json_ranges.c_str() + json_ranges.size(), &ranges, &errors );
- delete reader;
-
- if (success)
+ // Parse and append range data (if any)
+ try {
+ const Json::Value ranges = openshot::stringToJson(json_ranges);
root["ranges"] = ranges;
+ } catch (...) { }
// return JsonValue
return root;
}
// Load JSON string into this object
-void CacheDisk::SetJson(std::string value) {
+void CacheDisk::SetJson(const std::string value) {
// Parse JSON string into JSON objects
- Json::Value root;
- Json::CharReaderBuilder rbuilder;
- Json::CharReader* reader(rbuilder.newCharReader());
-
- std::string errors;
- bool success = reader->parse( value.c_str(),
- value.c_str() + value.size(), &root, &errors );
- delete reader;
-
- if (!success)
- // Raise exception
- throw InvalidJSON("JSON could not be parsed (or is invalid)");
-
try
{
+ const Json::Value root = openshot::stringToJson(value);
// Set all values that match
SetJsonValue(root);
}
@@ -531,8 +505,8 @@ void CacheDisk::SetJson(std::string value) {
}
}
-// Load Json::JsonValue into this object
-void CacheDisk::SetJsonValue(Json::Value root) {
+// Load Json::Value into this object
+void CacheDisk::SetJsonValue(const Json::Value root) {
// Close timeline before we do anything (this also removes all open and closing clips)
Clear();
diff --git a/src/CacheMemory.cpp b/src/CacheMemory.cpp
index 0b2d9ab8..70feef03 100644
--- a/src/CacheMemory.cpp
+++ b/src/CacheMemory.cpp
@@ -92,12 +92,8 @@ void CacheMemory::CalculateRanges() {
// Add JSON object with start/end attributes
// Use strings, since int64_ts are supported in JSON
- std::stringstream start_str;
- start_str << starting_frame;
- std::stringstream end_str;
- end_str << ending_frame;
- range["start"] = start_str.str();
- range["end"] = end_str.str();
+ range["start"] = std::to_string(starting_frame);
+ range["end"] = std::to_string(ending_frame);
ranges.append(range);
// Set new starting range
@@ -113,12 +109,8 @@ void CacheMemory::CalculateRanges() {
// Add JSON object with start/end attributes
// Use strings, since int64_ts are not supported in JSON
- std::stringstream start_str;
- start_str << starting_frame;
- std::stringstream end_str;
- end_str << ending_frame;
- range["start"] = start_str.str();
- range["end"] = end_str.str();
+ range["start"] = std::to_string(starting_frame);
+ range["end"] = std::to_string(ending_frame);
ranges.append(range);
// Cache range JSON as string
@@ -327,7 +319,7 @@ std::string CacheMemory::Json() {
return JsonValue().toStyledString();
}
-// Generate Json::JsonValue for this object
+// Generate Json::Value for this object
Json::Value CacheMemory::JsonValue() {
// Process range data (if anything has changed)
@@ -337,45 +329,25 @@ Json::Value CacheMemory::JsonValue() {
Json::Value root = CacheBase::JsonValue(); // get parent properties
root["type"] = cache_type;
- std::stringstream range_version_str;
- range_version_str << range_version;
- root["version"] = range_version_str.str();
+ root["version"] = std::to_string(range_version);
// Parse and append range data (if any)
- Json::Value ranges;
- Json::CharReaderBuilder rbuilder;
- Json::CharReader* reader(rbuilder.newCharReader());
-
- std::string errors;
- bool success = reader->parse( json_ranges.c_str(),
- json_ranges.c_str() + json_ranges.size(), &ranges, &errors );
- delete reader;
-
- if (success)
+ try {
+ const Json::Value ranges = openshot::stringToJson(json_ranges);
root["ranges"] = ranges;
+ } catch (...) { }
// return JsonValue
return root;
}
// Load JSON string into this object
-void CacheMemory::SetJson(std::string value) {
-
- // Parse JSON string into JSON objects
- Json::Value root;
- Json::CharReaderBuilder rbuilder;
- Json::CharReader* reader(rbuilder.newCharReader());
-
- std::string errors;
- bool success = reader->parse( value.c_str(),
- value.c_str() + value.size(), &root, &errors );
- delete reader;
- if (!success)
- // Raise exception
- throw InvalidJSON("JSON could not be parsed (or is invalid)");
+void CacheMemory::SetJson(const std::string value) {
try
{
+ // Parse string to Json::Value
+ const Json::Value root = openshot::stringToJson(value);
// Set all values that match
SetJsonValue(root);
}
@@ -386,8 +358,8 @@ void CacheMemory::SetJson(std::string value) {
}
}
-// Load Json::JsonValue into this object
-void CacheMemory::SetJsonValue(Json::Value root) {
+// Load Json::Value into this object
+void CacheMemory::SetJsonValue(const Json::Value root) {
// Close timeline before we do anything (this also removes all open and closing clips)
Clear();
diff --git a/src/ChunkReader.cpp b/src/ChunkReader.cpp
index 7321cb26..c194ce33 100644
--- a/src/ChunkReader.cpp
+++ b/src/ChunkReader.cpp
@@ -256,14 +256,14 @@ std::shared_ptr ChunkReader::GetFrame(int64_t requested_frame)
}
// Generate JSON string of this object
-std::string ChunkReader::Json() {
+std::string ChunkReader::Json() const {
// Return formatted string
return JsonValue().toStyledString();
}
-// Generate Json::JsonValue for this object
-Json::Value ChunkReader::JsonValue() {
+// Generate Json::Value for this object
+Json::Value ChunkReader::JsonValue() const {
// Create root json object
Json::Value root = ReaderBase::JsonValue(); // get parent properties
@@ -279,23 +279,11 @@ Json::Value ChunkReader::JsonValue() {
}
// Load JSON string into this object
-void ChunkReader::SetJson(std::string value) {
-
- // Parse JSON string into JSON objects
- Json::Value root;
- Json::CharReaderBuilder rbuilder;
- Json::CharReader* reader(rbuilder.newCharReader());
-
- std::string errors;
- bool success = reader->parse( value.c_str(),
- value.c_str() + value.size(), &root, &errors );
- delete reader;
- if (!success)
- // Raise exception
- throw InvalidJSON("JSON could not be parsed (or is invalid)");
+void ChunkReader::SetJson(const std::string value) {
try
{
+ const Json::Value root = openshot::stringToJson(value);
// Set all values that match
SetJsonValue(root);
}
@@ -306,8 +294,8 @@ void ChunkReader::SetJson(std::string value) {
}
}
-// Load Json::JsonValue into this object
-void ChunkReader::SetJsonValue(Json::Value root) {
+// Load Json::Value into this object
+void ChunkReader::SetJsonValue(const Json::Value root) {
// Set parent data
ReaderBase::SetJsonValue(root);
diff --git a/src/Clip.cpp b/src/Clip.cpp
index ef6b9852..695fb9a1 100644
--- a/src/Clip.cpp
+++ b/src/Clip.cpp
@@ -270,7 +270,7 @@ void Clip::Close()
}
// Get end position of clip (trim end of video), which can be affected by the time curve.
-float Clip::End()
+float Clip::End() const
{
// if a time curve is present, use its length
if (time.GetCount() > 1)
@@ -645,14 +645,14 @@ std::shared_ptr Clip::GetOrCreateFrame(int64_t number)
}
// Generate JSON string of this object
-std::string Clip::Json() {
+std::string Clip::Json() const {
// Return formatted string
return JsonValue().toStyledString();
}
// Get all properties for a specific frame
-std::string Clip::PropertiesJSON(int64_t requested_frame) {
+std::string Clip::PropertiesJSON(int64_t requested_frame) const {
// Generate JSON properties list
Json::Value root;
@@ -739,8 +739,8 @@ std::string Clip::PropertiesJSON(int64_t requested_frame) {
return root.toStyledString();
}
-// Generate Json::JsonValue for this object
-Json::Value Clip::JsonValue() {
+// Generate Json::Value for this object
+Json::Value Clip::JsonValue() const {
// Create root json object
Json::Value root = ClipBase::JsonValue(); // get parent properties
@@ -795,24 +795,12 @@ Json::Value Clip::JsonValue() {
}
// Load JSON string into this object
-void Clip::SetJson(std::string value) {
+void Clip::SetJson(const std::string value) {
// Parse JSON string into JSON objects
- Json::Value root;
- Json::CharReaderBuilder rbuilder;
- Json::CharReader* reader(rbuilder.newCharReader());
-
- std::string errors;
- bool success = reader->parse( value.c_str(),
- value.c_str() + value.size(), &root, &errors );
- delete reader;
-
- if (!success)
- // Raise exception
- throw InvalidJSON("JSON could not be parsed (or is invalid)");
-
try
{
+ const Json::Value root = openshot::stringToJson(value);
// Set all values that match
SetJsonValue(root);
}
@@ -823,8 +811,8 @@ void Clip::SetJson(std::string value) {
}
}
-// Load Json::JsonValue into this object
-void Clip::SetJsonValue(Json::Value root) {
+// Load Json::Value into this object
+void Clip::SetJsonValue(const Json::Value root) {
// Set parent data
ClipBase::SetJsonValue(root);
diff --git a/src/ClipBase.cpp b/src/ClipBase.cpp
index d1370205..a51c6573 100644
--- a/src/ClipBase.cpp
+++ b/src/ClipBase.cpp
@@ -32,8 +32,8 @@
using namespace openshot;
-// Generate Json::JsonValue for this object
-Json::Value ClipBase::JsonValue() {
+// Generate Json::Value for this object
+Json::Value ClipBase::JsonValue() const {
// Create root json object
Json::Value root;
@@ -48,8 +48,8 @@ Json::Value ClipBase::JsonValue() {
return root;
}
-// Load Json::JsonValue into this object
-void ClipBase::SetJsonValue(Json::Value root) {
+// Load Json::Value into this object
+void ClipBase::SetJsonValue(const Json::Value root) {
// Set data from Json (if key is found)
if (!root["id"].isNull())
@@ -65,10 +65,10 @@ void ClipBase::SetJsonValue(Json::Value root) {
}
// Generate JSON for a property
-Json::Value ClipBase::add_property_json(std::string name, float value, std::string type, std::string memo, Keyframe* keyframe, float min_value, float max_value, bool readonly, int64_t requested_frame) {
+Json::Value ClipBase::add_property_json(std::string name, float value, std::string type, std::string memo, const Keyframe* keyframe, float min_value, float max_value, bool readonly, int64_t requested_frame) const {
// Requested Point
- Point requested_point(requested_frame, requested_frame);
+ const Point requested_point(requested_frame, requested_frame);
// Create JSON Object
Json::Value prop = Json::Value(Json::objectValue);
@@ -101,7 +101,7 @@ Json::Value ClipBase::add_property_json(std::string name, float value, std::stri
return prop;
}
-Json::Value ClipBase::add_property_choice_json(std::string name, int value, int selected_value) {
+Json::Value ClipBase::add_property_choice_json(std::string name, int value, int selected_value) const {
// Create choice
Json::Value new_choice = Json::Value(Json::objectValue);
diff --git a/src/Color.cpp b/src/Color.cpp
index 927fc162..705ece4a 100644
--- a/src/Color.cpp
+++ b/src/Color.cpp
@@ -85,14 +85,14 @@ long Color::GetDistance(long R1, long G1, long B1, long R2, long G2, long B2)
}
// Generate JSON string of this object
-std::string Color::Json() {
+std::string Color::Json() const {
// Return formatted string
return JsonValue().toStyledString();
}
-// Generate Json::JsonValue for this object
-Json::Value Color::JsonValue() {
+// Generate Json::Value for this object
+Json::Value Color::JsonValue() const {
// Create root json object
Json::Value root;
@@ -106,24 +106,12 @@ Json::Value Color::JsonValue() {
}
// Load JSON string into this object
-void Color::SetJson(std::string value) {
+void Color::SetJson(const std::string value) {
// Parse JSON string into JSON objects
- Json::Value root;
- Json::CharReaderBuilder rbuilder;
- Json::CharReader* reader(rbuilder.newCharReader());
-
- std::string errors;
- bool success = reader->parse( value.c_str(),
- value.c_str() + value.size(), &root, &errors );
- delete reader;
-
- if (!success)
- // Raise exception
- throw InvalidJSON("JSON could not be parsed (or is invalid)");
-
try
{
+ const Json::Value root = openshot::stringToJson(value);
// Set all values that match
SetJsonValue(root);
}
@@ -134,8 +122,8 @@ void Color::SetJson(std::string value) {
}
}
-// Load Json::JsonValue into this object
-void Color::SetJsonValue(Json::Value root) {
+// Load Json::Value into this object
+void Color::SetJsonValue(const Json::Value root) {
// Set data from Json (if key is found)
if (!root["red"].isNull())
diff --git a/src/Coordinate.cpp b/src/Coordinate.cpp
index a0bdabcc..f87fb7a0 100644
--- a/src/Coordinate.cpp
+++ b/src/Coordinate.cpp
@@ -45,14 +45,14 @@ Coordinate::Coordinate(double x, double y) :
// Generate JSON string of this object
-std::string Coordinate::Json() {
+std::string Coordinate::Json() const {
// Return formatted string
return JsonValue().toStyledString();
}
-// Generate Json::JsonValue for this object
-Json::Value Coordinate::JsonValue() {
+// Generate Json::Value for this object
+Json::Value Coordinate::JsonValue() const {
// Create root json object
Json::Value root;
@@ -69,24 +69,12 @@ Json::Value Coordinate::JsonValue() {
}
// Load JSON string into this object
-void Coordinate::SetJson(std::string value) {
+void Coordinate::SetJson(const std::string value) {
// Parse JSON string into JSON objects
- Json::Value root;
- Json::CharReaderBuilder rbuilder;
- Json::CharReader* reader(rbuilder.newCharReader());
-
- std::string errors;
- bool success = reader->parse( value.c_str(),
- value.c_str() + value.size(), &root, &errors );
- delete reader;
-
- if (!success)
- // Raise exception
- throw InvalidJSON("JSON could not be parsed (or is invalid)");
-
try
{
+ const Json::Value root = openshot::stringToJson(value);
// Set all values that match
SetJsonValue(root);
}
@@ -97,8 +85,8 @@ void Coordinate::SetJson(std::string value) {
}
}
-// Load Json::JsonValue into this object
-void Coordinate::SetJsonValue(Json::Value root) {
+// Load Json::Value into this object
+void Coordinate::SetJsonValue(const Json::Value root) {
// Set data from Json (if key is found)
if (!root["X"].isNull())
diff --git a/src/DecklinkReader.cpp b/src/DecklinkReader.cpp
index 35ed1857..14c2f87c 100644
--- a/src/DecklinkReader.cpp
+++ b/src/DecklinkReader.cpp
@@ -246,14 +246,14 @@ std::shared_ptr DecklinkReader::GetFrame(int64_t requested_frame)
// Generate JSON string of this object
-std::string DecklinkReader::Json() {
+std::string DecklinkReader::Json() const {
// Return formatted string
return JsonValue().toStyledString();
}
-// Generate Json::JsonValue for this object
-Json::Value DecklinkReader::JsonValue() {
+// Generate Json::Value for this object
+Json::Value DecklinkReader::JsonValue() const {
// Create root json object
Json::Value root = ReaderBase::JsonValue(); // get parent properties
@@ -264,24 +264,12 @@ Json::Value DecklinkReader::JsonValue() {
}
// Load JSON string into this object
-void DecklinkReader::SetJson(std::string value) {
+void DecklinkReader::SetJson(const std::string value) {
// Parse JSON string into JSON objects
- Json::Value root;
- Json::CharReaderBuilder rbuilder;
- Json::CharReader* reader(rbuilder.newCharReader());
-
- std::string errors;
- bool success = reader->parse( value.c_str(),
- value.c_str() + value.size(), &root, &errors );
- delete reader;
-
- if (!success)
- // Raise exception
- throw InvalidJSON("JSON could not be parsed (or is invalid)");
-
try
{
+ const Json::Value root = openshot::stringToJson(value);
// Set all values that match
SetJsonValue(root);
}
@@ -292,8 +280,8 @@ void DecklinkReader::SetJson(std::string value) {
}
}
-// Load Json::JsonValue into this object
-void DecklinkReader::SetJsonValue(Json::Value root) {
+// Load Json::Value into this object
+void DecklinkReader::SetJsonValue(const Json::Value root) {
// Set parent data
ReaderBase::SetJsonValue(root);
diff --git a/src/DummyReader.cpp b/src/DummyReader.cpp
index 997a020a..8fd98bcb 100644
--- a/src/DummyReader.cpp
+++ b/src/DummyReader.cpp
@@ -124,14 +124,14 @@ std::shared_ptr DummyReader::GetFrame(int64_t requested_frame)
}
// Generate JSON string of this object
-std::string DummyReader::Json() {
+std::string DummyReader::Json() const {
// Return formatted string
return JsonValue().toStyledString();
}
-// Generate Json::JsonValue for this object
-Json::Value DummyReader::JsonValue() {
+// Generate Json::Value for this object
+Json::Value DummyReader::JsonValue() const {
// Create root json object
Json::Value root = ReaderBase::JsonValue(); // get parent properties
@@ -142,24 +142,12 @@ Json::Value DummyReader::JsonValue() {
}
// Load JSON string into this object
-void DummyReader::SetJson(std::string value) {
+void DummyReader::SetJson(const std::string value) {
// Parse JSON string into JSON objects
- Json::Value root;
- Json::CharReaderBuilder rbuilder;
- Json::CharReader* reader(rbuilder.newCharReader());
-
- std::string errors;
- bool success = reader->parse( value.c_str(),
- value.c_str() + value.size(), &root, &errors );
- delete reader;
-
- if (!success)
- // Raise exception
- throw InvalidJSON("JSON could not be parsed (or is invalid)");
-
try
{
+ const Json::Value root = openshot::stringToJson(value);
// Set all values that match
SetJsonValue(root);
}
@@ -170,8 +158,8 @@ void DummyReader::SetJson(std::string value) {
}
}
-// Load Json::JsonValue into this object
-void DummyReader::SetJsonValue(Json::Value root) {
+// Load Json::Value into this object
+void DummyReader::SetJsonValue(const Json::Value root) {
// Set parent data
ReaderBase::SetJsonValue(root);
diff --git a/src/EffectBase.cpp b/src/EffectBase.cpp
index e4a9e0ab..05ed97c2 100644
--- a/src/EffectBase.cpp
+++ b/src/EffectBase.cpp
@@ -74,14 +74,14 @@ int EffectBase::constrain(int color_value)
}
// Generate JSON string of this object
-std::string EffectBase::Json() {
+std::string EffectBase::Json() const {
// Return formatted string
return JsonValue().toStyledString();
}
-// Generate Json::JsonValue for this object
-Json::Value EffectBase::JsonValue() {
+// Generate Json::Value for this object
+Json::Value EffectBase::JsonValue() const {
// Create root json object
Json::Value root = ClipBase::JsonValue(); // get parent properties
@@ -97,24 +97,12 @@ Json::Value EffectBase::JsonValue() {
}
// Load JSON string into this object
-void EffectBase::SetJson(std::string value) {
+void EffectBase::SetJson(const std::string value) {
// Parse JSON string into JSON objects
- Json::Value root;
- Json::CharReaderBuilder rbuilder;
- Json::CharReader* reader(rbuilder.newCharReader());
-
- std::string errors;
- bool success = reader->parse( value.c_str(),
- value.c_str() + value.size(), &root, &errors );
- delete reader;
-
- if (!success)
- // Raise exception
- throw InvalidJSON("JSON could not be parsed (or is invalid)");
-
try
{
+ const Json::Value root = openshot::stringToJson(value);
// Set all values that match
SetJsonValue(root);
}
@@ -125,8 +113,8 @@ void EffectBase::SetJson(std::string value) {
}
}
-// Load Json::JsonValue into this object
-void EffectBase::SetJsonValue(Json::Value root) {
+// Load Json::Value into this object
+void EffectBase::SetJsonValue(const Json::Value root) {
// Set parent data
ClipBase::SetJsonValue(root);
@@ -136,8 +124,8 @@ void EffectBase::SetJsonValue(Json::Value root) {
Order(root["order"].asInt());
}
-// Generate Json::JsonValue for this object
-Json::Value EffectBase::JsonInfo() {
+// Generate Json::Value for this object
+Json::Value EffectBase::JsonInfo() const {
// Create root json object
Json::Value root;
diff --git a/src/EffectInfo.cpp b/src/EffectInfo.cpp
index 8fb8a4fe..5d786fe7 100644
--- a/src/EffectInfo.cpp
+++ b/src/EffectInfo.cpp
@@ -88,7 +88,7 @@ EffectBase* EffectInfo::CreateEffect(std::string effect_type) {
return NULL;
}
-// Generate Json::JsonValue for this object
+// Generate Json::Value for this object
Json::Value EffectInfo::JsonValue() {
// Create root json object
diff --git a/src/FFmpegReader.cpp b/src/FFmpegReader.cpp
index b548fa8f..2b03994b 100644
--- a/src/FFmpegReader.cpp
+++ b/src/FFmpegReader.cpp
@@ -2434,14 +2434,14 @@ int64_t FFmpegReader::GetSmallestAudioFrame() {
}
// Generate JSON string of this object
-std::string FFmpegReader::Json() {
+std::string FFmpegReader::Json() const {
// Return formatted string
return JsonValue().toStyledString();
}
-// Generate Json::JsonValue for this object
-Json::Value FFmpegReader::JsonValue() {
+// Generate Json::Value for this object
+Json::Value FFmpegReader::JsonValue() const {
// Create root json object
Json::Value root = ReaderBase::JsonValue(); // get parent properties
@@ -2453,23 +2453,11 @@ Json::Value FFmpegReader::JsonValue() {
}
// Load JSON string into this object
-void FFmpegReader::SetJson(std::string value) {
+void FFmpegReader::SetJson(const std::string value) {
// Parse JSON string into JSON objects
- Json::Value root;
- Json::CharReaderBuilder rbuilder;
- Json::CharReader* reader(rbuilder.newCharReader());
-
- std::string errors;
- bool success = reader->parse(value.c_str(), value.c_str() + value.size(),
- &root, &errors);
- delete reader;
-
- if (!success)
- // Raise exception
- throw InvalidJSON("JSON could not be parsed (or is invalid)");
-
try {
+ const Json::Value root = openshot::stringToJson(value);
// Set all values that match
SetJsonValue(root);
}
@@ -2479,8 +2467,8 @@ void FFmpegReader::SetJson(std::string value) {
}
}
-// Load Json::JsonValue into this object
-void FFmpegReader::SetJsonValue(Json::Value root) {
+// Load Json::Value into this object
+void FFmpegReader::SetJsonValue(const Json::Value root) {
// Set parent data
ReaderBase::SetJsonValue(root);
diff --git a/src/FFmpegWriter.cpp b/src/FFmpegWriter.cpp
index 8d060d77..e6a1d180 100644
--- a/src/FFmpegWriter.cpp
+++ b/src/FFmpegWriter.cpp
@@ -277,6 +277,14 @@ void FFmpegWriter::SetVideoOptions(bool has_video, std::string codec, Fraction f
info.has_video = has_video;
}
+// Set video export options (overloaded function)
+void FFmpegWriter::SetVideoOptions(std::string codec, int width, int height, Fraction fps, int bit_rate) {
+ // Call full signature with some default parameters
+ FFmpegWriter::SetVideoOptions(true, codec, fps, width, height,
+ openshot::Fraction(1, 1), false, true, bit_rate);
+}
+
+
// Set audio export options
void FFmpegWriter::SetAudioOptions(bool has_audio, std::string codec, int sample_rate, int channels, ChannelLayout channel_layout, int bit_rate) {
// Set audio options
@@ -312,6 +320,15 @@ void FFmpegWriter::SetAudioOptions(bool has_audio, std::string codec, int sample
info.has_audio = has_audio;
}
+
+// Set audio export options (overloaded function)
+void FFmpegWriter::SetAudioOptions(std::string codec, int sample_rate, int bit_rate) {
+ // Call full signature with some default parameters
+ FFmpegWriter::SetAudioOptions(true, codec, sample_rate, 2,
+ openshot::LAYOUT_STEREO, bit_rate);
+}
+
+
// Set custom options (some codecs accept additional params)
void FFmpegWriter::SetOption(StreamType stream, std::string name, std::string value) {
// Declare codec context
diff --git a/src/Frame.cpp b/src/Frame.cpp
index 8a843aa8..7d4dc42e 100644
--- a/src/Frame.cpp
+++ b/src/Frame.cpp
@@ -818,16 +818,23 @@ void Frame::AddImage(std::shared_ptr new_image, bool only_odd_lines)
// Ignore image of different sizes or formats
bool ret=false;
#pragma omp critical (AddImage)
- if (image == new_image || image->size() != image->size() || image->format() != image->format())
- ret=true;
- if (ret)
+ {
+ if (image == new_image || image->size() != new_image->size()) {
+ ret = true;
+ }
+ else if (new_image->format() != image->format()) {
+ new_image = std::shared_ptr(new QImage(new_image->convertToFormat(image->format())));
+ }
+ }
+ if (ret) {
return;
-
+ }
+
// Get the frame's image
const GenericScopedLock lock(addingImageSection);
#pragma omp critical (AddImage)
{
- const unsigned char *pixels = image->constBits();
+ unsigned char *pixels = image->bits();
const unsigned char *new_pixels = new_image->constBits();
// Loop through the scanlines of the image (even or odd)
@@ -836,13 +843,13 @@ void Frame::AddImage(std::shared_ptr new_image, bool only_odd_lines)
start = 1;
for (int row = start; row < image->height(); row += 2) {
- memcpy((unsigned char *) pixels, new_pixels + (row * image->bytesPerLine()), image->bytesPerLine());
- new_pixels += image->bytesPerLine();
+ int offset = row * image->bytesPerLine();
+ memcpy(pixels + offset, new_pixels + offset, image->bytesPerLine());
}
// Update height and width
- width = image->width();
height = image->height();
+ width = image->width();
has_image_data = true;
}
}
diff --git a/src/FrameMapper.cpp b/src/FrameMapper.cpp
index 6ace8400..7c4d04bb 100644
--- a/src/FrameMapper.cpp
+++ b/src/FrameMapper.cpp
@@ -675,14 +675,14 @@ void FrameMapper::Close()
// Generate JSON string of this object
-std::string FrameMapper::Json() {
+std::string FrameMapper::Json() const {
// Return formatted string
return JsonValue().toStyledString();
}
-// Generate Json::JsonValue for this object
-Json::Value FrameMapper::JsonValue() {
+// Generate Json::Value for this object
+Json::Value FrameMapper::JsonValue() const {
// Create root json object
Json::Value root = ReaderBase::JsonValue(); // get parent properties
@@ -693,24 +693,12 @@ Json::Value FrameMapper::JsonValue() {
}
// Load JSON string into this object
-void FrameMapper::SetJson(std::string value) {
+void FrameMapper::SetJson(const std::string value) {
// Parse JSON string into JSON objects
- Json::Value root;
- Json::CharReaderBuilder rbuilder;
- Json::CharReader* reader(rbuilder.newCharReader());
-
- std::string errors;
- bool success = reader->parse( value.c_str(),
- value.c_str() + value.size(), &root, &errors );
- delete reader;
-
- if (!success)
- // Raise exception
- throw InvalidJSON("JSON could not be parsed (or is invalid)");
-
try
{
+ const Json::Value root = openshot::stringToJson(value);
// Set all values that match
SetJsonValue(root);
}
@@ -721,8 +709,8 @@ void FrameMapper::SetJson(std::string value) {
}
}
-// Load Json::JsonValue into this object
-void FrameMapper::SetJsonValue(Json::Value root) {
+// Load Json::Value into this object
+void FrameMapper::SetJsonValue(const Json::Value root) {
// Set parent data
ReaderBase::SetJsonValue(root);
diff --git a/src/ImageReader.cpp b/src/ImageReader.cpp
index ad871f1f..9ce3a70f 100644
--- a/src/ImageReader.cpp
+++ b/src/ImageReader.cpp
@@ -136,14 +136,14 @@ std::shared_ptr ImageReader::GetFrame(int64_t requested_frame)
}
// Generate JSON string of this object
-std::string ImageReader::Json() {
+std::string ImageReader::Json() const {
// Return formatted string
return JsonValue().toStyledString();
}
-// Generate Json::JsonValue for this object
-Json::Value ImageReader::JsonValue() {
+// Generate Json::Value for this object
+Json::Value ImageReader::JsonValue() const {
// Create root json object
Json::Value root = ReaderBase::JsonValue(); // get parent properties
@@ -155,24 +155,12 @@ Json::Value ImageReader::JsonValue() {
}
// Load JSON string into this object
-void ImageReader::SetJson(std::string value) {
+void ImageReader::SetJson(const std::string value) {
// Parse JSON string into JSON objects
- Json::Value root;
- Json::CharReaderBuilder rbuilder;
- Json::CharReader* reader(rbuilder.newCharReader());
-
- std::string errors;
- bool success = reader->parse( value.c_str(),
- value.c_str() + value.size(), &root, &errors );
- delete reader;
-
- if (!success)
- // Raise exception
- throw InvalidJSON("JSON could not be parsed (or is invalid)");
-
try
{
+ const Json::Value root = openshot::stringToJson(value);
// Set all values that match
SetJsonValue(root);
}
@@ -183,8 +171,8 @@ void ImageReader::SetJson(std::string value) {
}
}
-// Load Json::JsonValue into this object
-void ImageReader::SetJsonValue(Json::Value root) {
+// Load Json::Value into this object
+void ImageReader::SetJsonValue(const Json::Value root) {
// Set parent data
ReaderBase::SetJsonValue(root);
diff --git a/src/Json.cpp b/src/Json.cpp
new file mode 100644
index 00000000..0c83d9d6
--- /dev/null
+++ b/src/Json.cpp
@@ -0,0 +1,50 @@
+/**
+ * @file
+ * @brief Helper functions for Json parsing
+ * @author FeRD (Frank Dana)
+ *
+ * @ref License
+ */
+
+/* LICENSE
+ *
+ * Copyright (c) 2008-2019 OpenShot Studios, LLC
+ * . This file is part of
+ * OpenShot Library (libopenshot), an open-source project dedicated to
+ * delivering high quality video editing and animation solutions to the
+ * world. For more information visit .
+ *
+ * OpenShot Library (libopenshot) is free software: you can redistribute it
+ * and/or modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * OpenShot Library (libopenshot) is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with OpenShot Library. If not, see .
+ */
+
+#include "../include/Json.h"
+
+const Json::Value openshot::stringToJson(const std::string value) {
+
+ // Parse JSON string into JSON objects
+ Json::Value root;
+ Json::CharReaderBuilder rbuilder;
+ Json::CharReader* reader(rbuilder.newCharReader());
+
+ std::string errors;
+ bool success = reader->parse( value.c_str(), value.c_str() + value.size(),
+ &root, &errors );
+ delete reader;
+
+ if (!success)
+ // Raise exception
+ throw openshot::InvalidJSON("JSON could not be parsed (or is invalid)");
+
+ return root;
+}
diff --git a/src/KeyFrame.cpp b/src/KeyFrame.cpp
index 457ed9b7..57e424cf 100644
--- a/src/KeyFrame.cpp
+++ b/src/KeyFrame.cpp
@@ -325,15 +325,15 @@ std::string Keyframe::Json() const {
return JsonValue().toStyledString();
}
-// Generate Json::JsonValue for this object
+// Generate Json::Value for this object
Json::Value Keyframe::JsonValue() const {
// Create root json object
Json::Value root;
root["Points"] = Json::Value(Json::arrayValue);
- // loop through points, and find a matching coordinate
- for (auto existing_point : Points) {
+ // loop through points
+ for (const auto existing_point : Points) {
root["Points"].append(existing_point.JsonValue());
}
@@ -342,24 +342,12 @@ Json::Value Keyframe::JsonValue() const {
}
// Load JSON string into this object
-void Keyframe::SetJson(std::string value) {
+void Keyframe::SetJson(const std::string value) {
// Parse JSON string into JSON objects
- Json::Value root;
- Json::CharReaderBuilder rbuilder;
- Json::CharReader* reader(rbuilder.newCharReader());
-
- std::string errors;
- bool success = reader->parse( value.c_str(),
- value.c_str() + value.size(), &root, &errors );
- delete reader;
-
- if (!success)
- // Raise exception
- throw InvalidJSON("JSON could not be parsed (or is invalid)");
-
try
{
+ const Json::Value root = openshot::stringToJson(value);
// Set all values that match
SetJsonValue(root);
}
@@ -370,8 +358,8 @@ void Keyframe::SetJson(std::string value) {
}
}
-// Load Json::JsonValue into this object
-void Keyframe::SetJsonValue(Json::Value root) {
+// Load Json::Value into this object
+void Keyframe::SetJsonValue(const Json::Value root) {
// Clear existing points
Points.clear();
diff --git a/src/Point.cpp b/src/Point.cpp
index 52e7ffbe..13679977 100644
--- a/src/Point.cpp
+++ b/src/Point.cpp
@@ -108,14 +108,14 @@ void Point::Initialize_RightHandle(float x, float y) {
}
// Generate JSON string of this object
-std::string Point::Json() {
+std::string Point::Json() const {
// Return formatted string
return JsonValue().toStyledString();
}
-// Generate Json::JsonValue for this object
-Json::Value Point::JsonValue() {
+// Generate Json::Value for this object
+Json::Value Point::JsonValue() const {
// Create root json object
Json::Value root;
@@ -132,24 +132,12 @@ Json::Value Point::JsonValue() {
}
// Load JSON string into this object
-void Point::SetJson(std::string value) {
+void Point::SetJson(const std::string value) {
// Parse JSON string into JSON objects
- Json::Value root;
- Json::CharReaderBuilder rbuilder;
- Json::CharReader* reader(rbuilder.newCharReader());
-
- std::string errors;
- bool success = reader->parse( value.c_str(),
- value.c_str() + value.size(), &root, &errors );
- delete reader;
-
- if (!success)
- // Raise exception
- throw InvalidJSON("JSON could not be parsed (or is invalid)");
-
try
{
+ const Json::Value root = openshot::stringToJson(value);
// Set all values that match
SetJsonValue(root);
}
@@ -160,8 +148,8 @@ void Point::SetJson(std::string value) {
}
}
-// Load Json::JsonValue into this object
-void Point::SetJsonValue(Json::Value root) {
+// Load Json::Value into this object
+void Point::SetJsonValue(const Json::Value root) {
if (!root["co"].isNull())
co.SetJsonValue(root["co"]); // update coordinate
diff --git a/src/Profiles.cpp b/src/Profiles.cpp
index e7c54771..5351520e 100644
--- a/src/Profiles.cpp
+++ b/src/Profiles.cpp
@@ -133,14 +133,14 @@ Profile::Profile(std::string path) {
}
// Generate JSON string of this object
-std::string Profile::Json() {
+std::string Profile::Json() const {
// Return formatted string
return JsonValue().toStyledString();
}
-// Generate Json::JsonValue for this object
-Json::Value Profile::JsonValue() {
+// Generate Json::Value for this object
+Json::Value Profile::JsonValue() const {
// Create root json object
Json::Value root;
@@ -163,24 +163,12 @@ Json::Value Profile::JsonValue() {
}
// Load JSON string into this object
-void Profile::SetJson(std::string value) {
+void Profile::SetJson(const std::string value) {
// Parse JSON string into JSON objects
- Json::Value root;
- Json::CharReaderBuilder rbuilder;
- Json::CharReader* reader(rbuilder.newCharReader());
-
- std::string errors;
- bool success = reader->parse( value.c_str(),
- value.c_str() + value.size(), &root, &errors );
- delete reader;
-
- if (!success)
- // Raise exception
- throw InvalidJSON("JSON could not be parsed (or is invalid)");
-
try
{
+ const Json::Value root = openshot::stringToJson(value);
// Set all values that match
SetJsonValue(root);
}
@@ -191,8 +179,8 @@ void Profile::SetJson(std::string value) {
}
}
-// Load Json::JsonValue into this object
-void Profile::SetJsonValue(Json::Value root) {
+// Load Json::Value into this object
+void Profile::SetJsonValue(const Json::Value root) {
if (!root["height"].isNull())
info.height = root["height"].asInt();
diff --git a/src/QtHtmlReader.cpp b/src/QtHtmlReader.cpp
index cfdde9f3..6b502fbd 100644
--- a/src/QtHtmlReader.cpp
+++ b/src/QtHtmlReader.cpp
@@ -180,14 +180,14 @@ std::shared_ptr QtHtmlReader::GetFrame(int64_t requested_frame)
}
// Generate JSON string of this object
-std::string QtHtmlReader::Json() {
+std::string QtHtmlReader::Json() const {
// Return formatted string
return JsonValue().toStyledString();
}
-// Generate Json::JsonValue for this object
-Json::Value QtHtmlReader::JsonValue() {
+// Generate Json::Value for this object
+Json::Value QtHtmlReader::JsonValue() const {
// Create root json object
Json::Value root = ReaderBase::JsonValue(); // get parent properties
@@ -206,24 +206,12 @@ Json::Value QtHtmlReader::JsonValue() {
}
// Load JSON string into this object
-void QtHtmlReader::SetJson(std::string value) {
+void QtHtmlReader::SetJson(const std::string value) {
// Parse JSON string into JSON objects
- Json::Value root;
- Json::CharReaderBuilder rbuilder;
- Json::CharReader* reader(rbuilder.newCharReader());
-
- std::string errors;
- bool success = reader->parse( value.c_str(),
- value.c_str() + value.size(), &root, &errors );
- delete reader;
-
- if (!success)
- // Raise exception
- throw InvalidJSON("JSON could not be parsed (or is invalid)");
-
try
{
+ const Json::Value root = openshot::stringToJson(value);
// Set all values that match
SetJsonValue(root);
}
@@ -234,8 +222,8 @@ void QtHtmlReader::SetJson(std::string value) {
}
}
-// Load Json::JsonValue into this object
-void QtHtmlReader::SetJsonValue(Json::Value root) {
+// Load Json::Value into this object
+void QtHtmlReader::SetJsonValue(const Json::Value root) {
// Set parent data
ReaderBase::SetJsonValue(root);
diff --git a/src/QtImageReader.cpp b/src/QtImageReader.cpp
index 3e51d769..864af23d 100644
--- a/src/QtImageReader.cpp
+++ b/src/QtImageReader.cpp
@@ -269,14 +269,14 @@ std::shared_ptr QtImageReader::GetFrame(int64_t requested_frame)
}
// Generate JSON string of this object
-std::string QtImageReader::Json() {
+std::string QtImageReader::Json() const {
// Return formatted string
return JsonValue().toStyledString();
}
-// Generate Json::JsonValue for this object
-Json::Value QtImageReader::JsonValue() {
+// Generate Json::Value for this object
+Json::Value QtImageReader::JsonValue() const {
// Create root json object
Json::Value root = ReaderBase::JsonValue(); // get parent properties
@@ -288,24 +288,12 @@ Json::Value QtImageReader::JsonValue() {
}
// Load JSON string into this object
-void QtImageReader::SetJson(std::string value) {
+void QtImageReader::SetJson(const std::string value) {
// Parse JSON string into JSON objects
- Json::Value root;
- Json::CharReaderBuilder rbuilder;
- Json::CharReader* reader(rbuilder.newCharReader());
-
- std::string errors;
- bool success = reader->parse( value.c_str(),
- value.c_str() + value.size(), &root, &errors );
- delete reader;
-
- if (!success)
- // Raise exception
- throw InvalidJSON("JSON could not be parsed (or is invalid)");
-
try
{
+ const Json::Value root = openshot::stringToJson(value);
// Set all values that match
SetJsonValue(root);
}
@@ -316,8 +304,8 @@ void QtImageReader::SetJson(std::string value) {
}
}
-// Load Json::JsonValue into this object
-void QtImageReader::SetJsonValue(Json::Value root) {
+// Load Json::Value into this object
+void QtImageReader::SetJsonValue(const Json::Value root) {
// Set parent data
ReaderBase::SetJsonValue(root);
diff --git a/src/QtTextReader.cpp b/src/QtTextReader.cpp
index ee0c598a..d91d164e 100644
--- a/src/QtTextReader.cpp
+++ b/src/QtTextReader.cpp
@@ -197,14 +197,14 @@ std::shared_ptr QtTextReader::GetFrame(int64_t requested_frame)
}
// Generate JSON string of this object
-std::string QtTextReader::Json() {
+std::string QtTextReader::Json() const {
// Return formatted string
return JsonValue().toStyledString();
}
-// Generate Json::JsonValue for this object
-Json::Value QtTextReader::JsonValue() {
+// Generate Json::Value for this object
+Json::Value QtTextReader::JsonValue() const {
// Create root json object
Json::Value root = ReaderBase::JsonValue(); // get parent properties
@@ -225,24 +225,12 @@ Json::Value QtTextReader::JsonValue() {
}
// Load JSON string into this object
-void QtTextReader::SetJson(std::string value) {
+void QtTextReader::SetJson(const std::string value) {
// Parse JSON string into JSON objects
- Json::Value root;
- Json::CharReaderBuilder rbuilder;
- Json::CharReader* reader(rbuilder.newCharReader());
-
- std::string errors;
- bool success = reader->parse( value.c_str(),
- value.c_str() + value.size(), &root, &errors );
- delete reader;
-
- if (!success)
- // Raise exception
- throw InvalidJSON("JSON could not be parsed (or is invalid)");
-
try
{
+ const Json::Value root = openshot::stringToJson(value);
// Set all values that match
SetJsonValue(root);
}
@@ -253,8 +241,8 @@ void QtTextReader::SetJson(std::string value) {
}
}
-// Load Json::JsonValue into this object
-void QtTextReader::SetJsonValue(Json::Value root) {
+// Load Json::Value into this object
+void QtTextReader::SetJsonValue(const Json::Value root) {
// Set parent data
ReaderBase::SetJsonValue(root);
diff --git a/src/ReaderBase.cpp b/src/ReaderBase.cpp
index f4c377c5..474dc624 100644
--- a/src/ReaderBase.cpp
+++ b/src/ReaderBase.cpp
@@ -112,8 +112,8 @@ void ReaderBase::DisplayInfo() {
std::cout << "--> " << it.first << ": " << it.second << std::endl;
}
-// Generate Json::JsonValue for this object
-Json::Value ReaderBase::JsonValue() {
+// Generate Json::Value for this object
+Json::Value ReaderBase::JsonValue() const {
// Create root json object
Json::Value root;
@@ -159,15 +159,16 @@ Json::Value ReaderBase::JsonValue() {
// Append metadata map
root["metadata"] = Json::Value(Json::objectValue);
- for (auto it : info.metadata)
+
+ for (const auto it : info.metadata)
root["metadata"][it.first] = it.second;
// return JsonValue
return root;
}
-// Load Json::JsonValue into this object
-void ReaderBase::SetJsonValue(Json::Value root) {
+// Load Json::Value into this object
+void ReaderBase::SetJsonValue(const Json::Value root) {
// Set data from Json (if key is found)
if (!root["has_video"].isNull())
@@ -242,7 +243,7 @@ void ReaderBase::SetJsonValue(Json::Value root) {
info.audio_timebase.den = root["audio_timebase"]["den"].asInt();
}
if (!root["metadata"].isNull() && root["metadata"].isObject()) {
- for( Json::Value::iterator itr = root["metadata"].begin() ; itr != root["metadata"].end() ; itr++ ) {
+ for( Json::Value::const_iterator itr = root["metadata"].begin() ; itr != root["metadata"].end() ; itr++ ) {
std::string key = itr.key().asString();
info.metadata[key] = root["metadata"][key].asString();
}
diff --git a/src/TextReader.cpp b/src/TextReader.cpp
index 1983b104..e317700c 100644
--- a/src/TextReader.cpp
+++ b/src/TextReader.cpp
@@ -187,14 +187,14 @@ std::shared_ptr TextReader::GetFrame(int64_t requested_frame)
}
// Generate JSON string of this object
-std::string TextReader::Json() {
+std::string TextReader::Json() const {
// Return formatted string
return JsonValue().toStyledString();
}
-// Generate Json::JsonValue for this object
-Json::Value TextReader::JsonValue() {
+// Generate Json::Value for this object
+Json::Value TextReader::JsonValue() const {
// Create root json object
Json::Value root = ReaderBase::JsonValue(); // get parent properties
@@ -216,24 +216,10 @@ Json::Value TextReader::JsonValue() {
}
// Load JSON string into this object
-void TextReader::SetJson(std::string value) {
-
- // Parse JSON string into JSON objects
- Json::Value root;
- Json::CharReaderBuilder rbuilder;
- Json::CharReader* reader(rbuilder.newCharReader());
-
- std::string errors;
- bool success = reader->parse( value.c_str(),
- value.c_str() + value.size(), &root, &errors );
- delete reader;
-
- if (!success)
- // Raise exception
- throw InvalidJSON("JSON could not be parsed (or is invalid)");
-
+void TextReader::SetJson(const std::string value) {
try
{
+ Json::Value root = openshot::stringToJson(value);
// Set all values that match
SetJsonValue(root);
}
@@ -244,8 +230,8 @@ void TextReader::SetJson(std::string value) {
}
}
-// Load Json::JsonValue into this object
-void TextReader::SetJsonValue(Json::Value root) {
+// Load Json::Value into this object
+void TextReader::SetJsonValue(const Json::Value root) {
// Set parent data
ReaderBase::SetJsonValue(root);
diff --git a/src/Timeline.cpp b/src/Timeline.cpp
index c54e54ff..b5a33920 100644
--- a/src/Timeline.cpp
+++ b/src/Timeline.cpp
@@ -968,14 +968,14 @@ void Timeline::SetCache(CacheBase* new_cache) {
}
// Generate JSON string of this object
-std::string Timeline::Json() {
+std::string Timeline::Json() const {
// Return formatted string
return JsonValue().toStyledString();
}
-// Generate Json::JsonValue for this object
-Json::Value Timeline::JsonValue() {
+// Generate Json::Value for this object
+Json::Value Timeline::JsonValue() const {
// Create root json object
Json::Value root = ReaderBase::JsonValue(); // get parent properties
@@ -989,7 +989,7 @@ Json::Value Timeline::JsonValue() {
root["clips"] = Json::Value(Json::arrayValue);
// Find Clips at this time
- for (auto existing_clip : clips)
+ for (const auto existing_clip : clips)
{
root["clips"].append(existing_clip->JsonValue());
}
@@ -998,7 +998,7 @@ Json::Value Timeline::JsonValue() {
root["effects"] = Json::Value(Json::arrayValue);
// loop through effects
- for (auto existing_effect: effects)
+ for (const auto existing_effect: effects)
{
root["effects"].append(existing_effect->JsonValue());
}
@@ -1008,27 +1008,15 @@ Json::Value Timeline::JsonValue() {
}
// Load JSON string into this object
-void Timeline::SetJson(std::string value) {
+void Timeline::SetJson(const std::string value) {
// Get lock (prevent getting frames while this happens)
const GenericScopedLock lock(getFrameCriticalSection);
// Parse JSON string into JSON objects
- Json::Value root;
- Json::CharReaderBuilder rbuilder;
- Json::CharReader* reader(rbuilder.newCharReader());
-
- std::string errors;
- bool success = reader->parse( value.c_str(),
- value.c_str() + value.size(), &root, &errors );
- delete reader;
-
- if (!success)
- // Raise exception
- throw InvalidJSON("JSON could not be parsed (or is invalid)");
-
try
{
+ const Json::Value root = openshot::stringToJson(value);
// Set all values that match
SetJsonValue(root);
}
@@ -1039,8 +1027,8 @@ void Timeline::SetJson(std::string value) {
}
}
-// Load Json::JsonValue into this object
-void Timeline::SetJsonValue(Json::Value root) {
+// Load Json::Value into this object
+void Timeline::SetJsonValue(const Json::Value root) {
// Close timeline before we do anything (this also removes all open and closing clips)
bool was_open = is_open;
@@ -1107,21 +1095,9 @@ void Timeline::ApplyJsonDiff(std::string value) {
const GenericScopedLock lock(getFrameCriticalSection);
// Parse JSON string into JSON objects
- Json::Value root;
- Json::CharReaderBuilder rbuilder;
- Json::CharReader* reader(rbuilder.newCharReader());
-
- std::string errors;
- bool success = reader->parse( value.c_str(),
- value.c_str() + value.size(), &root, &errors );
- delete reader;
-
- if (!success || !root.isArray())
- // Raise exception
- throw InvalidJSON("JSON could not be parsed (or is invalid).");
-
try
{
+ const Json::Value root = openshot::stringToJson(value);
// Process the JSON change array, loop through each item
for (const Json::Value change : root) {
std::string change_key = change["key"][(uint)0].asString();
diff --git a/src/WriterBase.cpp b/src/WriterBase.cpp
index 72b86b61..38821917 100644
--- a/src/WriterBase.cpp
+++ b/src/WriterBase.cpp
@@ -139,14 +139,14 @@ void WriterBase::DisplayInfo() {
}
// Generate JSON string of this object
-std::string WriterBase::Json() {
+std::string WriterBase::Json() const {
// Return formatted string
return JsonValue().toStyledString();
}
-// Generate Json::JsonValue for this object
-Json::Value WriterBase::JsonValue() {
+// Generate Json::Value for this object
+Json::Value WriterBase::JsonValue() const {
// Create root json object
Json::Value root;
@@ -195,24 +195,12 @@ Json::Value WriterBase::JsonValue() {
}
// Load JSON string into this object
-void WriterBase::SetJson(std::string value) {
+void WriterBase::SetJson(const std::string value) {
// Parse JSON string into JSON objects
- Json::Value root;
- Json::CharReaderBuilder rbuilder;
- Json::CharReader* reader(rbuilder.newCharReader());
-
- std::string errors;
- bool success = reader->parse( value.c_str(),
- value.c_str() + value.size(), &root, &errors );
- delete reader;
-
- if (!success)
- // Raise exception
- throw InvalidJSON("JSON could not be parsed (or is invalid)");
-
try
{
+ const Json::Value root = openshot::stringToJson(value);
// Set all values that match
SetJsonValue(root);
}
@@ -223,8 +211,8 @@ void WriterBase::SetJson(std::string value) {
}
}
-// Load Json::JsonValue into this object
-void WriterBase::SetJsonValue(Json::Value root) {
+// Load Json::Value into this object
+void WriterBase::SetJsonValue(const Json::Value root) {
// Set data from Json (if key is found)
if (!root["has_video"].isNull())
diff --git a/src/effects/Bars.cpp b/src/effects/Bars.cpp
index fcb684e3..3f9aac34 100644
--- a/src/effects/Bars.cpp
+++ b/src/effects/Bars.cpp
@@ -114,14 +114,14 @@ std::shared_ptr Bars::GetFrame(std::shared_ptr frame, int64_t fram
}
// Generate JSON string of this object
-std::string Bars::Json() {
+std::string Bars::Json() const {
// Return formatted string
return JsonValue().toStyledString();
}
-// Generate Json::JsonValue for this object
-Json::Value Bars::JsonValue() {
+// Generate Json::Value for this object
+Json::Value Bars::JsonValue() const {
// Create root json object
Json::Value root = EffectBase::JsonValue(); // get parent properties
@@ -137,24 +137,12 @@ Json::Value Bars::JsonValue() {
}
// Load JSON string into this object
-void Bars::SetJson(std::string value) {
+void Bars::SetJson(const std::string value) {
// Parse JSON string into JSON objects
- Json::Value root;
- Json::CharReaderBuilder rbuilder;
- Json::CharReader* reader(rbuilder.newCharReader());
-
- std::string errors;
- bool success = reader->parse( value.c_str(),
- value.c_str() + value.size(), &root, &errors );
- delete reader;
-
- if (!success)
- // Raise exception
- throw InvalidJSON("JSON could not be parsed (or is invalid)");
-
try
{
+ const Json::Value root = openshot::stringToJson(value);
// Set all values that match
SetJsonValue(root);
}
@@ -165,8 +153,8 @@ void Bars::SetJson(std::string value) {
}
}
-// Load Json::JsonValue into this object
-void Bars::SetJsonValue(Json::Value root) {
+// Load Json::Value into this object
+void Bars::SetJsonValue(const Json::Value root) {
// Set parent data
EffectBase::SetJsonValue(root);
@@ -185,7 +173,7 @@ void Bars::SetJsonValue(Json::Value root) {
}
// Get all properties for a specific frame
-std::string Bars::PropertiesJSON(int64_t requested_frame) {
+std::string Bars::PropertiesJSON(int64_t requested_frame) const {
// Generate JSON properties list
Json::Value root;
diff --git a/src/effects/Blur.cpp b/src/effects/Blur.cpp
index e0315fda..6ddba88e 100644
--- a/src/effects/Blur.cpp
+++ b/src/effects/Blur.cpp
@@ -74,192 +74,109 @@ std::shared_ptr Blur::GetFrame(std::shared_ptr frame, int64_t fram
float sigma_value = sigma.GetValue(frame_number);
int iteration_value = iterations.GetInt(frame_number);
+ int w = frame_image->width();
+ int h = frame_image->height();
- // Declare arrays for each color channel
- unsigned char *red = new unsigned char[frame_image->width() * frame_image->height()]();
- unsigned char *green = new unsigned char[frame_image->width() * frame_image->height()]();
- unsigned char *blue = new unsigned char[frame_image->width() * frame_image->height()]();
- unsigned char *alpha = new unsigned char[frame_image->width() * frame_image->height()]();
- // Create empty target RGBA arrays (for the results of our blur)
- unsigned char *blur_red = new unsigned char[frame_image->width() * frame_image->height()]();
- unsigned char *blur_green = new unsigned char[frame_image->width() * frame_image->height()]();
- unsigned char *blur_blue = new unsigned char[frame_image->width() * frame_image->height()]();
- unsigned char *blur_alpha = new unsigned char[frame_image->width() * frame_image->height()]();
-
- // Loop through pixels and split RGBA channels into separate arrays
- unsigned char *pixels = (unsigned char *) frame_image->bits();
- for (int pixel = 0, byte_index=0; pixel < frame_image->width() * frame_image->height(); pixel++, byte_index+=4)
- {
- // Get the RGBA values from each pixel
- unsigned char R = pixels[byte_index];
- unsigned char G = pixels[byte_index + 1];
- unsigned char B = pixels[byte_index + 2];
- unsigned char A = pixels[byte_index + 3];
-
- // Split channels into their own arrays
- red[pixel] = R;
- green[pixel] = G;
- blue[pixel] = B;
- alpha[pixel] = A;
- }
-
- // Init target RGBA arrays
- for (int i = 0; i < (frame_image->width() * frame_image->height()); i++) blur_red[i] = red[i];
- for (int i = 0; i < (frame_image->width() * frame_image->height()); i++) blur_green[i] = green[i];
- for (int i = 0; i < (frame_image->width() * frame_image->height()); i++) blur_blue[i] = blue[i];
- for (int i = 0; i < (frame_image->width() * frame_image->height()); i++) blur_alpha[i] = alpha[i];
+ // Grab two copies of the image pixel data
+ QImage image_copy = frame_image->copy();
+ std::shared_ptr frame_image_2 = std::make_shared(image_copy);
// Loop through each iteration
- for (int iteration = 0; iteration < iteration_value; iteration++)
+ for (int iteration = 0; iteration < iteration_value; ++iteration)
{
// HORIZONTAL BLUR (if any)
if (horizontal_radius_value > 0.0) {
- // Init boxes for computing blur
- int *bxs = initBoxes(sigma_value, horizontal_radius_value);
-
// Apply horizontal blur to target RGBA channels
- boxBlurH(red, blur_red, frame_image->width(), frame_image->height(), horizontal_radius_value);
- boxBlurH(green, blur_green, frame_image->width(), frame_image->height(), horizontal_radius_value);
- boxBlurH(blue, blur_blue, frame_image->width(), frame_image->height(), horizontal_radius_value);
- boxBlurH(alpha, blur_alpha, frame_image->width(), frame_image->height(), horizontal_radius_value);
+ boxBlurH(frame_image->bits(), frame_image_2->bits(), w, h, horizontal_radius_value);
- // Remove boxes
- delete[] bxs;
-
- // Copy blur_ back to for vertical blur or next iteration
- for (int i = 0; i < (frame_image->width() * frame_image->height()); i++) red[i] = blur_red[i];
- for (int i = 0; i < (frame_image->width() * frame_image->height()); i++) green[i] = blur_green[i];
- for (int i = 0; i < (frame_image->width() * frame_image->height()); i++) blue[i] = blur_blue[i];
- for (int i = 0; i < (frame_image->width() * frame_image->height()); i++) alpha[i] = blur_alpha[i];
+ // Swap output image back to input
+ frame_image.swap(frame_image_2);
}
// VERTICAL BLUR (if any)
if (vertical_radius_value > 0.0) {
- // Init boxes for computing blur
- int *bxs = initBoxes(sigma_value, vertical_radius_value);
-
// Apply vertical blur to target RGBA channels
- boxBlurT(red, blur_red, frame_image->width(), frame_image->height(), vertical_radius_value);
- boxBlurT(green, blur_green, frame_image->width(), frame_image->height(), vertical_radius_value);
- boxBlurT(blue, blur_blue, frame_image->width(), frame_image->height(), vertical_radius_value);
- boxBlurT(alpha, blur_alpha, frame_image->width(), frame_image->height(), vertical_radius_value);
+ boxBlurT(frame_image->bits(), frame_image_2->bits(), w, h, vertical_radius_value);
- // Remove boxes
- delete[] bxs;
-
- // Copy blur_ back to for vertical blur or next iteration
- for (int i = 0; i < (frame_image->width() * frame_image->height()); i++) red[i] = blur_red[i];
- for (int i = 0; i < (frame_image->width() * frame_image->height()); i++) green[i] = blur_green[i];
- for (int i = 0; i < (frame_image->width() * frame_image->height()); i++) blue[i] = blur_blue[i];
- for (int i = 0; i < (frame_image->width() * frame_image->height()); i++) alpha[i] = blur_alpha[i];
+ // Swap output image back to input
+ frame_image.swap(frame_image_2);
}
}
- // Copy RGBA channels back to original image
- for (int pixel = 0, byte_index=0; pixel < frame_image->width() * frame_image->height(); pixel++, byte_index+=4)
- {
- // Get the RGB values from the pixel
- unsigned char R = blur_red[pixel];
- unsigned char G = blur_green[pixel];
- unsigned char B = blur_blue[pixel];
- unsigned char A = blur_alpha[pixel];
-
- // Split channels into their own arrays
- pixels[byte_index] = R;
- pixels[byte_index + 1] = G;
- pixels[byte_index + 2] = B;
- pixels[byte_index + 3] = A;
- }
-
- // Delete channel arrays
- delete[] red;
- delete[] green;
- delete[] blue;
- delete[] alpha;
- delete[] blur_red;
- delete[] blur_green;
- delete[] blur_blue;
- delete[] blur_alpha;
-
// return the modified frame
return frame;
}
// Credit: http://blog.ivank.net/fastest-gaussian-blur.html (MIT License)
-int* Blur::initBoxes(float sigma, int n) // standard deviation, number of boxes
-{
- float wIdeal = sqrt((12.0 * sigma * sigma / n) + 1.0); // Ideal averaging filter width
- int wl = floor(wIdeal);
- if (wl % 2 == 0) wl--;
- int wu = wl + 2;
-
- float mIdeal = (12.0 * sigma * sigma - n * wl * wl - 4 * n * wl - 3 * n) / (-4.0 * wl - 4);
- int m = round(mIdeal);
-
- int *sizes = new int[n]();
- for (int i = 0; i < n; i++) sizes[i] = i < m ? wl : wu;
- return sizes;
-}
-
-// Credit: http://blog.ivank.net/fastest-gaussian-blur.html (MIT License)
+// Modified to process all four channels in a pixel array
void Blur::boxBlurH(unsigned char *scl, unsigned char *tcl, int w, int h, int r) {
float iarr = 1.0 / (r + r + 1);
- for (int i = 0; i < h; i++) {
- int ti = i * w, li = ti, ri = ti + r;
- int fv = scl[ti], lv = scl[ti + w - 1], val = (r + 1) * fv;
- for (int j = 0; j < r; j++) val += scl[ti + j];
- for (int j = 0; j <= r; j++) {
- val += scl[ri++] - fv;
- tcl[ti++] = round(val * iarr);
- }
- for (int j = r + 1; j < w - r; j++) {
- val += scl[ri++] - scl[li++];
- tcl[ti++] = round(val * iarr);
- }
- for (int j = w - r; j < w; j++) {
- val += lv - scl[li++];
- tcl[ti++] = round(val * iarr);
+
+ #pragma omp parallel for shared (scl, tcl)
+ for (int i = 0; i < h; ++i) {
+ for (int ch = 0; ch < 4; ++ch) {
+ int ti = i * w, li = ti, ri = ti + r;
+ int fv = scl[ti * 4 + ch], lv = scl[(ti + w - 1) * 4 + ch], val = (r + 1) * fv;
+ for (int j = 0; j < r; ++j) {
+ val += scl[(ti + j) * 4 + ch];
+ }
+ for (int j = 0; j <= r; ++j) {
+ val += scl[ri++ * 4 + ch] - fv;
+ tcl[ti++ * 4 + ch] = round(val * iarr);
+ }
+ for (int j = r + 1; j < w - r; ++j) {
+ val += scl[ri++ * 4 + ch] - scl[li++ * 4 + ch];
+ tcl[ti++ * 4 + ch] = round(val * iarr);
+ }
+ for (int j = w - r; j < w; ++j) {
+ val += lv - scl[li++ * 4 + ch];
+ tcl[ti++ * 4 + ch] = round(val * iarr);
+ }
}
}
}
void Blur::boxBlurT(unsigned char *scl, unsigned char *tcl, int w, int h, int r) {
float iarr = 1.0 / (r + r + 1);
+
+ #pragma omp parallel for shared (scl, tcl)
for (int i = 0; i < w; i++) {
- int ti = i, li = ti, ri = ti + r * w;
- int fv = scl[ti], lv = scl[ti + w * (h - 1)], val = (r + 1) * fv;
- for (int j = 0; j < r; j++) val += scl[ti + j * w];
- for (int j = 0; j <= r; j++) {
- val += scl[ri] - fv;
- tcl[ti] = round(val * iarr);
- ri += w;
- ti += w;
- }
- for (int j = r + 1; j < h - r; j++) {
- val += scl[ri] - scl[li];
- tcl[ti] = round(val * iarr);
- li += w;
- ri += w;
- ti += w;
- }
- for (int j = h - r; j < h; j++) {
- val += lv - scl[li];
- tcl[ti] = round(val * iarr);
- li += w;
- ti += w;
+ for (int ch = 0; ch < 4; ++ch) {
+ int ti = i, li = ti, ri = ti + r * w;
+ int fv = scl[ti * 4 + ch], lv = scl[(ti + w * (h - 1)) * 4 + ch], val = (r + 1) * fv;
+ for (int j = 0; j < r; j++) val += scl[(ti + j * w) * 4 + ch];
+ for (int j = 0; j <= r; j++) {
+ val += scl[ri * 4 + ch] - fv;
+ tcl[ti * 4 + ch] = round(val * iarr);
+ ri += w;
+ ti += w;
+ }
+ for (int j = r + 1; j < h - r; j++) {
+ val += scl[ri * 4 + ch] - scl[li * 4 + ch];
+ tcl[ti * 4 + ch] = round(val * iarr);
+ li += w;
+ ri += w;
+ ti += w;
+ }
+ for (int j = h - r; j < h; j++) {
+ val += lv - scl[li * 4 + ch];
+ tcl[ti * 4 + ch] = round(val * iarr);
+ li += w;
+ ti += w;
+ }
}
}
}
// Generate JSON string of this object
-std::string Blur::Json() {
+std::string Blur::Json() const {
// Return formatted string
return JsonValue().toStyledString();
}
-// Generate Json::JsonValue for this object
-Json::Value Blur::JsonValue() {
+// Generate Json::Value for this object
+Json::Value Blur::JsonValue() const {
// Create root json object
Json::Value root = EffectBase::JsonValue(); // get parent properties
@@ -274,24 +191,12 @@ Json::Value Blur::JsonValue() {
}
// Load JSON string into this object
-void Blur::SetJson(std::string value) {
+void Blur::SetJson(const std::string value) {
// Parse JSON string into JSON objects
- Json::Value root;
- Json::CharReaderBuilder rbuilder;
- Json::CharReader* reader(rbuilder.newCharReader());
-
- std::string errors;
- bool success = reader->parse( value.c_str(),
- value.c_str() + value.size(), &root, &errors );
- delete reader;
-
- if (!success)
- // Raise exception
- throw InvalidJSON("JSON could not be parsed (or is invalid)");
-
try
{
+ const Json::Value root = openshot::stringToJson(value);
// Set all values that match
SetJsonValue(root);
}
@@ -302,8 +207,8 @@ void Blur::SetJson(std::string value) {
}
}
-// Load Json::JsonValue into this object
-void Blur::SetJsonValue(Json::Value root) {
+// Load Json::Value into this object
+void Blur::SetJsonValue(const Json::Value root) {
// Set parent data
EffectBase::SetJsonValue(root);
@@ -320,7 +225,7 @@ void Blur::SetJsonValue(Json::Value root) {
}
// Get all properties for a specific frame
-std::string Blur::PropertiesJSON(int64_t requested_frame) {
+std::string Blur::PropertiesJSON(int64_t requested_frame) const {
// Generate JSON properties list
Json::Value root;
diff --git a/src/effects/Brightness.cpp b/src/effects/Brightness.cpp
index b8113b87..321a19a7 100644
--- a/src/effects/Brightness.cpp
+++ b/src/effects/Brightness.cpp
@@ -72,35 +72,24 @@ std::shared_ptr Brightness::GetFrame(std::shared_ptr frame, int64_
// Loop through pixels
unsigned char *pixels = (unsigned char *) frame_image->bits();
- for (int pixel = 0, byte_index=0; pixel < frame_image->width() * frame_image->height(); pixel++, byte_index+=4)
+ int pixel_count = frame_image->width() * frame_image->height();
+
+ #pragma omp parallel for
+ for (int pixel = 0; pixel < pixel_count; ++pixel)
{
- // Get the RGB values from the pixel
- int R = pixels[byte_index];
- int G = pixels[byte_index + 1];
- int B = pixels[byte_index + 2];
- int A = pixels[byte_index + 3];
-
- // Adjust the contrast
+ // Compute contrast adjustment factor
float factor = (259 * (contrast_value + 255)) / (255 * (259 - contrast_value));
- R = constrain((factor * (R - 128)) + 128);
- G = constrain((factor * (G - 128)) + 128);
- B = constrain((factor * (B - 128)) + 128);
- // Adjust the brightness
- R += (255 * brightness_value);
- G += (255 * brightness_value);
- B += (255 * brightness_value);
+ // Get RGB pixels from image and apply constrained contrast adjustment
+ int R = constrain((factor * (pixels[pixel * 4] - 128)) + 128);
+ int G = constrain((factor * (pixels[pixel * 4 + 1] - 128)) + 128);
+ int B = constrain((factor * (pixels[pixel * 4 + 2] - 128)) + 128);
+ // (Don't modify Alpha value)
- // Constrain the value from 0 to 255
- R = constrain(R);
- G = constrain(G);
- B = constrain(B);
-
- // Set all pixels to new value
- pixels[byte_index] = R;
- pixels[byte_index + 1] = G;
- pixels[byte_index + 2] = B;
- pixels[byte_index + 3] = A; // leave the alpha value alone
+ // Adjust brightness and write constrained values back to image
+ pixels[pixel * 4] = constrain(R + (255 * brightness_value));
+ pixels[pixel * 4 + 1] = constrain(G + (255 * brightness_value));
+ pixels[pixel * 4 + 2] = constrain(B + (255 * brightness_value));
}
// return the modified frame
@@ -108,14 +97,14 @@ std::shared_ptr Brightness::GetFrame(std::shared_ptr frame, int64_
}
// Generate JSON string of this object
-std::string Brightness::Json() {
+std::string Brightness::Json() const {
// Return formatted string
return JsonValue().toStyledString();
}
-// Generate Json::JsonValue for this object
-Json::Value Brightness::JsonValue() {
+// Generate Json::Value for this object
+Json::Value Brightness::JsonValue() const {
// Create root json object
Json::Value root = EffectBase::JsonValue(); // get parent properties
@@ -128,24 +117,12 @@ Json::Value Brightness::JsonValue() {
}
// Load JSON string into this object
-void Brightness::SetJson(std::string value) {
+void Brightness::SetJson(const std::string value) {
// Parse JSON string into JSON objects
- Json::Value root;
- Json::CharReaderBuilder rbuilder;
- Json::CharReader* reader(rbuilder.newCharReader());
-
- std::string errors;
- bool success = reader->parse( value.c_str(),
- value.c_str() + value.size(), &root, &errors );
- delete reader;
-
- if (!success)
- // Raise exception
- throw InvalidJSON("JSON could not be parsed (or is invalid)");
-
try
{
+ const Json::Value root = openshot::stringToJson(value);
// Set all values that match
SetJsonValue(root);
}
@@ -156,8 +133,8 @@ void Brightness::SetJson(std::string value) {
}
}
-// Load Json::JsonValue into this object
-void Brightness::SetJsonValue(Json::Value root) {
+// Load Json::Value into this object
+void Brightness::SetJsonValue(const Json::Value root) {
// Set parent data
EffectBase::SetJsonValue(root);
@@ -170,7 +147,7 @@ void Brightness::SetJsonValue(Json::Value root) {
}
// Get all properties for a specific frame
-std::string Brightness::PropertiesJSON(int64_t requested_frame) {
+std::string Brightness::PropertiesJSON(int64_t requested_frame) const {
// Generate JSON properties list
Json::Value root;
diff --git a/src/effects/ChromaKey.cpp b/src/effects/ChromaKey.cpp
index 30c4dfce..dbb56a69 100644
--- a/src/effects/ChromaKey.cpp
+++ b/src/effects/ChromaKey.cpp
@@ -101,14 +101,14 @@ std::shared_ptr ChromaKey::GetFrame(std::shared_ptr frame, int64_t
}
// Generate JSON string of this object
-std::string ChromaKey::Json() {
+std::string ChromaKey::Json() const {
// Return formatted string
return JsonValue().toStyledString();
}
-// Generate Json::JsonValue for this object
-Json::Value ChromaKey::JsonValue() {
+// Generate Json::Value for this object
+Json::Value ChromaKey::JsonValue() const {
// Create root json object
Json::Value root = EffectBase::JsonValue(); // get parent properties
@@ -121,24 +121,12 @@ Json::Value ChromaKey::JsonValue() {
}
// Load JSON string into this object
-void ChromaKey::SetJson(std::string value) {
+void ChromaKey::SetJson(const std::string value) {
// Parse JSON string into JSON objects
- Json::Value root;
- Json::CharReaderBuilder rbuilder;
- Json::CharReader* reader(rbuilder.newCharReader());
-
- std::string errors;
- bool success = reader->parse( value.c_str(),
- value.c_str() + value.size(), &root, &errors );
- delete reader;
-
- if (!success)
- // Raise exception
- throw InvalidJSON("JSON could not be parsed (or is invalid)");
-
try
{
+ const Json::Value root = openshot::stringToJson(value);
// Set all values that match
SetJsonValue(root);
}
@@ -149,8 +137,8 @@ void ChromaKey::SetJson(std::string value) {
}
}
-// Load Json::JsonValue into this object
-void ChromaKey::SetJsonValue(Json::Value root) {
+// Load Json::Value into this object
+void ChromaKey::SetJsonValue(const Json::Value root) {
// Set parent data
EffectBase::SetJsonValue(root);
@@ -163,7 +151,7 @@ void ChromaKey::SetJsonValue(Json::Value root) {
}
// Get all properties for a specific frame
-std::string ChromaKey::PropertiesJSON(int64_t requested_frame) {
+std::string ChromaKey::PropertiesJSON(int64_t requested_frame) const {
// Generate JSON properties list
Json::Value root;
diff --git a/src/effects/ColorShift.cpp b/src/effects/ColorShift.cpp
index 4fc9c941..2a7a26d7 100644
--- a/src/effects/ColorShift.cpp
+++ b/src/effects/ColorShift.cpp
@@ -33,7 +33,7 @@
using namespace openshot;
/// Blank constructor, useful when using Json to load the effect properties
-ColorShift::ColorShift() : red_x(-0.05), red_y(0.0), green_x(0.05), green_y(0.0), blue_x(0.0), blue_y(0.0), alpha_x(0.0), alpha_y(0.0) {
+ColorShift::ColorShift() : red_x(0.0), red_y(0.0), green_x(0.0), green_y(0.0), blue_x(0.0), blue_y(0.0), alpha_x(0.0), alpha_y(0.0) {
// Init effect properties
init_effect_details();
}
@@ -194,14 +194,14 @@ std::shared_ptr ColorShift::GetFrame(std::shared_ptr frame, int64_
}
// Generate JSON string of this object
-std::string ColorShift::Json() {
+std::string ColorShift::Json() const {
// Return formatted string
return JsonValue().toStyledString();
}
-// Generate Json::JsonValue for this object
-Json::Value ColorShift::JsonValue() {
+// Generate Json::Value for this object
+Json::Value ColorShift::JsonValue() const {
// Create root json object
Json::Value root = EffectBase::JsonValue(); // get parent properties
@@ -220,24 +220,12 @@ Json::Value ColorShift::JsonValue() {
}
// Load JSON string into this object
-void ColorShift::SetJson(std::string value) {
+void ColorShift::SetJson(const std::string value) {
// Parse JSON string into JSON objects
- Json::Value root;
- Json::CharReaderBuilder rbuilder;
- Json::CharReader* reader(rbuilder.newCharReader());
-
- std::string errors;
- bool success = reader->parse( value.c_str(),
- value.c_str() + value.size(), &root, &errors );
- delete reader;
-
- if (!success)
- // Raise exception
- throw InvalidJSON("JSON could not be parsed (or is invalid)");
-
try
{
+ const Json::Value root = openshot::stringToJson(value);
// Set all values that match
SetJsonValue(root);
}
@@ -248,8 +236,8 @@ void ColorShift::SetJson(std::string value) {
}
}
-// Load Json::JsonValue into this object
-void ColorShift::SetJsonValue(Json::Value root) {
+// Load Json::Value into this object
+void ColorShift::SetJsonValue(const Json::Value root) {
// Set parent data
EffectBase::SetJsonValue(root);
@@ -274,7 +262,7 @@ void ColorShift::SetJsonValue(Json::Value root) {
}
// Get all properties for a specific frame
-std::string ColorShift::PropertiesJSON(int64_t requested_frame) {
+std::string ColorShift::PropertiesJSON(int64_t requested_frame) const {
// Generate JSON properties list
Json::Value root;
diff --git a/src/effects/Crop.cpp b/src/effects/Crop.cpp
index 8a4afa5e..b1c3d38d 100644
--- a/src/effects/Crop.cpp
+++ b/src/effects/Crop.cpp
@@ -114,14 +114,14 @@ std::shared_ptr Crop::GetFrame(std::shared_ptr frame, int64_t fram
}
// Generate JSON string of this object
-std::string Crop::Json() {
+std::string Crop::Json() const {
// Return formatted string
return JsonValue().toStyledString();
}
-// Generate Json::JsonValue for this object
-Json::Value Crop::JsonValue() {
+// Generate Json::Value for this object
+Json::Value Crop::JsonValue() const {
// Create root json object
Json::Value root = EffectBase::JsonValue(); // get parent properties
@@ -136,24 +136,12 @@ Json::Value Crop::JsonValue() {
}
// Load JSON string into this object
-void Crop::SetJson(std::string value) {
+void Crop::SetJson(const std::string value) {
// Parse JSON string into JSON objects
- Json::Value root;
- Json::CharReaderBuilder rbuilder;
- Json::CharReader* reader(rbuilder.newCharReader());
-
- std::string errors;
- bool success = reader->parse( value.c_str(),
- value.c_str() + value.size(), &root, &errors );
- delete reader;
-
- if (!success)
- // Raise exception
- throw InvalidJSON("JSON could not be parsed (or is invalid)");
-
try
{
+ const Json::Value root = openshot::stringToJson(value);
// Set all values that match
SetJsonValue(root);
}
@@ -164,8 +152,8 @@ void Crop::SetJson(std::string value) {
}
}
-// Load Json::JsonValue into this object
-void Crop::SetJsonValue(Json::Value root) {
+// Load Json::Value into this object
+void Crop::SetJsonValue(const Json::Value root) {
// Set parent data
EffectBase::SetJsonValue(root);
@@ -182,7 +170,7 @@ void Crop::SetJsonValue(Json::Value root) {
}
// Get all properties for a specific frame
-std::string Crop::PropertiesJSON(int64_t requested_frame) {
+std::string Crop::PropertiesJSON(int64_t requested_frame) const {
// Generate JSON properties list
Json::Value root;
diff --git a/src/effects/Deinterlace.cpp b/src/effects/Deinterlace.cpp
index a78af931..39b3316a 100644
--- a/src/effects/Deinterlace.cpp
+++ b/src/effects/Deinterlace.cpp
@@ -96,14 +96,14 @@ std::shared_ptr Deinterlace::GetFrame(std::shared_ptr frame, int64
}
// Generate JSON string of this object
-std::string Deinterlace::Json() {
+std::string Deinterlace::Json() const {
// Return formatted string
return JsonValue().toStyledString();
}
-// Generate Json::JsonValue for this object
-Json::Value Deinterlace::JsonValue() {
+// Generate Json::Value for this object
+Json::Value Deinterlace::JsonValue() const {
// Create root json object
Json::Value root = EffectBase::JsonValue(); // get parent properties
@@ -115,24 +115,12 @@ Json::Value Deinterlace::JsonValue() {
}
// Load JSON string into this object
-void Deinterlace::SetJson(std::string value) {
+void Deinterlace::SetJson(const std::string value) {
// Parse JSON string into JSON objects
- Json::Value root;
- Json::CharReaderBuilder rbuilder;
- Json::CharReader* reader(rbuilder.newCharReader());
-
- std::string errors;
- bool success = reader->parse( value.c_str(),
- value.c_str() + value.size(), &root, &errors );
- delete reader;
-
- if (!success)
- // Raise exception
- throw InvalidJSON("JSON could not be parsed (or is invalid)");
-
try
{
+ const Json::Value root = openshot::stringToJson(value);
// Set all values that match
SetJsonValue(root);
}
@@ -143,8 +131,8 @@ void Deinterlace::SetJson(std::string value) {
}
}
-// Load Json::JsonValue into this object
-void Deinterlace::SetJsonValue(Json::Value root) {
+// Load Json::Value into this object
+void Deinterlace::SetJsonValue(const Json::Value root) {
// Set parent data
EffectBase::SetJsonValue(root);
@@ -155,7 +143,7 @@ void Deinterlace::SetJsonValue(Json::Value root) {
}
// Get all properties for a specific frame
-std::string Deinterlace::PropertiesJSON(int64_t requested_frame) {
+std::string Deinterlace::PropertiesJSON(int64_t requested_frame) const {
// Generate JSON properties list
Json::Value root;
diff --git a/src/effects/Hue.cpp b/src/effects/Hue.cpp
index 4083d035..eb4808e3 100644
--- a/src/effects/Hue.cpp
+++ b/src/effects/Hue.cpp
@@ -66,36 +66,35 @@ std::shared_ptr Hue::GetFrame(std::shared_ptr frame, int64_t frame
// Get the frame's image
std::shared_ptr frame_image = frame->GetImage();
+ int pixel_count = frame_image->width() * frame_image->height();
+
// Get the current hue percentage shift amount, and convert to degrees
double degrees = 360.0 * hue.GetValue(frame_number);
float cosA = cos(degrees*3.14159265f/180);
float sinA = sin(degrees*3.14159265f/180);
// Calculate a rotation matrix for the RGB colorspace (based on the current hue shift keyframe value)
- float matrix[3][3] = {{cosA + (1.0f - cosA) / 3.0f, 1.0f/3.0f * (1.0f - cosA) - sqrtf(1.0f/3.0f) * sinA, 1.0f/3.0f * (1.0f - cosA) + sqrtf(1.0f/3.0f) * sinA},
- {1.0f/3.0f * (1.0f - cosA) + sqrtf(1.0f/3.0f) * sinA, cosA + 1.0f/3.0f*(1.0f - cosA), 1.0f/3.0f * (1.0f - cosA) - sqrtf(1.0f/3.0f) * sinA},
- {1.0f/3.0f * (1.0f - cosA) - sqrtf(1.0f/3.0f) * sinA, 1.0f/3.0f * (1.0f - cosA) + sqrtf(1.0f/3.0f) * sinA, cosA + 1.0f/3.0f * (1.0f - cosA)}};
+ float matrix[3] = {
+ cosA + (1.0f - cosA) / 3.0f,
+ 1.0f/3.0f * (1.0f - cosA) - sqrtf(1.0f/3.0f) * sinA,
+ 1.0f/3.0f * (1.0f - cosA) + sqrtf(1.0f/3.0f) * sinA
+ };
// Loop through pixels
unsigned char *pixels = (unsigned char *) frame_image->bits();
- for (int pixel = 0, byte_index=0; pixel < frame_image->width() * frame_image->height(); pixel++, byte_index+=4)
+
+ #pragma omp parallel for shared (pixels)
+ for (int pixel = 0; pixel < pixel_count; ++pixel)
{
- // Get the RGB values from the pixel
- int R = pixels[byte_index];
- int G = pixels[byte_index + 1];
- int B = pixels[byte_index + 2];
- int A = pixels[byte_index + 3];
+ // Get the RGB values from the pixel (ignore the alpha channel)
+ int R = pixels[pixel * 4];
+ int G = pixels[pixel * 4 + 1];
+ int B = pixels[pixel * 4 + 2];
// Multiply each color by the hue rotation matrix
- float rx = constrain(R * matrix[0][0] + G * matrix[0][1] + B * matrix[0][2]);
- float gx = constrain(R * matrix[1][0] + G * matrix[1][1] + B * matrix[1][2]);
- float bx = constrain(R * matrix[2][0] + G * matrix[2][1] + B * matrix[2][2]);
-
- // Set all pixels to new value
- pixels[byte_index] = rx;
- pixels[byte_index + 1] = gx;
- pixels[byte_index + 2] = bx;
- pixels[byte_index + 3] = A; // leave the alpha value alone
+ pixels[pixel * 4] = constrain(R * matrix[0] + G * matrix[1] + B * matrix[2]);
+ pixels[pixel * 4 + 1] = constrain(R * matrix[2] + G * matrix[0] + B * matrix[1]);
+ pixels[pixel * 4 + 2] = constrain(R * matrix[1] + G * matrix[2] + B * matrix[0]);
}
// return the modified frame
@@ -103,14 +102,14 @@ std::shared_ptr Hue::GetFrame(std::shared_ptr frame, int64_t frame
}
// Generate JSON string of this object
-std::string Hue::Json() {
+std::string Hue::Json() const {
// Return formatted string
return JsonValue().toStyledString();
}
-// Generate Json::JsonValue for this object
-Json::Value Hue::JsonValue() {
+// Generate Json::Value for this object
+Json::Value Hue::JsonValue() const {
// Create root json object
Json::Value root = EffectBase::JsonValue(); // get parent properties
@@ -122,24 +121,12 @@ Json::Value Hue::JsonValue() {
}
// Load JSON string into this object
-void Hue::SetJson(std::string value) {
+void Hue::SetJson(const std::string value) {
// Parse JSON string into JSON objects
- Json::Value root;
- Json::CharReaderBuilder rbuilder;
- Json::CharReader* reader(rbuilder.newCharReader());
-
- std::string errors;
- bool success = reader->parse( value.c_str(),
- value.c_str() + value.size(), &root, &errors );
- delete reader;
-
- if (!success)
- // Raise exception
- throw InvalidJSON("JSON could not be parsed (or is invalid)");
-
try
{
+ const Json::Value root = openshot::stringToJson(value);
// Set all values that match
SetJsonValue(root);
}
@@ -150,8 +137,8 @@ void Hue::SetJson(std::string value) {
}
}
-// Load Json::JsonValue into this object
-void Hue::SetJsonValue(Json::Value root) {
+// Load Json::Value into this object
+void Hue::SetJsonValue(const Json::Value root) {
// Set parent data
EffectBase::SetJsonValue(root);
@@ -162,7 +149,7 @@ void Hue::SetJsonValue(Json::Value root) {
}
// Get all properties for a specific frame
-std::string Hue::PropertiesJSON(int64_t requested_frame) {
+std::string Hue::PropertiesJSON(int64_t requested_frame) const {
// Generate JSON properties list
Json::Value root;
diff --git a/src/effects/Mask.cpp b/src/effects/Mask.cpp
index b804c214..11c37f05 100644
--- a/src/effects/Mask.cpp
+++ b/src/effects/Mask.cpp
@@ -150,14 +150,14 @@ std::shared_ptr Mask::GetFrame(std::shared_ptr frame, int64_t fram
}
// Generate JSON string of this object
-std::string Mask::Json() {
+std::string Mask::Json() const {
// Return formatted string
return JsonValue().toStyledString();
}
-// Generate Json::JsonValue for this object
-Json::Value Mask::JsonValue() {
+// Generate Json::Value for this object
+Json::Value Mask::JsonValue() const {
// Create root json object
Json::Value root = EffectBase::JsonValue(); // get parent properties
@@ -175,24 +175,12 @@ Json::Value Mask::JsonValue() {
}
// Load JSON string into this object
-void Mask::SetJson(std::string value) {
+void Mask::SetJson(const std::string value) {
// Parse JSON string into JSON objects
- Json::Value root;
- Json::CharReaderBuilder rbuilder;
- Json::CharReader* reader(rbuilder.newCharReader());
-
- std::string errors;
- bool success = reader->parse( value.c_str(),
- value.c_str() + value.size(), &root, &errors );
- delete reader;
-
- if (!success)
- // Raise exception
- throw InvalidJSON("JSON could not be parsed (or is invalid)");
-
try
{
+ const Json::Value root = openshot::stringToJson(value);
// Set all values that match
SetJsonValue(root);
}
@@ -203,8 +191,8 @@ void Mask::SetJson(std::string value) {
}
}
-// Load Json::JsonValue into this object
-void Mask::SetJsonValue(Json::Value root) {
+// Load Json::Value into this object
+void Mask::SetJsonValue(const Json::Value root) {
// Set parent data
EffectBase::SetJsonValue(root);
@@ -271,7 +259,7 @@ void Mask::SetJsonValue(Json::Value root) {
}
// Get all properties for a specific frame
-std::string Mask::PropertiesJSON(int64_t requested_frame) {
+std::string Mask::PropertiesJSON(int64_t requested_frame) const {
// Generate JSON properties list
Json::Value root;
diff --git a/src/effects/Negate.cpp b/src/effects/Negate.cpp
index cce59498..18a5d194 100644
--- a/src/effects/Negate.cpp
+++ b/src/effects/Negate.cpp
@@ -58,14 +58,14 @@ std::shared_ptr Negate::GetFrame(std::shared_ptr frame, int64_t fr
}
// Generate JSON string of this object
-std::string Negate::Json() {
+std::string Negate::Json() const {
// Return formatted string
return JsonValue().toStyledString();
}
-// Generate Json::JsonValue for this object
-Json::Value Negate::JsonValue() {
+// Generate Json::Value for this object
+Json::Value Negate::JsonValue() const {
// Create root json object
Json::Value root = EffectBase::JsonValue(); // get parent properties
@@ -76,24 +76,12 @@ Json::Value Negate::JsonValue() {
}
// Load JSON string into this object
-void Negate::SetJson(std::string value) {
+void Negate::SetJson(const std::string value) {
// Parse JSON string into JSON objects
- Json::Value root;
- Json::CharReaderBuilder rbuilder;
- Json::CharReader* reader(rbuilder.newCharReader());
-
- std::string errors;
- bool success = reader->parse( value.c_str(),
- value.c_str() + value.size(), &root, &errors );
- delete reader;
-
- if (!success)
- // Raise exception
- throw InvalidJSON("JSON could not be parsed (or is invalid)");
-
try
{
+ const Json::Value root = openshot::stringToJson(value);
// Set all values that match
SetJsonValue(root);
}
@@ -104,8 +92,8 @@ void Negate::SetJson(std::string value) {
}
}
-// Load Json::JsonValue into this object
-void Negate::SetJsonValue(Json::Value root) {
+// Load Json::Value into this object
+void Negate::SetJsonValue(const Json::Value root) {
// Set parent data
EffectBase::SetJsonValue(root);
@@ -113,7 +101,7 @@ void Negate::SetJsonValue(Json::Value root) {
}
// Get all properties for a specific frame
-std::string Negate::PropertiesJSON(int64_t requested_frame) {
+std::string Negate::PropertiesJSON(int64_t requested_frame) const {
// Generate JSON properties list
Json::Value root;
diff --git a/src/effects/Pixelate.cpp b/src/effects/Pixelate.cpp
index a57a186f..c993915c 100644
--- a/src/effects/Pixelate.cpp
+++ b/src/effects/Pixelate.cpp
@@ -75,34 +75,20 @@ std::shared_ptr Pixelate::GetFrame(std::shared_ptr frame, int64_t
double bottom_value = bottom.GetValue(frame_number);
if (pixelization_value > 0.0) {
- // Resize frame image smaller (based on pixelization value)
- std::shared_ptr smaller_frame_image = std::shared_ptr(new QImage(frame_image->scaledToWidth(std::max(frame_image->width() * pixelization_value, 2.0), Qt::SmoothTransformation)));
+ int w = frame_image->width();
+ int h = frame_image->height();
- // Resize image back to original size (with no smoothing to create pixelated image)
- std::shared_ptr pixelated_image = std::shared_ptr(new QImage(smaller_frame_image->scaledToWidth(frame_image->width(), Qt::FastTransformation).convertToFormat(QImage::Format_RGBA8888)));
+ // Define area we're working on in terms of a QRect with QMargins applied
+ QRect area(QPoint(0,0), frame_image->size());
+ area = area.marginsRemoved({int(left_value * w), int(top_value * h), int(right_value * w), int(bottom_value * h)});
- // Get pixel array pointer
- unsigned char *pixels = (unsigned char *) frame_image->bits();
- unsigned char *pixelated_pixels = (unsigned char *) pixelated_image->bits();
+ // Copy and scale pixels in area to be pixelated
+ auto frame_scaled = frame_image->copy(area).scaledToWidth(area.width() * pixelization_value, Qt::SmoothTransformation);
- // Get pixels sizes of all margins
- int top_bar_height = top_value * frame_image->height();
- int bottom_bar_height = bottom_value * frame_image->height();
- int left_bar_width = left_value * frame_image->width();
- int right_bar_width = right_value * frame_image->width();
-
- // Loop through rows
- for (int row = 0; row < frame_image->height(); row++) {
-
- // Copy pixelated pixels into original frame image (where needed)
- if ((row >= top_bar_height) && (row <= frame_image->height() - bottom_bar_height)) {
- memcpy(&pixels[(row * frame_image->width() + left_bar_width) * 4], &pixelated_pixels[(row * frame_image->width() + left_bar_width) * 4], sizeof(char) * (frame_image->width() - left_bar_width - right_bar_width) * 4);
- }
- }
-
- // Cleanup temp images
- smaller_frame_image.reset();
- pixelated_image.reset();
+ // Draw pixelated image back over original
+ QPainter painter(frame_image.get());
+ painter.drawImage(area, frame_scaled);
+ painter.end();
}
// return the modified frame
@@ -110,14 +96,14 @@ std::shared_ptr Pixelate::GetFrame(std::shared_ptr frame, int64_t
}
// Generate JSON string of this object
-std::string Pixelate::Json() {
+std::string Pixelate::Json() const {
// Return formatted string
return JsonValue().toStyledString();
}
-// Generate Json::JsonValue for this object
-Json::Value Pixelate::JsonValue() {
+// Generate Json::Value for this object
+Json::Value Pixelate::JsonValue() const {
// Create root json object
Json::Value root = EffectBase::JsonValue(); // get parent properties
@@ -133,24 +119,12 @@ Json::Value Pixelate::JsonValue() {
}
// Load JSON string into this object
-void Pixelate::SetJson(std::string value) {
+void Pixelate::SetJson(const std::string value) {
// Parse JSON string into JSON objects
- Json::Value root;
- Json::CharReaderBuilder rbuilder;
- Json::CharReader* reader(rbuilder.newCharReader());
-
- std::string errors;
- bool success = reader->parse( value.c_str(),
- value.c_str() + value.size(), &root, &errors );
- delete reader;
-
- if (!success)
- // Raise exception
- throw InvalidJSON("JSON could not be parsed (or is invalid)");
-
try
{
+ const Json::Value root = openshot::stringToJson(value);
// Set all values that match
SetJsonValue(root);
}
@@ -161,8 +135,8 @@ void Pixelate::SetJson(std::string value) {
}
}
-// Load Json::JsonValue into this object
-void Pixelate::SetJsonValue(Json::Value root) {
+// Load Json::Value into this object
+void Pixelate::SetJsonValue(const Json::Value root) {
// Set parent data
EffectBase::SetJsonValue(root);
@@ -181,7 +155,7 @@ void Pixelate::SetJsonValue(Json::Value root) {
}
// Get all properties for a specific frame
-std::string Pixelate::PropertiesJSON(int64_t requested_frame) {
+std::string Pixelate::PropertiesJSON(int64_t requested_frame) const {
// Generate JSON properties list
Json::Value root;
diff --git a/src/effects/Saturation.cpp b/src/effects/Saturation.cpp
index 06bcb02c..d5c295eb 100644
--- a/src/effects/Saturation.cpp
+++ b/src/effects/Saturation.cpp
@@ -69,44 +69,36 @@ std::shared_ptr Saturation::GetFrame(std::shared_ptr frame, int64_
if (!frame_image)
return frame;
+ int pixel_count = frame_image->width() * frame_image->height();
+
// Get keyframe values for this frame
float saturation_value = saturation.GetValue(frame_number);
// Constants used for color saturation formula
- double pR = .299;
- double pG = .587;
- double pB = .114;
+ const double pR = .299;
+ const double pG = .587;
+ const double pB = .114;
// Loop through pixels
unsigned char *pixels = (unsigned char *) frame_image->bits();
- for (int pixel = 0, byte_index=0; pixel < frame_image->width() * frame_image->height(); pixel++, byte_index+=4)
+
+ #pragma omp parallel for shared (pixels)
+ for (int pixel = 0; pixel < pixel_count; ++pixel)
{
// Get the RGB values from the pixel
- int R = pixels[byte_index];
- int G = pixels[byte_index + 1];
- int B = pixels[byte_index + 2];
- int A = pixels[byte_index + 3];
+ int R = pixels[pixel * 4];
+ int G = pixels[pixel * 4 + 1];
+ int B = pixels[pixel * 4 + 2];
// Calculate the saturation multiplier
double p = sqrt( (R * R * pR) +
- (G * G * pG) +
- (B * B * pB) );
+ (G * G * pG) +
+ (B * B * pB) );
- // Adjust the saturation
- R = p + (R - p) * saturation_value;
- G = p + (G - p) * saturation_value;
- B = p + (B - p) * saturation_value;
-
- // Constrain the value from 0 to 255
- R = constrain(R);
- G = constrain(G);
- B = constrain(B);
-
- // Set all pixels to new value
- pixels[byte_index] = R;
- pixels[byte_index + 1] = G;
- pixels[byte_index + 2] = B;
- pixels[byte_index + 3] = A; // leave the alpha value alone
+ // Apply adjusted and constrained saturation
+ pixels[pixel * 4] = constrain(p + (R - p) * saturation_value);
+ pixels[pixel * 4 + 1] = constrain(p + (G - p) * saturation_value);
+ pixels[pixel * 4 + 2] = constrain(p + (B - p) * saturation_value);
}
// return the modified frame
@@ -114,14 +106,14 @@ std::shared_ptr Saturation::GetFrame(std::shared_ptr frame, int64_
}
// Generate JSON string of this object
-std::string Saturation::Json() {
+std::string Saturation::Json() const {
// Return formatted string
return JsonValue().toStyledString();
}
-// Generate Json::JsonValue for this object
-Json::Value Saturation::JsonValue() {
+// Generate Json::Value for this object
+Json::Value Saturation::JsonValue() const {
// Create root json object
Json::Value root = EffectBase::JsonValue(); // get parent properties
@@ -133,24 +125,12 @@ Json::Value Saturation::JsonValue() {
}
// Load JSON string into this object
-void Saturation::SetJson(std::string value) {
+void Saturation::SetJson(const std::string value) {
// Parse JSON string into JSON objects
- Json::Value root;
- Json::CharReaderBuilder rbuilder;
- Json::CharReader* reader(rbuilder.newCharReader());
-
- std::string errors;
- bool success = reader->parse( value.c_str(),
- value.c_str() + value.size(), &root, &errors );
- delete reader;
-
- if (!success)
- // Raise exception
- throw InvalidJSON("JSON could not be parsed (or is invalid)");
-
try
{
+ const Json::Value root = openshot::stringToJson(value);
// Set all values that match
SetJsonValue(root);
}
@@ -161,8 +141,8 @@ void Saturation::SetJson(std::string value) {
}
}
-// Load Json::JsonValue into this object
-void Saturation::SetJsonValue(Json::Value root) {
+// Load Json::Value into this object
+void Saturation::SetJsonValue(const Json::Value root) {
// Set parent data
EffectBase::SetJsonValue(root);
@@ -173,7 +153,7 @@ void Saturation::SetJsonValue(Json::Value root) {
}
// Get all properties for a specific frame
-std::string Saturation::PropertiesJSON(int64_t requested_frame) {
+std::string Saturation::PropertiesJSON(int64_t requested_frame) const {
// Generate JSON properties list
Json::Value root;
diff --git a/src/effects/Shift.cpp b/src/effects/Shift.cpp
index d0908fd8..0a58d152 100644
--- a/src/effects/Shift.cpp
+++ b/src/effects/Shift.cpp
@@ -133,14 +133,14 @@ std::shared_ptr Shift::GetFrame(std::shared_ptr frame, int64_t fra
}
// Generate JSON string of this object
-std::string Shift::Json() {
+std::string Shift::Json() const {
// Return formatted string
return JsonValue().toStyledString();
}
-// Generate Json::JsonValue for this object
-Json::Value Shift::JsonValue() {
+// Generate Json::Value for this object
+Json::Value Shift::JsonValue() const {
// Create root json object
Json::Value root = EffectBase::JsonValue(); // get parent properties
@@ -153,24 +153,12 @@ Json::Value Shift::JsonValue() {
}
// Load JSON string into this object
-void Shift::SetJson(std::string value) {
+void Shift::SetJson(const std::string value) {
// Parse JSON string into JSON objects
- Json::Value root;
- Json::CharReaderBuilder rbuilder;
- Json::CharReader* reader(rbuilder.newCharReader());
-
- std::string errors;
- bool success = reader->parse( value.c_str(),
- value.c_str() + value.size(), &root, &errors );
- delete reader;
-
- if (!success)
- // Raise exception
- throw InvalidJSON("JSON could not be parsed (or is invalid)");
-
try
{
+ const Json::Value root = openshot::stringToJson(value);
// Set all values that match
SetJsonValue(root);
}
@@ -181,8 +169,8 @@ void Shift::SetJson(std::string value) {
}
}
-// Load Json::JsonValue into this object
-void Shift::SetJsonValue(Json::Value root) {
+// Load Json::Value into this object
+void Shift::SetJsonValue(const Json::Value root) {
// Set parent data
EffectBase::SetJsonValue(root);
@@ -195,7 +183,7 @@ void Shift::SetJsonValue(Json::Value root) {
}
// Get all properties for a specific frame
-std::string Shift::PropertiesJSON(int64_t requested_frame) {
+std::string Shift::PropertiesJSON(int64_t requested_frame) const {
// Generate JSON properties list
Json::Value root;
diff --git a/src/effects/Wave.cpp b/src/effects/Wave.cpp
index 3b1cfb21..0647dc7c 100644
--- a/src/effects/Wave.cpp
+++ b/src/effects/Wave.cpp
@@ -68,12 +68,10 @@ std::shared_ptr Wave::GetFrame(std::shared_ptr frame, int64_t fram
// Get the frame's image
std::shared_ptr frame_image = frame->GetImage();
- // Get pixels for frame image
+ // Get original pixels for frame image, and also make a copy for editing
+ const unsigned char *original_pixels = (unsigned char *) frame_image->constBits();
unsigned char *pixels = (unsigned char *) frame_image->bits();
-
- // Make temp copy of pixels before we start changing them
- unsigned char *temp_image = new unsigned char[frame_image->width() * frame_image->height() * 4]();
- memcpy(temp_image, pixels, sizeof(char) * frame_image->width() * frame_image->height() * 4);
+ int pixel_count = frame_image->width() * frame_image->height();
// Get current keyframe values
double time = frame_number;//abs(((frame_number + 255) % 510) - 255);
@@ -84,43 +82,41 @@ std::shared_ptr Wave::GetFrame(std::shared_ptr frame, int64_t fram
double speed_y_value = speed_y.GetValue(frame_number);
// Loop through pixels
- for (int pixel = 0, byte_index=0; pixel < frame_image->width() * frame_image->height(); pixel++, byte_index+=4)
+ #pragma omp parallel for
+ for (int pixel = 0; pixel < pixel_count; ++pixel)
{
- // Calculate X and Y pixel coordinates
+ // Calculate pixel Y value
int Y = pixel / frame_image->width();
// Calculate wave pixel offsets
- float noiseVal = (100 + Y * 0.001) * multiplier_value; // Time and time multiplier (to make the wave move)
- float noiseAmp = noiseVal * amplitude_value; // Apply amplitude / height of the wave
- float waveformVal = sin((Y * wavelength_value) + (time * speed_y_value)); // Waveform algorithm on y-axis
- float waveVal = (waveformVal + shift_x_value) * noiseAmp; // Shifts pixels on the x-axis
+ float noiseVal = (100 + Y * 0.001) * multiplier_value; // Time and time multiplier (to make the wave move)
+ float noiseAmp = noiseVal * amplitude_value; // Apply amplitude / height of the wave
+ float waveformVal = sin((Y * wavelength_value) + (time * speed_y_value)); // Waveform algorithm on y-axis
+ float waveVal = (waveformVal + shift_x_value) * noiseAmp; // Shifts pixels on the x-axis
- long unsigned int source_X = round(pixel + waveVal) * 4;
- if (source_X < 0)
- source_X = 0;
- if (source_X > frame_image->width() * frame_image->height() * 4 * sizeof(char))
- source_X = (frame_image->width() * frame_image->height() * 4 * sizeof(char)) - (sizeof(char) * 4);
+ long unsigned int source_px = round(pixel + waveVal);
+ if (source_px < 0)
+ source_px = 0;
+ if (source_px >= pixel_count)
+ source_px = pixel_count - 1;
// Calculate source array location, and target array location, and copy the 4 color values
- memcpy(&pixels[byte_index], &temp_image[source_X], sizeof(char) * 4);
+ memcpy(&pixels[pixel * 4], &original_pixels[source_px * 4], sizeof(char) * 4);
}
- // Delete arrays
- delete[] temp_image;
-
// return the modified frame
return frame;
}
// Generate JSON string of this object
-std::string Wave::Json() {
+std::string Wave::Json() const {
// Return formatted string
return JsonValue().toStyledString();
}
-// Generate Json::JsonValue for this object
-Json::Value Wave::JsonValue() {
+// Generate Json::Value for this object
+Json::Value Wave::JsonValue() const {
// Create root json object
Json::Value root = EffectBase::JsonValue(); // get parent properties
@@ -136,24 +132,12 @@ Json::Value Wave::JsonValue() {
}
// Load JSON string into this object
-void Wave::SetJson(std::string value) {
+void Wave::SetJson(const std::string value) {
// Parse JSON string into JSON objects
- Json::Value root;
- Json::CharReaderBuilder rbuilder;
- Json::CharReader* reader(rbuilder.newCharReader());
-
- std::string errors;
- bool success = reader->parse( value.c_str(),
- value.c_str() + value.size(), &root, &errors );
- delete reader;
-
- if (!success)
- // Raise exception
- throw InvalidJSON("JSON could not be parsed (or is invalid)");
-
try
{
+ const Json::Value root = openshot::stringToJson(value);
// Set all values that match
SetJsonValue(root);
}
@@ -164,8 +148,8 @@ void Wave::SetJson(std::string value) {
}
}
-// Load Json::JsonValue into this object
-void Wave::SetJsonValue(Json::Value root) {
+// Load Json::Value into this object
+void Wave::SetJsonValue(const Json::Value root) {
// Set parent data
EffectBase::SetJsonValue(root);
@@ -184,7 +168,7 @@ void Wave::SetJsonValue(Json::Value root) {
}
// Get all properties for a specific frame
-std::string Wave::PropertiesJSON(int64_t requested_frame) {
+std::string Wave::PropertiesJSON(int64_t requested_frame) const {
// Generate JSON properties list
Json::Value root;
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 25031127..480dfb3d 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -85,7 +85,7 @@ endif()
################# LIBOPENSHOT-AUDIO ###################
# Find JUCE-based openshot Audio libraries
-find_package(OpenShotAudio 0.1.9 REQUIRED)
+find_package(OpenShotAudio 0.2.0 REQUIRED)
# Include Juce headers (needed for compile)
include_directories(${LIBOPENSHOT_AUDIO_INCLUDE_DIRS})
diff --git a/tests/FFmpegWriter_Tests.cpp b/tests/FFmpegWriter_Tests.cpp
index 21940b1b..cb75a118 100644
--- a/tests/FFmpegWriter_Tests.cpp
+++ b/tests/FFmpegWriter_Tests.cpp
@@ -36,7 +36,8 @@
using namespace std;
using namespace openshot;
-TEST(FFmpegWriter_Test_Webm)
+SUITE(FFMpegWriter) {
+TEST(Webm)
{
// Reader
stringstream path;
@@ -82,3 +83,46 @@ TEST(FFmpegWriter_Test_Webm)
CHECK_CLOSE(23, (int)pixels[pixel_index + 2], 5);
CHECK_CLOSE(255, (int)pixels[pixel_index + 3], 5);
}
+
+TEST(Options_Overloads)
+{
+ // Reader
+ stringstream path;
+ path << TEST_MEDIA_PATH << "sintel_trailer-720p.mp4";
+ FFmpegReader r(path.str());
+ r.Open();
+
+ /* WRITER ---------------- */
+ FFmpegWriter w("output1.mp4");
+
+ // Set options
+ w.SetAudioOptions("aac", 48000, 192000);
+ w.SetVideoOptions("libx264", 1280, 720, Fraction(30,1), 5000000);
+
+ // Open writer
+ w.Open();
+
+ // Write some frames
+ w.WriteFrame(&r, 24, 50);
+
+ // Close writer & reader
+ w.Close();
+ r.Close();
+
+ FFmpegReader r1("output1.mp4");
+ r1.Open();
+
+ // Verify implied settings
+ CHECK_EQUAL(true, r1.info.has_audio);
+ CHECK_EQUAL(true, r1.info.has_video);
+
+ CHECK_EQUAL(2, r1.GetFrame(1)->GetAudioChannelsCount());
+ CHECK_EQUAL(LAYOUT_STEREO, r1.info.channel_layout);
+
+ CHECK_EQUAL(1, r1.info.pixel_ratio.num);
+ CHECK_EQUAL(1, r1.info.pixel_ratio.den);
+ CHECK_EQUAL(false, r1.info.interlaced_frame);
+ CHECK_EQUAL(true, r1.info.top_field_first);
+}
+
+} // SUITE()
diff --git a/tests/ReaderBase_Tests.cpp b/tests/ReaderBase_Tests.cpp
index 8ac28321..e3062bc1 100644
--- a/tests/ReaderBase_Tests.cpp
+++ b/tests/ReaderBase_Tests.cpp
@@ -49,9 +49,9 @@ TEST(ReaderBase_Derived_Class)
std::shared_ptr GetFrame(int64_t number) { std::shared_ptr f(new Frame()); return f; }
void Close() { };
void Open() { };
- string Json() { return NULL; };
+ string Json() const { return NULL; };
void SetJson(string value) { };
- Json::Value JsonValue() { return (int) NULL; };
+ Json::Value JsonValue() const { return (int) NULL; };
void SetJsonValue(Json::Value root) { };
bool IsOpen() { return true; };
string Name() { return "TestReader"; };