@@ -80,11 +80,12 @@ int frm_eos = 0;
80
80
int drm_fd = 0 ;
81
81
pthread_mutex_t video_mutex;
82
82
pthread_cond_t video_cond;
83
-
83
+ extern bool osd_update_ready;
84
84
int video_zpos = 1 ;
85
85
86
86
bool mavlink_dvr_on_arm = false ;
87
87
bool osd_custom_message = false ;
88
+ bool disable_vsync = false ;
88
89
89
90
VideoCodec codec = VideoCodec::H265;
90
91
Dvr *dvr = NULL ;
@@ -264,10 +265,11 @@ void *__DISPLAY_THREAD__(void *param)
264
265
265
266
while (!frm_eos) {
266
267
int fb_id;
268
+ bool osd_update;
267
269
268
270
ret = pthread_mutex_lock (&video_mutex);
269
271
assert (!ret);
270
- while (output_list->video_fb_id ==0 ) {
272
+ while (output_list->video_fb_id ==0 && !osd_update_ready ) {
271
273
pthread_cond_wait (&video_cond, &video_mutex);
272
274
assert (!ret);
273
275
if (output_list->video_fb_id == 0 && frm_eos) {
@@ -279,24 +281,33 @@ void *__DISPLAY_THREAD__(void *param)
279
281
struct timespec ts, ats;
280
282
clock_gettime (CLOCK_MONOTONIC, &ats);
281
283
fb_id = output_list->video_fb_id ;
284
+ osd_update = osd_update_ready;
282
285
283
- uint64_t decoding_pts=output_list->decoding_pts ;
286
+ uint64_t decoding_pts=fb_id != 0 ? output_list->decoding_pts : get_time_ms () ;
284
287
output_list->video_fb_id =0 ;
288
+ osd_update_ready = false ;
285
289
ret = pthread_mutex_unlock (&video_mutex);
286
290
assert (!ret);
287
291
292
+ // create new video_request
293
+ drmModeAtomicFree (output_list->video_request );
294
+ output_list->video_request = drmModeAtomicAlloc ();
295
+
288
296
// show DRM FB in plane
289
- drmModeAtomicSetCursor (output_list->video_request , 0 );
290
- ret = set_drm_object_property (output_list->video_request , &output_list->video_plane , " FB_ID" , fb_id);
291
- assert (ret>0 );
297
+ uint32_t flags = DRM_MODE_ATOMIC_NONBLOCK;
298
+ if (fb_id != 0 ) {
299
+ flags = disable_vsync ? DRM_MODE_ATOMIC_NONBLOCK : DRM_MODE_ATOMIC_ALLOW_MODESET;
300
+ ret = set_drm_object_property (output_list->video_request , &output_list->video_plane , " FB_ID" , fb_id);
301
+ assert (ret>0 );
302
+ }
292
303
293
304
if (enable_osd) {
294
305
ret = pthread_mutex_lock (&osd_mutex);
295
306
assert (!ret);
296
307
ret = set_drm_object_property (output_list->video_request , &output_list->osd_plane , " FB_ID" , output_list->osd_bufs [output_list->osd_buf_switch ].fb );
297
308
assert (ret>0 );
298
309
}
299
- drmModeAtomicCommit (drm_fd, output_list->video_request , DRM_MODE_ATOMIC_ALLOW_MODESET , NULL );
310
+ drmModeAtomicCommit (drm_fd, output_list->video_request , flags , NULL );
300
311
ret = pthread_mutex_unlock (&osd_mutex);
301
312
assert (!ret);
302
313
@@ -368,6 +379,24 @@ void sigusr1_handler(int signum) {
368
379
}
369
380
}
370
381
382
+ void sigusr2_handler (int signum) {
383
+ // Toggle the disable_vsync flag
384
+ disable_vsync = disable_vsync ^ 1 ;
385
+
386
+ // Open the file for writing
387
+ std::ofstream outFile (" /run/pixelpilot.msg" );
388
+ if (!outFile.is_open ()) {
389
+ spdlog::error (" Error opening file!" );
390
+ return ; // Exit the function if the file cannot be opened
391
+ }
392
+
393
+ // Write the formatted text to the file
394
+ outFile << " disable_vsync: " << std::boolalpha << disable_vsync << std::endl;
395
+ outFile.close ();
396
+
397
+ // Log the new state of disable_vsync
398
+ spdlog::info (" disable_vsync: {}" , disable_vsync);
399
+ }
371
400
372
401
int decoder_stalled_count=0 ;
373
402
bool feed_packet_to_decoder (MppPacket *packet,void * data_p,int data_len){
@@ -524,6 +553,8 @@ void printHelp() {
524
553
" \n "
525
554
" --screen-mode <mode> - Override default screen mode. <width>x<heigth>@<fps> ex: 1920x1080@120\n "
526
555
" \n "
556
+ " --disable-vsync - Disable VSYNC commits\n "
557
+ " \n "
527
558
" --screen-mode-list - Print the list of supported screen modes and exit.\n "
528
559
" \n "
529
560
" --version - Show program version\n "
@@ -702,6 +733,11 @@ int main(int argc, char **argv)
702
733
continue ;
703
734
}
704
735
736
+ __OnArgument (" --disable-vsync" ) {
737
+ disable_vsync = true ;
738
+ continue ;
739
+ }
740
+
705
741
__OnArgument (" --screen-mode-list" ) {
706
742
print_modelist = 1 ;
707
743
continue ;
@@ -728,6 +764,8 @@ int main(int argc, char **argv)
728
764
729
765
printf (" PixelPilot Rockchip %d.%d\n " , APP_VERSION_MAJOR, APP_VERSION_MINOR);
730
766
767
+ spdlog::info (" disable_vsync: {}" , disable_vsync);
768
+
731
769
if (enable_osd == 0 ) {
732
770
video_zpos = 4 ;
733
771
}
@@ -786,6 +824,7 @@ int main(int argc, char **argv)
786
824
if (dvr_template) {
787
825
signal (SIGUSR1, sigusr1_handler);
788
826
}
827
+ signal (SIGUSR2, sigusr2_handler);
789
828
// ////////////////// THREADS SETUP
790
829
791
830
ret = pthread_mutex_init (&video_mutex, NULL );
0 commit comments