Skip to content

Commit b299dd8

Browse files
committed
logger: implement a static logger
This logger allows to be used across an application The log level can be set at runtime.
1 parent 9e4b684 commit b299dd8

File tree

3 files changed

+94
-30
lines changed

3 files changed

+94
-30
lines changed

lib/esextractor.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -421,3 +421,9 @@ es_extractor_teardown (ESExtractor * extractor)
421421
{
422422
delete (extractor);
423423
}
424+
425+
void
426+
es_extractor_set_log_level (uint8_t level)
427+
{
428+
Logger::instance().setLogLevel(level);
429+
}

lib/esextractor.h

+63-19
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,66 @@
2222
#include <istream>
2323
#include <vector>
2424

25-
//#define _DEBUG
26-
#ifdef _DEBUG
27-
# define DBG(FMT, ...) printf(FMT "\n", ##__VA_ARGS__)
28-
#else
29-
# define DBG(FMT, ...)
30-
#endif
31-
#define DUMP(FMT, ...) printf(FMT, ##__VA_ARGS__)
32-
#define INFO(FMT, ...) printf(FMT "\n", ##__VA_ARGS__)
33-
#define ERR(FMT, ...) printf("ERROR: " FMT "\n", ##__VA_ARGS__)
25+
#include <stdarg.h>
26+
#include <string.h>
27+
28+
enum {
29+
ES_LOG_LEVEL_NONE = 0,
30+
ES_LOG_LEVEL_ERROR,
31+
ES_LOG_LEVEL_INFO,
32+
ES_LOG_LEVEL_DEBUG,
33+
ES_LOG_LEVEL_MEMDUMP,
34+
ES_LOG_LEVEL_MAX
35+
};
36+
37+
class Logger {
38+
public:
39+
Logger() {
40+
m_level = ES_LOG_LEVEL_ERROR;
41+
42+
}
43+
static Logger& instance()
44+
{
45+
static Logger instance;
46+
return instance;
47+
}
48+
int level() { return m_level;}
49+
void setLogLevel(uint8_t level) {
50+
m_level = level;
51+
if (m_level > ES_LOG_LEVEL_MAX)
52+
m_level=ES_LOG_LEVEL_DEBUG;
53+
}
54+
void createLog(const char *format, ...) {
55+
va_list argptr;
56+
va_start(argptr, format);
57+
vfprintf(stdout, format, argptr);
58+
va_end(argptr);
59+
}
60+
61+
void createLogData(const uint8_t* buffer, uint32_t length, const char* format, ...) {
62+
va_list argptr;
63+
va_start(argptr, format);
64+
vfprintf(stdout, format, argptr);
65+
va_end(argptr);
66+
for (uint32_t i = 0; i < length; i++) {
67+
fprintf(stdout, "0x%.2X ", buffer[i]);
68+
}
69+
fprintf(stdout, "\n");
70+
}
71+
72+
private:
73+
uint8_t m_level;
74+
};
75+
76+
#define __FILENAME__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__)
77+
78+
#define LOGGER(LEVEL, PREFIX, FMT, SUFFIX, ...) if (LEVEL <= Logger::instance().level()) Logger::instance().createLog(PREFIX "%s:%d:%s:\t" FMT SUFFIX,__FILENAME__,__LINE__,__FUNCTION__, ##__VA_ARGS__)
79+
#define LOGGER_DATA(LEVEL, DATA, LENGTH, PREFIX, FMT, SUFFIX, ...) if (LEVEL <= Logger::instance().level()) Logger::instance().createLogData(DATA, LENGTH, PREFIX "%s:%d:%s:\t" FMT SUFFIX,__FILENAME__,__LINE__,__FUNCTION__, ##__VA_ARGS__)
80+
#define ERR(FMT, ...) LOGGER(ES_LOG_LEVEL_ERROR, "ESE_ERROR\t", FMT, "\n", ##__VA_ARGS__)
81+
#define INFO(FMT, ...) LOGGER(ES_LOG_LEVEL_INFO, "ESE_INFO\t", FMT, "\n", ##__VA_ARGS__)
82+
83+
#define DBG(FMT, ...) LOGGER(ES_LOG_LEVEL_DEBUG, "ESE_DEBUG\t", FMT, "\n", ##__VA_ARGS__)
84+
#define MEM_DUMP(DATA, LENGTH, FMT, ...) LOGGER_DATA(ES_LOG_LEVEL_MEMDUMP, DATA, LENGTH, "ESE_MEMDUMP\t", FMT, "", ##__VA_ARGS__)
3485

3586
#if (defined _WIN32 || defined __CYGWIN__) && !defined(ES_STATIC_COMPILATION)
3687
#ifdef BUILDING_ES_EXTRACTOR
@@ -46,16 +97,6 @@
4697
#endif
4798
#endif
4899

