diff options
Diffstat (limited to 'chromium/media/capture/video/chromeos/stream_buffer_manager.cc')
-rw-r--r-- | chromium/media/capture/video/chromeos/stream_buffer_manager.cc | 83 |
1 files changed, 64 insertions, 19 deletions
diff --git a/chromium/media/capture/video/chromeos/stream_buffer_manager.cc b/chromium/media/capture/video/chromeos/stream_buffer_manager.cc index 4420ec935a9..6ba6adfcddb 100644 --- a/chromium/media/capture/video/chromeos/stream_buffer_manager.cc +++ b/chromium/media/capture/video/chromeos/stream_buffer_manager.cc @@ -27,15 +27,7 @@ StreamBufferManager::StreamBufferManager( weak_ptr_factory_(this) {} StreamBufferManager::~StreamBufferManager() { - for (const auto& iter : stream_context_) { - if (iter.second) { - for (const auto& buf : iter.second->buffers) { - if (buf) { - buf->Unmap(); - } - } - } - } + DestroyCurrentStreamsAndBuffers(); } gfx::GpuMemoryBuffer* StreamBufferManager::GetBufferById(StreamType stream_type, @@ -54,9 +46,26 @@ VideoCaptureFormat StreamBufferManager::GetStreamCaptureFormat( return stream_context_[stream_type]->capture_format; } +void StreamBufferManager::DestroyCurrentStreamsAndBuffers() { + for (const auto& iter : stream_context_) { + if (iter.second) { + for (const auto& buf : iter.second->buffers) { + if (buf) { + buf->Unmap(); + } + } + iter.second->buffers.clear(); + } + } + stream_context_.clear(); +} + bool StreamBufferManager::HasFreeBuffers( const std::set<StreamType>& stream_types) { for (auto stream_type : stream_types) { + if (IsInputStream(stream_type)) { + continue; + } if (stream_context_[stream_type]->free_buffers.empty()) { return false; } @@ -64,10 +73,22 @@ bool StreamBufferManager::HasFreeBuffers( return true; } +bool StreamBufferManager::HasStreamsConfigured( + std::initializer_list<StreamType> stream_types) { + for (auto stream_type : stream_types) { + if (stream_context_.find(stream_type) == stream_context_.end()) { + return false; + } + } + return true; +} + void StreamBufferManager::SetUpStreamsAndBuffers( VideoCaptureFormat capture_format, const cros::mojom::CameraMetadataPtr& static_metadata, std::vector<cros::mojom::Camera3StreamPtr> streams) { + DestroyCurrentStreamsAndBuffers(); + for (auto& stream : streams) { DVLOG(2) << "Stream " << stream->id << " stream_type: " << stream->stream_type @@ -100,17 +121,23 @@ void StreamBufferManager::SetUpStreamsAndBuffers( stream_context_[stream_type]->capture_format.pixel_format = stream_format.video_format; + // For input stream, there is no need to allocate buffers. + if (IsInputStream(stream_type)) { + continue; + } + // Allocate buffers. size_t num_buffers = stream_context_[stream_type]->stream->max_buffers; stream_context_[stream_type]->buffers.resize(num_buffers); int32_t buffer_width, buffer_height; switch (stream_type) { - case StreamType::kPreview: { + case StreamType::kPreviewOutput: + case StreamType::kYUVOutput: { buffer_width = stream_context_[stream_type]->stream->width; buffer_height = stream_context_[stream_type]->stream->height; break; } - case StreamType::kStillCapture: { + case StreamType::kJpegOutput: { const cros::mojom::CameraMetadataEntryPtr* jpeg_max_size = GetMetadataEntry( static_metadata, @@ -160,7 +187,8 @@ cros::mojom::Camera3StreamPtr StreamBufferManager::GetStreamConfiguration( } base::Optional<BufferInfo> StreamBufferManager::RequestBuffer( - StreamType stream_type) { + StreamType stream_type, + base::Optional<uint64_t> buffer_id) { VideoPixelFormat buffer_format = stream_context_[stream_type]->capture_format.pixel_format; uint32_t drm_format = PixFormatVideoToDrm(buffer_format); @@ -175,11 +203,25 @@ base::Optional<BufferInfo> StreamBufferManager::RequestBuffer( } BufferInfo buffer_info; - buffer_info.id = stream_context_[stream_type]->free_buffers.front(); - stream_context_[stream_type]->free_buffers.pop(); - buffer_info.gpu_memory_buffer = stream_context_[stream_type] - ->buffers[GetBufferIndex(buffer_info.id)] - .get(); + if (buffer_id.has_value()) { + // Currently, only kYUVInput has an associated output buffer which is + // kYUVOutput. + if (stream_type != StreamType::kYUVInput) { + return {}; + } + buffer_info.id = *buffer_id; + buffer_info.gpu_memory_buffer = + stream_context_[StreamType::kYUVOutput] + ->buffers[GetBufferIndex(buffer_info.id)] + .get(); + } else { + buffer_info.id = stream_context_[stream_type]->free_buffers.front(); + stream_context_[stream_type]->free_buffers.pop(); + buffer_info.gpu_memory_buffer = + stream_context_[stream_type] + ->buffers[GetBufferIndex(buffer_info.id)] + .get(); + } buffer_info.hal_pixel_format = stream_context_[stream_type]->stream->format; buffer_info.drm_format = drm_format; return buffer_info; @@ -187,11 +229,14 @@ base::Optional<BufferInfo> StreamBufferManager::RequestBuffer( void StreamBufferManager::ReleaseBuffer(StreamType stream_type, uint64_t buffer_id) { + if (IsInputStream(stream_type)) { + return; + } stream_context_[stream_type]->free_buffers.push(buffer_id); } -size_t StreamBufferManager::GetNumberOfStreams() { - return stream_context_.size(); +bool StreamBufferManager::IsReprocessSupported() { + return stream_context_.find(StreamType::kYUVOutput) != stream_context_.end(); } // static |