Commit Graph

39 Commits

Author SHA1 Message Date
Daniel Jour
3b2e262821 Keyframe: New implementation calculating values ondemand
- GetValue() calculates the value at the given position now ondemand,
  without caching values as previously.  First, it uses binary search
  to find the segment (start and end point) containing the given
  position.  Constant and linear interpolation are straightforward,
  bezier curves are calculating by binary search between the end
  points until a point on the curve is found with a X coordinate close
  enough to the given position. That points Y coordinate is returned.

- IsIncreasing(), GetRepeatFraction(), GetDelta() use GetValue()
  instead of accessing the (removed) Values vector.

- Removed now unused private functions, and the unused public
  Process().

First test results show good performance improvements for the
"rendering case" (setting up the keyframe points at once, then getting
all values) and drastic performance improvements for the "preview
case" (changing keyframe points, mixed with getting values).
2019-11-22 22:37:06 +01:00
Daniel Jour
6d81033bff Keyframe::GetPoint() returns a constant reference now
Returning a non constant reference is not possible; this allows
outside code to invalidate internal invariants (sorted order of
points) by modifying the returned point.  To make updates the current
best approach is to remove the point by index, and then add it again.
2019-11-22 00:36:52 +01:00
Daniel Jour
504ea0c1ff Make Keyframe::Values and Keyframe::Points vectors private
The Values vector should only be accessed from the outside through the
GetValue() function.  The Points vector should only be accessed using
the AddPoint(), RemovePoint(), .. functions.

This helps maintain internal invariants (e.g. keeping Points sorted)
and allows for future removal / lazy evaluation of Values.

The size() of the vectors had been accessed from various parts of the
code; the GetLength() (for Values) and GetCount() (for Points) member
functions provide access to this information and are already part of
the public API.
2019-11-19 23:43:28 +01:00
Daniel Jour
cb5574180e Keyframe::AddPoint() add at correct index, keeping Points ordered
AddPoint() now searches (binary search) for the best place to insert a
new point, thus always maintaining the order of Points.  Therefore,
ReorderPoints() is no longer needed.

CAVEAT: This breaks if some outside code changes (the public member)
Points!
2019-11-19 22:43:34 +01:00
Jonathan Thomas
272f004c0e Merge pull request #296 from OpenShot/std-prefixes
Remove all 'using namespace' directives from headers
2019-11-17 16:18:14 -06:00
SuslikV
87c06feda1 Clarify some comments 2019-11-02 20:04:58 +02:00
FeRD (Frank Dana)
3879b09047 FrameMapper/KeyFrame/Point: std:: prefixes 2019-08-04 22:54:06 -04:00
FeRD (Frank Dana)
f170fdd009 Update copyright range to current year 2019-06-11 06:48:32 -04:00
FeRD (Frank Dana)
0327c2ab5c Remove license block from documentation comment 2019-06-09 08:31:04 -04:00
Jonathan Thomas
2fcb35ddcc Removing throw statements from header files (thanks Peter) 2017-10-26 18:44:35 -05:00
Jonathan Thomas
c95db460d6 Big update! Updating all "long int" frame number types to int64_t, so all 3 OSes will produce the same depth and precision on frame numbers. Also removing variable bitrate support temporarily, since it causes more problems than it solves. 2017-09-28 16:03:01 -05:00
Jonathan Thomas
85ac4bf6d2 Updating references to frame number / position to long int, there were still quite a few old "int" declarations, which limits the length of frame number. Also, updated precision of KeyFrames to use double (instead of float) for higher precision, which fixed lots of issues with very long videos (since our FrameMapper used a KeyFrame object to create a map to new frames) 2017-01-24 18:39:17 -06:00
Jonathan Thomas
559d6a0545 Huge refactor of keyframe point handles (bezier quadratic curves) to use CSS-style syntax. Basically, the left and right handles of a point now use percentages, such as 0.0, 1.0, 0.5, 1.0 (between 0 and 1), and become real coordinates based on the value differences between points (in real time). Also simplified the JSON property creation. Also, many unit tests have been updated, because they were actually generating the incorrect values from before... although only slightly in most cases. Now they have correct values from the default bezier handles. 2016-10-19 02:19:07 -05:00
Jonathan Thomas
1743558f99 Improved image caching logic, to better estimate max image sizes possible, based on clip scale and keyframe settings... so we are always dealing with the smallest possible frame sizes for performance (without losing quality) 2016-09-17 17:14:27 -05:00
Jonathan Thomas
bfa050409c Improved support for missing frames and invalid PTS (which result in gaps and duplicate frames). Also changed frame number to larger data type, and did some code clean-up and refactoring. Less crashes, and more video support! 2015-08-24 01:05:48 -05:00
Jonathan Thomas
b612f3339d Replaced ImagMagick with QImage on almost all key methods and classes. Reprogrammed all effects and the entire rendering pipeline to use QImage and QTransforms, primarily for increases in speed and stability. libopenshot is more than 10X faster on many of the most CPU heavy tasks. This was a huge change, and still has a few minor issues relating to BlackMagick Decklink and Text rendering.... which should be resolved very soon.
Also, much work has been done on memory management / leak detection, and optimizations with multi-threading... including a new thread cacher class used by the video playback (which is smoother than ever).
2015-06-01 00:20:14 -07:00
Jonathan Thomas
e2ee3d01f2 Added the ability to scale and flip keyframes, making it easy to reverse an effect or transition, and resize transitions without having to manually reset the keyframes X coordinates. 2015-03-13 23:19:55 -05:00
Jonathan Thomas
61ed19250e Fixed bug determing the closest keyframe point to another point. Added additional unit tests. Added new method to get the # of Points in a keyframe. 2015-02-22 01:04:54 -06:00
Jonathan Thomas
b976b8220b Added new properties to the clip JSON properties method, to enable more rich control of a clips properties. Fixed some defaults on Points that still used X=0. 2015-02-21 03:10:38 -06:00
Jonathan Thomas
5145abdacb Added new clip method that returns all properties for a given frame in JSON. 2015-02-09 22:41:42 -06:00
Jonathan Thomas
e135eb5738 Changed license to LGPLv3 for all libopenshot code. 2014-07-11 16:52:14 -05:00
Jonathan Thomas
5010f6252a Replaced all copyright and licensing to reflect AGPLv3 license. Also, added a bad ass version header, which is now integrated into CMake as well. A single place to indicate version and ABI/API compatibility. 2014-03-29 18:49:22 -05:00
Jonathan Thomas
cd7743fb88 Improved Json methods to correct work with swig and inheritance. 2013-12-07 21:09:55 -06:00
Jonathan Thomas
d8da4cb807 Added Json() methods to many methods, for loading and saving properties. 2013-12-06 00:40:26 -06:00
Jonathan Thomas
4e730a3f41 Integrated more JSON methods into the library. 2013-12-03 00:13:25 -06:00