1010#include < vector>
1111
1212#include " omniseer/vision/dma_heap_alloc.hpp"
13+ #include " omniseer/vision/image_buffer_pool.hpp"
1314#include " omniseer/vision/pipeline.hpp"
15+ #include " omniseer/vision/rga_preprocess.hpp"
1416#include " omniseer/vision/telemetry.hpp"
1517
1618namespace
@@ -57,8 +59,6 @@ namespace
5759 {
5860 case ProducerStage::None:
5961 return " none" ;
60- case ProducerStage::Preconditions:
61- return " preconditions" ;
6262 case ProducerStage::Dequeue:
6363 return " dequeue" ;
6464 case ProducerStage::AcquireWrite:
@@ -100,36 +100,6 @@ namespace
100100 };
101101} // namespace
102102
103- TEST (ProducerPipeline, NotArmedReportsPreconditionsAndTelemetry)
104- {
105- omniseer::vision::V4l2Capture capture ({
106- .device = " /dev/video12" ,
107- .width = 1280 ,
108- .height = 720 ,
109- .fourcc = V4L2_PIX_FMT_NV12 ,
110- .buffer_count = 4 ,
111- });
112- omniseer::vision::ImageBufferPool pool;
113- omniseer::vision::RgaPreprocess preprocess;
114- TestTelemetry telemetry;
115-
116- omniseer::vision::ProducerPipeline producer (capture, preprocess, pool, &telemetry);
117-
118- const auto tick = producer.run ();
119- EXPECT_EQ (tick.status , omniseer::vision::ProducerTickStatus::CaptureFatalError);
120- EXPECT_EQ (tick.stage , omniseer::vision::ProducerStage::Preconditions);
121- EXPECT_EQ (tick.stage_errno , EPERM );
122- EXPECT_EQ (tick.stage_mask , 0u );
123-
124- ASSERT_EQ (telemetry.producer_samples .size (), 1u );
125- EXPECT_EQ (telemetry.producer_samples [0 ].producer_status ,
126- static_cast <uint8_t >(omniseer::vision::ProducerTickStatus::CaptureFatalError));
127-
128- telemetry.enabled = false ;
129- (void ) producer.run ();
130- EXPECT_EQ (telemetry.producer_samples .size (), 1u );
131- }
132-
133103TEST (ProducerPipeline, PreflightThenProducesFrames)
134104{
135105 const char * dev_env = std::getenv (" VISION_V4L2_DEV" );
@@ -191,19 +161,22 @@ TEST(ProducerPipeline, PreflightThenProducesFrames)
191161 TestTelemetry telemetry;
192162 omniseer::vision::ProducerPipeline producer (capture, preprocess, pool, &telemetry);
193163
194- const auto pre_preflight = producer.run ();
195- EXPECT_EQ (pre_preflight.status , omniseer::vision::ProducerTickStatus::CaptureFatalError);
196- EXPECT_EQ (pre_preflight.stage , omniseer::vision::ProducerStage::Preconditions);
197- EXPECT_EQ (pre_preflight.stage_errno , EPERM );
198- EXPECT_EQ (pre_preflight.stage_mask , 0u );
199- EXPECT_EQ (pre_preflight.capture .status , omniseer::vision::CaptureStatus::FatalError);
200- EXPECT_EQ (pre_preflight.capture .sys_errno , EPERM );
201- ASSERT_EQ (telemetry.producer_samples .size (), 1u );
202-
203164 ASSERT_NO_THROW (producer.preflight ());
204-
205- int produced = 0 ;
206- int nonfatal = 0 ;
165+ EXPECT_TRUE (producer.is_armed ());
166+
167+ const auto & remap = producer.remap ();
168+ EXPECT_EQ (remap.source_size .w , static_cast <int >(src_w));
169+ EXPECT_EQ (remap.source_size .h , static_cast <int >(src_h));
170+ EXPECT_EQ (remap.model_input_size .w , dst_w);
171+ EXPECT_EQ (remap.model_input_size .h , dst_h);
172+ EXPECT_GT (remap.scale , 0 .0f );
173+ EXPECT_GE (remap.pad_x , 0 );
174+ EXPECT_GE (remap.pad_y , 0 );
175+ EXPECT_GT (remap.resized_w , 0 );
176+ EXPECT_GT (remap.resized_h , 0 );
177+
178+ int produced = 0 ;
179+ uint64_t last_frame_id = 0 ;
207180 constexpr int max_ticks = 400 ;
208181 for (int i = 0 ; i < max_ticks && produced < 3 ; ++i)
209182 {
@@ -218,14 +191,20 @@ TEST(ProducerPipeline, PreflightThenProducesFrames)
218191 else
219192 {
220193 EXPECT_EQ (telemetry.producer_samples .size (), emitted_before + 1 );
194+ ASSERT_LT (emitted_before, telemetry.producer_samples .size ());
195+ EXPECT_EQ (telemetry.producer_samples [emitted_before].producer_status ,
196+ static_cast <uint8_t >(tick.status ));
221197 }
222198
223199 if (tick.status == omniseer::vision::ProducerTickStatus::Produced)
224200 {
225201 ++produced;
226- EXPECT_TRUE (tick.preprocess .ok ());
227- EXPECT_EQ (tick.capture .status , omniseer::vision::CaptureStatus::Ok);
228202 EXPECT_EQ (tick.stage , omniseer::vision::ProducerStage::Requeue);
203+ EXPECT_EQ (tick.stage_errno , 0 );
204+ EXPECT_GT (tick.capture_ts_real_ns , 0u );
205+ EXPECT_GE (tick.pool_index , 0 );
206+ EXPECT_GT (tick.frame_id , last_frame_id);
207+ last_frame_id = tick.frame_id ;
229208
230209 const uint32_t expected_mask =
231210 stage_mask_bit (omniseer::vision::ProducerStageMask::Dequeue) |
@@ -239,24 +218,21 @@ TEST(ProducerPipeline, PreflightThenProducesFrames)
239218
240219 if (tick.status == omniseer::vision::ProducerTickStatus::NoWritableBuffer)
241220 {
242- EXPECT_TRUE (tick.stage == omniseer::vision::ProducerStage::AcquireWrite ||
243- tick.stage == omniseer::vision::ProducerStage::Requeue)
221+ EXPECT_EQ (tick.stage , omniseer::vision::ProducerStage::AcquireWrite)
244222 << " unexpected stage for NoWritableBuffer: " << stage_name (tick.stage );
245223 }
246224
247225 if (tick.status == omniseer::vision::ProducerTickStatus::CaptureFatalError ||
248226 tick.status == omniseer::vision::ProducerTickStatus::PreprocessError)
249227 {
250228 FAIL () << " unexpected fatal-ish status: " << tick_status_name (tick.status )
251- << " , capture_errno =" << tick.capture . sys_errno ;
229+ << " , stage_errno =" << tick.stage_errno ;
252230 }
253231
254- ++nonfatal;
255232 std::this_thread::sleep_for (std::chrono::milliseconds (1 ));
256233 }
257234
258235 EXPECT_GT (produced, 0 ) << " producer did not produce any frames in " << max_ticks << " ticks" ;
259- EXPECT_GE (nonfatal, 0 );
260236
261237 ASSERT_NO_THROW (capture.stop ());
262238}
0 commit comments