- Added new Frame::ReverseAudio() helper method - for time keyframe support playing backwards audio
- Fixed math rounding error on time keyframe Resampler, to use the rounded source samples value
- Removed some unused args and Frame audio methods
- Reset FrameMapper resample context when non-adjacent frames are requested
- Correctly reverse Frame audio if a time keyframe is present, and reversing audio
- Rewrite Keyframe::IsIncreasing() function, to give accurate direction of time keyframes at any index (special logic to support first and last indexes)
- Fixed Keyframe unit tests - since logic has changed a bit
- Improved time mapping unit tests
- Replace many c-style casts with static_cast
- Added new sine.wav test file
* Removing legacy profile property. Add new operators for Profile classes (for comparison). Also added new functions to generate different variations of the Profile data (key, short name, long name, long name w/description).
* Add empty constructor for Profile class, and new Profile unit tets
* Adding zero padding to profile Key function, for easier sorting: 01920x1080i2997_16:09
* Clear setfill flag after creating Key() output
* Updating example exe to load an *.osp project file via C++, which makes debugging complex broken projects much easier.
* - Add new unit test to FFmpegWriter to create an animated GIF and verify it can be wrapped with a FrameMapper (with no audio track)
- Improve FrameMapper to ignore missing audio data (i.e. when no audio samples present, don't try and find them or resample them)
* Fix some whitespace issues
* Fix inline documentation mistype
* Fixed missing reuse licensing on new example profile files
* Changing Profile::Key() format to exclude the : character, since Windows file names cannot contain that
* - Large memory leak fixed in FFmpegWriter when closing the video & audio contexts
- Reducing # of cached frames and rescalers to 1, since we no longer use OMP and this is unneeded - we need to refactor much of this code out eventually
* - Fixing whitespace issues
- Code clean-up / line wrapping / etc...
- The `fmt` class member, which was of type AVFormat*, was really
just an unnecessary copy of `(AVFormatContext*)oc->oformat`.
But we were ASSIGNING into its members, which we were definitely
not supposed to be doing. (And in recent FFmpegs, now that
`AVFormat` has been `const`d, we can't.) It's gone; now we just
use `oc->oformat` anywhere we used to access `fmt`.
- The preprocessor macro to allocate a new _stream_ was a mess of
cross purposes: It did allocate a stream, but then it also
allocated a new AvCodecCtx on newer FFmpeg releases. Worse (and
always galling to me), it proceeded to assign to a variable
that WASN'T passed in to the macro, just taking it on faith that
it would only be used where that variable was defined. That's
just... ugh. So I broke it apart into two steps (stream creation
and context allocation), realized the stream creation code was
the same for all ffmpeg versions and didn't need to be a macro
at all, and now a 4-parameter, 6-line magical macro has been
replaced with a simple, zero-side-effect one-liner.
- I also cleaned up the add_video_stream() code to be more like
the add_audio_stream() code, since they were bad-different for
no discernible reason.