3232#include < drm_fourcc.h>
3333#include < linux/videodev2.h>
3434#include < rockchip/rk_mpi.h>
35+ #include " spdlog/spdlog.h"
3536
3637extern " C" {
3738#include " main.h"
@@ -92,7 +93,8 @@ void init_buffer(MppFrame frame) {
9293 MppFrameFormat fmt = mpp_frame_get_fmt (frame);
9394 assert ((fmt == MPP_FMT_YUV420SP) || (fmt == MPP_FMT_YUV420SP_10BIT));
9495
95- printf (" Frame info changed %d(%d)x%d(%d)\n " , output_list->video_frm_width , hor_stride, output_list->video_frm_height , ver_stride);
96+ spdlog::info (" Frame info changed {}({})x{}({})" ,
97+ output_list->video_frm_width , hor_stride, output_list->video_frm_height , ver_stride);
9698
9799 output_list->video_fb_x = 0 ;
98100 output_list->video_fb_y = 0 ;
@@ -237,7 +239,7 @@ void *__FRAME_THREAD__(void *param)
237239 frame = NULL ;
238240 } else assert (0 );
239241 }
240- printf (" Frame thread done.\n " );
242+ spdlog::info (" Frame thread done." );
241243 return nullptr ;
242244}
243245
@@ -313,7 +315,9 @@ void *__DISPLAY_THREAD__(void *param)
313315 osd_vars.latency_min = min_latency;
314316 osd_vars.current_framerate = frame_counter*(1000 /osd_vars.refresh_frequency_ms );
315317
316- // printf("decoding decoding latency=%.2f ms (%.2f, %.2f), framerate=%d fps\n", osd_vars.latency_avg/1000.0, osd_vars.latency_max/1000.0, osd_vars.latency_min/1000.0, osd_vars.current_framerate);
318+ SPDLOG_DEBUG (" decoding decoding latency={:.2f} ms ({:.2f}, {:.2f}), framerate={} fps" ,
319+ osd_vars.latency_avg /1000.0 , osd_vars.latency_max /1000.0 ,
320+ osd_vars.latency_min /1000.0 , osd_vars.current_framerate );
317321
318322 fps_start = fps_end;
319323 frame_counter = 0 ;
@@ -327,7 +331,7 @@ void *__DISPLAY_THREAD__(void *param)
327331
328332 }
329333end:
330- printf (" Display thread done.\n " );
334+ spdlog::info (" Display thread done." );
331335 return nullptr ;
332336}
333337
@@ -337,7 +341,7 @@ int signal_flag = 0;
337341
338342void sig_handler (int signum)
339343{
340- printf (" Received signal %d \n " , signum);
344+ spdlog::info (" Received signal {} " , signum);
341345 signal_flag++;
342346 mavlink_thread_signal++;
343347 osd_thread_signal++;
@@ -347,7 +351,7 @@ void sig_handler(int signum)
347351}
348352
349353void sigusr1_handler (int signum) {
350- printf (" Received signal %d \n " , signum);
354+ spdlog::info (" Received signal {} " , signum);
351355 if (dvr) {
352356 dvr->toggle_recording ();
353357 }
@@ -369,7 +373,7 @@ bool feed_packet_to_decoder(MppPacket *packet,void* data_p,int data_len){
369373 uint64_t elapsed = get_time_ms () - data_feed_begin;
370374 if (elapsed > 100 ) {
371375 decoder_stalled_count++;
372- printf (" Cannot feed decoder, stalled %d ? \n " , decoder_stalled_count);
376+ spdlog::warn (" Cannot feed decoder, stalled {} ? " , decoder_stalled_count);
373377 return false ;
374378 }
375379 usleep (2 * 1000 );
@@ -407,7 +411,7 @@ void read_gstreamerpipe_stream(MppPacket *packet, int gst_udp_port, const VideoC
407411 sleep (10 );
408412 }
409413 receiver.stop_receiving ();
410- printf (" Feeding eos\n " );
414+ spdlog::info (" Feeding eos" );
411415 mpp_packet_set_eos (packet);
412416 // mpp_packet_set_pos(packet, nal_buffer);
413417 mpp_packet_set_length (packet, 0 );
@@ -420,7 +424,7 @@ void read_gstreamerpipe_stream(MppPacket *packet, int gst_udp_port, const VideoC
420424void set_control_verbose (MppApi * mpi, MppCtx ctx,MpiCmd control,RK_U32 enable){
421425 RK_U32 res = mpi->control (ctx, control, &enable);
422426 if (res){
423- printf (" Could not set control %d %d \n " , control,enable);
427+ spdlog::warn (" Could not set control {} {} " , control, enable);
424428 assert (false );
425429 }
426430}
@@ -432,20 +436,20 @@ void set_mpp_decoding_parameters(MppApi * mpi, MppCtx ctx) {
432436 // get default config from decoder context
433437 int ret = mpi->control (ctx, MPP_DEC_GET_CFG, cfg);
434438 if (ret) {
435- printf ( " %p failed to get decoder cfg ret %d \n " , ctx, ret);
439+ spdlog::warn ( " {} failed to get decoder cfg ret {} " , ctx, ret);
436440 assert (false );
437441 }
438442 // split_parse is to enable mpp internal frame spliter when the input
439443 // packet is not aplited into frames.
440444 RK_U32 need_split = 1 ;
441445 ret = mpp_dec_cfg_set_u32 (cfg, " base:split_parse" , need_split);
442446 if (ret) {
443- printf ( " %p failed to set split_parse ret %d \n " , ctx, ret);
447+ spdlog::warn ( " {} failed to set split_parse ret {} " , ctx, ret);
444448 assert (false );
445449 }
446450 ret = mpi->control (ctx, MPP_DEC_SET_CFG, cfg);
447451 if (ret) {
448- printf ( " %p failed to set cfg %p ret %d \n " , ctx, cfg, ret);
452+ spdlog::warn ( " {} failed to set cfg {} ret {} " , ctx, cfg, ret);
449453 assert (false );
450454 }
451455 int mpp_split_mode =0 ;
@@ -478,6 +482,8 @@ void printHelp() {
478482 " \n "
479483 " --codec <codec> - Video codec, should be the same as on VTX (Default: h265 <h264|h265>)\n "
480484 " \n "
485+ " --log-level <level> - Log verbosity level, debug|info|warn|error (Default: info)\n "
486+ " \n "
481487 " --osd - Enable OSD\n "
482488 " \n "
483489 " --osd-elements <els> - Customize osd elements (Default: video,wfbng,telem)\n "
@@ -524,9 +530,10 @@ int main(int argc, char **argv)
524530 uint16_t mode_width = 0 ;
525531 uint16_t mode_height = 0 ;
526532 uint32_t mode_vrefresh = 0 ;
533+ auto log_level = spdlog::level::info;
527534
528535 osd_vars.enable_recording = 0 ;
529-
536+
530537 // Load console arguments
531538 __BeginParseConsoleArguments__ (printHelp)
532539
@@ -539,7 +546,7 @@ int main(int argc, char **argv)
539546 char * codec_str = const_cast <char *>(__ArgValue);
540547 codec = video_codec (codec_str);
541548 if (codec == VideoCodec::UNKNOWN ) {
542- printf ( " unsupported video codec" );
549+ fprintf (stderr, " unsupported video codec" );
543550 return -1 ;
544551 }
545552 continue ;
@@ -572,6 +579,25 @@ int main(int argc, char **argv)
572579 continue ;
573580 }
574581
582+ __OnArgument (" --log-level" ) {
583+ std::string log_l = std::string (__ArgValue);
584+ if (log_l == " info" ) {
585+ log_level = spdlog::level::info;
586+ } else if (log_l == " debug" ){
587+ log_level = spdlog::level::debug;
588+ spdlog::set_pattern (" [%Y-%m-%d %H:%M:%S.%e] [thread %t] [%s:%#] [%^%l%$] %v" );
589+ } else if (log_l == " warn" ){
590+ log_level = spdlog::level::warn;
591+ } else if (log_l == " error" ){
592+ log_level = spdlog::level::err;
593+ } else {
594+ fprintf (stderr, " invalid log level %s\n " , log_l.c_str ());
595+ printHelp ();
596+ return -1 ;
597+ }
598+ continue ;
599+ }
600+
575601 __OnArgument (" --mavlink-port" ) {
576602 mavlink_port = atoi (__ArgValue);
577603 continue ;
@@ -647,6 +673,8 @@ int main(int argc, char **argv)
647673
648674 __EndParseConsoleArguments__
649675
676+ spdlog::set_level (log_level);
677+
650678 if (dvr_template != NULL && video_framerate < 0 ) {
651679 printf (" --dvr-framerate must be provided when dvr is enabled.\n " );
652680 return 0 ;
@@ -668,7 +696,7 @@ int main(int argc, char **argv)
668696 // //////////////////////////////// DRM SETUP
669697 ret = modeset_open (&drm_fd, " /dev/dri/card0" );
670698 if (ret < 0 ) {
671- printf (" modeset_open() = %d \n " , ret);
699+ spdlog::warn (" modeset_open() = {} " , ret);
672700 }
673701 assert (drm_fd >= 0 );
674702 if (print_modelist) {
0 commit comments