summaryrefslogtreecommitdiff
path: root/src/ipa/vimc
diff options
context:
space:
mode:
authorNaushir Patuck <naush@raspberrypi.com>2021-02-08 15:07:34 +0000
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2021-02-09 13:23:39 +0200
commit68b992e72e806810bcc1e580e2412f5ae404ad4a (patch)
treecab7c5679ebc73ae8105f7459787f77804d3ec4b /src/ipa/vimc
parent64e3aa23ffc9ae76683f159a39b19984587a840d (diff)
pipeline: raspberrypi: Set the ISP Output1 to 1/4 resolution if unused
In preparation for fast colour denoise, set the low resolution ISP output stream (Output1) to a 1/4 resolution of the application requested stream (Output0). This only happens if the application has not requested an additional YUV or RGB stream. We also constrain this 1/4 resolution to at most 1200 pixels in the largest dimension to avoid being too taxing on memory usage and system bandwidth. Also switch the default StreamRole::VideoRecording to YUV420 to allow fast colour denoise to run. Signed-off-by: Naushir Patuck <naush@raspberrypi.com> Reviewed-by: David Plowman <david.plowman@raspberrypi.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Diffstat (limited to 'src/ipa/vimc')
0 files changed, 0 insertions, 0 deletions
">streamNames_(streamNames), pattern_(pattern) { } FileSink::~FileSink() { } int FileSink::configure(const libcamera::CameraConfiguration &config) { int ret = FrameSink::configure(config); if (ret < 0) return ret; return 0; } void FileSink::mapBuffer(FrameBuffer *buffer) { std::unique_ptr<Image> image = Image::fromFrameBuffer(buffer, Image::MapMode::ReadOnly); assert(image != nullptr); mappedBuffers_[buffer] = std::move(image); } bool FileSink::processRequest(Request *request) { for (auto [stream, buffer] : request->buffers()) writeBuffer(stream, buffer); return true; } void FileSink::writeBuffer(const Stream *stream, FrameBuffer *buffer) { std::string filename; size_t pos; int fd, ret = 0; if (!pattern_.empty()) filename = pattern_; if (filename.empty() || filename.back() == '/') filename += "frame-#.bin"; pos = filename.find_first_of('#'); if (pos != std::string::npos) { std::stringstream ss; ss << streamNames_[stream] << "-" << std::setw(6) << std::setfill('0') << buffer->metadata().sequence; filename.replace(pos, 1, ss.str()); } fd = open(filename.c_str(), O_CREAT | O_WRONLY | (pos == std::string::npos ? O_APPEND : O_TRUNC), S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); if (fd == -1) { ret = -errno; std::cerr << "failed to open file " << filename << ": " << strerror(-ret) << std::endl; return; } Image *image = mappedBuffers_[buffer].get(); for (unsigned int i = 0; i < buffer->planes().size(); ++i) { const FrameMetadata::Plane &meta = buffer->metadata().planes()[i]; Span<uint8_t> data = image->data(i); unsigned int length = std::min<unsigned int>(meta.bytesused, data.size()); if (meta.bytesused > data.size()) std::cerr << "payload size " << meta.bytesused << " larger than plane size " << data.size() << std::endl; ret = ::write(fd, data.data(), length); if (ret < 0) { ret = -errno; std::cerr << "write error: " << strerror(-ret) << std::endl; break; } else if (ret != (int)length) { std::cerr << "write error: only " << ret << " bytes written instead of " << length << std::endl; break; } } close(fd); }