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() { }; };