blob: a0c73f99390fbf8164d3ae0937380be1b14c58a5 (
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
/* SPDX-License-Identifier: BSD-2-Clause */
/*
* Copyright (C) 2019, Raspberry Pi (Trading) Limited
*
* cam_helper.cpp - helper information for different sensors
*/
#include <linux/videodev2.h>
#include <assert.h>
#include <map>
#include <string.h>
#include "libcamera/internal/v4l2_videodevice.h"
#include "cam_helper.hpp"
#include "md_parser.hpp"
using namespace RPi;
static std::map<std::string, CamHelperCreateFunc> cam_helpers;
CamHelper *CamHelper::Create(std::string const &cam_name)
{
/*
* CamHelpers get registered by static RegisterCamHelper
* initialisers.
*/
for (auto &p : cam_helpers) {
if (cam_name.find(p.first) != std::string::npos)
return p.second();
}
return nullptr;
}
CamHelper::CamHelper(MdParser *parser)
: parser_(parser), initialized_(false)
{
}
CamHelper::~CamHelper()
{
delete parser_;
}
uint32_t CamHelper::ExposureLines(double exposure_us) const
{
assert(initialized_);
return exposure_us * 1000.0 / mode_.line_length;
}
double CamHelper::Exposure(uint32_t exposure_lines) const
{
assert(initialized_);
return exposure_lines * mode_.line_length / 1000.0;
}
void CamHelper::SetCameraMode(const CameraMode &mode)
{
mode_ = mode;
parser_->SetBitsPerPixel(mode.bitdepth);
parser_->SetLineLengthBytes(0); /* We use SetBufferSize. */
initialized_ = true;
}
void CamHelper::GetDelays(int &exposure_delay, int &gain_delay) const
{
/*
* These values are correct for many sensors. Other sensors will
* need to over-ride this method.
*/
exposure_delay = 2;
gain_delay = 1;
}
bool CamHelper::SensorEmbeddedDataPresent() const
{
return false;
}
unsigned int CamHelper::HideFramesStartup() const
{
/*
* By default, hide 6 frames completely at start-up while AGC etc. sort
* themselves out (converge).
*/
return 6;
}
unsigned int CamHelper::HideFramesModeSwitch() const
{
/* After a mode switch, many sensors return valid frames immediately. */
return 0;
}
unsigned int CamHelper::MistrustFramesStartup() const
{
/* Many sensors return a single bad frame on start-up. */
return 1;
}
unsigned int CamHelper::MistrustFramesModeSwitch() const
{
/* Many sensors return valid metadata immediately. */
return 0;
}
CamTransform CamHelper::GetOrientation() const
{
/* Most sensors will be mounted the "right" way up? */
return CamTransform_IDENTITY;
}
RegisterCamHelper::RegisterCamHelper(char const *cam_name,
CamHelperCreateFunc create_func)
{
cam_helpers[std::string(cam_name)] = create_func;
}
|