@@ -67,7 +67,8 @@ class RkISP1Frames
67
67
public:
68
68
RkISP1Frames (PipelineHandler *pipe);
69
69
70
- RkISP1FrameInfo *create (const RkISP1CameraData *data, Request *request);
70
+ RkISP1FrameInfo *create (const RkISP1CameraData *data, Request *request,
71
+ bool isRaw);
71
72
int destroy (unsigned int frame);
72
73
void clear ();
73
74
@@ -184,6 +185,7 @@ class PipelineHandlerRkISP1 : public PipelineHandler
184
185
std::unique_ptr<V4L2Subdevice> csi_;
185
186
186
187
bool hasSelfPath_;
188
+ bool isRaw_;
187
189
188
190
RkISP1MainPath mainPath_;
189
191
RkISP1SelfPath selfPath_;
@@ -203,28 +205,35 @@ RkISP1Frames::RkISP1Frames(PipelineHandler *pipe)
203
205
{
204
206
}
205
207
206
- RkISP1FrameInfo *RkISP1Frames::create (const RkISP1CameraData *data, Request *request)
208
+ RkISP1FrameInfo *RkISP1Frames::create (const RkISP1CameraData *data, Request *request,
209
+ bool isRaw)
207
210
{
208
211
unsigned int frame = data->frame_ ;
209
212
210
- if (pipe_->availableParamBuffers_ .empty ()) {
211
- LOG (RkISP1, Error) << " Parameters buffer underrun" ;
212
- return nullptr ;
213
- }
214
- FrameBuffer *paramBuffer = pipe_->availableParamBuffers_ .front ();
213
+ FrameBuffer *paramBuffer = nullptr ;
214
+ FrameBuffer *statBuffer = nullptr ;
215
215
216
- if (pipe_->availableStatBuffers_ .empty ()) {
217
- LOG (RkISP1, Error) << " Statisitc buffer underrun" ;
218
- return nullptr ;
216
+ if (!isRaw) {
217
+ if (pipe_->availableParamBuffers_ .empty ()) {
218
+ LOG (RkISP1, Error) << " Parameters buffer underrun" ;
219
+ return nullptr ;
220
+ }
221
+
222
+ if (pipe_->availableStatBuffers_ .empty ()) {
223
+ LOG (RkISP1, Error) << " Statisitc buffer underrun" ;
224
+ return nullptr ;
225
+ }
226
+
227
+ paramBuffer = pipe_->availableParamBuffers_ .front ();
228
+ pipe_->availableParamBuffers_ .pop ();
229
+
230
+ statBuffer = pipe_->availableStatBuffers_ .front ();
231
+ pipe_->availableStatBuffers_ .pop ();
219
232
}
220
- FrameBuffer *statBuffer = pipe_->availableStatBuffers_ .front ();
221
233
222
234
FrameBuffer *mainPathBuffer = request->findBuffer (&data->mainPathStream_ );
223
235
FrameBuffer *selfPathBuffer = request->findBuffer (&data->selfPathStream_ );
224
236
225
- pipe_->availableParamBuffers_ .pop ();
226
- pipe_->availableStatBuffers_ .pop ();
227
-
228
237
RkISP1FrameInfo *info = new RkISP1FrameInfo;
229
238
230
239
info->frame = frame;
@@ -672,6 +681,8 @@ int PipelineHandlerRkISP1::configure(Camera *camera, CameraConfiguration *c)
672
681
<< " ISP input pad configured with " << format
673
682
<< " crop " << rect;
674
683
684
+ isRaw_ = false ;
685
+
675
686
/* YUYV8_2X8 is required on the ISP source path pad for YUV output. */
676
687
format.mbus_code = MEDIA_BUS_FMT_YUYV8_2X8;
677
688
LOG (RkISP1, Debug)
@@ -764,13 +775,15 @@ int PipelineHandlerRkISP1::allocateBuffers(Camera *camera)
764
775
data->selfPathStream_ .configuration ().bufferCount ,
765
776
});
766
777
767
- ret = param_->allocateBuffers (maxCount, ¶mBuffers_);
768
- if (ret < 0 )
769
- goto error;
778
+ if (!isRaw_) {
779
+ ret = param_->allocateBuffers (maxCount, ¶mBuffers_);
780
+ if (ret < 0 )
781
+ goto error;
770
782
771
- ret = stat_->allocateBuffers (maxCount, &statBuffers_);
772
- if (ret < 0 )
773
- goto error;
783
+ ret = stat_->allocateBuffers (maxCount, &statBuffers_);
784
+ if (ret < 0 )
785
+ goto error;
786
+ }
774
787
775
788
for (std::unique_ptr<FrameBuffer> &buffer : paramBuffers_) {
776
789
buffer->setCookie (ipaBufferId++);
@@ -846,23 +859,25 @@ int PipelineHandlerRkISP1::start(Camera *camera, [[maybe_unused]] const ControlL
846
859
847
860
data->frame_ = 0 ;
848
861
849
- ret = param_->streamOn ();
850
- if (ret) {
851
- data->ipa_ ->stop ();
852
- freeBuffers (camera);
853
- LOG (RkISP1, Error)
854
- << " Failed to start parameters " << camera->id ();
855
- return ret;
856
- }
862
+ if (!isRaw_) {
863
+ ret = param_->streamOn ();
864
+ if (ret) {
865
+ data->ipa_ ->stop ();
866
+ freeBuffers (camera);
867
+ LOG (RkISP1, Error)
868
+ << " Failed to start parameters " << camera->id ();
869
+ return ret;
870
+ }
857
871
858
- ret = stat_->streamOn ();
859
- if (ret) {
860
- param_->streamOff ();
861
- data->ipa_ ->stop ();
862
- freeBuffers (camera);
863
- LOG (RkISP1, Error)
864
- << " Failed to start statistics " << camera->id ();
865
- return ret;
872
+ ret = stat_->streamOn ();
873
+ if (ret) {
874
+ param_->streamOff ();
875
+ data->ipa_ ->stop ();
876
+ freeBuffers (camera);
877
+ LOG (RkISP1, Error)
878
+ << " Failed to start statistics " << camera->id ();
879
+ return ret;
880
+ }
866
881
}
867
882
868
883
if (data->mainPath_ ->isEnabled ()) {
@@ -907,15 +922,17 @@ void PipelineHandlerRkISP1::stopDevice(Camera *camera)
907
922
selfPath_.stop ();
908
923
mainPath_.stop ();
909
924
910
- ret = stat_->streamOff ();
911
- if (ret)
912
- LOG (RkISP1, Warning)
913
- << " Failed to stop statistics for " << camera->id ();
925
+ if (!isRaw_) {
926
+ ret = stat_->streamOff ();
927
+ if (ret)
928
+ LOG (RkISP1, Warning)
929
+ << " Failed to stop statistics for " << camera->id ();
914
930
915
- ret = param_->streamOff ();
916
- if (ret)
917
- LOG (RkISP1, Warning)
918
- << " Failed to stop parameters for " << camera->id ();
931
+ ret = param_->streamOff ();
932
+ if (ret)
933
+ LOG (RkISP1, Warning)
934
+ << " Failed to stop parameters for " << camera->id ();
935
+ }
919
936
920
937
ASSERT (data->queuedRequests_ .empty ());
921
938
data->frameInfo_ .clear ();
@@ -929,12 +946,21 @@ int PipelineHandlerRkISP1::queueRequestDevice(Camera *camera, Request *request)
929
946
{
930
947
RkISP1CameraData *data = cameraData (camera);
931
948
932
- RkISP1FrameInfo *info = data->frameInfo_ .create (data, request);
949
+ RkISP1FrameInfo *info = data->frameInfo_ .create (data, request, isRaw_ );
933
950
if (!info)
934
951
return -ENOENT;
935
952
936
953
data->ipa_ ->queueRequest (data->frame_ , request->controls ());
937
- data->ipa_ ->fillParamsBuffer (data->frame_ , info->paramBuffer ->cookie ());
954
+ if (isRaw_) {
955
+ if (info->mainPathBuffer )
956
+ data->mainPath_ ->queueBuffer (info->mainPathBuffer );
957
+
958
+ if (data->selfPath_ && info->selfPathBuffer )
959
+ data->selfPath_ ->queueBuffer (info->selfPathBuffer );
960
+ } else {
961
+ data->ipa_ ->fillParamsBuffer (data->frame_ ,
962
+ info->paramBuffer ->cookie ());
963
+ }
938
964
939
965
data->frame_ ++;
940
966
@@ -1139,7 +1165,7 @@ void PipelineHandlerRkISP1::tryCompleteRequest(RkISP1FrameInfo *info)
1139
1165
if (!info->metadataProcessed )
1140
1166
return ;
1141
1167
1142
- if (!info->paramDequeued )
1168
+ if (!isRaw_ && ! info->paramDequeued )
1143
1169
return ;
1144
1170
1145
1171
data->frameInfo_ .destroy (info->frame );
@@ -1156,16 +1182,28 @@ void PipelineHandlerRkISP1::bufferReady(FrameBuffer *buffer)
1156
1182
if (!info)
1157
1183
return ;
1158
1184
1185
+ const FrameMetadata &metadata = buffer->metadata ();
1159
1186
Request *request = buffer->request ();
1160
1187
1161
- /*
1162
- * Record the sensor's timestamp in the request metadata.
1163
- *
1164
- * \todo The sensor timestamp should be better estimated by connecting
1165
- * to the V4L2Device::frameStart signal.
1166
- */
1167
- request->metadata ().set (controls::SensorTimestamp,
1168
- buffer->metadata ().timestamp );
1188
+ if (metadata.status != FrameMetadata::FrameCancelled) {
1189
+ /*
1190
+ * Record the sensor's timestamp in the request metadata.
1191
+ *
1192
+ * \todo The sensor timestamp should be better estimated by connecting
1193
+ * to the V4L2Device::frameStart signal.
1194
+ */
1195
+ request->metadata ().set (controls::SensorTimestamp,
1196
+ metadata.timestamp );
1197
+
1198
+ if (isRaw_) {
1199
+ const ControlList &ctrls =
1200
+ data->delayedCtrls_ ->get (metadata.sequence );
1201
+ data->ipa_ ->processStatsBuffer (info->frame , 0 , ctrls);
1202
+ }
1203
+ } else {
1204
+ if (isRaw_)
1205
+ info->metadataProcessed = true ;
1206
+ }
1169
1207
1170
1208
completeBuffer (request, buffer);
1171
1209
tryCompleteRequest (info);
0 commit comments