Skip to content

Commit 1ca5aab

Browse files
committed
Add logging via spdlog library
It works for CPP, but from C code we have to keep using printf
1 parent d01af96 commit 1ca5aab

File tree

7 files changed

+72
-49
lines changed

7 files changed

+72
-49
lines changed

.github/workflows/build.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ jobs:
5454
tee /etc/apt/sources.list.d/80-rockchip.list <<< "deb [signed-by=/usr/share/keyrings/radxa-archive-keyring.gpg] https://radxa-repo.github.io/bullseye rockchip-bullseye main"
5555
5656
apt-get update
57-
apt-get install -y cmake g++ git pkg-config librockchip-mpp-dev libcairo-dev libdrm-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
57+
apt-get install -y cmake g++ git pkg-config librockchip-mpp-dev libcairo-dev libdrm-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libspdlog-dev
5858
apt clean
5959
6060
cmake -B build

CMakeLists.txt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,14 @@ set(SOURCE_FILES
2323
src/gstrtpreceiver.cpp
2424
src/gstrtpreceiver.h)
2525

26-
include_directories("/usr/include/libdrm" "/usr/include/cairo")
26+
include_directories("/usr/include/libdrm" "/usr/include/cairo" "/usr/include/spdlog")
2727

2828
configure_file("${PROJECT_NAME}_config.h.in" "${PROJECT_NAME}_config.h")
2929

30+
find_package(spdlog REQUIRED)
31+
3032
add_executable(${PROJECT_NAME} ${SOURCE_FILES})
31-
target_link_libraries(${PROJECT_NAME} rockchip_mpp pthread drm m cairo)
33+
target_link_libraries(${PROJECT_NAME} rockchip_mpp pthread drm m cairo spdlog::spdlog)
3234

3335
# Embed gstreamer
3436
find_package(PkgConfig REQUIRED)
@@ -41,6 +43,7 @@ pkg_search_module(gstreamer-app REQUIRED IMPORTED_TARGET gstreamer-app-1.0>=1.4)
4143
target_link_libraries(${PROJECT_NAME} PkgConfig::gstreamer PkgConfig::gstreamer-app)
4244

