Skip to content

Commit 5c7467b

Browse files
committed
handle assert errors in libhelix
1 parent 4bd31a6 commit 5c7467b

File tree

4 files changed

+58
-38
lines changed

4 files changed

+58
-38
lines changed

src/AACDecoderHelix.h

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -102,24 +102,28 @@ class AACDecoderHelix : public CommonHelix {
102102
provideResult(info);
103103

104104
// remove processed data from buffer
105-
buffer_size -= decoded;
106-
assert(buffer_size<=maxFrameSize());
107-
memmove(frame_buffer, frame_buffer+r.start+decoded, buffer_size);
108-
LOG(Debug, " -> decoded %d bytes - remaining buffer_size: %d", decoded, buffer_size);
105+
if (decoded<=buffer_size) {
106+
buffer_size -= decoded;
107+
//assert(buffer_size<=maxFrameSize());
108+
memmove(frame_buffer, frame_buffer+r.start+decoded, buffer_size);
109+
LOG(Debug, " -> decoded %d bytes - remaining buffer_size: %d", decoded, buffer_size);
110+
} else {
111+
LOG(Warning, " -> decoded %d > buffersize %d", decoded, buffer_size);
112+
buffer_size = 0;
113+
}
109114
} else {
115+
// decoding error
110116
LOG(Debug, " -> decode error: %d - removing frame!", result);
111-
112-
int ignore = decoded > 0 ? decoded : r.end;
113-
if (ignore>buffer_size){
114-
buffer_size = 0;
115-
} else {
117+
int ignore = decoded;
118+
if (ignore == 0) ignore = r.end;
119+
// We advance to the next synch world
120+
if (ignore<=buffer_size){
116121
buffer_size -= ignore;
122+
memmove(frame_buffer, frame_buffer+ignore, buffer_size);
123+
} else {
124+
buffer_size = 0;
117125
}
118-
// We advance to the next synch world
119-
assert(buffer_size<=maxFrameSize());
120-
if (buffer_size>0) {
121-
memmove(frame_buffer, frame_buffer+ignore, buffer_size);
122-
}
126+
123127
}
124128
}
125129

