blob: 6c1540a0508c1b367dd03c3b1b213d116cf8961d [file] [log] [blame]
/*
* Copyright 2019 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_HAL_IP_REQUEST_QUEUE_H_
#define CAMERA_HAL_IP_REQUEST_QUEUE_H_
#include <deque>
#include <memory>
#include <base/macros.h>
#include <base/synchronization/condition_variable.h>
#include <hardware/camera3.h>
namespace cros {
class CaptureRequest {
public:
explicit CaptureRequest(camera3_capture_request_t* request);
CaptureRequest(const CaptureRequest&) = delete;
CaptureRequest& operator=(const CaptureRequest&) = delete;
~CaptureRequest();
const uint32_t GetFrameNumber() const;
const camera3_stream_buffer_t* GetOutputBuffer() const;
void SetErrorBufferStatus();
private:
const uint32_t frame_number_;
buffer_handle_t buffer_handle_;
camera3_stream_buffer_t output_stream_buffer_;
};
// This class provides its own locking and is therefore thread-safe. It is
// intended to be used by a single producer and a single consumer.
class RequestQueue {
public:
RequestQueue();
RequestQueue(const RequestQueue&) = delete;
RequestQueue& operator=(const RequestQueue&) = delete;
~RequestQueue();
// Must be called before using any other functionality of the RequestQueue.
void SetCallbacks(const camera3_callback_ops_t* callback_ops);
// Queues a request
void Push(camera3_capture_request_t* request);
// If no request is available this will block until one does become available.
// This can return null if the queue is flushed. This shouldn't be called a
// second time if the first call has not yet returned.
std::unique_ptr<CaptureRequest> Pop();
// Checks if a request is currently available.
bool IsEmpty();
// Waits until any requests that have already been popped are completed, then
// cancels any other pending requests.
void Flush();
// Returns a popped request back to the queue, this should be called after the
// request has been filled.
void NotifyCapture(std::unique_ptr<CaptureRequest> request);
// Returns a popped request back to the queue, but signals that an error has
// occured and the request has not been filled.
void NotifyError(std::unique_ptr<CaptureRequest> request);
private:
void NotifyShutter(uint32_t frame_number, uint64_t timestamp);
void CancelRequestLocked(std::unique_ptr<CaptureRequest> request);
void NotifyCaptureInternal(std::unique_ptr<CaptureRequest> request);
// This lock protects the queue, associated flags/counters, and condition
// variables.
base::Lock lock_;
std::deque<std::unique_ptr<CaptureRequest>> queue_;
base::ConditionVariable new_request_available_;
base::ConditionVariable request_filled_;
int requests_being_filled_;
bool flushing_;
const camera3_callback_ops_t* callback_ops_;
};
} // namespace cros
#endif // CAMERA_HAL_IP_REQUEST_QUEUE_H_