libcamera  v0.2.0
Supporting cameras in Linux since 2019
converter.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
2 /*
3  * Copyright (C) 2020, Laurent Pinchart
4  * Copyright 2022 NXP
5  *
6  * converter.h - Generic format converter interface
7  */
8 
9 #pragma once
10 
11 #include <functional>
12 #include <initializer_list>
13 #include <map>
14 #include <memory>
15 #include <string>
16 #include <tuple>
17 #include <vector>
18 
19 #include <libcamera/base/class.h>
20 #include <libcamera/base/signal.h>
21 
22 #include <libcamera/geometry.h>
23 
24 namespace libcamera {
25 
26 class FrameBuffer;
27 class MediaDevice;
28 class PixelFormat;
29 struct StreamConfiguration;
30 
31 class Converter
32 {
33 public:
34  Converter(MediaDevice *media);
35  virtual ~Converter();
36 
37  virtual int loadConfiguration(const std::string &filename) = 0;
38 
39  virtual bool isValid() const = 0;
40 
41  virtual std::vector<PixelFormat> formats(PixelFormat input) = 0;
42  virtual SizeRange sizes(const Size &input) = 0;
43 
44  virtual std::tuple<unsigned int, unsigned int>
45  strideAndFrameSize(const PixelFormat &pixelFormat, const Size &size) = 0;
46 
47  virtual int configure(const StreamConfiguration &inputCfg,
48  const std::vector<std::reference_wrapper<StreamConfiguration>> &outputCfgs) = 0;
49  virtual int exportBuffers(unsigned int output, unsigned int count,
50  std::vector<std::unique_ptr<FrameBuffer>> *buffers) = 0;
51 
52  virtual int start() = 0;
53  virtual void stop() = 0;
54 
55  virtual int queueBuffers(FrameBuffer *input,
56  const std::map<unsigned int, FrameBuffer *> &outputs) = 0;
57 
60 
61  const std::string &deviceNode() const { return deviceNode_; }
62 
63 private:
64  std::string deviceNode_;
65 };
66 
68 {
69 public:
70  ConverterFactoryBase(const std::string name, std::initializer_list<std::string> compatibles);
71  virtual ~ConverterFactoryBase() = default;
72 
73  const std::vector<std::string> &compatibles() const { return compatibles_; }
74 
75  static std::unique_ptr<Converter> create(MediaDevice *media);
76  static std::vector<ConverterFactoryBase *> &factories();
77  static std::vector<std::string> names();
78 
79 private:
81 
82  static void registerType(ConverterFactoryBase *factory);
83 
84  virtual std::unique_ptr<Converter> createInstance(MediaDevice *media) const = 0;
85 
86  std::string name_;
87  std::vector<std::string> compatibles_;
88 };
89 
90 template<typename _Converter>
92 {
93 public:
94  ConverterFactory(const char *name, std::initializer_list<std::string> compatibles)
96  {
97  }
98 
99  std::unique_ptr<Converter> createInstance(MediaDevice *media) const override
100  {
101  return std::make_unique<_Converter>(media);
102  }
103 };
104 
105 #define REGISTER_CONVERTER(name, converter, compatibles) \
106  static ConverterFactory<converter> global_##converter##Factory(name, compatibles);
107 
108 } /* namespace libcamera */
Utilities to help constructing class interfaces.
#define LIBCAMERA_DISABLE_COPY_AND_MOVE(klass)
Disable copy and move construction and assignment of the klass.
Base class for converter factories.
Definition: converter.h:68
static std::vector< ConverterFactoryBase * > & factories()
Retrieve the list of all converter factories.
Definition: converter.cpp:277
ConverterFactoryBase(const std::string name, std::initializer_list< std::string > compatibles)
Construct a converter factory base.
Definition: converter.cpp:192
static std::unique_ptr< Converter > create(MediaDevice *media)
Create an instance of the converter corresponding to the media device.
Definition: converter.cpp:213
const std::vector< std::string > & compatibles() const
Definition: converter.h:73
static std::vector< std::string > names()
Retrieve the list of all converter factory names.
Definition: converter.cpp:257
Registration of ConverterFactory classes and creation of instances.
Definition: converter.h:92
std::unique_ptr< Converter > createInstance(MediaDevice *media) const override
Create an instance of the Converter corresponding to the factory.
Definition: converter.h:99
ConverterFactory(const char *name, std::initializer_list< std::string > compatibles)
Construct a converter factory.
Definition: converter.h:94
Abstract Base Class for converter.
Definition: converter.h:32
const std::string & deviceNode() const
The converter device node attribute accessor.
Definition: converter.h:61
Signal< FrameBuffer * > outputBufferReady
A signal emitted on each frame buffer completion of the output queue.
Definition: converter.h:59
virtual void stop()=0
Stop the converter streaming operation.
virtual bool isValid() const =0
Check if the converter configuration is valid.
virtual std::tuple< unsigned int, unsigned int > strideAndFrameSize(const PixelFormat &pixelFormat, const Size &size)=0
Retrieve the output stride and frame size for an input configutation.
virtual int queueBuffers(FrameBuffer *input, const std::map< unsigned int, FrameBuffer * > &outputs)=0
Queue buffers to converter device.
virtual int loadConfiguration(const std::string &filename)=0
Load converter configuration from file.
virtual std::vector< PixelFormat > formats(PixelFormat input)=0
Retrieve the list of supported pixel formats for an input pixel format.
virtual int start()=0
Start the converter streaming operation.
virtual int configure(const StreamConfiguration &inputCfg, const std::vector< std::reference_wrapper< StreamConfiguration >> &outputCfgs)=0
Configure a set of output stream conversion from an input stream.
Signal< FrameBuffer * > inputBufferReady
A signal emitted when the input frame buffer completes.
Definition: converter.h:58
Converter(MediaDevice *media)
Construct a Converter instance.
Definition: converter.cpp:44
virtual int exportBuffers(unsigned int output, unsigned int count, std::vector< std::unique_ptr< FrameBuffer >> *buffers)=0
Export buffers from the converter device.
virtual SizeRange sizes(const Size &input)=0
Retrieve the range of minimum and maximum output sizes for an input size.
Frame buffer data and its associated dynamic metadata.
Definition: framebuffer.h:50
The MediaDevice represents a Media Controller device with its full graph of connected objects.
Definition: media_device.h:26
libcamera image pixel format
Definition: pixel_format.h:18
Generic signal and slot communication mechanism.
Definition: signal.h:40
Describe a range of sizes.
Definition: geometry.h:201
Describe a two-dimensional size.
Definition: geometry.h:53
Data structures related to geometric objects.
Top-level libcamera namespace.
Definition: backtrace.h:17
Signal & slot implementation.
Configuration parameters for a stream.
Definition: stream.h:41