blob: a1c4f81c31aa701520778d15c3fec6ff45d36f76 [file] [log] [blame]
/*
* Copyright 2020 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.
*/
#ifndef CAMERA_COMMON_LIBCAMERA_CONNECTOR_STREAM_BUFFER_MANAGER_H_
#define CAMERA_COMMON_LIBCAMERA_CONNECTOR_STREAM_BUFFER_MANAGER_H_
#include <map>
#include <queue>
#include <vector>
#include <base/callback.h>
#include <base/files/scoped_file.h>
#include <base/macros.h>
#include <base/synchronization/lock.h>
#include <base/threading/thread.h>
#include "mojo/camera3.mojom.h"
namespace cros {
// StreamBufferManager is a helper class that manages a set of pre-allocated
// mojom::Camera3StreamBufferPtr from
// CameraDeviceAdapter::ConfigureStreamsAndGetAllocatedBuffers(). The lifetimes
// of these buffers are managed by CameraDeviceAdapter - created during stream
// configuration and released when the device is closed. StreamBufferManager's
// lifetime lasts the entire lifetime of the user intending to use the camera.
// The class can be initialized multiple times when a new stream is configured.
class StreamBufferManager {
public:
StreamBufferManager();
~StreamBufferManager();
// Initializes StreamBufferManager with a set of pre-allocated buffers.
// StreamBufferManager can be initialized multiple times with new sets of
// buffers. The lifetimes of these buffers are managed by camera HAL adapter.
void Init(std::vector<mojom::Camera3StreamBufferPtr> allocated_buffers);
// Allocates a free buffer from |buffer_queue_|. If |buffer_queue_| is empty,
// a null mojom::Camera3StreamBufferPtr is returned.
mojom::Camera3StreamBufferPtr AllocateBuffer();
// Releases a used buffer back into the buffer pool. Returns true if the
// buffer came from the pre-allocated buffers, false otherwise.
bool ReleaseBuffer(uint64_t buffer_id);
// Returns the camera buffer handle whose buffer id is |buffer_id|.
mojom::CameraBufferHandlePtr* GetBufferHandle(uint64_t buffer_id);
// Returns the file descriptors associated with |buffer_id|.
std::vector<base::ScopedFD>* GetFds(uint64_t buffer_id);
// Returns true if StreamBufferManager still has free buffers. It is not
// guaranteed that AllocateBuffer() would succeed afterwards, since other
// threads could potentially get a free buffer allocated before that
bool HasFreeBuffers();
// Sets the callback that would be triggered once when a free buffer is
// available.
void SetNotifyBufferCallback(base::OnceClosure notify_callback);
private:
std::vector<mojom::Camera3StreamBufferPtr> buffers_;
std::queue<mojom::Camera3StreamBufferPtr*> buffer_queue_;
std::map<uint64_t, mojom::Camera3StreamBufferPtr*> buffer_pointer_map_;
std::map<uint64_t, std::vector<base::ScopedFD>> fd_map_;
base::Lock buffer_manager_lock_;
base::Thread callback_thread_;
base::OnceClosure notify_callback_;
// NotCopyableOrMovable.
StreamBufferManager(const StreamBufferManager&) = delete;
StreamBufferManager& operator=(const StreamBufferManager&) = delete;
};
} // namespace cros
#endif // CAMERA_COMMON_LIBCAMERA_CONNECTOR_STREAM_BUFFER_MANAGER_H_