summaryrefslogtreecommitdiff
AgeCommit message (Expand)Author
2020-12-27libcamera: Add missing internal include headers to meson.buildLaurent Pinchart
2020-12-27utils: gen-controls: Fix enumerators documentationLaurent Pinchart
2020-12-20ipa: raspberrypi: Add digital gain to libcamera metadataDavid Plowman
2020-12-20libcamera: controls: Add DigitalGain controlDavid Plowman
2020-12-18libcamera: pipeline: simple: Remove non-implemented methodsJacopo Mondi
2020-12-18android: camera_device: Report number of out streamsJacopo Mondi
2020-12-18android: camera_device: Report pipeline depthJacopo Mondi
2020-12-16ipa: raspberrypi: Only validate ISP and sensor control during configureNaushir Patuck
2020-12-16ipa: raspberrypi: Rename unicamCtrls_ to sensorCtrls_Naushir Patuck
2020-12-14libcamera: pipeline: Manage resources with std::unique_ptr<>Laurent Pinchart
2020-12-14libcamera: pipeline: vimc: Use V4L2*::fromEntityName() where possibleLaurent Pinchart
2020-12-14libcamera: pipeline: raspberrypi: Don't leak RPiCameraData::sensor_Laurent Pinchart
2020-12-14libcamera: Replace ARRAY_SIZE() with std::size()Laurent Pinchart
2020-12-14android: camera_device: Replace auto with explicit typeLaurent Pinchart
2020-12-14android: camera_device: Temporary fix sensor propertiesJacopo Mondi
2020-12-11ipa: raspberrypi: Move initial frame drop decision to AGC/AWBDavid Plowman
2020-12-11ipa: raspberrypi: Estimate the colour temerature if starting with fixed colou...David Plowman
2020-12-11ipa: raspberrypi: Compute inverse of piecewise linear functionDavid Plowman
2020-12-11ipa: raspberrypi: awb: Add GetConvergenceFrames method to AWB base classDavid Plowman
2020-12-11ipa: raspberrypi: agc: Add GetConvergenceFrames method to AGC base classDavid Plowman
2020-12-11libcamera: pipeline: raspberrypi: Pass the drop frame count in start, not con...David Plowman
2020-12-11libcamera: pipeline: raspberrypi: Allow ScalerCrop to work when passed in Cam...David Plowman
2020-12-11android: camera_device: Reorder configurations before requestingHirokazu Honda
2020-12-11android: camera_device: Use Camera3StreamConfig in configureStreams()Hirokazu Honda
2020-12-11android: camera_device: Introduce Camera3StreamConfigHirokazu Honda
2020-12-09libcamera: v4l2_device: Return a unique pointer from fromEntityName()Laurent Pinchart
2020-12-09libcamera: v4l2_subdevice: Return a unique pointer from fromEntityName()Laurent Pinchart
2020-12-08pipeline: ipa: raspberrypi: Pass controls to IPA on startNaushir Patuck
2020-12-08libcamera: ipa: Pass a set of controls and return results from ipa::start()Naushir Patuck
2020-12-08libcamera: pipeline: Pass libcamera controls into pipeline_handler::start()Naushir Patuck
2020-12-07pipeline: ipa: raspberrypi: Handle failures during IPA configurationNaushir Patuck
2020-12-07android: camera_device: Stop camera when re-configuring itJacopo Mondi
2020-12-07android: camera_device: Initialize pixel array propertiesJacopo Mondi
2020-12-07libcamera: camera_sensor: Initialize PixelArray propertiesJacopo Mondi
2020-12-07libcamera: camera_sensor: Break out properties initializationJacopo Mondi
2020-12-07libcamera: camera_sensor: Adjust CameraSensorInfo::analogCropJacopo Mondi
2020-12-02android: camera_device: Check capture_request validityJacopo Mondi
2020-12-02android: camera_mode: Reserve 'data' vectorsJacopo Mondi
2020-12-01src: ipa: raspberrypi: Fix initial AGC oscillation for imx219 sensorDavid Plowman
2020-12-01libcamera: controls: Improve documentation for ExposureTime and AnalogueGainDavid Plowman
2020-12-01src: ipa: raspberrypi: Improve behaviour when AE disabledDavid Plowman
2020-12-01src: ipa: raspberrypi: agc: Make AGC handle Pause/Resume for itselfDavid Plowman
2020-12-01src: ipa: raspberrypi: Avoid AGC filtering when both gain and shutter specifiedDavid Plowman
2020-12-01qcam: Make log less verbose by defaultLaurent Pinchart
2020-12-01qcam: main: Fix comment incorrectly referring to the cam applicationLaurent Pinchart
2020-12-01Documentation: Fix doxygen warningLaurent Pinchart
2020-11-30libcamera: control_ids: Keep draft controls lastJacopo Mondi
2020-11-29cam: Update command line description for stream role optionNaushir Patuck
2020-11-26pipeline: raspberrypi: Fix erroneous bayer buffer requeue on buffer matchingNaushir Patuck
2020-11-24libcamera: camera: Document the camera and pipeline modelLaurent Pinchart
lass="hl opt">), efd_(-1), bufferAvailableCount_(0) { camera_->requestCompleted.connect(this, &V4L2Camera::requestComplete); } V4L2Camera::~V4L2Camera() { close(); } int V4L2Camera::open(StreamConfiguration *streamConfig) { if (camera_->acquire() < 0) { LOG(V4L2Compat, Error) << "Failed to acquire camera"; return -EINVAL; } config_ = camera_->generateConfiguration({ StreamRole::Viewfinder }); if (!config_) { camera_->release(); return -EINVAL; } bufferAllocator_ = new FrameBufferAllocator(camera_); *streamConfig = config_->at(0); return 0; } void V4L2Camera::close() { requestPool_.clear(); delete bufferAllocator_; bufferAllocator_ = nullptr; camera_->release(); } void V4L2Camera::bind(int efd) { efd_ = efd; } void V4L2Camera::unbind() { efd_ = -1; } std::vector<V4L2Camera::Buffer> V4L2Camera::completedBuffers() { std::vector<Buffer> v; bufferLock_.lock(); for (std::unique_ptr<Buffer> &metadata : completedBuffers_) v.push_back(*metadata.get()); completedBuffers_.clear(); bufferLock_.unlock(); return v; } void V4L2Camera::requestComplete(Request *request) { if (request->status() == Request::RequestCancelled) return; /* We only have one stream at the moment. */ bufferLock_.lock(); FrameBuffer *buffer = request->buffers().begin()->second; std::unique_ptr<Buffer> metadata = std::make_unique<Buffer>(request->cookie(), buffer->metadata()); completedBuffers_.push_back(std::move(metadata)); bufferLock_.unlock(); uint64_t data = 1; int ret = ::write(efd_, &data, sizeof(data)); if (ret != sizeof(data)) LOG(V4L2Compat, Error) << "Failed to signal eventfd POLLIN"; request->reuse(); { MutexLocker locker(bufferMutex_); bufferAvailableCount_++; } bufferCV_.notify_all(); } int V4L2Camera::configure(StreamConfiguration *streamConfigOut, const Size &size, const PixelFormat &pixelformat, unsigned int bufferCount) { StreamConfiguration &streamConfig = config_->at(0); streamConfig.size.width = size.width; streamConfig.size.height = size.height; streamConfig.pixelFormat = pixelformat; streamConfig.bufferCount = bufferCount; /* \todo memoryType (interval vs external) */ CameraConfiguration::Status validation = config_->validate(); if (validation == CameraConfiguration::Invalid) { LOG(V4L2Compat, Debug) << "Configuration invalid"; return -EINVAL; } if (validation == CameraConfiguration::Adjusted) LOG(V4L2Compat, Debug) << "Configuration adjusted"; LOG(V4L2Compat, Debug) << "Validated configuration is: " << streamConfig.toString(); int ret = camera_->configure(config_.get()); if (ret < 0) return ret; *streamConfigOut = config_->at(0); return 0; } int V4L2Camera::validateConfiguration(const PixelFormat &pixelFormat, const Size &size, StreamConfiguration *streamConfigOut) { std::unique_ptr<CameraConfiguration> config = camera_->generateConfiguration({ StreamRole::Viewfinder }); StreamConfiguration &cfg = config->at(0); cfg.size = size; cfg.pixelFormat = pixelFormat; cfg.bufferCount = 1; CameraConfiguration::Status validation = config->validate(); if (validation == CameraConfiguration::Invalid) return -EINVAL; *streamConfigOut = cfg; return 0; } int V4L2Camera::allocBuffers(unsigned int count) { Stream *stream = config_->at(0).stream(); int ret = bufferAllocator_->allocate(stream); if (ret < 0) return ret; for (unsigned int i = 0; i < count; i++) { std::unique_ptr<Request> request = camera_->createRequest(i); if (!request) { requestPool_.clear(); return -ENOMEM; } requestPool_.push_back(std::move(request)); } return ret; } void V4L2Camera::freeBuffers() { pendingRequests_.clear(); requestPool_.clear(); Stream *stream = config_->at(0).stream(); bufferAllocator_->free(stream); } int V4L2Camera::getBufferFd(unsigned int index) { Stream *stream = config_->at(0).stream(); const std::vector<std::unique_ptr<FrameBuffer>> &buffers = bufferAllocator_->buffers(stream); if (buffers.size() <= index) return -1; return buffers[index]->planes()[0].fd.get(); } int V4L2Camera::streamOn() { if (isRunning_) return 0; int ret = camera_->start(); if (ret < 0) return ret == -EACCES ? -EBUSY : ret; isRunning_ = true; for (Request *req : pendingRequests_) {