11
11
12
12
#include "rec_pb.h"
13
13
14
+ #include "../font/font.h"
15
+
14
16
#define REC_PB_CONFIG_ENABLED_KEY "rec_pb_enabled"
15
17
16
18
#define MAX_X 60
@@ -34,6 +36,7 @@ static bool rec_pb_enabled = false;
34
36
static FILE * osd_fd = NULL ;
35
37
static rec_config_t osd_config = {0 };
36
38
39
+ static uint32_t header_size = 0 ;
37
40
static int64_t frame_counter = 0 ;
38
41
39
42
static uint32_t * frame_idxs ;
@@ -90,22 +93,64 @@ int rec_pb_start()
90
93
return 1 ;
91
94
}
92
95
93
- if (file_header .version != REC_VERSION )
96
+ if (file_header .version == REC_VERSION )
97
+ {
98
+ DEBUG_PRINT ("header ok!" );
99
+ memcpy (& osd_config , & file_header .config , sizeof (rec_config_t ));
100
+ header_size = sizeof (rec_file_header_t );
101
+ }
102
+ else if (file_header .version == 1 )
103
+ {
104
+ DEBUG_PRINT ("header is v1" );
105
+ rec_file_header_v1_t file_header_v1 ;
106
+ fseek (osd_fd , 0 , SEEK_SET );
107
+
108
+ fread (& file_header_v1 , sizeof (rec_file_header_v1_t ), 1 , osd_fd );
109
+ if (strncmp (file_header_v1 .magic , REC_MAGIC , sizeof (REC_MAGIC )) != 0 )
110
+ {
111
+ DEBUG_PRINT ("invalid osd file" );
112
+ fclose (osd_fd );
113
+ osd_fd = NULL ;
114
+ return 1 ;
115
+ }
116
+
117
+ switch (file_header_v1 .config .font_variant )
118
+ {
119
+ case FONT_VARIANT_BETAFLIGHT :
120
+ strcpy (file_header .config .font_variant , "BTFL" );
121
+ break ;
122
+ case FONT_VARIANT_INAV :
123
+ strcpy (file_header .config .font_variant , "INAV" );
124
+ break ;
125
+ case FONT_VARIANT_ARDUPILOT :
126
+ strcpy (file_header .config .font_variant , "ARDU" );
127
+ break ;
128
+ case FONT_VARIANT_KISS_ULTRA :
129
+ strcpy (file_header .config .font_variant , "ULTR" );
130
+ break ;
131
+ case FONT_VARIANT_QUICKSILVER :
132
+ strcpy (file_header .config .font_variant , "QUIC" );
133
+ break ;
134
+ default :
135
+ file_header .config .font_variant [0 ] = '\0' ; // Empty string
136
+ }
137
+
138
+ memcpy (& osd_config , & file_header .config , sizeof (rec_config_t ));
139
+ header_size = sizeof (rec_file_header_v1_t );
140
+ }
141
+ else
94
142
{
95
143
DEBUG_PRINT ("invalid osd file version! expected: %d, got: %d" , REC_VERSION , file_header .version );
96
144
fclose (osd_fd );
97
145
osd_fd = NULL ;
98
146
return 1 ;
99
147
}
100
148
101
- DEBUG_PRINT ("header ok!" );
102
- memcpy (& osd_config , & file_header .config , sizeof (rec_config_t ));
103
-
104
149
DEBUG_PRINT ("loading frame indexes" );
105
150
106
151
fseek (osd_fd , 0 , SEEK_END );
107
152
uint32_t file_size = ftell (osd_fd );
108
- fseek (osd_fd , sizeof ( rec_file_header_t ) , SEEK_SET );
153
+ fseek (osd_fd , header_size , SEEK_SET );
109
154
DEBUG_PRINT ("file size: %d" , file_size );
110
155
111
156
frame_idx_len = file_size / FRAME_SIZE ;
@@ -121,7 +166,7 @@ int rec_pb_start()
121
166
fseek (osd_fd , sizeof (uint16_t ) * MAX_T , SEEK_CUR );
122
167
}
123
168
124
- fseek (osd_fd , sizeof ( rec_file_header_t ) , SEEK_SET );
169
+ fseek (osd_fd , header_size , SEEK_SET );
125
170
126
171
current_frame_idx = 0 ;
127
172
frame_counter = rec_pb_cp_vdec -> frames_sent ;
@@ -179,7 +224,7 @@ int rec_pb_do_next_frame(uint16_t *map_out)
179
224
180
225
fseek (
181
226
osd_fd ,
182
- sizeof ( rec_file_header_t ) + (closest_frame_idx * FRAME_SIZE ) + sizeof (rec_frame_header_t ),
227
+ header_size + (closest_frame_idx * FRAME_SIZE ) + sizeof (rec_frame_header_t ),
183
228
SEEK_SET );
184
229
fread (map_out , sizeof (uint16_t ), MAX_T , osd_fd );
185
230
@@ -203,3 +248,4 @@ bool rec_pb_is_ready()
203
248
{
204
249
return rec_pb_cp_vdec != NULL && rec_pb_vdec_local_player != NULL ;
205
250
}
251
+
0 commit comments