diff --git a/src/bin/imgtools/rvio/main.cpp b/src/bin/imgtools/rvio/main.cpp index 2fd3441e5..0d5c51e3f 100644 --- a/src/bin/imgtools/rvio/main.cpp +++ b/src/bin/imgtools/rvio/main.cpp @@ -970,14 +970,8 @@ int utf8Main(int argc, char* argv[]) setEnvVar("LC_ALL", "C"); TwkFB::ThreadPool::initialize(); - // - // XXX dummyDev is leaking here. Best would be to pass it to the App so - // that it could delete it after startup, since it's no longer needed at - // that point. - // - #ifdef RVIO_HW - TwkGLF::FBOVideoDevice* dummyDev = new TwkGLF::FBOVideoDevice(0, 10, 10, false); + auto dummyDev = std::make_unique(nullptr, 10, 10, false); #else TwkGLF::OSMesaVideoDevice* dummyDev = new TwkGLF::OSMesaVideoDevice(0, 10, 10, true); FrameBuffer* dummyFB = new FrameBuffer(10, 10, 4, FrameBuffer::FLOAT); @@ -1646,7 +1640,7 @@ int utf8Main(int argc, char* argv[]) threadAPI.create = GC_pthread_create; threadAPI.join = GC_pthread_join; threadAPI.detach = GC_pthread_detach; - outmov = new ThreadedMovie(inputMovies, outFrames, 8, &threadAPI, threadedMovieInit); + outmov = new ThreadedMovie(inputMovies, outFrames, 8, &threadAPI, threadedMovieInit, MovieRV::uninit); #endif #endif @@ -1739,10 +1733,6 @@ int utf8Main(int argc, char* argv[]) if (!writer->write(outmov, outfile, writeRequest)) exit(-2); - - // clean up any frame buffers we allocated writing the movie - // - MovieRV::uninit(); } catch (TwkExc::Exception& exc) { diff --git a/src/lib/image/TwkMovie/ThreadedMovie.cpp b/src/lib/image/TwkMovie/ThreadedMovie.cpp index c911e84e4..005beed50 100644 --- a/src/lib/image/TwkMovie/ThreadedMovie.cpp +++ b/src/lib/image/TwkMovie/ThreadedMovie.cpp @@ -19,7 +19,8 @@ namespace TwkMovie mov->threadMain(); } - ThreadedMovie::ThreadedMovie(const Movies& movies, const Frames& frames, size_t stackMultiplier, ThreadAPI* api, InitializeFunc F) + ThreadedMovie::ThreadedMovie(const Movies& movies, const Frames& frames, size_t stackMultiplier, ThreadAPI* api, InitializeFunc F, + FinalizeFunc finalizeFunction) : m_movies(movies) , m_threadGroup(movies.size(), stackMultiplier, api) , m_frames(frames) @@ -27,6 +28,7 @@ namespace TwkMovie , m_currentIndex(0) , m_requestIndex(0) , m_initialize(F) + , m_finalize(finalizeFunction) { // if (!m_movie->isThreadSafe()) throw runtime_exception(); m_info = movies.front()->info(); @@ -188,8 +190,16 @@ namespace TwkMovie m_threadGroup.lock(m_runLock); td->running = false; + + bool allFramesDone = (m_currentIndex >= m_frames.size()); + m_threadGroup.unlock(m_runLock); + if (allFramesDone && m_finalize != nullptr) + { + m_finalize(); + } + // cout << "thread " << td->id << " no longer running" << endl; } diff --git a/src/lib/image/TwkMovie/TwkMovie/ThreadedMovie.h b/src/lib/image/TwkMovie/TwkMovie/ThreadedMovie.h index 11b0f7456..18d71d0b0 100644 --- a/src/lib/image/TwkMovie/TwkMovie/ThreadedMovie.h +++ b/src/lib/image/TwkMovie/TwkMovie/ThreadedMovie.h @@ -57,8 +57,10 @@ namespace TwkMovie typedef std::vector Movies; typedef stl_ext::thread_group::thread_api ThreadAPI; typedef void (*InitializeFunc)(); + using FinalizeFunc = void (*)(); - ThreadedMovie(const Movies&, const Frames& frames, size_t stackMultiplier = 8, ThreadAPI* api = 0, InitializeFunc = NULL); + ThreadedMovie(const Movies&, const Frames& frames, size_t stackMultiplier = 8, ThreadAPI* api = nullptr, InitializeFunc = nullptr, + FinalizeFunc = nullptr); virtual ~ThreadedMovie(); @@ -104,6 +106,7 @@ namespace TwkMovie int m_requestIndex; bool m_init; InitializeFunc m_initialize; + FinalizeFunc m_finalize; }; } // namespace TwkMovie