@@ -550,15 +550,51 @@ gst_aravis_create (GstPushSrc * push_src, GstBuffer ** buffer)
550550 gst_aravis = GST_ARAVIS (push_src );
551551 base_src_does_timestamp = gst_base_src_get_do_timestamp (GST_BASE_SRC (push_src ));
552552
553+ // get trigger mode
554+ GError * error = NULL ;
555+
556+ gboolean triggerModeEnabled = FALSE;
557+ gboolean triggerModeAvail = arv_device_is_feature_available (arv_camera_get_device (gst_aravis -> camera ), "TriggerMode" , & error );
558+
559+ if (error != NULL ) {
560+ GST_ERROR_OBJECT (gst_aravis , "Check TriggerMode avail failed: %d %s" , error -> code , error -> message );
561+ return GST_FLOW_ERROR ;
562+ }
563+
564+ if (triggerModeAvail ) {
565+
566+ ArvGcNode * feature = arv_device_get_feature (arv_camera_get_device (gst_aravis -> camera ), "TriggerMode" );
567+ const char * value = arv_gc_string_get_value (ARV_GC_STRING (feature ), & error );
568+
569+ if (error != NULL ) {
570+ GST_ERROR_OBJECT (gst_aravis , "Read TriggerMode failed: %d %s" , error -> code , error -> message );
571+ return GST_FLOW_ERROR ;
572+ }
573+
574+ triggerModeEnabled = strcmp (value , "On" ) == 0 ;
575+ if (triggerModeEnabled ) {
576+ GST_LOG_OBJECT (gst_aravis , "TriggeMode is set to On, pipeline will wait for a stream." );
577+ }
578+ }
579+
553580 GST_OBJECT_LOCK (gst_aravis );
554581
555582 do {
556583 if (arv_buffer ) arv_stream_push_buffer (gst_aravis -> stream , arv_buffer );
557584 arv_buffer = arv_stream_timeout_pop_buffer (gst_aravis -> stream , gst_aravis -> buffer_timeout_us );
558- } while (arv_buffer != NULL && arv_buffer_get_status (arv_buffer ) != ARV_BUFFER_STATUS_SUCCESS );
559585
560- if (arv_buffer == NULL )
586+ if (arv_buffer == NULL && triggerModeEnabled ) {
587+ GST_DEBUG_OBJECT (gst_aravis , "Waiting for buffer" );
588+ }
589+
590+ } while (
591+ (arv_buffer == NULL && triggerModeEnabled ) ||
592+ (arv_buffer != NULL && arv_buffer_get_status (arv_buffer ) != ARV_BUFFER_STATUS_SUCCESS )
593+ );
594+
595+ if (arv_buffer == NULL ) {
561596 goto error ;
597+ }
562598
563599 buffer_data = (char * ) arv_buffer_get_data (arv_buffer , & buffer_size );
564600 arv_buffer_get_image_region (arv_buffer , NULL , NULL , & width , & height );
0 commit comments