summaryrefslogtreecommitdiff
AgeCommit message (Expand)Author
2019-04-18libcamera: v4l2_subdevice: Close subdevice when destroyedLaurent Pinchart
2019-04-18libcamera: utils: Add set_overlap() functionLaurent Pinchart
2019-04-18test: geometry: Add tests for Size class comparison operatorsLaurent Pinchart
2019-04-18libcamera: geometry: Add comparison operators to geometry classesLaurent Pinchart
2019-04-18libcamera: geometry: Use Size to store min and max in SizeRangeLaurent Pinchart
2019-04-18libcamera: geometry: Sort classes alphabeticallyLaurent Pinchart
2019-04-18libcamera: camera: Log requested configuration in configureStreams()Laurent Pinchart
2019-04-18libcamera: log: Mark Loggable::_log() methods as constLaurent Pinchart
2019-04-18Install the cam and qcam utilitiesLaurent Pinchart
2019-04-18libcamera: buffer: Store Request reference in BufferJacopo Mondi
2019-04-18libcamera: request: Expose the Stream to Buffers mapJacopo Mondi
2019-04-18libcamera: camera: Validate Request before queueing itJacopo Mondi
2019-04-18libcamera: request: Add hasPendingBuffers() methodJacopo Mondi
2019-04-18libcamera: v4l2_device: Propagate releaseBuffers() errorJacopo Mondi
2019-04-18libcamera: camera: Don't call freeBuffer() on allocateBuffer() errorJacopo Mondi
2019-04-17libcamera: camera: Pass the stream set to allocate/freeBuffers()Jacopo Mondi
2019-04-16libcamera: stream: Make Stream inheritableJacopo Mondi
2019-04-14libcamera: pipeline_handler: Add missing forward declaration of StreamUsageNiklas Söderlund
2019-04-09libcamera: Add missing header files to meson.buildNiklas Söderlund
2019-04-09cam: Allow cameras with more than one streamNiklas Söderlund
2019-04-09cam: Extend request completion handler to deal with multiple streamsNiklas Söderlund
2019-04-09cam: Add support to specify multiple stream configurations with rolesNiklas Söderlund
2019-04-09cam: Extend BufferWriter to include a stream name in file pathNiklas Söderlund
2019-04-09cam: Rename --format to --streamNiklas Söderlund
2019-04-09libcamera: Switch to CameraConfigurationNiklas Söderlund
2019-04-09libcamera: camera: Add CameraConfigurationNiklas Söderlund
2019-04-05libcamera: camera: Add support for stream usagesNiklas Söderlund
2019-04-05libcamera: stream: Add basic stream usagesNiklas Söderlund
2019-04-05libcamera: Make geometry.h a public headerNiklas Söderlund
2019-04-04test: camera: Remove test for bad Stream IDsNiklas Söderlund
2019-04-04test: camera: Remove streams argument from configurationValid()Niklas Söderlund
2019-04-04cam: Rework how streams configuration is preparedNiklas Söderlund
2019-04-03qcam: meson: Use pkg-config method for qt5 dependenciesKieran Bingham
2019-04-03libcamera: ipu3: Catch return value when disabling linksKieran Bingham
2019-04-03libcamera: ipu3: Enable ImgU media linksJacopo Mondi
2019-04-03libcamera: ipu3: Limit resolution to 2560x1920Jacopo Mondi
2019-04-03libcamera: ipu3: Set stream configurationJacopo Mondi
2019-04-03libcamera: ipu3: Connect CIO2 and ImgU bufferReady signalsJacopo Mondi
2019-04-03libcamera: ipu3: Queue requests to ImgUJacopo Mondi
2019-04-03libcamera: ipu3: Implement camera start/stopJacopo Mondi
2019-04-03libcamera: ipu3: Implement memory handlingJacopo Mondi
2019-04-03libcamera: ipu3: Apply image format to the pipelineJacopo Mondi
2019-04-03libcamera: ipu3: Create ImgUDevice classJacopo Mondi
2019-04-03libcamera: ipu3: Cache the sensor size and formatJacopo Mondi
2019-04-03libcamera: ipu3: Create CIO2Device classJacopo Mondi
2019-04-03libcamera: geometry: Add Size structureJacopo Mondi
2019-04-03libcamera: geometry: Add 0-initialized SizeRange constructorJacopo Mondi
2019-04-03libcamera: utils: Use internal secure_getenv() implementationKieran Bingham
2019-04-03libcamera: utils: Use internal basename implementation.Kieran Bingham
2019-04-03meson: options: Document the optionsKieran Bingham
lass="hl opt">{ for (auto const &buffer : *buffers) bufferMap_.emplace(id_.get(), buffer.get()); } const BufferMap &Stream::getBuffers() const { return bufferMap_; } int Stream::getBufferId(FrameBuffer *buffer) const { if (importOnly_) return -1; /* Find the buffer in the map, and return the buffer id. */ auto it = std::find_if(bufferMap_.begin(), bufferMap_.end(), [&buffer](auto const &p) { return p.second == buffer; }); if (it == bufferMap_.end()) return -1; return it->first; } void Stream::setExternalBuffer(FrameBuffer *buffer) { bufferMap_.emplace(ipa::RPi::MaskExternalBuffer | id_.get(), buffer); } void Stream::removeExternalBuffer(FrameBuffer *buffer) { int id = getBufferId(buffer); /* Ensure we have this buffer in the stream, and it is marked external. */ ASSERT(id != -1 && (id & ipa::RPi::MaskExternalBuffer)); bufferMap_.erase(id); } int Stream::prepareBuffers(unsigned int count) { int ret; if (!importOnly_) { if (count) { /* Export some frame buffers for internal use. */ ret = dev_->exportBuffers(count, &internalBuffers_); if (ret < 0) return ret; /* Add these exported buffers to the internal/external buffer list. */ setExportedBuffers(&internalBuffers_); resetBuffers(); } /* We must import all internal/external exported buffers. */ count = bufferMap_.size(); } /* * If this is an external stream, we must allocate slots for buffers that * might be externally allocated. We have no indication of how many buffers * may be used, so this might overallocate slots in the buffer cache. * Similarly, if this stream is only importing buffers, we do the same. * * \todo Find a better heuristic, or, even better, an exact solution to * this issue. */ if (isExternal() || importOnly_) count = count * 2; return dev_->importBuffers(count); } int Stream::queueBuffer(FrameBuffer *buffer) { /* * A nullptr buffer implies an external stream, but no external * buffer has been supplied in the Request. So, pick one from the * availableBuffers_ queue. */ if (!buffer) { if (availableBuffers_.empty()) { LOG(RPISTREAM, Debug) << "No buffers available for " << name_; /* * Note that we need to queue an internal buffer as soon * as one becomes available. */ requestBuffers_.push(nullptr); return 0; } buffer = availableBuffers_.front(); availableBuffers_.pop(); } /* * If no earlier requests are pending to be queued we can go ahead and * queue this buffer into the device. */ if (requestBuffers_.empty()) return queueToDevice(buffer); /* * There are earlier Request buffers to be queued, so this buffer must go * on the waiting list. */ requestBuffers_.push(buffer); return 0; } void Stream::returnBuffer(FrameBuffer *buffer) { if (!external_) { /* For internal buffers, simply requeue back to the device. */ queueToDevice(buffer); return; } /* Push this buffer back into the queue to be used again. */ availableBuffers_.push(buffer); /* Allow the buffer id to be reused. */ id_.release(getBufferId(buffer)); /* * Do we have any Request buffers that are waiting to be queued? * If so, do it now as availableBuffers_ will not be empty. */ while (!requestBuffers_.empty()) { FrameBuffer *requestBuffer = requestBuffers_.front(); if (!requestBuffer) { /* * We want to queue an internal buffer, but none * are available. Can't do anything, quit the loop. */ if (availableBuffers_.empty()) break; /* * We want to queue an internal buffer, and at least one * is available. */ requestBuffer = availableBuffers_.front(); availableBuffers_.pop(); } requestBuffers_.pop(); queueToDevice(requestBuffer); } } int Stream::queueAllBuffers() { int ret; if (external_) return 0; while (!availableBuffers_.empty()) { ret = queueBuffer(availableBuffers_.front()); if (ret < 0) return ret; availableBuffers_.pop(); } return 0; } void Stream::releaseBuffers() { dev_->releaseBuffers(); clearBuffers(); } void Stream::clearBuffers() { availableBuffers_ = std::queue<FrameBuffer *>{}; requestBuffers_ = std::queue<FrameBuffer *>{}; internalBuffers_.clear(); bufferMap_.clear(); id_.reset(); } int Stream::queueToDevice(FrameBuffer *buffer) { LOG(RPISTREAM, Debug) << "Queuing buffer " << getBufferId(buffer) << " for " << name_; int ret = dev_->queueBuffer(buffer); if (ret) LOG(RPISTREAM, Error) << "Failed to queue buffer for " << name_; return ret; } } /* namespace RPi */ } /* namespace libcamera */