49-
inline void
50-
printBufferHex (unsigned char *buffer, int size)
51-
{
52-
for (int i = 0; i < size; i++) {
53-
DUMP ("0x%.2X ", buffer[i]);
54-
}
55-
DUMP ("\n");
56-
}
57-
58-
59100
typedef enum ESExtractorVideoCodec {
60101
ES_EXTRACTOR_VIDEO_CODEC_UNKNOWN = 0,
61102
ES_EXTRACTOR_VIDEO_CODEC_H264,
@@ -172,6 +213,9 @@ int es_extractor_frame_count (ESExtractor * extractor);
172213
ES_EXTRACTOR_API
173214
void es_extractor_teardown (ESExtractor * demuxer);
174215

216+
ES_EXTRACTOR_API
217+
void es_extractor_set_log_level (uint8_t level);
218+
175219
#ifdef __cplusplus
176220
}
177221
#endif

test/test.cpp

+25-11
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,8 @@ class CmdLineParser{
3535
static const std::string empty_string("");
3636
return empty_string;
3737
}
38-
bool optionExists(const std::string &option) const{
39-
return std::find(this->tokens.begin(), this->tokens.end(), option)
40-
!= this->tokens.end();
38+
int optionExists(const std::string &option) const{
39+
return std::count(this->tokens.begin(), this->tokens.end(), option);
4140
}
4241
private:
4342
std::vector <std::string> tokens;
@@ -62,15 +61,16 @@ dumpFrame (ESExtractor * esextractor, uint8_t * data, int data_size)
6261
const char *frame_type_name =
6362
frameTypeName (es_extractor_video_codec (esextractor));
6463
INFO ("Got a %s frame of size %d", frame_type_name, data_size);
65-
printBufferHex (data, data_size);
64+
MEM_DUMP (data, data_size, "Buffer=");
6665
}
6766

6867
int
69-
parseFile (const char *fileName, ESExtractorPacketAlignment alignment, bool debug)
68+
parseFile (const char *fileName, ESExtractorPacketAlignment alignment, uint8_t debug_level)
7069
{
7170
ESExtractorResult res;
7271
ESEPacket *pkt;
7372
ESExtractor *esextractor = es_extractor_new (fileName, alignment);
73+
es_extractor_set_log_level (debug_level);
7474

7575
if (!esextractor) {
7676
ERR ("Unable to discover a compatible stream. Exit");
@@ -80,8 +80,8 @@ parseFile (const char *fileName, ESExtractorPacketAlignment alignment, bool debu
8080
while ((res =
8181
es_extractor_read_frame (esextractor,
8282
&pkt)) < ES_EXTRACTOR_RESULT_EOS) {
83-
if (debug)
84-
dumpFrame (esextractor, pkt->data, pkt->data_size);
83+
84+
dumpFrame (esextractor, pkt->data, pkt->data_size);
8585
es_extractor_clear_packet (pkt);
8686
}
8787
es_extractor_clear_packet (pkt);
@@ -91,22 +91,36 @@ parseFile (const char *fileName, ESExtractorPacketAlignment alignment, bool debu
9191
return 0;
9292
}
9393

94+
void usage(int argc, char *argv[]) {
95+
std::cout << "Usage: " << argv[0] << " -f input_file" << std::endl;
96+
std::cout << std::endl;
97+
std::cout << "Options: "<< std::endl;
98+
std::cout << "-h:\t show this help message and exit"<< std::endl;
99+
std::cout << "-d:\t increment the debug level which each occurences (ie -d -d = level info(2))"<< std::endl;
100+
}
101+
94102
int
95103
main (int argc, char *argv[])
96104
{
97105
int res = 0;
98-
bool debug = false;
106+
uint8_t debug = ES_LOG_LEVEL_ERROR;
99107

100108
std::ofstream myfile;
101109

102110
CmdLineParser cmdLine(argc, argv);
103-
if(cmdLine.optionExists("-d")){
104-
debug = true;
111+
if(cmdLine.optionExists("-h")) {
112+
usage(argc, argv);
113+
return 0;
114+
}
115+
116+
for (int i = 0; i < cmdLine.optionExists("-d"); i++){
117+
debug ++;
105118
}
106119

107120
const std::string &fileName = cmdLine.getOption("-f");
108121
if (fileName.empty()){
109-
std::cerr << "Error: No input file specified. Usage: " << std::endl;
122+
std::cerr << "Error: No input file specified." << std::endl;
123+
usage(argc, argv);
110124
return -1;
111125
}
112126

0 commit comments

Comments
 (0)