From 617088cebfaa0e65781b5ec0a17ad7e4441c3e83 Mon Sep 17 00:00:00 2001 From: Jonathan Thomas Date: Sun, 14 Oct 2012 03:43:52 -0500 Subject: [PATCH] Yet another huge refactor, to use shared_ptr objects instead of actual pointers, due to the difficulties in managing the lifecycle of pointers between the timeline, clip, and readers. Seems to work great, and solves all sorts of bugs. =) --- include/Cache.h | 9 +- include/Clip.h | 5 +- include/FFmpegReader.h | 7 +- include/FFmpegWriter.h | 24 ++-- include/FileReaderBase.h | 3 +- include/FileWriterBase.h | 2 +- include/ImageReader.h | 6 +- include/Timeline.h | 3 +- src/Cache.cpp | 12 +- src/Clip.cpp | 6 +- src/FFmpegReader.cpp | 16 +-- src/FFmpegWriter.cpp | 22 +-- src/ImageReader.cpp | 6 +- src/Main.cpp | 239 +++++++++++++++++---------------- src/Player.cpp | 4 +- src/Timeline.cpp | 4 +- tests/Cache_Tests.cpp | 32 ++--- tests/FFmpegReader_Tests.cpp | 4 +- tests/FileReaderBase_Tests.cpp | 2 +- 19 files changed, 208 insertions(+), 198 deletions(-) diff --git a/include/Cache.h b/include/Cache.h index 1d0066f0..cc9003c9 100644 --- a/include/Cache.h +++ b/include/Cache.h @@ -9,6 +9,7 @@ #include #include +#include #include "Frame.h" #include "Exceptions.h" @@ -27,7 +28,7 @@ namespace openshot { private: int64 total_bytes; ///< This is the current total bytes (that are in this cache) int64 max_bytes; ///< This is the max number of bytes to cache (0 = no limit) - map frames; ///< This map holds the frame number and Frame objects + map > frames; ///< This map holds the frame number and Frame objects deque frame_numbers; ///< This queue holds a sequential list of cached Frame numbers /// Clean up cached frames that exceed the max number of bytes @@ -41,7 +42,7 @@ namespace openshot { Cache(int64 max_bytes); /// Add a Frame to the cache - void Add(int frame_number, Frame* frame); + void Add(int frame_number, tr1::shared_ptr frame); /// Clear the cache of all frames void Clear(); @@ -56,7 +57,7 @@ namespace openshot { bool Exists(int frame_number); /// Get a frame from the cache - Frame* GetFrame(int frame_number); + tr1::shared_ptr GetFrame(int frame_number); /// Gets the maximum bytes value int64 GetBytes() { return total_bytes; }; @@ -65,7 +66,7 @@ namespace openshot { int64 GetMaxBytes() { return max_bytes; }; /// Get the smallest frame number - Frame* GetSmallestFrame(); + tr1::shared_ptr GetSmallestFrame(); /// Move frame to front of queue (so it lasts longer) void MoveToFront(int frame_number); diff --git a/include/Clip.h b/include/Clip.h index c3ad362a..987a447f 100644 --- a/include/Clip.h +++ b/include/Clip.h @@ -7,6 +7,7 @@ * \author Copyright (c) 2011 Jonathan Thomas */ +#include #include "FFmpegReader.h" #include "FrameRate.h" #include "FrameMapper.h" @@ -78,7 +79,7 @@ namespace openshot { int adjust_frame_number_minimum(int frame_number); /// Apply basic image processing (scale, rotate, move, etc...) - void apply_basic_image_processing(Frame* frame, int frame_number); + void apply_basic_image_processing(tr1::shared_ptr frame, int frame_number); /// Get file extension string get_file_extension(string path); @@ -119,7 +120,7 @@ namespace openshot { /// /// @returns The requested frame (containing the image) /// @param[requested_frame] number The frame number that is requested. - Frame* GetFrame(int requested_frame) throw(ReaderClosed); + tr1::shared_ptr GetFrame(int requested_frame) throw(ReaderClosed); /// Map frame rate of this clip to a different frame rate void MapFrames(Framerate fps, Pulldown_Method pulldown); diff --git a/include/FFmpegReader.h b/include/FFmpegReader.h index 2a03ad17..26c0285e 100644 --- a/include/FFmpegReader.h +++ b/include/FFmpegReader.h @@ -25,6 +25,7 @@ extern "C" { #include #include #include +#include #include "Magick++.h" #include "Cache.h" #include "Exceptions.h" @@ -111,7 +112,7 @@ namespace openshot int ConvertVideoPTStoFrame(int pts); /// Create a new Frame (or return an existing one) and add it to the working queue. - Frame* CreateFrame(int requested_frame); + tr1::shared_ptr CreateFrame(int requested_frame); /// Calculate Starting video frame and sample # for an audio PTS audio_packet_location GetAudioPTSLocation(int pts); @@ -144,7 +145,7 @@ namespace openshot void ProcessAudioPacket(int requested_frame, int target_frame, int starting_sample); /// Read the stream until we find the requested Frame - Frame* ReadStream(int requested_frame); + tr1::shared_ptr ReadStream(int requested_frame); /// Remove AVFrame from cache (and deallocate it's memory) void RemoveAVFrame(AVPicture*); @@ -187,7 +188,7 @@ namespace openshot /// /// @returns The requested frame of video /// @param[requested_frame] number The frame number that is requested. - Frame* GetFrame(int requested_frame) throw(ReaderClosed, TooManySeeks); + tr1::shared_ptr GetFrame(int requested_frame) throw(ReaderClosed, TooManySeeks); /// Open File - which is called by the constructor automatically void Open() throw(InvalidFile, NoStreamsFound, InvalidCodec); diff --git a/include/FFmpegWriter.h b/include/FFmpegWriter.h index 274be07a..f748a124 100644 --- a/include/FFmpegWriter.h +++ b/include/FFmpegWriter.h @@ -78,20 +78,20 @@ namespace openshot int audio_input_position; AudioResampler *resampler; - Frame* last_frame; - deque spooled_audio_frames; - deque spooled_video_frames; + tr1::shared_ptr last_frame; + deque > spooled_audio_frames; + deque > spooled_video_frames; - deque queued_audio_frames; - deque queued_video_frames; + deque > queued_audio_frames; + deque > queued_video_frames; - deque processed_frames; - deque deallocate_frames; + deque > processed_frames; + deque > deallocate_frames; - map av_frames; + map, AVFrame*> av_frames; /// Add an AVFrame to the cache - void add_avframe(Frame* frame, AVFrame* av_frame); + void add_avframe(tr1::shared_ptr frame, AVFrame* av_frame); /// Add an audio output stream AVStream* add_audio_stream(); @@ -121,13 +121,13 @@ namespace openshot void open_video(AVFormatContext *oc, AVStream *st); /// process video frame - void process_video_packet(Frame* frame); + void process_video_packet(tr1::shared_ptr frame); /// write all queued frames' audio to the video file void write_audio_packets(); /// write video frame - void write_video_packet(Frame* frame, AVFrame* frame_final); + void write_video_packet(tr1::shared_ptr frame, AVFrame* frame_final); /// write all queued frames void write_queued_frames(); @@ -172,7 +172,7 @@ namespace openshot void WriteHeader(); /// Add a frame to the stack waiting to be encoded. - void WriteFrame(Frame* frame); + void WriteFrame(tr1::shared_ptr frame); /// Write a block of frames from a reader void WriteFrame(FileReaderBase* reader, int start, int length); diff --git a/include/FileReaderBase.h b/include/FileReaderBase.h index bd06e61c..d4c75419 100644 --- a/include/FileReaderBase.h +++ b/include/FileReaderBase.h @@ -9,6 +9,7 @@ #include #include +#include #include "Fraction.h" #include "Frame.h" @@ -75,7 +76,7 @@ namespace openshot /// /// @returns The requested frame of video /// @param[in] number The frame number that is requested. - virtual Frame* GetFrame(int number) = 0; + virtual tr1::shared_ptr GetFrame(int number) = 0; /// Initialize the values of the ReaderInfo struct. It is important for derived classes to call /// this method, or the ReaderInfo struct values will not be initialized. diff --git a/include/FileWriterBase.h b/include/FileWriterBase.h index 22dedc32..18c934a7 100644 --- a/include/FileWriterBase.h +++ b/include/FileWriterBase.h @@ -65,7 +65,7 @@ namespace openshot WriterInfo info; /// This method is required for all derived classes of FileWriterBase. Write a Frame to the video file. - virtual void WriteFrame(Frame* frame) = 0; + virtual void WriteFrame(tr1::shared_ptr frame) = 0; /// This method is required for all derived classes of FileWriterBase. Write a block of frames from a reader. virtual void WriteFrame(FileReaderBase* reader, int start, int length) = 0; diff --git a/include/ImageReader.h b/include/ImageReader.h index 53f69fa9..d7e4dd9a 100644 --- a/include/ImageReader.h +++ b/include/ImageReader.h @@ -14,11 +14,11 @@ #include #include #include +#include #include "Magick++.h" #include "Cache.h" #include "Exceptions.h" - using namespace std; namespace openshot @@ -32,7 +32,7 @@ namespace openshot { private: string path; - Frame* image_frame; + tr1::shared_ptr image_frame; bool is_open; public: @@ -49,7 +49,7 @@ namespace openshot /// /// @returns The requested frame (containing the image) /// @param[requested_frame] number The frame number that is requested. - Frame* GetFrame(int requested_frame) throw(ReaderClosed); + tr1::shared_ptr GetFrame(int requested_frame) throw(ReaderClosed); /// Open File - which is called by the constructor automatically void Open() throw(InvalidFile); diff --git a/include/Timeline.h b/include/Timeline.h index 7cc5aa05..1b427bac 100644 --- a/include/Timeline.h +++ b/include/Timeline.h @@ -8,6 +8,7 @@ */ #include +#include #include "Clip.h" #include "FileReaderBase.h" #include "Fraction.h" @@ -69,7 +70,7 @@ namespace openshot { /// /// @returns The requested frame (containing the image) /// @param[requested_frame] number The frame number that is requested. - Frame* GetFrame(int requested_frame) throw(ReaderClosed); + tr1::shared_ptr GetFrame(int requested_frame) throw(ReaderClosed); /// Get the height of canvas and viewport int Height() { return height; } diff --git a/src/Cache.cpp b/src/Cache.cpp index 97f78e0f..6ae9e416 100644 --- a/src/Cache.cpp +++ b/src/Cache.cpp @@ -16,7 +16,7 @@ Cache::Cache() : max_bytes(0), total_bytes(0) { }; Cache::Cache(int64 max_bytes) : max_bytes(max_bytes), total_bytes(0) { }; // Add a Frame to the cache -void Cache::Add(int frame_number, Frame *frame) +void Cache::Add(int frame_number, tr1::shared_ptr frame) { // Remove frame if it already exists if (Exists(frame_number)) @@ -47,7 +47,7 @@ bool Cache::Exists(int frame_number) } // Get a frame from the cache -Frame* Cache::GetFrame(int frame_number) +tr1::shared_ptr Cache::GetFrame(int frame_number) { // Does frame exists in cache? if (Exists(frame_number)) @@ -64,7 +64,7 @@ Frame* Cache::GetFrame(int frame_number) } // Get the smallest frame number -Frame* Cache::GetSmallestFrame() +tr1::shared_ptr Cache::GetSmallestFrame() { // Loop through frame numbers deque::iterator itr; @@ -83,7 +83,7 @@ Frame* Cache::GetSmallestFrame() void Cache::Remove(int frame_number, bool delete_data) { // Get the frame (or throw exception) - Frame *f = GetFrame(frame_number); + tr1::shared_ptr f = GetFrame(frame_number); // Decrement the total bytes (for this cache) total_bytes -= f->GetBytes(); @@ -102,7 +102,7 @@ void Cache::Remove(int frame_number, bool delete_data) // Deallocate frame (if requested) if (delete_data) - delete frames[frame_number]; + frames[frame_number].reset(); // Remove frame from map frames.erase(frame_number); @@ -148,7 +148,7 @@ void Cache::Clear() for(itr = frame_numbers.begin(); itr != frame_numbers.end(); ++itr) { // Deallocate frame - delete frames[*itr]; + frames[*itr].reset(); // Remove frame from map frames.erase(*itr); diff --git a/src/Clip.cpp b/src/Clip.cpp index bbc365bb..45e57434 100644 --- a/src/Clip.cpp +++ b/src/Clip.cpp @@ -170,7 +170,7 @@ float Clip::End() } // Get an openshot::Frame object for a specific frame number of this reader. -Frame* Clip::GetFrame(int requested_frame) throw(ReaderClosed) +tr1::shared_ptr Clip::GetFrame(int requested_frame) throw(ReaderClosed) { // Adjust out of bounds frame number requested_frame = adjust_frame_number_minimum(requested_frame); @@ -182,7 +182,7 @@ Frame* Clip::GetFrame(int requested_frame) throw(ReaderClosed) frame_number = adjust_frame_number_minimum(get_time_mapped_frame(frame_number)); // Now that we have re-mapped what frame number is needed, go and get the frame pointer - Frame *frame = file_reader->GetFrame(frame_number); + tr1::shared_ptr frame = file_reader->GetFrame(frame_number); // Apply basic image processing (scale, rotation, etc...) apply_basic_image_processing(frame, frame_number); @@ -241,7 +241,7 @@ int Clip::get_time_mapped_frame(int original_frame_number) } // Apply basic image processing (scale, rotate, move, etc...) -void Clip::apply_basic_image_processing(Frame* frame, int frame_number) +void Clip::apply_basic_image_processing(tr1::shared_ptr frame, int frame_number) { // Get values float rotation_value = rotation.GetValue(frame_number); diff --git a/src/FFmpegReader.cpp b/src/FFmpegReader.cpp index 14b5ead4..8d92780f 100644 --- a/src/FFmpegReader.cpp +++ b/src/FFmpegReader.cpp @@ -287,7 +287,7 @@ void FFmpegReader::UpdateVideoInfo() } -Frame* FFmpegReader::GetFrame(int requested_frame) throw(ReaderClosed, TooManySeeks) +tr1::shared_ptr FFmpegReader::GetFrame(int requested_frame) throw(ReaderClosed, TooManySeeks) { // Check for open reader (or throw exception) if (!is_open) @@ -348,7 +348,7 @@ Frame* FFmpegReader::GetFrame(int requested_frame) throw(ReaderClosed, TooManySe } // Read the stream until we find the requested Frame -Frame* FFmpegReader::ReadStream(int requested_frame) +tr1::shared_ptr FFmpegReader::ReadStream(int requested_frame) { // Allocate video frame bool end_of_stream = false; @@ -635,7 +635,7 @@ void FFmpegReader::ProcessVideoPacket(int requested_frame) sws_scale(img_convert_ctx, my_frame->data, my_frame->linesize, 0, height, pFrameRGB->data, pFrameRGB->linesize); - Frame *f = NULL; + tr1::shared_ptr f; #pragma omp critical (openshot_cache) // Create or get frame object f = CreateFrame(current_frame); @@ -820,7 +820,7 @@ void FFmpegReader::ProcessAudioPacket(int requested_frame, int target_frame, int #pragma omp critical (processing_list) processing_audio_frames[starting_frame_number] = starting_frame_number; - Frame *f = NULL; + tr1::shared_ptr f; #pragma omp critical (openshot_cache) // Create or get frame object f = CreateFrame(starting_frame_number); @@ -1081,13 +1081,13 @@ int FFmpegReader::GetSamplesPerFrame(int frame_number) } // Create a new Frame (or return an existing one) and add it to the working queue. -Frame* FFmpegReader::CreateFrame(int requested_frame) +tr1::shared_ptr FFmpegReader::CreateFrame(int requested_frame) { // Check working cache if (working_cache.Exists(requested_frame)) { // Return existing frame - Frame* output = working_cache.GetFrame(requested_frame); + tr1::shared_ptr output = working_cache.GetFrame(requested_frame); return output; } @@ -1097,7 +1097,7 @@ Frame* FFmpegReader::CreateFrame(int requested_frame) int samples_per_frame = GetSamplesPerFrame(requested_frame); // Create a new frame on the working cache - Frame *f = new Frame(requested_frame, 1, 1, "#000000", samples_per_frame, info.channels); + tr1::shared_ptr f(new Frame(requested_frame, 1, 1, "#000000", samples_per_frame, info.channels)); f->SetPixelRatio(info.pixel_ratio.num, info.pixel_ratio.den); f->SetSampleRate(info.sample_rate); @@ -1134,7 +1134,7 @@ void FFmpegReader::CheckWorkingFrames(bool end_of_stream) break; // Get the front frame of working cache - Frame *f = working_cache.GetSmallestFrame(); + tr1::shared_ptr f(working_cache.GetSmallestFrame()); bool is_video_ready = (f->number < smallest_video_frame); bool is_audio_ready = (f->number < smallest_audio_frame); diff --git a/src/FFmpegWriter.cpp b/src/FFmpegWriter.cpp index 5f02fd82..73d686b9 100644 --- a/src/FFmpegWriter.cpp +++ b/src/FFmpegWriter.cpp @@ -31,7 +31,7 @@ FFmpegWriter::FFmpegWriter(string path) throw (InvalidFile, InvalidFormat, Inval path(path), fmt(NULL), oc(NULL), audio_st(NULL), video_st(NULL), audio_pts(0), video_pts(0), samples(NULL), audio_outbuf(NULL), audio_outbuf_size(0), audio_input_frame_size(0), audio_input_position(0), initial_audio_input_frame_size(0), resampler(NULL), img_convert_ctx(NULL), cache_size(8), - num_of_rescalers(32), rescaler_position(0), video_codec(NULL), audio_codec(NULL), is_writing(false), last_frame(NULL) + num_of_rescalers(32), rescaler_position(0), video_codec(NULL), audio_codec(NULL), is_writing(false) { // Init FileInfo struct (clear all values) @@ -284,7 +284,7 @@ void FFmpegWriter::WriteHeader() } // Add a frame to the queue waiting to be encoded. -void FFmpegWriter::WriteFrame(Frame* frame) +void FFmpegWriter::WriteFrame(tr1::shared_ptr frame) { // Add frame pointer to "queue", waiting to be processed the next // time the WriteFrames() method is called. @@ -344,7 +344,7 @@ void FFmpegWriter::write_queued_frames() while (!queued_video_frames.empty()) { // Get front frame (from the queue) - Frame *frame = queued_video_frames.front(); + tr1::shared_ptr frame = queued_video_frames.front(); // Add to processed queue processed_frames.push_back(frame); @@ -365,7 +365,7 @@ void FFmpegWriter::write_queued_frames() while (!processed_frames.empty()) { // Get front frame (from the queue) - Frame *frame = processed_frames.front(); + tr1::shared_ptr frame = processed_frames.front(); if (info.has_video && video_st) { @@ -391,7 +391,7 @@ void FFmpegWriter::write_queued_frames() while (!deallocate_frames.empty()) { // Get front frame (from the queue) - Frame *frame = deallocate_frames.front(); + tr1::shared_ptr frame = deallocate_frames.front(); // Does this frame's AVFrame still exist if (av_frames.count(frame)) @@ -425,7 +425,7 @@ void FFmpegWriter::WriteFrame(FileReaderBase* reader, int start, int length) for (int number = start; number <= length; number++) { // Get the frame - Frame *f = reader->GetFrame(number); + tr1::shared_ptr f = reader->GetFrame(number); // Encode frame WriteFrame(f); @@ -441,7 +441,7 @@ void FFmpegWriter::WriteTrailer() if (last_frame) { // Create black frame - Frame *padding_frame = new Frame(999999, last_frame->GetWidth(), last_frame->GetHeight(), "#000000", last_frame->GetAudioSamplesCount(), last_frame->GetAudioChannelsCount()); + tr1::shared_ptr padding_frame(new Frame(999999, last_frame->GetWidth(), last_frame->GetHeight(), "#000000", last_frame->GetAudioSamplesCount(), last_frame->GetAudioChannelsCount())); padding_frame->AddColor(last_frame->GetWidth(), last_frame->GetHeight(), "#000000"); // Add the black frame many times @@ -507,7 +507,7 @@ void FFmpegWriter::Close() } // Add an AVFrame to the cache -void FFmpegWriter::add_avframe(Frame* frame, AVFrame* av_frame) +void FFmpegWriter::add_avframe(tr1::shared_ptr frame, AVFrame* av_frame) { // Add AVFrame to map (if it does not already exist) if (!av_frames.count(frame)) @@ -758,7 +758,7 @@ void FFmpegWriter::write_audio_packets() while (!queued_audio_frames.empty()) { // Get front frame (from the queue) - Frame *frame = queued_audio_frames.front(); + tr1::shared_ptr frame = queued_audio_frames.front(); // Get the audio details from this frame sample_rate_in_frame = info.sample_rate; // resampling happens when getting the interleaved audio samples below @@ -911,7 +911,7 @@ AVFrame* FFmpegWriter::allocate_avframe(PixelFormat pix_fmt, int width, int heig } // process video frame -void FFmpegWriter::process_video_packet(Frame* frame) +void FFmpegWriter::process_video_packet(tr1::shared_ptr frame) { // Determine the height & width of the source image int source_image_width = frame->GetWidth(); @@ -985,7 +985,7 @@ void FFmpegWriter::process_video_packet(Frame* frame) } // write video frame -void FFmpegWriter::write_video_packet(Frame* frame, AVFrame* frame_final) +void FFmpegWriter::write_video_packet(tr1::shared_ptr frame, AVFrame* frame_final) { // Encode Picture and Write Frame int video_outbuf_size = 200000; diff --git a/src/ImageReader.cpp b/src/ImageReader.cpp index 2b69cfa6..34daa22c 100644 --- a/src/ImageReader.cpp +++ b/src/ImageReader.cpp @@ -31,7 +31,7 @@ void ImageReader::Open() throw(InvalidFile) } // Create or get frame object - image_frame = new Frame(1, source->size().width(), source->size().height(), "#000000", 0, 2); + image_frame = tr1::shared_ptr(new Frame(1, source->size().width(), source->size().height(), "#000000", 0, 2)); // Add Image data to frame image_frame->AddImage(source); @@ -74,7 +74,7 @@ void ImageReader::Close() if (is_open) { // Deallocate frame - delete image_frame; + image_frame.reset(); // Mark as "closed" is_open = false; @@ -82,7 +82,7 @@ void ImageReader::Close() } // Get an openshot::Frame object for a specific frame number of this reader. -Frame* ImageReader::GetFrame(int requested_frame) throw(ReaderClosed) +tr1::shared_ptr ImageReader::GetFrame(int requested_frame) throw(ReaderClosed) { // Check for open reader (or throw exception) if (!is_open) diff --git a/src/Main.cpp b/src/Main.cpp index 3168e1f8..212ab96c 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -3,9 +3,11 @@ #include #include #include +#include #include "../include/OpenShot.h" using namespace openshot; +using namespace tr1; void FrameReady(int number) { @@ -14,70 +16,73 @@ void FrameReady(int number) int main() { -// // Create timeline -// Timeline t(640, 360, Framerate(24,1)); -// -// // Add some clips -// Clip c1("../../src/examples/piano.wav"); -// c1.Position(0.0); -// + shared_ptr f(new Frame(1,2,2)); + + + // Create timeline + Timeline t(640, 360, Framerate(24,1)); + + // Add some clips + Clip c1("/home/jonathan/Videos/sintel-1024-stereo.mp4"); + c1.Position(0.0); + // c1.time.AddPoint(1, 50); // c1.time.AddPoint(100, 1); // c1.time.AddPoint(200, 90); // c1.time.PrintValues(); -// -// //c1.time.AddPoint(500, 500, LINEAR); -//// c1.time.AddPoint(1, 300); -//// c1.time.AddPoint(200, 500, LINEAR); -//// c1.time.AddPoint(400, 100); -//// c1.time.AddPoint(500, 500); -// -// // Add clips -// t.AddClip(&c1); -// -// -// // Create a writer -// FFmpegWriter w("/home/jonathan/output.webm"); -// w.DisplayInfo(); -// -// // Set options -// w.SetAudioOptions(true, "libvorbis", 44100, 2, 128000, false); -// //w.SetVideoOptions(true, "libvpx", Fraction(24, 1), 640, 360, Fraction(1,1), false, false, 2000000); -// -// // Prepare Streams -// w.PrepareStreams(); -// -// // Write header -// w.WriteHeader(); -// -// // Output stream info -// w.OutputStreamInfo(); -// -// for (int frame = 1; frame <= 162; frame++) -// { -// Frame *f = t.GetFrame(frame); -// if (f) -// { -// //f->AddOverlayNumber(0); -// -// // Write frame -// //cout << "queue frame " << frame << endl; -// cout << "queue frame " << frame << " (" << f->number << ", " << f << ")" << endl; -// w.WriteFrame(f); -// } -// } -// -// // Write Footer -// w.WriteTrailer(); -// -// // Close writer & reader -// w.Close(); -// -// // Close timeline -// t.Close(); -// -// cout << "Successfully Finished Timeline DEMO" << endl; -// return 0; + + //c1.time.AddPoint(500, 500, LINEAR); + c1.time.AddPoint(1, 300); + c1.time.AddPoint(200, 500, LINEAR); + c1.time.AddPoint(400, 100); + c1.time.AddPoint(500, 500); + + // Add clips + t.AddClip(&c1); + + + // Create a writer + FFmpegWriter w("/home/jonathan/output.webm"); + w.DisplayInfo(); + + // Set options + w.SetAudioOptions(true, "libvorbis", 44100, 2, 128000, false); + w.SetVideoOptions(true, "libvpx", Fraction(24, 1), 640, 360, Fraction(1,1), false, false, 2000000); + + // Prepare Streams + w.PrepareStreams(); + + // Write header + w.WriteHeader(); + + // Output stream info + w.OutputStreamInfo(); + + for (int frame = 1; frame <= 500; frame++) + { + tr1::shared_ptr f = t.GetFrame(frame); + if (f) + { + //f->AddOverlayNumber(0); + + // Write frame + //cout << "queue frame " << frame << endl; + cout << "queue frame " << frame << " (" << f->number << ", " << f << ")" << endl; + w.WriteFrame(f); + } + } + + // Write Footer + w.WriteTrailer(); + + // Close writer & reader + w.Close(); + + // Close timeline + t.Close(); + + cout << "Successfully Finished Timeline DEMO" << endl; + return 0; @@ -125,63 +130,63 @@ int main() // openshot::FFmpegReader r("/home/jonathan/Videos/60fps.mp4"); // openshot::FFmpegReader r("/home/jonathan/Aptana Studio Workspace/OpenShotLibrary/src/examples/asdf.wdf"); - // Display debug info - r.Open(); - r.DisplayInfo(); - - // Create a writer - FFmpegWriter w("/home/jonathan/output.webm"); - w.DisplayInfo(); - - // Set options - w.SetAudioOptions(true, "libvorbis", 44100, 2, 128000, false); - //w.SetVideoOptions(true, "libvpx", Fraction(24, 1), 640, 360, Fraction(1,1), false, false, 2000000); - - // Prepare Streams - w.PrepareStreams(); - - // Set Options -// w.SetOption(VIDEO_STREAM, "quality", "good"); -// w.SetOption(VIDEO_STREAM, "g", "120"); -// w.SetOption(VIDEO_STREAM, "qmin", "11"); -// w.SetOption(VIDEO_STREAM, "qmax", "51"); -// w.SetOption(VIDEO_STREAM, "profile", "0"); -// w.SetOption(VIDEO_STREAM, "speed", "0"); -// w.SetOption(VIDEO_STREAM, "level", "216"); -// w.SetOption(VIDEO_STREAM, "rc_lookahead", "16"); -// w.SetOption(VIDEO_STREAM, "rc_min_rate", "100000"); -// w.SetOption(VIDEO_STREAM, "rc_max_rate", "24000000"); -// w.SetOption(VIDEO_STREAM, "slices", "4"); -// w.SetOption(VIDEO_STREAM, "arnr_max_frames", "7"); -// w.SetOption(VIDEO_STREAM, "arnr_strength", "5"); -// w.SetOption(VIDEO_STREAM, "arnr_type", "3"); - - // Write header - w.WriteHeader(); - - // Output stream info - w.OutputStreamInfo(); - - //Frame *f = r.GetFrame(1); - - //for (int frame = 131; frame >= 1; frame--) - for (int frame = 1; frame <= 131; frame++) - { - Frame *f = r.GetFrame(frame); - //f->AddOverlayNumber(0); - //f->Display(); - - // Write frame - cout << "queue frame " << frame << endl; - w.WriteFrame(f); - } - - // Write Footer - w.WriteTrailer(); - - // Close writer & reader - w.Close(); - r.Close(); +// // Display debug info +// r.Open(); +// r.DisplayInfo(); +// +// // Create a writer +// FFmpegWriter w("/home/jonathan/output.webm"); +// w.DisplayInfo(); +// +// // Set options +// w.SetAudioOptions(true, "libvorbis", 44100, 2, 128000, false); +// //w.SetVideoOptions(true, "libvpx", Fraction(24, 1), 640, 360, Fraction(1,1), false, false, 2000000); +// +// // Prepare Streams +// w.PrepareStreams(); +// +// // Set Options +//// w.SetOption(VIDEO_STREAM, "quality", "good"); +//// w.SetOption(VIDEO_STREAM, "g", "120"); +//// w.SetOption(VIDEO_STREAM, "qmin", "11"); +//// w.SetOption(VIDEO_STREAM, "qmax", "51"); +//// w.SetOption(VIDEO_STREAM, "profile", "0"); +//// w.SetOption(VIDEO_STREAM, "speed", "0"); +//// w.SetOption(VIDEO_STREAM, "level", "216"); +//// w.SetOption(VIDEO_STREAM, "rc_lookahead", "16"); +//// w.SetOption(VIDEO_STREAM, "rc_min_rate", "100000"); +//// w.SetOption(VIDEO_STREAM, "rc_max_rate", "24000000"); +//// w.SetOption(VIDEO_STREAM, "slices", "4"); +//// w.SetOption(VIDEO_STREAM, "arnr_max_frames", "7"); +//// w.SetOption(VIDEO_STREAM, "arnr_strength", "5"); +//// w.SetOption(VIDEO_STREAM, "arnr_type", "3"); +// +// // Write header +// w.WriteHeader(); +// +// // Output stream info +// w.OutputStreamInfo(); +// +// //Frame *f = r.GetFrame(1); +// +// //for (int frame = 131; frame >= 1; frame--) +// for (int frame = 1; frame <= 131; frame++) +// { +// tr1::shared_ptr f = r.GetFrame(frame); +// //f->AddOverlayNumber(0); +// //f->Display(); +// +// // Write frame +// cout << "queue frame " << frame << endl; +// w.WriteFrame(f); +// } +// +// // Write Footer +// w.WriteTrailer(); +// +// // Close writer & reader +// w.Close(); +// r.Close(); cout << "Successfully executed Main.cpp!" << endl; diff --git a/src/Player.cpp b/src/Player.cpp index 5251642e..10909428 100644 --- a/src/Player.cpp +++ b/src/Player.cpp @@ -25,7 +25,7 @@ void Player::SetFrameCallback(CallbackPtr p_callback, void *p_pythonmethod) // double *Pixels = new double[100]; // for (int i = 0; i < 100; i++) // Pixels[i] = i + 100; - Frame *f = reader->GetFrame(300); + tr1::shared_ptr f = reader->GetFrame(300); // invoke method pointer 10 times for (int i = 0; i < 30; i++) @@ -41,7 +41,7 @@ void Player::Push() // double *Pixels = new double[100]; // for (int i = 0; i < 100; i++) // Pixels[i] = i + 200; - Frame *f = reader->GetFrame(500); + tr1::shared_ptr f = reader->GetFrame(500); // manually invoke method for (int i = 30; i < 20; i++) diff --git a/src/Timeline.cpp b/src/Timeline.cpp index e70918da..576716f9 100644 --- a/src/Timeline.cpp +++ b/src/Timeline.cpp @@ -89,7 +89,7 @@ void Timeline::Open() } // Get an openshot::Frame object for a specific frame number of this reader. -Frame* Timeline::GetFrame(int requested_frame) throw(ReaderClosed) +tr1::shared_ptr Timeline::GetFrame(int requested_frame) throw(ReaderClosed) { // Adjust out of bounds frame number if (requested_frame < 1) @@ -121,5 +121,5 @@ Frame* Timeline::GetFrame(int requested_frame) throw(ReaderClosed) } // No clips found - return NULL; + return tr1::shared_ptr(); } diff --git a/tests/Cache_Tests.cpp b/tests/Cache_Tests.cpp index ba77bc9d..37c0eaf8 100644 --- a/tests/Cache_Tests.cpp +++ b/tests/Cache_Tests.cpp @@ -13,7 +13,7 @@ TEST(Cache_Default_Constructor) for (int i = 0; i < 50; i++) { // Add blank frame to the cache - Frame *f = new Frame(); + tr1::shared_ptr f(new Frame()); c.Add(i, f); } @@ -30,7 +30,7 @@ TEST(Cache_Max_Bytes_Constructor) for (int i = 30; i > 0; i--) { // Add blank frame to the cache - Frame *f = new Frame(i, 320, 240, "#000000"); + tr1::shared_ptr f(new Frame(i, 320, 240, "#000000")); c.Add(i, f); } @@ -41,7 +41,7 @@ TEST(Cache_Max_Bytes_Constructor) for (int i = 10; i > 0; i--) { // Add blank frame to the cache - Frame *f = new Frame(i, 320, 240, "#000000"); + tr1::shared_ptr f(new Frame(i, 320, 240, "#000000")); c.Add(i, f); } @@ -67,7 +67,7 @@ TEST(Cache_Clear) for (int i = 0; i < 10; i++) { // Add blank frame to the cache - Frame *f = new Frame(); + tr1::shared_ptr f(new Frame()); c.Add(i, f); } @@ -90,7 +90,7 @@ TEST(Cache_Add_Duplicate_Frames) for (int i = 0; i < 10; i++) { // Add blank frame to the cache (each frame is #1) - Frame *f = new Frame(); + tr1::shared_ptr f(new Frame()); c.Add(1, f); } @@ -107,7 +107,7 @@ TEST(Cache_Check_If_Frame_Exists) for (int i = 1; i < 6; i++) { // Add blank frame to the cache - Frame *f = new Frame(); + tr1::shared_ptr f(new Frame()); c.Add(i, f); } @@ -132,9 +132,9 @@ TEST(Cache_GetFrame) Frame green(3, 500, 500, "green"); // Add frames to cache - c.Add(red.number, &red); - c.Add(blue.number, &blue); - c.Add(green.number, &green); + c.Add(red.number, tr1::shared_ptr(&red)); + c.Add(blue.number, tr1::shared_ptr(&blue)); + c.Add(green.number, tr1::shared_ptr(&green)); // Get frames CHECK_THROW(c.GetFrame(0), OutOfBoundsFrame); @@ -157,9 +157,9 @@ TEST(Cache_GetSmallest) Frame green(3, 500, 500, "green"); // Add frames to cache - c.Add(red.number, &red); - c.Add(blue.number, &blue); - c.Add(green.number, &green); + c.Add(red.number, tr1::shared_ptr(&red)); + c.Add(blue.number, tr1::shared_ptr(&blue)); + c.Add(green.number, tr1::shared_ptr(&green)); // Check if frame 1 is the front CHECK_EQUAL(1, c.GetSmallestFrame()->number); @@ -185,9 +185,9 @@ TEST(Cache_Remove) Frame green(3, 500, 500, "green"); // Add frames to cache - c.Add(red.number, &red); - c.Add(blue.number, &blue); - c.Add(green.number, &green); + c.Add(red.number, tr1::shared_ptr(&red)); + c.Add(blue.number, tr1::shared_ptr(&blue)); + c.Add(green.number, tr1::shared_ptr(&green)); // Check if count is 3 CHECK_EQUAL(3, c.Count()); @@ -223,7 +223,7 @@ TEST(Cache_Set_Max_Bytes) for (int i = 0; i < 20; i++) { // Add blank frame to the cache - Frame *f = new Frame(); + tr1::shared_ptr f(new Frame()); c.Add(i, f); } diff --git a/tests/FFmpegReader_Tests.cpp b/tests/FFmpegReader_Tests.cpp index 24d956d1..9102e7dc 100644 --- a/tests/FFmpegReader_Tests.cpp +++ b/tests/FFmpegReader_Tests.cpp @@ -26,7 +26,7 @@ TEST(FFmpegReader_Check_Audio_File) r.Open(); // Get frame 1 - Frame *f = r.GetFrame(1); + tr1::shared_ptr f = r.GetFrame(1); // Get the number of channels and samples float *samples = f->GetAudioSamples(0); @@ -54,7 +54,7 @@ TEST(FFmpegReader_Check_Video_File) r.Open(); // Get frame 1 - Frame *f = r.GetFrame(1); + tr1::shared_ptr f = r.GetFrame(1); // Get the image data const Magick::PixelPacket* pixels = f->GetPixels(10); diff --git a/tests/FileReaderBase_Tests.cpp b/tests/FileReaderBase_Tests.cpp index 237796f7..8702b7e6 100644 --- a/tests/FileReaderBase_Tests.cpp +++ b/tests/FileReaderBase_Tests.cpp @@ -13,7 +13,7 @@ TEST(FileReaderBase_Derived_Class) { public: TestReader() { InitFileInfo(); }; - Frame* GetFrame(int number) { Frame *f = new Frame(); return f; } + tr1::shared_ptr GetFrame(int number) { tr1::shared_ptr f(new Frame()); return f; } void Close() { }; void Open() { }; };