diff --git a/app/render/framehashcache.cpp b/app/render/framehashcache.cpp index 1cfb9278c..679d03478 100644 --- a/app/render/framehashcache.cpp +++ b/app/render/framehashcache.cpp @@ -205,6 +205,49 @@ void FrameHashCache::SaveCacheFrame(const QByteArray &hash, FramePtr frame) SaveCacheFrame(hash, frame->data(), frame->video_params()); } +FramePtr FrameHashCache::LoadCacheFrame(const QByteArray &hash, const PixelFormat::Format &format) +{ + return LoadCacheFrame(CachePathName(hash, format)); +} + +FramePtr FrameHashCache::LoadCacheFrame(const QString &fn) +{ + FramePtr frame = nullptr; + + if (!fn.isEmpty() && QFileInfo::exists(fn)) { + auto input = OIIO::ImageInput::open(fn.toStdString()); + + if (input) { + + PixelFormat::Format image_format = PixelFormat::OIIOFormatToOliveFormat(input->spec().format, + input->spec().nchannels == kRGBAChannels); + + frame = Frame::Create(); + frame->set_video_params(VideoParams(input->spec().width, + input->spec().height, + image_format)); + + frame->allocate(); + + input->read_image(input->spec().format, + frame->data(), + OIIO::AutoStride, + frame->linesize_bytes()); + + input->close(); + +#if OIIO_VERSION < 10903 + OIIO::ImageInput::destroy(input); +#endif + + } else { + qWarning() << "OIIO Error:" << OIIO::geterror().c_str(); + } + } + + return frame; +} + void FrameHashCache::LengthChangedEvent(const rational &old, const rational &newlen) { if (newlen < old) { diff --git a/app/render/framehashcache.h b/app/render/framehashcache.h index 5b0712650..39e92a841 100644 --- a/app/render/framehashcache.h +++ b/app/render/framehashcache.h @@ -63,6 +63,8 @@ public: static bool SaveCacheFrame(const QString& filename, char *data, const VideoParams &vparam); static void SaveCacheFrame(const QByteArray& hash, char *data, const VideoParams &vparam); static void SaveCacheFrame(const QByteArray& hash, FramePtr frame); + static FramePtr LoadCacheFrame(const QByteArray& hash, const PixelFormat::Format& format); + static FramePtr LoadCacheFrame(const QString& fn); static QString GetFormatExtension(const PixelFormat::Format& f); diff --git a/app/widget/viewer/viewer.cpp b/app/widget/viewer/viewer.cpp index a460fa8cc..160f563b3 100644 --- a/app/widget/viewer/viewer.cpp +++ b/app/widget/viewer/viewer.cpp @@ -394,38 +394,10 @@ void ViewerWidget::SetBackgroundCacheTask(CacheTask *t) FramePtr DecodeCachedImage(const QString &fn, const rational& time) { - FramePtr frame = nullptr; + FramePtr frame = FrameHashCache::LoadCacheFrame(fn); - if (!fn.isEmpty() && QFileInfo::exists(fn)) { - auto input = OIIO::ImageInput::open(fn.toStdString()); - - if (input) { - - PixelFormat::Format image_format = PixelFormat::OIIOFormatToOliveFormat(input->spec().format, - input->spec().nchannels == kRGBAChannels); - - frame = Frame::Create(); - frame->set_timestamp(time); - frame->set_video_params(VideoParams(input->spec().width, - input->spec().height, - image_format)); - - frame->allocate(); - - input->read_image(input->spec().format, - frame->data(), - OIIO::AutoStride, - frame->linesize_bytes()); - - input->close(); - -#if OIIO_VERSION < 10903 - OIIO::ImageInput::destroy(input); -#endif - - } else { - qWarning() << "OIIO Error:" << OIIO::geterror().c_str(); - } + if (frame) { + frame->set_timestamp(time); } return frame;