diff --git a/app/codec/ffmpeg/ffmpegdecoder.cpp b/app/codec/ffmpeg/ffmpegdecoder.cpp index acb61c299..4d2430e30 100644 --- a/app/codec/ffmpeg/ffmpegdecoder.cpp +++ b/app/codec/ffmpeg/ffmpegdecoder.cpp @@ -617,7 +617,7 @@ void SaveCacheFrame(FFmpegDecoder* decoder, &converted_linesize); scaler_lock.unlock(); - if (!FrameHashCache::SaveCacheFrame(dst_fn, converted_buffer.data(), params)) { + if (!FrameHashCache::SaveCacheFrame(dst_fn, converted_buffer.data(), params, converted_linesize)) { qCritical() <<" Failed to save cache frame" << dst_fn; } diff --git a/app/render/framehashcache.cpp b/app/render/framehashcache.cpp index e3169bdbe..0bde0581a 100644 --- a/app/render/framehashcache.cpp +++ b/app/render/framehashcache.cpp @@ -180,11 +180,12 @@ QVector FrameHashCache::GetInvalidatedFrames() void FrameHashCache::SaveCacheFrame(const QByteArray& hash, char* data, - const VideoParams& vparam) + const VideoParams& vparam, + int linesize_bytes) { QString fn = CachePathName(hash); - if (SaveCacheFrame(fn, data, vparam)) { + if (SaveCacheFrame(fn, data, vparam, linesize_bytes)) { // Register frame with the disk manager DiskManager::instance()->CreatedFile(fn, hash); } @@ -192,7 +193,7 @@ void FrameHashCache::SaveCacheFrame(const QByteArray& hash, void FrameHashCache::SaveCacheFrame(const QByteArray &hash, FramePtr frame) { - SaveCacheFrame(hash, frame->data(), frame->video_params()); + SaveCacheFrame(hash, frame->data(), frame->video_params(), frame->linesize_bytes()); } FramePtr FrameHashCache::LoadCacheFrame(const QByteArray &hash) @@ -319,7 +320,7 @@ QString FrameHashCache::CachePathName(const QByteArray& hash) return cache_dir.filePath(filename); } -bool FrameHashCache::SaveCacheFrame(const QString &filename, char *data, const VideoParams &vparam) +bool FrameHashCache::SaveCacheFrame(const QString &filename, char *data, const VideoParams &vparam, int linesize_bytes) { Q_ASSERT(PixelFormat::FormatIsFloat(vparam.format())); @@ -350,7 +351,7 @@ bool FrameHashCache::SaveCacheFrame(const QString &filename, char *data, const V int bpc = PixelFormat::BytesPerChannel(vparam.format()); size_t xs = PixelFormat::ChannelCount(vparam.format()) * bpc; - size_t ys = vparam.effective_width() * PixelFormat::ChannelCount(vparam.format()) * bpc; + size_t ys = linesize_bytes; Imf::FrameBuffer framebuffer; framebuffer.insert("R", Imf::Slice(pix_type, data, xs, ys)); diff --git a/app/render/framehashcache.h b/app/render/framehashcache.h index 2f77d9de3..a31c4335c 100644 --- a/app/render/framehashcache.h +++ b/app/render/framehashcache.h @@ -60,8 +60,8 @@ public: */ static QString CachePathName(const QByteArray &hash); - static bool SaveCacheFrame(const QString& filename, char *data, const VideoParams &vparam); - static void SaveCacheFrame(const QByteArray& hash, char *data, const VideoParams &vparam); + static bool SaveCacheFrame(const QString& filename, char *data, const VideoParams &vparam, int linesize_bytes); + static void SaveCacheFrame(const QByteArray& hash, char *data, const VideoParams &vparam, int linesize_bytes); static void SaveCacheFrame(const QByteArray& hash, FramePtr frame); static FramePtr LoadCacheFrame(const QByteArray& hash); static FramePtr LoadCacheFrame(const QString& fn);