4345
if(CMAKE_BUILD_TYPE MATCHES "Debug")
46+
add_compile_definitions(SPDLOG_ACTIVE_LEVEL=SPDLOG_LEVEL_TRACE)
4447
set(
4548
CMAKE_C_FLAGS
4649
"${CMAKE_C_FLAGS} -Werror -fsanitize=undefined -fsanitize=address"

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@ Build on the Rockchip linux system directly.
1919

2020
## Install dependencies
2121

22-
- drm, cairo, mpp
22+
- drm, cairo, mpp, logging
2323

2424
```
25-
sudo apt install libdrm-dev libcairo-dev librockchip-mpp-dev
25+
sudo apt install libdrm-dev libcairo-dev librockchip-mpp-dev libspdlog-dev
2626
```
2727

2828
- gstreamer

src/dvr.cpp

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
#include <pthread.h>
2-
#include <stdio.h>
32
#include <stdlib.h>
43
#include <stdint.h>
54

5+
#include "spdlog/spdlog.h"
6+
67
#include "dvr.h"
78
#include "minimp4.h"
89

@@ -108,7 +109,7 @@ void Dvr::loop() {
108109
switch (rpc.command) {
109110
case dvr_rpc::RPC_SET_PARAMS:
110111
{
111-
printf("got rpc SET_PARAMS\n");
112+
SPDLOG_DEBUG("got rpc SET_PARAMS");
112113
if (dvr_file == NULL) {
113114
break;
114115
}
@@ -117,7 +118,7 @@ void Dvr::loop() {
117118
}
118119
case dvr_rpc::RPC_START:
119120
{
120-
printf("got rpc START\n");
121+
SPDLOG_DEBUG("got rpc START");
121122
if (dvr_file != NULL) {
122123
break;
123124
}
@@ -129,7 +130,7 @@ void Dvr::loop() {
129130
}
130131
case dvr_rpc::RPC_STOP:
131132
{
132-
printf("got rpc STOP\n");
133+
SPDLOG_DEBUG("got rpc STOP");
133134
if (dvr_file == NULL) {
134135
break;
135136
}
@@ -138,7 +139,7 @@ void Dvr::loop() {
138139
}
139140
case dvr_rpc::RPC_TOGGLE:
140141
{
141-
printf("got rpc TOGGLE\n");
142+
SPDLOG_DEBUG("got rpc TOGGLE");
142143
if (dvr_file == NULL) {
143144
start();
144145
if (video_frm_width > 0 && video_frm_height > 0) {
@@ -157,7 +158,7 @@ void Dvr::loop() {
157158
std::shared_ptr<std::vector<uint8_t>> frame = rpc.frame;
158159
auto res = mp4_h26x_write_nal(mp4wr, frame->data(), frame->size(), 90000/video_framerate);
159160
if (!(MP4E_STATUS_OK == res || MP4E_STATUS_BAD_ARGUMENTS == res)) {
160-
printf("mp4_h26x_write_nal failed with error %d\n", res);
161+
spdlog::warn("mp4_h26x_write_nal failed with error {}", res);
161162
}
162163
break;
163164
}
@@ -170,7 +171,7 @@ void Dvr::loop() {
170171
if (dvr_file != NULL) {
171172
stop();
172173
}
173-
printf("DVR thread done.\n");
174+
spdlog::info("DVR thread done.");
174175
}
175176

176177
int Dvr::start() {
@@ -179,7 +180,7 @@ int Dvr::start() {
179180
time_t t = time(NULL);
180181
strftime(fname, sizeof(fname), fname_tpl, localtime(&t));
181182
if ((dvr_file = fopen(fname,"w")) == NULL){
182-
fprintf(stderr, "ERROR: unable to open %s\n", fname);
183+
spdlog::error("unable to open DVR file {}", fname);
183184
return -1;
184185
}
185186
osd_vars.enable_recording = 1;
@@ -189,12 +190,12 @@ int Dvr::start() {
189190
}
190191

191192
void Dvr::init() {
192-
printf("setting up dvr and mux to %dx%d\n", video_frm_width, video_frm_height);
193+
spdlog::info("setting up dvr and mux to {}x{}", video_frm_width, video_frm_height);
193194
if (MP4E_STATUS_OK != mp4_h26x_write_init(mp4wr, mux,
194195
video_frm_width,
195196
video_frm_height,
196197
codec==VideoCodec::H265)) {
197-
fprintf(stderr, "error: mp4_h26x_write_init failed\n");
198+
spdlog::error("mp4_h26x_write_init failed");
198199
mux = NULL;
199200
dvr_file = NULL;
200201
}

src/gstrtpreceiver.cpp

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include "gst/gstparse.h"
88
#include "gst/gstpipeline.h"
99
#include "gst/app/gstappsink.h"
10+
#include "spdlog/spdlog.h"
1011
#include <cstring>
1112
#include <stdexcept>
1213
#include <cassert>
@@ -15,8 +16,6 @@
1516
#include <memory>
1617
#include <utility>
1718

18-
#define qDebug() std::cout
19-
2019
namespace pipeline {
2120
static std::string gst_create_rtp_caps(const VideoCodec& videoCodec){
2221
std::stringstream ss;
@@ -143,20 +142,20 @@ void GstRtpReceiver::on_new_sample(std::shared_ptr<std::vector<uint8_t> > sample
143142

144143
void GstRtpReceiver::start_receiving(NEW_FRAME_CALLBACK cb)
145144
{
146-
std::cout<<"GstRtpReceiver::start_receiving begin"<<std::endl;
145+
spdlog::info("GstRtpReceiver::start_receiving begin");
147146
assert(m_gst_pipeline==nullptr);
148147
m_cb=cb;
149148

150149
const auto pipeline=construct_gstreamer_pipeline();
151150
GError *error = nullptr;
152151
m_gst_pipeline = gst_parse_launch(pipeline.c_str(), &error);
153-
std::cout<< "GSTREAMER PIPE=[" << pipeline.c_str()<<"]"<<std::endl;
152+
spdlog::info("GSTREAMER PIPE=[{}]", pipeline);
154153
if (error) {
155-
qDebug() << "gst_parse_launch error: " << error->message;
154+
spdlog::warn("gst_parse_launch error: {}", error->message);
156155
return;
157156
}
158157
if(!m_gst_pipeline || !(GST_IS_PIPELINE(m_gst_pipeline))){
159-
qDebug()<<"Cannot construct pipeline";
158+
spdlog::warn("Cannot construct pipeline");
160159
m_gst_pipeline = nullptr;
161160
return;
162161
}
@@ -168,7 +167,7 @@ void GstRtpReceiver::start_receiving(NEW_FRAME_CALLBACK cb)
168167
m_pull_samples_run= true;
169168
m_pull_samples_thread=std::make_unique<std::thread>(&GstRtpReceiver::loop_pull_samples, this);
170169

171-
qDebug()<<"GstRtpReceiver::start_receiving end";
170+
spdlog::info("GstRtpReceiver::start_receiving end");
172171
}
173172

174173
void GstRtpReceiver::stop_receiving()
@@ -187,4 +186,4 @@ void GstRtpReceiver::stop_receiving()
187186
gst_object_unref (m_gst_pipeline);
188187
m_gst_pipeline=nullptr;
189188
}
190-
}
189+
}

src/main.cpp

Lines changed: 43 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
#include <drm_fourcc.h>
3333
#include <linux/videodev2.h>
3434
#include <rockchip/rk_mpi.h>
35+
#include "spdlog/spdlog.h"
3536

3637
extern "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
}
329333
end:
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

338342
void 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

349353
void 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
420424
void 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

Comments
 (0)