/* * Oak Video Editor - Non-Linear Video Editor * Copyright (C) 2025 Olive CE Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "planarfiledevice.h" namespace olive { PlanarFileDevice::PlanarFileDevice(QObject *parent) : QObject(parent) { } PlanarFileDevice::~PlanarFileDevice() { close(); } bool PlanarFileDevice::open(const QVector &filenames, QIODevice::OpenMode mode) { if (isOpen()) { // Already open return false; } files_.resize(filenames.size()); files_.fill(nullptr); for (int i = 0; i < files_.size(); i++) { files_[i] = new QFile(filenames.at(i)); if (!files_[i]->open(mode)) { close(); return false; } } return true; } qint64 PlanarFileDevice::read(char **data, qint64 bytes_per_channel, qint64 offset) { qint64 ret = -1; if (isOpen()) { for (int i = 0; i < files_.size(); i++) { // Kind of clunky but should be largely fine ret = files_[i]->read(data[i] + offset, bytes_per_channel); } } return ret; } qint64 PlanarFileDevice::write(const char **data, qint64 bytes_per_channel, qint64 offset) { qint64 ret = -1; if (isOpen()) { for (int i = 0; i < files_.size(); i++) { // Kind of clunky but should be largely fine ret = files_[i]->write(data[i] + offset, bytes_per_channel); } } return ret; } qint64 PlanarFileDevice::size() const { if (isOpen()) { return files_.first()->size(); } else { return 0; } } bool PlanarFileDevice::seek(qint64 pos) { bool ret = true; for (int i = 0; i < files_.size(); i++) { ret = files_[i]->seek(pos) & ret; } return ret; } void PlanarFileDevice::close() { for (int i = 0; i < files_.size(); i++) { QFile *f = files_.at(i); if (f) { if (f->isOpen()) { f->close(); } delete f; } } files_.clear(); } }