From 7b1ff78d2d2955a02ab22c88ec932dcf975140de Mon Sep 17 00:00:00 2001 From: Jonathan Thomas Date: Tue, 9 May 2017 23:52:56 -0500 Subject: [PATCH 01/12] Bumping version to 0.1.5 (SO renames unchanged at 11). --- include/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/Version.h b/include/Version.h index 4a5b27fe..9304f6e3 100644 --- a/include/Version.h +++ b/include/Version.h @@ -36,7 +36,7 @@ #define OPENSHOT_VERSION_MAJOR 0; /// Major version number is incremented when huge features are added or improved. #define OPENSHOT_VERSION_MINOR 1; /// Minor version is incremented when smaller (but still very important) improvements are added. -#define OPENSHOT_VERSION_BUILD 4; /// Build number is incremented when minor bug fixes and less important improvements are added. +#define OPENSHOT_VERSION_BUILD 5; /// Build number is incremented when minor bug fixes and less important improvements are added. #define OPENSHOT_VERSION_SO 11; /// Shared object version number. This increments any time the API and ABI changes (so old apps will no longer link) #define OPENSHOT_VERSION_MAJOR_MINOR STRINGIZE(OPENSHOT_VERSION_MAJOR) "." STRINGIZE(OPENSHOT_VERSION_MINOR); /// A string of the "Major.Minor" version #define OPENSHOT_VERSION_ALL STRINGIZE(OPENSHOT_VERSION_MAJOR) "." STRINGIZE(OPENSHOT_VERSION_MINOR) "." STRINGIZE(OPENSHOT_VERSION_BUILD); /// A string of the entire version "Major.Minor.Build" From efecd2b8d6b7ef9ea32df4d3d7823a65d04e357c Mon Sep 17 00:00:00 2001 From: Jonathan Thomas Date: Tue, 16 May 2017 17:07:06 -0500 Subject: [PATCH 02/12] Fixing unicode path issues when loading a Profile() class. Broke when using unicode home directory on Windows. --- include/Profiles.h | 2 ++ src/Profiles.cpp | 20 ++++++++------------ 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/include/Profiles.h b/include/Profiles.h index 7611f8f1..57bf70da 100644 --- a/include/Profiles.h +++ b/include/Profiles.h @@ -34,6 +34,8 @@ #include #include #include +#include +#include #include #include #include "Exceptions.h" diff --git a/src/Profiles.cpp b/src/Profiles.cpp index e1b93d1a..bfbfeaa0 100644 --- a/src/Profiles.cpp +++ b/src/Profiles.cpp @@ -51,24 +51,19 @@ Profile::Profile(string path) throw(InvalidFile, InvalidJSON) { info.display_ratio.den = 0; info.interlaced_frame = false; - // Read the profile file - ifstream myfile (path.c_str()); - if (myfile.is_open()) + QFile inputFile(path.c_str()); + if (inputFile.open(QIODevice::ReadOnly)) { - // Loop through each line - while (myfile.good()) + QTextStream in(&inputFile); + while (!in.atEnd()) { - // read current line of file - read_file = true; - string line = ""; - getline (myfile, line); + QString line = in.readLine(); if (line.length() <= 0) continue; // Split current line - QString qline(line.c_str()); - QStringList parts = qline.split( "=" ); + QStringList parts = line.split( "=" ); string setting = parts[0].toStdString(); string value = parts[1].toStdString(); int value_int = 0; @@ -117,7 +112,8 @@ Profile::Profile(string path) throw(InvalidFile, InvalidJSON) { info.pixel_format = value_int; } } - myfile.close(); + read_file = true; + inputFile.close(); } } From 3a884e71dc2ec564ce70f67188c71d00d0baf688 Mon Sep 17 00:00:00 2001 From: Jonathan Thomas Date: Wed, 17 May 2017 01:17:42 -0500 Subject: [PATCH 03/12] Big improvement with handling invalid video and audio timestamps, defaulting to more sane values (when huge crazy timestamps are detected). Also fixing a bug when disabling video/audio tracks on FrameMappers. Also adding additional bail-out code when stuck searching for a video/audio packet that probably doesn't exist. Added improved "checked" handling, and once 1 frame is detected as invalid, clean out any other invalid ones as well. --- src/Clip.cpp | 10 ++++++++++ src/FFmpegReader.cpp | 47 ++++++++++++++++++++++++++++++++++++-------- 2 files changed, 49 insertions(+), 8 deletions(-) diff --git a/src/Clip.cpp b/src/Clip.cpp index 4eefa70d..1116c9fe 100644 --- a/src/Clip.cpp +++ b/src/Clip.cpp @@ -279,6 +279,16 @@ tr1::shared_ptr Clip::GetFrame(long int requested_frame) throw(ReaderClos // Override parent reader reader->info.has_audio = enabled_audio; reader->info.has_video = enabled_video; + + if (reader->Name() == "FrameMapper") { + // Override nested reader (if any) + FrameMapper* nested_reader = (FrameMapper*) reader; + if (nested_reader->Reader()) { + nested_reader->Reader()->info.has_audio = enabled_audio; + nested_reader->Reader()->info.has_video = enabled_video; + } + } + } // Is a time map detected diff --git a/src/FFmpegReader.cpp b/src/FFmpegReader.cpp index ce62680b..ac82cdcb 100644 --- a/src/FFmpegReader.cpp +++ b/src/FFmpegReader.cpp @@ -486,6 +486,7 @@ tr1::shared_ptr FFmpegReader::ReadStream(long int requested_frame) // Minimum number of packets to process (for performance reasons) int packets_processed = 0; int minimum_packets = OPEN_MP_NUM_PROCESSORS; + int max_packets = 1024; // Set the number of threads in OpenMP omp_set_num_threads(OPEN_MP_NUM_PROCESSORS); @@ -518,7 +519,7 @@ tr1::shared_ptr FFmpegReader::ReadStream(long int requested_frame) } // Debug output - ZmqLogger::Instance()->AppendDebugMethod("FFmpegReader::ReadStream (GetNextPacket)", "requested_frame", requested_frame, "processing_video_frames.size()", processing_video_frames.size(), "processing_audio_frames.size()", processing_audio_frames.size(), "minimum_packets", minimum_packets, "packets_processed", packets_processed, "", -1); + ZmqLogger::Instance()->AppendDebugMethod("FFmpegReader::ReadStream (GetNextPacket)", "requested_frame", requested_frame, "processing_video_frames.size()", processing_video_frames.size(), "processing_audio_frames.size()", processing_audio_frames.size(), "minimum_packets", minimum_packets, "packets_processed", packets_processed, "is_seeking", is_seeking); // Video packet if (info.has_video && packet->stream_index == videoStream) @@ -603,7 +604,7 @@ tr1::shared_ptr FFmpegReader::ReadStream(long int requested_frame) packets_processed++; // Break once the frame is found - if ((is_cache_found && packets_processed >= minimum_packets)) + if ((is_cache_found && packets_processed >= minimum_packets) || packets_processed > max_packets) break; } // end while @@ -1220,6 +1221,8 @@ void FFmpegReader::Seek(long int requested_frame) throw(TooManySeeks) num_checks_since_final = 0; num_packets_since_video_frame = 0; has_missing_frames = false; + bool has_audio_override = info.has_audio; + bool has_video_override = info.has_video; // Increment seek count seek_count++; @@ -1232,6 +1235,10 @@ void FFmpegReader::Seek(long int requested_frame) throw(TooManySeeks) Close(); Open(); + // Update overrides (since closing and re-opening might update these) + info.has_audio = has_audio_override; + info.has_video = has_video_override; + // Not actually seeking, so clear these flags is_seeking = false; if (seek_count == 1) { @@ -1316,6 +1323,10 @@ void FFmpegReader::Seek(long int requested_frame) throw(TooManySeeks) // Close and re-open file (basically seeking to frame 1) Close(); Open(); + + // Update overrides (since closing and re-opening might update these) + info.has_audio = has_audio_override; + info.has_video = has_video_override; } } } @@ -1339,15 +1350,25 @@ void FFmpegReader::UpdatePTSOffset(bool is_video) { // VIDEO PACKET if (video_pts_offset == 99999) // Has the offset been set yet? - // Find the difference between PTS and frame number - video_pts_offset = 0 - GetVideoPTS(); + { + // Find the difference between PTS and frame number (no more than 10 timebase units allowed) + video_pts_offset = 0 - max(GetVideoPTS(), (long) info.video_timebase.ToInt() * 10); + + // debug output + ZmqLogger::Instance()->AppendDebugMethod("FFmpegReader::UpdatePTSOffset (Video)", "video_pts_offset", video_pts_offset, "is_video", is_video, "", -1, "", -1, "", -1, "", -1); + } } else { // AUDIO PACKET if (audio_pts_offset == 99999) // Has the offset been set yet? - // Find the difference between PTS and frame number - audio_pts_offset = 0 - packet->pts; + { + // Find the difference between PTS and frame number (no more than 10 timebase units allowed) + audio_pts_offset = 0 - max(packet->pts, (long) info.audio_timebase.ToInt() * 10); + + // debug output + ZmqLogger::Instance()->AppendDebugMethod("FFmpegReader::UpdatePTSOffset (Audio)", "audio_pts_offset", audio_pts_offset, "is_video", is_video, "", -1, "", -1, "", -1, "", -1); + } } } @@ -1623,6 +1644,9 @@ bool FFmpegReader::CheckMissingFrame(long int requested_frame) void FFmpegReader::CheckWorkingFrames(bool end_of_stream, long int requested_frame) { // Loop through all working queue frames + bool checked_count_tripped = false; + int max_checked_count = 80; + while (true) { // Get the front frame of working cache @@ -1647,7 +1671,11 @@ void FFmpegReader::CheckWorkingFrames(bool end_of_stream, long int requested_fra is_audio_ready = processed_audio_frames.count(f->number); // Get check count for this frame - checked_count = checked_frames[f->number]; + if (!checked_count_tripped || f->number >= requested_frame) + checked_count = checked_frames[f->number]; + else + // Force checked count over the limit + checked_count = max_checked_count; } if (previous_packet_location.frame == f->number && !end_of_stream) @@ -1659,10 +1687,13 @@ void FFmpegReader::CheckWorkingFrames(bool end_of_stream, long int requested_fra if (!info.has_audio) is_audio_ready = true; // Make final any frames that get stuck (for whatever reason) - if (checked_count > 80 && (!is_video_ready || !is_audio_ready)) { + if (checked_count >= max_checked_count && (!is_video_ready || !is_audio_ready)) { // Debug output ZmqLogger::Instance()->AppendDebugMethod("FFmpegReader::CheckWorkingFrames (exceeded checked_count)", "requested_frame", requested_frame, "frame_number", f->number, "is_video_ready", is_video_ready, "is_audio_ready", is_audio_ready, "checked_count", checked_count, "checked_frames.size()", checked_frames.size()); + // Trigger checked count tripped mode (clear out all frames before requested frame) + checked_count_tripped = true; + if (info.has_video && !is_video_ready && last_video_frame) { // Copy image from last frame f->AddImage(tr1::shared_ptr(new QImage(*last_video_frame->GetImage()))); From 1ed5302835d909c7e487c7a3016ee02501551aed Mon Sep 17 00:00:00 2001 From: Jonathan Thomas Date: Wed, 17 May 2017 01:29:32 -0500 Subject: [PATCH 04/12] Fixing a data type issues with max() --- src/FFmpegReader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/FFmpegReader.cpp b/src/FFmpegReader.cpp index ac82cdcb..84bbf853 100644 --- a/src/FFmpegReader.cpp +++ b/src/FFmpegReader.cpp @@ -1364,7 +1364,7 @@ void FFmpegReader::UpdatePTSOffset(bool is_video) if (audio_pts_offset == 99999) // Has the offset been set yet? { // Find the difference between PTS and frame number (no more than 10 timebase units allowed) - audio_pts_offset = 0 - max(packet->pts, (long) info.audio_timebase.ToInt() * 10); + audio_pts_offset = 0 - max(packet->pts, (int64_t) info.audio_timebase.ToInt() * 10); // debug output ZmqLogger::Instance()->AppendDebugMethod("FFmpegReader::UpdatePTSOffset (Audio)", "audio_pts_offset", audio_pts_offset, "is_video", is_video, "", -1, "", -1, "", -1, "", -1); From c89ad78e38e8d3bc250a605439e711a7437a78ac Mon Sep 17 00:00:00 2001 From: Jonathan Thomas Date: Thu, 18 May 2017 02:48:00 -0500 Subject: [PATCH 05/12] Adding additional lock on ClearAllCache method, to prevent crash --- src/Timeline.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Timeline.cpp b/src/Timeline.cpp index 852721cf..9b77f2c6 100644 --- a/src/Timeline.cpp +++ b/src/Timeline.cpp @@ -1347,6 +1347,10 @@ void Timeline::apply_json_to_timeline(Json::Value change) throw(InvalidJSONKey) // Clear all caches void Timeline::ClearAllCache() { + + // Get lock (prevent getting frames while this happens) + const GenericScopedLock lock(getFrameCriticalSection); + // Clear primary cache final_cache->Clear(); From e899cbf39af4255e05698059dbbd1e8fe8d711ba Mon Sep 17 00:00:00 2001 From: Jonathan Thomas Date: Thu, 18 May 2017 17:04:34 -0500 Subject: [PATCH 06/12] Fixing Timeline::SetJSON to use a lock, and reopen the reader if already open. This fixes an issue when trying to open another project while the current project is being accessed (i.e. during playback). --- src/FFmpegReader.cpp | 2 +- src/Timeline.cpp | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/FFmpegReader.cpp b/src/FFmpegReader.cpp index 84bbf853..5f54e5d7 100644 --- a/src/FFmpegReader.cpp +++ b/src/FFmpegReader.cpp @@ -486,7 +486,7 @@ tr1::shared_ptr FFmpegReader::ReadStream(long int requested_frame) // Minimum number of packets to process (for performance reasons) int packets_processed = 0; int minimum_packets = OPEN_MP_NUM_PROCESSORS; - int max_packets = 1024; + int max_packets = 4096; // Set the number of threads in OpenMP omp_set_num_threads(OPEN_MP_NUM_PROCESSORS); diff --git a/src/Timeline.cpp b/src/Timeline.cpp index 9b77f2c6..028610af 100644 --- a/src/Timeline.cpp +++ b/src/Timeline.cpp @@ -631,10 +631,6 @@ bool Timeline::isEqual(double a, double b) // Get an openshot::Frame object for a specific frame number of this reader. tr1::shared_ptr Timeline::GetFrame(long int requested_frame) throw(ReaderClosed, OutOfBoundsFrame) { - // Check for open reader (or throw exception) - if (!is_open) - throw ReaderClosed("The Timeline is closed. Call Open() before calling this method.", ""); - // Adjust out of bounds frame number if (requested_frame < 1) requested_frame = 1; @@ -653,6 +649,10 @@ tr1::shared_ptr Timeline::GetFrame(long int requested_frame) throw(Reader // Create a scoped lock, allowing only a single thread to run the following code at one time const GenericScopedLock lock(getFrameCriticalSection); + // Check for open reader (or throw exception) + if (!is_open) + throw ReaderClosed("The Timeline is closed. Call Open() before calling this method.", ""); + // Check cache again (due to locking) frame = final_cache->GetFrame(requested_frame); if (frame) { @@ -904,6 +904,9 @@ Json::Value Timeline::JsonValue() { // Load JSON string into this object void Timeline::SetJson(string value) throw(InvalidJSON) { + // Get lock (prevent getting frames while this happens) + const GenericScopedLock lock(getFrameCriticalSection); + // Parse JSON string into JSON objects Json::Value root; Json::Reader reader; @@ -928,6 +931,7 @@ void Timeline::SetJson(string value) throw(InvalidJSON) { void Timeline::SetJsonValue(Json::Value root) throw(InvalidFile, ReaderClosed) { // Close timeline before we do anything (this also removes all open and closing clips) + bool was_open = is_open; Close(); // Set parent data @@ -983,6 +987,10 @@ void Timeline::SetJsonValue(Json::Value root) throw(InvalidFile, ReaderClosed) { info.duration = root["duration"].asDouble(); info.video_length = info.fps.ToFloat() * info.duration; } + + // Re-open if needed + if (was_open) + Open(); } // Apply a special formatted JSON object, which represents a change to the timeline (insert, update, delete) From b36d8540fa4be412200205d67b099eb9d7c7cc5f Mon Sep 17 00:00:00 2001 From: Jonathan Thomas Date: Thu, 18 May 2017 17:31:38 -0500 Subject: [PATCH 07/12] New release! Bumping version to 0.1.6 --- include/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/Version.h b/include/Version.h index 9304f6e3..a10f071f 100644 --- a/include/Version.h +++ b/include/Version.h @@ -36,7 +36,7 @@ #define OPENSHOT_VERSION_MAJOR 0; /// Major version number is incremented when huge features are added or improved. #define OPENSHOT_VERSION_MINOR 1; /// Minor version is incremented when smaller (but still very important) improvements are added. -#define OPENSHOT_VERSION_BUILD 5; /// Build number is incremented when minor bug fixes and less important improvements are added. +#define OPENSHOT_VERSION_BUILD 6; /// Build number is incremented when minor bug fixes and less important improvements are added. #define OPENSHOT_VERSION_SO 11; /// Shared object version number. This increments any time the API and ABI changes (so old apps will no longer link) #define OPENSHOT_VERSION_MAJOR_MINOR STRINGIZE(OPENSHOT_VERSION_MAJOR) "." STRINGIZE(OPENSHOT_VERSION_MINOR); /// A string of the "Major.Minor" version #define OPENSHOT_VERSION_ALL STRINGIZE(OPENSHOT_VERSION_MAJOR) "." STRINGIZE(OPENSHOT_VERSION_MINOR) "." STRINGIZE(OPENSHOT_VERSION_BUILD); /// A string of the entire version "Major.Minor.Build" From 724c57680e2f52aa94c9593ea707abf580f8f87e Mon Sep 17 00:00:00 2001 From: Jonathan Thomas Date: Mon, 22 May 2017 04:43:21 -0500 Subject: [PATCH 08/12] Moving checked_count erase command inside lock protection, to prevent crash --- src/FFmpegReader.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/FFmpegReader.cpp b/src/FFmpegReader.cpp index 5f54e5d7..b5af90fa 100644 --- a/src/FFmpegReader.cpp +++ b/src/FFmpegReader.cpp @@ -1732,6 +1732,9 @@ void FFmpegReader::CheckWorkingFrames(bool end_of_stream, long int requested_fra ZmqLogger::Instance()->AppendDebugMethod("FFmpegReader::CheckWorkingFrames (add frame to missing cache)", "f->number", f->number, "is_seek_trash", is_seek_trash, "Missing Cache Count", missing_frames.Count(), "Working Cache Count", working_cache.Count(), "Final Cache Count", final_cache.Count(), "", -1); missing_frames.Add(f); } + + // Remove from 'checked' count + checked_frames.erase(f->number); } // Remove frame from working cache @@ -1740,9 +1743,6 @@ void FFmpegReader::CheckWorkingFrames(bool end_of_stream, long int requested_fra // Update last frame processed last_frame = f->number; - // Remove from 'checked' count - checked_frames.erase(f->number); - } else { // Seek trash, so delete the frame from the working cache, and never add it to the final cache. working_cache.Remove(f->number); From a36e399b476bd70a2d245d837b9244ff75da9171 Mon Sep 17 00:00:00 2001 From: Jonathan Thomas Date: Wed, 24 May 2017 03:20:26 -0500 Subject: [PATCH 09/12] Fixing a bug when changing project Profiles... we were not correctly reinitializing the FrameMapper --- src/FrameMapper.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/FrameMapper.cpp b/src/FrameMapper.cpp index bcd01516..6b2e0fbb 100644 --- a/src/FrameMapper.cpp +++ b/src/FrameMapper.cpp @@ -726,7 +726,7 @@ void FrameMapper::SetJsonValue(Json::Value root) throw(InvalidFile) { // Change frame rate or audio mapping details void FrameMapper::ChangeMapping(Fraction target_fps, PulldownType target_pulldown, int target_sample_rate, int target_channels, ChannelLayout target_channel_layout) { - ZmqLogger::Instance()->AppendDebugMethod("FrameMapper::ChangeMapping", "target_fps.num", target_fps.num, "target_fps.den", target_fps.num, "target_pulldown", target_pulldown, "target_sample_rate", target_sample_rate, "target_channels", target_channels, "target_channel_layout", target_channel_layout); + ZmqLogger::Instance()->AppendDebugMethod("FrameMapper::ChangeMapping", "target_fps.num", target_fps.num, "target_fps.den", target_fps.den, "target_pulldown", target_pulldown, "target_sample_rate", target_sample_rate, "target_channels", target_channels, "target_channel_layout", target_channel_layout); // Mark as dirty is_dirty = true; @@ -750,6 +750,9 @@ void FrameMapper::ChangeMapping(Fraction target_fps, PulldownType target_pulldow avresample_free(&avr); avr = NULL; } + + // Re-init mapping + Init(); } // Set offset relative to parent timeline From 8f236200cc7e6b2d5c60a8c7f5e471e85efb8020 Mon Sep 17 00:00:00 2001 From: Jonathan Thomas Date: Fri, 26 May 2017 01:08:20 -0500 Subject: [PATCH 10/12] Fixing another small issue when changing profiles --- include/Timeline.h | 2 +- src/FrameMapper.cpp | 9 +++++++-- src/Timeline.cpp | 6 +++--- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/include/Timeline.h b/include/Timeline.h index cd3235c8..f6bf6a1f 100644 --- a/include/Timeline.h +++ b/include/Timeline.h @@ -165,7 +165,7 @@ namespace openshot { void apply_json_to_timeline(Json::Value change) throw(InvalidJSONKey); ///info.video_length * rate_diff; // Build curve for framerate mapping @@ -732,7 +732,12 @@ void FrameMapper::ChangeMapping(Fraction target_fps, PulldownType target_pulldow is_dirty = true; // Update mapping details - target = target_fps; + target.num = target_fps.num; + target.den = target_fps.den; + info.fps.num = target_fps.num; + info.fps.den = target_fps.den; + info.video_timebase.num = target_fps.den; + info.video_timebase.den = target_fps.num; pulldown = target_pulldown; info.sample_rate = target_sample_rate; info.channels = target_channels; diff --git a/src/Timeline.cpp b/src/Timeline.cpp index 028610af..28aec740 100644 --- a/src/Timeline.cpp +++ b/src/Timeline.cpp @@ -155,13 +155,13 @@ void Timeline::ApplyMapperToClips() } // Calculate time of a frame number, based on a framerate -float Timeline::calculate_time(long int number, Fraction rate) +double Timeline::calculate_time(long int number, Fraction rate) { // Get float version of fps fraction - float raw_fps = rate.ToFloat(); + double raw_fps = rate.ToFloat(); // Return the time (in seconds) of this frame - return float(number - 1) / raw_fps; + return double(number - 1) / raw_fps; } // Apply effects to the source frame (if any) From 5290f67a971ef0344ad59c3ed5a6b0ff5e06dbec Mon Sep 17 00:00:00 2001 From: Jonathan Thomas Date: Tue, 30 May 2017 15:35:43 -0500 Subject: [PATCH 11/12] Fixing regression where source readers could have their info.has_video and info.has_audio set to an invalid state... causing crashes and freezes. --- src/Clip.cpp | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/src/Clip.cpp b/src/Clip.cpp index 1116c9fe..57d3e0f7 100644 --- a/src/Clip.cpp +++ b/src/Clip.cpp @@ -274,29 +274,11 @@ tr1::shared_ptr Clip::GetFrame(long int requested_frame) throw(ReaderClos else if (enabled_video == -1 && reader && !reader->info.has_audio) enabled_video = 0; - // Adjust parent reader with same settings (for performance gains) - if (reader) { - // Override parent reader - reader->info.has_audio = enabled_audio; - reader->info.has_video = enabled_video; - - if (reader->Name() == "FrameMapper") { - // Override nested reader (if any) - FrameMapper* nested_reader = (FrameMapper*) reader; - if (nested_reader->Reader()) { - nested_reader->Reader()->info.has_audio = enabled_audio; - nested_reader->Reader()->info.has_video = enabled_video; - } - } - - } - // Is a time map detected long int new_frame_number = requested_frame; if (time.Values.size() > 1) new_frame_number = time.GetLong(requested_frame); - // Now that we have re-mapped what frame number is needed, go and get the frame pointer tr1::shared_ptr original_frame = GetOrCreateFrame(new_frame_number); From 078c3f74dd5011436326c6019eaec60a1898f40e Mon Sep 17 00:00:00 2001 From: Jonathan Thomas Date: Wed, 31 May 2017 23:39:13 -0500 Subject: [PATCH 12/12] Bumping release to 0.1.7 (so version 12) --- include/Version.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/include/Version.h b/include/Version.h index a10f071f..c3593306 100644 --- a/include/Version.h +++ b/include/Version.h @@ -34,10 +34,10 @@ #define STRINGIZE(x) STRINGIZE_(x) #endif -#define OPENSHOT_VERSION_MAJOR 0; /// Major version number is incremented when huge features are added or improved. -#define OPENSHOT_VERSION_MINOR 1; /// Minor version is incremented when smaller (but still very important) improvements are added. -#define OPENSHOT_VERSION_BUILD 6; /// Build number is incremented when minor bug fixes and less important improvements are added. -#define OPENSHOT_VERSION_SO 11; /// Shared object version number. This increments any time the API and ABI changes (so old apps will no longer link) +#define OPENSHOT_VERSION_MAJOR 0; /// Major version number is incremented when huge features are added or improved. +#define OPENSHOT_VERSION_MINOR 1; /// Minor version is incremented when smaller (but still very important) improvements are added. +#define OPENSHOT_VERSION_BUILD 7; /// Build number is incremented when minor bug fixes and less important improvements are added. +#define OPENSHOT_VERSION_SO 12; /// Shared object version number. This increments any time the API and ABI changes (so old apps will no longer link) #define OPENSHOT_VERSION_MAJOR_MINOR STRINGIZE(OPENSHOT_VERSION_MAJOR) "." STRINGIZE(OPENSHOT_VERSION_MINOR); /// A string of the "Major.Minor" version #define OPENSHOT_VERSION_ALL STRINGIZE(OPENSHOT_VERSION_MAJOR) "." STRINGIZE(OPENSHOT_VERSION_MINOR) "." STRINGIZE(OPENSHOT_VERSION_BUILD); /// A string of the entire version "Major.Minor.Build"