From 7a858aeca3aad52219acbf19456bd49e92e5131b Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 9 Aug 2019 07:46:53 +1000 Subject: [PATCH] moved decoders to shared ptrs --- app/decoder/decoder.cpp | 62 ++++++++++++---------------------- app/decoder/decoder.h | 7 ++-- app/node/input/media/media.cpp | 2 +- app/node/input/media/media.h | 2 +- 4 files changed, 27 insertions(+), 46 deletions(-) diff --git a/app/decoder/decoder.cpp b/app/decoder/decoder.cpp index db8197bde..4993bf935 100644 --- a/app/decoder/decoder.cpp +++ b/app/decoder/decoder.cpp @@ -58,22 +58,14 @@ void Decoder::set_stream(const Stream *fs) * DECODER STATIC PUBLIC MEMBERS */ -QVector ReceiveListOfAllDecoders() { - QVector decoders; +QVector ReceiveListOfAllDecoders() { + QVector decoders; - decoders.append(new FFmpegDecoder()); + decoders.append(std::make_shared()); return decoders; } -void FreeListOfDecoders(const QVector& decoders, Decoder* except = nullptr) { - foreach (Decoder* d, decoders) { - if (except == nullptr || except != d) { - delete d; - } - } -} - bool Decoder::ProbeMedia(Footage *f) { // Check for a valid filename @@ -92,60 +84,48 @@ bool Decoder::ProbeMedia(Footage *f) f->Clear(); // Create list to iterate through - QVector decoder_list = ReceiveListOfAllDecoders(); - - Decoder* found_decoder = nullptr; + QVector decoder_list = ReceiveListOfAllDecoders(); // Pass Footage through each Decoder's probe function for (int i=0;iProbe(f)) { + // We found a Decoder, so we can set this media as valid + f->set_status(Footage::kReady); + + // Attach the successful Decoder to this Footage object + f->set_decoder(decoder->id()); + // FIXME: Cache the results so we don't have to probe if this media is added a second time - found_decoder = decoder; - break; + return true; } } - if (found_decoder == nullptr) { - // We aren't able to use this Footage - f->set_status(Footage::kInvalid); - f->set_decoder(QString()); - } else { - // We found a Decoder, so we can set this media as valid - f->set_status(Footage::kReady); + // We aren't able to use this Footage + f->set_status(Footage::kInvalid); + f->set_decoder(QString()); - // Attach the successful Decoder to this Footage object - f->set_decoder(found_decoder->id()); - } - - FreeListOfDecoders(decoder_list); - - return (found_decoder != nullptr); + return false; } -Decoder *Decoder::CreateFromID(const QString &id) +DecoderPtr Decoder::CreateFromID(const QString &id) { if (id.isEmpty()) { return nullptr; } // Create list to iterate through - QVector decoder_list = ReceiveListOfAllDecoders(); + QVector decoder_list = ReceiveListOfAllDecoders(); - Decoder* found_decoder = nullptr; - - foreach (Decoder* d, decoder_list) { + foreach (DecoderPtr d, decoder_list) { if (d->id() == id) { - found_decoder = d; - break; + return d; } } - FreeListOfDecoders(decoder_list, found_decoder); - - return found_decoder; + return nullptr; } diff --git a/app/decoder/decoder.h b/app/decoder/decoder.h index de160fbf1..38237f60f 100644 --- a/app/decoder/decoder.h +++ b/app/decoder/decoder.h @@ -28,6 +28,9 @@ #include "project/item/footage/footage.h" #include "decoder/frame.h" +class Decoder; +using DecoderPtr = std::shared_ptr; + /** * @brief A decoder's is the main class for bringing external media into Olive * @@ -185,7 +188,7 @@ public: * * A Decoder instance or nullptr if a Decoder with this ID does not exist */ - static Decoder* CreateFromID(const QString& id); + static DecoderPtr CreateFromID(const QString& id); protected: bool open_; @@ -194,6 +197,4 @@ private: const Stream* stream_; }; -using DecoderPtr = std::shared_ptr; - #endif // DECODER_H diff --git a/app/node/input/media/media.cpp b/app/node/input/media/media.cpp index 3d64382ac..98f8be707 100644 --- a/app/node/input/media/media.cpp +++ b/app/node/input/media/media.cpp @@ -64,7 +64,6 @@ QString MediaInput::Description() void MediaInput::Release() { - delete decoder_; decoder_ = nullptr; } @@ -93,6 +92,7 @@ void MediaInput::Process(const rational &time) // Determine which decoder to use if (decoder_ == nullptr && (decoder_ = Decoder::CreateFromID(footage->decoder())) == nullptr) { + return; } if (decoder_->stream() == nullptr) { diff --git a/app/node/input/media/media.h b/app/node/input/media/media.h index 20c8e35ae..089e299dc 100644 --- a/app/node/input/media/media.h +++ b/app/node/input/media/media.h @@ -63,7 +63,7 @@ private: TextureBuffer tex_buf_; // END TEST CODE - Decoder* decoder_; + DecoderPtr decoder_; };