Skip to content

Commit

Permalink
Adding initial caption effect, which supports VTT and SubRip formats …
Browse files Browse the repository at this point in the history
…(limited support, no formating, no regions)
  • Loading branch information
jonoomph committed Oct 6, 2020
1 parent fb879a4 commit 4de0001
Show file tree
Hide file tree
Showing 5 changed files with 470 additions and 1 deletion.
1 change: 1 addition & 0 deletions include/Effects.h
Expand Up @@ -35,6 +35,7 @@
#include "effects/Bars.h"
#include "effects/Blur.h"
#include "effects/Brightness.h"
#include "effects/Caption.h"
#include "effects/ChromaKey.h"
#include "effects/ColorShift.h"
#include "effects/Crop.h"
Expand Down
131 changes: 131 additions & 0 deletions include/effects/Caption.h
@@ -0,0 +1,131 @@
/**
* @file
* @brief Header file for Caption effect class
* @author Jonathan Thomas <jonathan@openshot.org>
*
* @ref License
*/

/* LICENSE
*
* Copyright (c) 2008-2019 OpenShot Studios, LLC
* <http://www.openshotstudios.com/>. 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 <http://www.openshot.org/>.
*
* 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 <http://www.gnu.org/licenses/>.
*/

#ifndef OPENSHOT_CAPTION_EFFECT_H
#define OPENSHOT_CAPTION_EFFECT_H

#include "../EffectBase.h"

#include <cmath>
#include <stdio.h>
#include <memory>
#include <QtCore/QRegularExpression>
#include "../Color.h"
#include "../Fraction.h"
#include "../Json.h"
#include "../KeyFrame.h"



namespace openshot
{

/**
* @brief This class adds captions/text over a video, based on timestamps. You can also animate some limited
* aspects, such as words appearing/disappearing.
*
* Adding captions can be an easy way to generate text overlays through-out a long clip.
*/
class Caption : public EffectBase
{
private:
std::vector<QRegularExpressionMatch> matchedCaptions; ///< RegEx to capture cues and text
std::string caption_text; ///< Text of caption
std::string caption_format; ///< Format of caption (application/x-subrip, text/vtt)
bool is_dirty;

/// Init effect settings
void init_effect_details();

/// Process regex capture
void process_regex();


public:
Color color; ///< Color of caption text
Color stroke; ///< Color of text border / stroke
Keyframe stroke_width; ///< Width of text border / stroke
Keyframe font_size; ///< Font size in points
Keyframe left; ///< Size of left bar
Keyframe top; ///< Size of top bar
Keyframe right; ///< Size of right bar
Keyframe bottom; ///< Size of bottom bar

/// Blank constructor, useful when using Json to load the effect properties
Caption();

/// Default constructor, which takes 4 curves and a color. These curves animated the bars over time.
///
/// @param color The curve to adjust the color of bars
/// @param left The curve to adjust the left bar size (between 0 and 1)
/// @param top The curve to adjust the top bar size (between 0 and 1)
/// @param right The curve to adjust the right bar size (between 0 and 1)
/// @param bottom The curve to adjust the bottom bar size (between 0 and 1)
Caption(Color color, std::string captions, std::string format);

/// @brief This method is required for all derived classes of ClipBase, and returns a
/// new openshot::Frame object. All Clip keyframes and effects are resolved into
/// pixels.
///
/// @returns A new openshot::Frame object
/// @param frame_number The frame number (starting at 1) of the clip or effect on the timeline.
std::shared_ptr<openshot::Frame> GetFrame(int64_t frame_number) override { return GetFrame(std::shared_ptr<Frame> (new Frame()), frame_number); }

/// @brief This method is required for all derived classes of ClipBase, and returns a
/// modified openshot::Frame object
///
/// The frame object is passed into this method and used as a starting point (pixels and audio).
/// All Clip keyframes and effects are resolved into pixels.
///
/// @returns The modified openshot::Frame object
/// @param frame The frame object that needs the clip or effect applied to it
/// @param frame_number The frame number (starting at 1) of the clip or effect on the timeline.
std::shared_ptr<openshot::Frame> GetFrame(std::shared_ptr<openshot::Frame> frame, int64_t frame_number) override;

// Get and Set caption data
std::string CaptionText(); ///< Set the caption string to use (see VTT format)
void CaptionText(std::string new_caption_text); ///< Get the caption string
std::string CaptionFormat(); ///< Set the caption format to use (only VTT format is currently supported)
void CaptionFormat(std::string new_caption_format); ///< Get the caption format

/// Get and Set JSON methods
std::string Json() const override; ///< Generate JSON string of this object
void SetJson(const std::string value) override; ///< Load JSON string into this object
Json::Value JsonValue() const override; ///< Generate Json::Value for this object
void SetJsonValue(const Json::Value root) override; ///< 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) const override;
};

}

#endif
3 changes: 2 additions & 1 deletion src/CMakeLists.txt
Expand Up @@ -117,7 +117,7 @@ if (ENABLE_BLACKMAGIC)
endif()

############### PROFILING #################
#set(PROFILER "/usr/lib/libprofiler.so.0.3.2")
#set(PROFILER "/usr/lib//usr/lib/libprofiler.so.0.4.5")
#set(PROFILER "/usr/lib/libtcmalloc.so.4")

if(CMAKE_VERSION VERSION_LESS 3.3)
Expand Down Expand Up @@ -186,6 +186,7 @@ set(EFFECTS_SOURCES
effects/Bars.cpp
effects/Blur.cpp
effects/Brightness.cpp
effects/Caption.cpp
effects/ChromaKey.cpp
effects/ColorShift.cpp
effects/Crop.cpp
Expand Down
4 changes: 4 additions & 0 deletions src/EffectInfo.cpp
Expand Up @@ -53,6 +53,9 @@ EffectBase* EffectInfo::CreateEffect(std::string effect_type) {
else if (effect_type == "Brightness")
return new Brightness();

else if (effect_type == "Caption")
return new Caption();

else if (effect_type == "ChromaKey")
return new ChromaKey();

Expand Down Expand Up @@ -98,6 +101,7 @@ Json::Value EffectInfo::JsonValue() {
root.append(Bars().JsonInfo());
root.append(Blur().JsonInfo());
root.append(Brightness().JsonInfo());
root.append(Caption().JsonInfo());
root.append(ChromaKey().JsonInfo());
root.append(ColorShift().JsonInfo());
root.append(Crop().JsonInfo());
Expand Down

0 comments on commit 4de0001

Please sign in to comment.