blob: c37bbeabda3ce736800459db0048946a85beb2ef [file] [log] [blame]
/*
* Copyright 2021 The Chromium OS Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "cros-camera/camera_buffer_utils.h"
#include <fstream>
#include <iostream>
#include <base/files/file_util.h>
#include <base/files/memory_mapped_file.h>
#include <drm_fourcc.h>
#include "cros-camera/camera_buffer_manager.h"
#include "cros-camera/common.h"
namespace cros {
bool ReadFileIntoBuffer(buffer_handle_t buffer, base::FilePath file_to_read) {
if (!base::PathExists(file_to_read)) {
LOGF(ERROR) << "File " << file_to_read << " does not exist";
return false;
}
std::ifstream input_file;
input_file.open(file_to_read.value());
if (!input_file.is_open()) {
LOGF(ERROR) << "Failed to load from file: " << file_to_read;
return false;
}
ScopedMapping mapping(buffer);
if (!mapping.is_valid()) {
LOGF(ERROR) << "Failed to mmap buffer";
input_file.close();
return false;
}
size_t total_plane_size = 0;
for (size_t p = 0; p < mapping.num_planes(); ++p) {
total_plane_size += mapping.plane(p).size;
}
input_file.seekg(0, input_file.end);
size_t length = input_file.tellg();
if (length < total_plane_size) {
LOGF(ERROR) << "File " << file_to_read
<< " does not have enough data to fill the buffer";
input_file.close();
return false;
}
size_t offset = 0;
for (size_t p = 0; p < mapping.num_planes(); ++p) {
input_file.seekg(offset, input_file.beg);
auto plane = mapping.plane(p);
input_file.read(reinterpret_cast<char*>(plane.addr), plane.size);
offset += plane.size;
}
input_file.close();
return true;
}
bool WriteBufferIntoFile(buffer_handle_t buffer, base::FilePath file_to_write) {
std::ofstream output_file;
output_file.open(file_to_write.value(), std::ios::binary | std::ios::out);
if (!output_file.is_open()) {
LOGF(ERROR) << "Failed to open output file " << file_to_write;
return false;
}
ScopedMapping mapping(buffer);
if (!mapping.is_valid()) {
LOGF(ERROR) << "Failed to mmap buffer";
output_file.close();
return false;
}
for (size_t p = 0; p < mapping.num_planes(); ++p) {
auto plane = mapping.plane(p);
output_file.write(reinterpret_cast<char*>(plane.addr), plane.size);
}
output_file.close();
return true;
}
} // namespace cros