@@ -74,9 +74,14 @@ Agc::Agc()
74
74
int Agc::configure (IPAContext &context, const IPACameraSensorInfo &configInfo)
75
75
{
76
76
/* Configure the default exposure and gain. */
77
- context.activeState .agc .gain = std::max (context.configuration .sensor .minAnalogueGain ,
78
- kMinAnalogueGain );
79
- context.activeState .agc .exposure = 10ms / context.configuration .sensor .lineDuration ;
77
+ context.activeState .agc .automatic .gain =
78
+ std::max (context.configuration .sensor .minAnalogueGain ,
79
+ kMinAnalogueGain );
80
+ context.activeState .agc .automatic .exposure =
81
+ 10ms / context.configuration .sensor .lineDuration ;
82
+ context.activeState .agc .manual .gain = context.activeState .agc .automatic .gain ;
83
+ context.activeState .agc .manual .exposure = context.activeState .agc .automatic .exposure ;
84
+ context.activeState .agc .autoEnabled = true ;
80
85
81
86
/*
82
87
* According to the RkISP1 documentation:
@@ -108,14 +113,58 @@ int Agc::configure(IPAContext &context, const IPACameraSensorInfo &configInfo)
108
113
return 0 ;
109
114
}
110
115
116
+ /* *
117
+ * \copydoc libcamera::ipa::Algorithm::queueRequest
118
+ */
119
+ void Agc::queueRequest (IPAContext &context,
120
+ [[maybe_unused]] const uint32_t frame,
121
+ IPAFrameContext &frameContext,
122
+ const ControlList &controls)
123
+ {
124
+ auto &agc = context.activeState .agc ;
125
+
126
+ const auto &agcEnable = controls.get (controls::AeEnable);
127
+ if (agcEnable && *agcEnable != agc.autoEnabled ) {
128
+ agc.autoEnabled = *agcEnable;
129
+
130
+ LOG (RkISP1Agc, Debug)
131
+ << (agc.autoEnabled ? " Enabling" : " Disabling" ) << " AGC" ;
132
+ }
133
+
134
+ const auto &exposure = controls.get (controls::ExposureTime);
135
+ if (exposure && !agc.autoEnabled ) {
136
+ agc.manual .exposure = *exposure * 1 .0us
137
+ / context.configuration .sensor .lineDuration ;
138
+
139
+ LOG (RkISP1Agc, Debug)
140
+ << " Set exposure to " << agc.manual .exposure ;
141
+ }
142
+
143
+ const auto &gain = controls.get (controls::AnalogueGain);
144
+ if (gain && !agc.autoEnabled ) {
145
+ agc.manual .gain = *gain;
146
+
147
+ LOG (RkISP1Agc, Debug) << " Set gain to " << agc.manual .gain ;
148
+ }
149
+
150
+ frameContext.agc .autoEnabled = agc.autoEnabled ;
151
+
152
+ if (!frameContext.agc .autoEnabled ) {
153
+ frameContext.agc .exposure = agc.manual .exposure ;
154
+ frameContext.agc .gain = agc.manual .gain ;
155
+ }
156
+ }
157
+
111
158
/* *
112
159
* \copydoc libcamera::ipa::Algorithm::prepare
113
160
*/
114
161
void Agc::prepare (IPAContext &context, const uint32_t frame,
115
162
IPAFrameContext &frameContext, rkisp1_params_cfg *params)
116
163
{
117
- frameContext.agc .exposure = context.activeState .agc .exposure ;
118
- frameContext.agc .gain = context.activeState .agc .gain ;
164
+ if (frameContext.agc .autoEnabled ) {
165
+ frameContext.agc .exposure = context.activeState .agc .automatic .exposure ;
166
+ frameContext.agc .gain = context.activeState .agc .automatic .gain ;
167
+ }
119
168
120
169
if (frame > 0 )
121
170
return ;
@@ -263,8 +312,8 @@ void Agc::computeExposure(IPAContext &context, IPAFrameContext &frameContext,
263
312
<< stepGain;
264
313
265
314
/* Update the estimated exposure and gain. */
266
- activeState.agc .exposure = shutterTime / configuration.sensor .lineDuration ;
267
- activeState.agc .gain = stepGain;
315
+ activeState.agc .automatic . exposure = shutterTime / configuration.sensor .lineDuration ;
316
+ activeState.agc .automatic . gain = stepGain;
268
317
}
269
318
270
319
/* *
0 commit comments