src/CommonHelix.h

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ namespace libhelix {
3333
struct Range {
3434
int start;
3535
int end;
36+
bool isValid(uint32_t max) {
37+
return start>=0 && end>start && (end - start)<=max;
38+
}
3639
};
3740

3841
/**
@@ -119,7 +122,7 @@ class CommonHelix {
119122
yield();
120123
}
121124
} else {
122-
LOG(Warn, "CommonHelix not active");
125+
LOG(Warning, "CommonHelix not active");
123126
}
124127

125128
return start;
@@ -173,7 +176,7 @@ class CommonHelix {
173176
memmove(frame_buffer+buffer_size, in_ptr, process_size);
174177
buffer_size += process_size;
175178
if (buffer_size>maxFrameSize()){
176-
LOG(Error "Increase MAX_FRAME_SIZE > %ld", buffer_size);
179+
LOG(Error, "Increase MAX_FRAME_SIZE > %ld", buffer_size);
177180
}
178181
assert(buffer_size<=maxFrameSize());
179182

@@ -189,15 +192,17 @@ class CommonHelix {
189192
result = appendToBuffer(in_ptr, in_size);
190193
Range r = synchronizeFrame();
191194
// Decode if we have a valid start and end synch word
192-
if(r.start>=0 && r.end>r.start){
195+
if(r.isValid(maxFrameSize())){
193196
decode(r);
194-
}
197+
} else {
198+
LOG(Warning, " -> invalid frame size: %d / max: %d", (int) r.end-r.start, (int) maxFrameSize());
199+
}
195200
yield();
196201
frame_counter++;
197202
return result;
198203
}
199204

200-
/// returns true if we have a valid start and end synch word.
205+
/// returns valid start and end synch word.
201206
Range synchronizeFrame() {
202207
LOG(Debug, "synchronizeFrame");
203208
Range range = frameRange();

src/MP3DecoderHelix.h

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@
55
#include "libhelix-mp3/mp3common.h"
66

77
#define MP3_MAX_OUTPUT_SIZE 1024 * 2
8-
//#define MP3_MAX_FRAME_SIZE 1600
9-
#define MP3_MAX_FRAME_SIZE 10000
8+
#define MP3_MAX_FRAME_SIZE 1600
109

1110
namespace libhelix {
1211

@@ -112,21 +111,28 @@ class MP3DecoderHelix : public CommonHelix {
112111
provideResult(info);
113112

114113
// remove processed data from buffer
115-
buffer_size -= decoded;
116-
assert(buffer_size<=maxFrameSize());
117-
118-
memmove(frame_buffer, frame_buffer+r.start+decoded, buffer_size);
119-
LOG(Debug, " -> decoded %d bytes - remaining buffer_size: %d", decoded, buffer_size);
114+
if (decoded<=buffer_size) {
115+
buffer_size -= decoded;
116+
//assert(buffer_size<=maxFrameSize());
117+
memmove(frame_buffer, frame_buffer+r.start+decoded, buffer_size);
118+
LOG(Debug, " -> decoded %d bytes - remaining buffer_size: %d", decoded, buffer_size);
119+
} else {
120+
LOG(Warning, " -> decoded %d > buffersize %d", decoded, buffer_size);
121+
buffer_size = 0;
122+
}
120123
} else {
121124
// decoding error
122125
LOG(Debug, " -> decode error: %d - removing frame!", result);
123126
int ignore = decoded;
124127
if (ignore == 0) ignore = r.end;
125128
// We advance to the next synch world
126-
buffer_size -= ignore;
127-
assert(buffer_size<=maxFrameSize());
129+
if (ignore<=buffer_size){
130+
buffer_size -= ignore;
131+
memmove(frame_buffer, frame_buffer+ignore, buffer_size);
132+
} else {
133+
buffer_size = 0;
134+
}
128135

129-
memmove(frame_buffer, frame_buffer+ignore, buffer_size);
130136
}
131137
}
132138

src/helix_log.h

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,25 @@
22

33
// User Settings: Activate/Deactivate logging
44
#ifndef HELIX_LOGGING_ACTIVE
5-
#define HELIX_LOGGING_ACTIVE false
5+
#define HELIX_LOGGING_ACTIVE true
66
#endif
7+
78
#ifndef HELIX_LOG_LEVEL
8-
#define HELIX_LOG_LEVEL Debug
9+
#define HELIX_LOG_LEVEL Warning
10+
#endif
11+
12+
#ifndef HELIX_LOGGING_OUT
13+
#define HELIX_LOGGING_OUT Serial
914
#endif
1015

1116
// Logging Implementation
1217
#if HELIX_LOGGING_ACTIVE == true
13-
static char log_buffer[512];
14-
enum LogLevel {Debug, Info, Warning, Error};
15-
static LogLevel minLogLevel = Debug;
16-
// We print the log based on the log level
17-
#define LOG(level,...) { if(level>=minLogLevel) { int l = snprintf(log_buffer,512, __VA_ARGS__); Serial.write(log_buffer,l); Serial.println(); } }
18+
static char log_buffer[512];
19+
enum LogLevel {Debug, Info, Warning, Error};
20+
static LogLevel minLogLevel = HELIX_LOG_LEVEL;
21+
// We print the log based on the log level
22+
#define LOG(level,...) { if(level>=minLogLevel) { int l = snprintf(log_buffer,512, __VA_ARGS__); HELIX_LOGGING_OUT.write("libhelix - "); HELIX_LOGGING_OUT.write(log_buffer,l); HELIX_LOGGING_OUT.println(); } }
1823
#else
19-
// Remove all log statments from the code
20-
#define LOG(...)
24+
// Remove all log statments from the code
25+
#define LOG(...)
2126
#endif

0 commit comments

Comments
 (0)