summaryrefslogtreecommitdiff
path: root/src/apps/lc-compliance/simple_capture.h
blob: 2911d6019923155e7a7accd6210aacccc0c00aa6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 * Copyright (C) 2020-2021, Google Inc.
 *
 * simple_capture.h - Simple capture helper
 */

#pragma once

#include <memory>

#include <libcamera/libcamera.h>

#include "../common/event_loop.h"

class SimpleCapture
{
public:
	void configure(libcamera::StreamRole role);

protected:
	SimpleCapture(std::shared_ptr<libcamera::Camera> camera);
	virtual ~SimpleCapture();

	void start();
	void stop();

	virtual void requestComplete(libcamera::Request *request) = 0;

	EventLoop *loop_;

	std::shared_ptr<libcamera::Camera> camera_;
	std::unique_ptr<libcamera::FrameBufferAllocator> allocator_;
	std::unique_ptr<libcamera::CameraConfiguration> config_;
	std::vector<std::unique_ptr<libcamera::Request>> requests_;
};

class SimpleCaptureBalanced : public SimpleCapture
{
public:
	SimpleCaptureBalanced(std::shared_ptr<libcamera::Camera> camera);

	void capture(unsigned int numRequests);

private:
	int queueRequest(libcamera::Request *request);
	void requestComplete(libcamera::Request *request) override;

	unsigned int queueCount_;
	unsigned int captureCount_;
	unsigned int captureLimit_;
};

class SimpleCaptureUnbalanced : public SimpleCapture
{
public:
	SimpleCaptureUnbalanced(std::shared_ptr<libcamera::Camera> camera);

	void capture(unsigned int numRequests);

private:
	void requestComplete(libcamera::Request *request) override;

	unsigned int captureCount_;
	unsigned int captureLimit_;
};
values_; bool valid_; }; class KeyValueParser { public: class Options : public OptionsBase<std::string> { }; KeyValueParser(); virtual ~KeyValueParser(); bool addOption(const char *name, OptionType type, const char *help, OptionArgument argument = ArgumentNone); virtual Options parse(const char *arguments); private: KeyValueParser(const KeyValueParser &) = delete; KeyValueParser &operator=(const KeyValueParser &) = delete; friend class OptionsParser; unsigned int maxOptionLength() const; void usage(int indent); std::map<std::string, Option> optionsMap_; }; class OptionsParser { public: class Options : public OptionsBase<int> { }; OptionsParser(); ~OptionsParser(); bool addOption(int opt, OptionType type, const char *help, const char *name = nullptr, OptionArgument argument = ArgumentNone, const char *argumentName = nullptr, bool array = false, int parent = 0); bool addOption(int opt, KeyValueParser *parser, const char *help, const char *name = nullptr, bool array = false, int parent = 0); Options parse(int argc, char *argv[]); void usage(); private: OptionsParser(const OptionsParser &) = delete; OptionsParser &operator=(const OptionsParser &) = delete; void usageOptions(const std::list<Option> &options, unsigned int indent); std::tuple<OptionsParser::Options *, const Option *> childOption(const Option *parent, Options *options); bool parseValue(const Option &option, const char *arg, Options *options); std::list<Option> options_; std::map<unsigned int, Option *> optionsMap_; }; class OptionValue { public: enum ValueType { ValueNone, ValueInteger, ValueString, ValueKeyValue, ValueArray, }; OptionValue(); OptionValue(int value); OptionValue(const char *value); OptionValue(const std::string &value); OptionValue(const KeyValueParser::Options &value); void addValue(const OptionValue &value); ValueType type() const { return type_; } bool empty() const { return type_ == ValueType::ValueNone; } operator int() const; operator std::string() const; int toInteger() const; std::string toString() const; const KeyValueParser::Options &toKeyValues() const; const std::vector<OptionValue> &toArray() const; const OptionsParser::Options &children() const; private: ValueType type_; int integer_; std::string string_; KeyValueParser::Options keyValues_; std::vector<OptionValue> array_; OptionsParser::Options children_; };