FireBirdLib - Topfield TMS PVR TAP Programming Library
HDD_DecodeRECHeader.c
Go to the documentation of this file.
1#include <string.h>
2#include "FBLib_rec.h"
3
4word getWord(const void *buffer, bool NeedsByteSwapping)
5{
7
8 word w;
9 byte *p;
10
11 p = (byte*)buffer;
12 if(NeedsByteSwapping)
13 w = (p[1] | (p[0] << 8));
14 else
15 w = (p[0] | (p[1] << 8));
16
17 TRACEEXIT();
18 return w;
19}
20
21dword getDword(const void *buffer, bool NeedsByteSwapping)
22{
23 TRACEENTER();
24
25 dword d;
26 byte *p;
27
28 p = (byte*)buffer;
29 if(NeedsByteSwapping)
30 d = (p[3] | (p[2] << 8) | (p[1] << 16) | (p[0] << 24));
31 else
32 d = (p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24));
33
34 TRACEEXIT();
35 return d;
36}
37
38bool WrongEndian = FALSE;
39
40void DecodeExtInfo(byte *Buffer, dword p, tRECHeaderInfo *RECHeaderInfo)
41{
42 TRACEENTER();
43
44 //The extended info structure is identical on all Toppies
45 RECHeaderInfo->ExtEventServiceID = getWord(&Buffer[p + 0x0000], WrongEndian);
46
47 RECHeaderInfo->ExtEventTextLength = getWord(&Buffer[p + 0x0002], WrongEndian);
48 if(RECHeaderInfo->ExtEventTextLength > 1023)
49 {
50 RECHeaderInfo->ExtEventTextLength = 1023;
51 Buffer[p + 0x0407] = 0;
52 }
53
54 RECHeaderInfo->ExtEventEventID = getDword(&Buffer[p + 0x0004], WrongEndian);
55 RECHeaderInfo->ExtEventNrItemizedPairs = Buffer[p + 0x0408];
56 memcpy(RECHeaderInfo->ExtEventUnknown1, &Buffer[p + 0x0409], 3);
57
58 if(RECHeaderInfo->ExtEventNrItemizedPairs == 0)
59 {
60 memcpy(RECHeaderInfo->ExtEventText, &Buffer[p + 0x0008], RECHeaderInfo->ExtEventTextLength);
61 }
62 else
63 {
64 char *pStart, *pEnd, *pDescr, *pInfo;
65
66 //Find the border between the itemized data and the description
67 pStart = &Buffer[p + 0x0008];
68 pEnd = pStart + RECHeaderInfo->ExtEventTextLength;
69 pDescr = pEnd - 1;
70 while((*pDescr != 0) && (pDescr > pStart))
71 {
72 pDescr--;
73 }
74 if(pDescr != pStart) pDescr++;
75
76 pInfo = RECHeaderInfo->ExtEventText;
77 memcpy(pInfo, pDescr, pEnd - pDescr + 1);
78 pInfo += (pEnd - pDescr + 1);
79 memcpy(pInfo, pStart, pDescr - pStart + 1);
80 }
81 StrReplace(RECHeaderInfo->ExtEventText, "\\n", "\x8a");
82
83 TRACEEXIT();
84}
85
86void HDD_DecodeRECHeader_ST_S(byte *Buffer, tRECHeaderInfo *RECHeaderInfo)
87{
88 TRACEENTER();
89
90 dword p;
91 word TPFlags1;
92 byte EventTextLength;
93
94 //Header
95 p = 0;
96 memcpy(RECHeaderInfo->HeaderUnknown2, &Buffer[p + 0x0006], 2);
97 RECHeaderInfo->HeaderDuration = getWord(&Buffer[p + 0x0008], WrongEndian);
98 RECHeaderInfo->HeaderSvcNumber = getWord(&Buffer[p + 0x000a], WrongEndian);
99 RECHeaderInfo->HeaderSvcType = getWord(&Buffer[p + 0x000c], WrongEndian);
100
101 //Service Info
102 p = 0x000e;
103 RECHeaderInfo->SISatIndex = Buffer[p + 0x0000];
104 RECHeaderInfo->SIServiceType = Buffer[p + 0x0001];
105 RECHeaderInfo->SITPIdx = getWord(&Buffer[p + 0x0002], WrongEndian) >> 6;
106 RECHeaderInfo->SITunerNum = (getWord(&Buffer[p + 0x0002], WrongEndian) >> 4) & 3;
107 RECHeaderInfo->SISkipFlag = (getWord(&Buffer[p + 0x0002], WrongEndian) >> 3) & 1;
108 RECHeaderInfo->SILockFlag = (getWord(&Buffer[p + 0x0002], WrongEndian) >> 2) & 1;
109 RECHeaderInfo->SICASFlag = (getWord(&Buffer[p + 0x0002], WrongEndian) >> 1) & 1;
110 RECHeaderInfo->SIDelFlag = (getWord(&Buffer[p + 0x0002], WrongEndian) ) & 1;
111
112 RECHeaderInfo->SIServiceID = getWord(&Buffer[p + 0x0004], WrongEndian);
113 RECHeaderInfo->SIPMTPID = getWord(&Buffer[p + 0x0006], WrongEndian);
114 RECHeaderInfo->SIPCRPID = getWord(&Buffer[p + 0x0008], WrongEndian);
115 RECHeaderInfo->SIVideoPID = getWord(&Buffer[p + 0x000a], WrongEndian);
116 RECHeaderInfo->SIAudioPID = getWord(&Buffer[p + 0x000c], WrongEndian);
117 strncpy(RECHeaderInfo->SISvcName, &Buffer[p + 0x000e], 24);
118
119 //Transponder Info
120 p = 0x0034;
121 RECHeaderInfo->TPSatIndex = Buffer[p + 0x0000];
122
123 TPFlags1 = Buffer[p + 0x0001];
124 RECHeaderInfo->TPPolarization = TPFlags1 >> 7;
125 RECHeaderInfo->TPMode = (TPFlags1 >> 4) & 7;
126
127 memcpy(RECHeaderInfo->TPUnknown3, &Buffer[p + 0x0002], 2);
128 RECHeaderInfo->TPFrequency = getDword(&Buffer[p + 0x0004], WrongEndian);
129 RECHeaderInfo->TPSymbolRate = getWord(&Buffer[p + 0x0008], WrongEndian);
130 RECHeaderInfo->TPTSID = getWord(&Buffer[p + 0x000a], WrongEndian);
131 memcpy(RECHeaderInfo->TPUnknown5, &Buffer[p + 0x000c], 2);
132 RECHeaderInfo->TPOriginalNetworkID = getWord(&Buffer[p + 0x000e], WrongEndian);
133
134 //Event Info
135 p = 0x0044;
136 memcpy(RECHeaderInfo->EventUnknown1, &Buffer[p], 2);
137 RECHeaderInfo->EventDuration = 60 * Buffer[p + 0x0002] + Buffer[p + 0x0003];
138 RECHeaderInfo->EventEventID = getDword(&Buffer[p + 0x0004], WrongEndian);
139 RECHeaderInfo->EventStartTime = getDword(&Buffer[p + 0x0008], WrongEndian);
140 RECHeaderInfo->EventEndTime = getDword(&Buffer[p + 0x000c], WrongEndian);
141 RECHeaderInfo->EventRunningStatus = Buffer[p + 0x0010];
142 EventTextLength = Buffer[p + 0x0011];
143 RECHeaderInfo->EventParentalRate = Buffer[p + 0x0012];
144 strncpy(RECHeaderInfo->EventEventName, &Buffer[p + 0x0013], EventTextLength);
145 strncpy(RECHeaderInfo->EventEventDescription, &Buffer[p + 0x0013 + EventTextLength], 257 - EventTextLength);
146 RECHeaderInfo->EventServiceID = getWord(&Buffer[p + 0x0114], WrongEndian);
147 memcpy(RECHeaderInfo->EventUnknown2, &Buffer[p + 0x0116], 14);
148
149 //Extended Event Info
150 p = 0x0168;
151 DecodeExtInfo(Buffer, p, RECHeaderInfo);
152
153 //Crypt Info
154 p = 0x0574;
155 RECHeaderInfo->CryptFlag = Buffer[p + 0x0000];
156 memcpy(RECHeaderInfo->CryptUnknown2, &Buffer[p + 0x0001], 3);
157
158 //Bookmarks
159 p = 0x0578;
160 memcpy(RECHeaderInfo->Bookmark, &Buffer[p + 0x0000], 64 * sizeof(dword));
161 RECHeaderInfo->Resume = getDword(&Buffer[p + 0x0100], WrongEndian);
162
163 TRACEEXIT();
164}
165
166void HDD_DecodeRECHeader_ST_T(byte *Buffer, tRECHeaderInfo *RECHeaderInfo)
167{
168 TRACEENTER();
169
170 dword p;
171 byte EventTextLength;
172
173 //Header
174 p = 0;
175 memcpy(RECHeaderInfo->HeaderUnknown2, &Buffer[p + 0x0006], 2);
176 RECHeaderInfo->HeaderDuration = getWord(&Buffer[p + 0x0008], WrongEndian);
177 RECHeaderInfo->HeaderSvcNumber = getWord(&Buffer[p + 0x000a], WrongEndian);
178 RECHeaderInfo->HeaderSvcType = getWord(&Buffer[p + 0x000c], WrongEndian);
179
180 //Service Info
181 p = 0x000e;
182 RECHeaderInfo->SISatIndex = Buffer[p + 0x0000];
183 RECHeaderInfo->SIServiceType = Buffer[p + 0x0001];
184 RECHeaderInfo->SITPIdx = getWord(&Buffer[p + 0x0002], WrongEndian) >> 6;
185 RECHeaderInfo->SITunerNum = (getWord(&Buffer[p + 0x0002], WrongEndian) >> 4) & 3;
186 RECHeaderInfo->SISkipFlag = (getWord(&Buffer[p + 0x0002], WrongEndian) >> 3) & 1;
187 RECHeaderInfo->SILockFlag = (getWord(&Buffer[p + 0x0002], WrongEndian) >> 2) & 1;
188 RECHeaderInfo->SICASFlag = (getWord(&Buffer[p + 0x0002], WrongEndian) >> 1) & 1;
189 RECHeaderInfo->SIDelFlag = (getWord(&Buffer[p + 0x0002], WrongEndian) ) & 1;
190
191 RECHeaderInfo->SIServiceID = getWord(&Buffer[p + 0x0004], WrongEndian);
192 RECHeaderInfo->SIPMTPID = getWord(&Buffer[p + 0x0006], WrongEndian);
193 RECHeaderInfo->SIPCRPID = getWord(&Buffer[p + 0x0008], WrongEndian);
194 RECHeaderInfo->SIVideoPID = getWord(&Buffer[p + 0x000a], WrongEndian);
195 RECHeaderInfo->SIAudioPID = getWord(&Buffer[p + 0x000c], WrongEndian);
196 strncpy(RECHeaderInfo->SISvcName, &Buffer[p + 0x000e], 24);
197
198 //Transponder Info
199 p = 0x0034;
200 RECHeaderInfo->TPChannelNumber = getWord(&Buffer[p + 0x0000], WrongEndian);
201 RECHeaderInfo->TPBandwidth = Buffer[p + 0x0002];
202 RECHeaderInfo->TPUnknown2 = Buffer[p + 0x0003];
203 RECHeaderInfo->TPFrequency = getDword(&Buffer[p + 0x0004], WrongEndian);
204 RECHeaderInfo->TPTSID = getWord(&Buffer[p + 0x0008], WrongEndian);
205 RECHeaderInfo->TPLPHPStream = Buffer[p + 0x000a];
206 RECHeaderInfo->TPUnknown4 = Buffer[p + 0x000b];
207 RECHeaderInfo->TPOriginalNetworkID = getWord(&Buffer[p + 0x000c], WrongEndian);
208 RECHeaderInfo->TPNetworkID = getWord(&Buffer[p + 0x000e], WrongEndian);
209
210 //Event Info
211 p = 0x0044;
212 memcpy(RECHeaderInfo->EventUnknown1, &Buffer[p], 2);
213 RECHeaderInfo->EventDuration = 60 * Buffer[p + 0x0002] + Buffer[p + 0x0003];
214 RECHeaderInfo->EventEventID = getDword(&Buffer[p + 0x0004], WrongEndian);
215 RECHeaderInfo->EventStartTime = getDword(&Buffer[p + 0x0008], WrongEndian);
216 RECHeaderInfo->EventEndTime = getDword(&Buffer[p + 0x000c], WrongEndian);
217 RECHeaderInfo->EventRunningStatus = Buffer[p + 0x0010];
218 EventTextLength = Buffer[p + 0x0011];
219 RECHeaderInfo->EventParentalRate = Buffer[p + 0x0012];
220 strncpy(RECHeaderInfo->EventEventName, &Buffer[p + 0x0013], EventTextLength);
221 strncpy(RECHeaderInfo->EventEventDescription, &Buffer[p + 0x0013 + EventTextLength], 257 - EventTextLength);
222 RECHeaderInfo->EventServiceID = getWord(&Buffer[p + 0x0114], WrongEndian);
223 memcpy(RECHeaderInfo->EventUnknown2, &Buffer[p + 0x0116], 14);
224
225 //Extended Event Info
226 p = 0x0168;
227 DecodeExtInfo(Buffer, p, RECHeaderInfo);
228
229 //Crypt Info
230 p = 0x0574;
231 RECHeaderInfo->CryptFlag = Buffer[p + 0x0000];
232 memcpy(RECHeaderInfo->CryptUnknown2, &Buffer[p + 0x0001], 3);
233
234 //Bookmarks
235 p = 0x0578;
236 memcpy(RECHeaderInfo->Bookmark, &Buffer[p + 0x0000], 64 * sizeof(dword));
237 RECHeaderInfo->Resume = getDword(&Buffer[p + 0x0100], WrongEndian);
238
239 TRACEEXIT();
240}
241
242void HDD_DecodeRECHeader_ST_C(byte *Buffer, tRECHeaderInfo *RECHeaderInfo)
243{
244 TRACEENTER();
245
246 dword p;
247 byte EventTextLength;
248
249 //Header
250 p = 0;
251 memcpy(RECHeaderInfo->HeaderUnknown2, &Buffer[p + 6], 2);
252 RECHeaderInfo->HeaderDuration = getWord(&Buffer[p + 0x0008], WrongEndian);
253 RECHeaderInfo->HeaderSvcNumber = getWord(&Buffer[p + 0x000a], WrongEndian);
254 RECHeaderInfo->HeaderSvcType = getWord(&Buffer[p + 0x000c], WrongEndian);
255
256 //Service Info
257 p = 0x000e;
258 RECHeaderInfo->SISatIndex = Buffer[p + 0x0000];
259 RECHeaderInfo->SIServiceType = Buffer[p + 0x0001];
260 RECHeaderInfo->SITPIdx = getWord(&Buffer[p + 0x0002], WrongEndian) >> 6;
261 RECHeaderInfo->SITunerNum = (getWord(&Buffer[p + 0x0002], WrongEndian) >> 4) & 3;
262 RECHeaderInfo->SIDelFlag = (getWord(&Buffer[p + 0x0002], WrongEndian) >> 3) & 1;
263 RECHeaderInfo->SICASFlag = (getWord(&Buffer[p + 0x0002], WrongEndian) >> 2) & 1;
264 RECHeaderInfo->SILockFlag = (getWord(&Buffer[p + 0x0002], WrongEndian) >> 1) & 1;
265 RECHeaderInfo->SISkipFlag = (getWord(&Buffer[p + 0x0002], WrongEndian) ) & 1;
266
267 RECHeaderInfo->SIServiceID = getWord(&Buffer[p + 0x0004], WrongEndian);
268 RECHeaderInfo->SIPMTPID = getWord(&Buffer[p + 0x0006], WrongEndian);
269 RECHeaderInfo->SIPCRPID = getWord(&Buffer[p + 0x0008], WrongEndian);
270 RECHeaderInfo->SIVideoPID = getWord(&Buffer[p + 0x000a], WrongEndian);
271 RECHeaderInfo->SIAudioPID = getWord(&Buffer[p + 0x000c], WrongEndian);
272 strncpy(RECHeaderInfo->SISvcName, &Buffer[p + 0x000e], 24);
273
274 //Transponder Info
275 p = 0x0034;
276 RECHeaderInfo->TPFrequency = getDword(&Buffer[p + 0x0000], WrongEndian);
277 RECHeaderInfo->TPSymbolRate = getWord(&Buffer[p + 0x0004], WrongEndian);
278 RECHeaderInfo->TPTSID = getWord(&Buffer[p + 0x0006], WrongEndian);
279 RECHeaderInfo->TPOriginalNetworkID = getWord(&Buffer[p + 0x0008], WrongEndian);
280 RECHeaderInfo->TPModulation = Buffer[p + 0x000a];
281 RECHeaderInfo->TPUnknown6 = Buffer[p + 0x000b];
282
283 //Event Info
284 p = 0x0040;
285 memcpy(RECHeaderInfo->EventUnknown1, &Buffer[p], 2);
286 RECHeaderInfo->EventDuration = 60 * Buffer[p + 0x0002] + Buffer[p + 0x0003];
287 RECHeaderInfo->EventEventID = getDword(&Buffer[p + 0x0004], WrongEndian);
288 RECHeaderInfo->EventStartTime = getDword(&Buffer[p + 0x0008], WrongEndian);
289 RECHeaderInfo->EventEndTime = getDword(&Buffer[p + 0x000c], WrongEndian);
290 RECHeaderInfo->EventRunningStatus = Buffer[p + 0x0010];
291 EventTextLength = Buffer[p + 0x0011];
292 RECHeaderInfo->EventParentalRate = Buffer[p + 0x0012];
293 strncpy(RECHeaderInfo->EventEventName, &Buffer[p + 0x0013], EventTextLength);
294 strncpy(RECHeaderInfo->EventEventDescription, &Buffer[p + 0x0013 + EventTextLength], 257 - EventTextLength);
295 RECHeaderInfo->EventServiceID = getWord(&Buffer[p + 0x0114], WrongEndian);
296 memcpy(RECHeaderInfo->EventUnknown2, &Buffer[p + 0x0116], 14);
297
298 //Extended Event Info
299 p = 0x0164;
300 DecodeExtInfo(Buffer, p, RECHeaderInfo);
301
302 //Crypt Info
303 p = 0x0570;
304 RECHeaderInfo->CryptFlag = Buffer[p + 0x0000];
305 memcpy(RECHeaderInfo->CryptUnknown2, &Buffer[p + 0x0001], 3);
306
307 //Bookmarks
308 p = 0x0574;
309 memcpy(RECHeaderInfo->Bookmark, &Buffer[p + 0x0000], 64 * sizeof(dword));
310 RECHeaderInfo->Resume = getDword(&Buffer[p + 0x0100], WrongEndian);
311
312 TRACEEXIT();
313}
314
315void HDD_DecodeRECHeader_ST_T5700(byte *Buffer, tRECHeaderInfo *RECHeaderInfo)
316{
317 TRACEENTER();
318
319 dword p;
320 byte EventTextLength;
321
322 //Header
323 p = 0;
324 memcpy(RECHeaderInfo->HeaderUnknown2, &Buffer[p + 6], 2);
325 RECHeaderInfo->HeaderDuration = getWord(&Buffer[p + 0x0008], WrongEndian);
326 RECHeaderInfo->HeaderSvcNumber = getWord(&Buffer[p + 0x000a], WrongEndian);
327 RECHeaderInfo->HeaderSvcType = getWord(&Buffer[p + 0x000c], WrongEndian);
328
329 //Service Info
330 p = 0x000e;
331 RECHeaderInfo->SISatIndex = Buffer[p + 0x0000];
332 RECHeaderInfo->SIServiceType = Buffer[p + 0x0001];
333 RECHeaderInfo->SITPIdx = getWord(&Buffer[p + 0x0002], WrongEndian) >> 6;
334 RECHeaderInfo->SITunerNum = (getWord(&Buffer[p + 0x0002], WrongEndian) >> 4) & 3;
335 RECHeaderInfo->SIDelFlag = (getWord(&Buffer[p + 0x0002], WrongEndian) >> 3) & 1;
336 RECHeaderInfo->SICASFlag = (getWord(&Buffer[p + 0x0002], WrongEndian) >> 2) & 1;
337 RECHeaderInfo->SILockFlag = (getWord(&Buffer[p + 0x0002], WrongEndian) >> 1) & 1;
338 RECHeaderInfo->SISkipFlag = (getWord(&Buffer[p + 0x0002], WrongEndian) ) & 1;
339
340 RECHeaderInfo->SIServiceID = getWord(&Buffer[p + 0x0004], WrongEndian);
341 RECHeaderInfo->SIPMTPID = getWord(&Buffer[p + 0x0006], WrongEndian);
342 RECHeaderInfo->SIPCRPID = getWord(&Buffer[p + 0x0008], WrongEndian);
343 RECHeaderInfo->SIVideoPID = getWord(&Buffer[p + 0x000a], WrongEndian);
344 RECHeaderInfo->SIAudioPID = getWord(&Buffer[p + 0x000c], WrongEndian);
345 strncpy(RECHeaderInfo->SISvcName, &Buffer[p + 0x000e], 24);
346
347 //Transponder Info
348 p = 0x0034;
349 RECHeaderInfo->TPChannelNumber = getWord(&Buffer[p + 0x0000], WrongEndian);
350 RECHeaderInfo->TPBandwidth = Buffer[p + 0x0002];
351 RECHeaderInfo->TPUnknown2 = Buffer[p + 0x0003];
352 RECHeaderInfo->TPFrequency = getDword(&Buffer[p + 0x0004], WrongEndian);
353 RECHeaderInfo->TPTSID = getWord(&Buffer[p + 0x0008], WrongEndian);
354 RECHeaderInfo->TPLPHPStream = Buffer[p + 0x000a];
355 RECHeaderInfo->TPUnknown4 = Buffer[p + 0x000b];
356 RECHeaderInfo->TPOriginalNetworkID = getWord(&Buffer[p + 0x000c], WrongEndian);
357 RECHeaderInfo->TPNetworkID = getWord(&Buffer[p + 0x000e], WrongEndian);
358 memcpy(RECHeaderInfo->TPUnknown7, &Buffer[p + 0x0010], 8);
359
360 //Event Info
361 p = 0x004c;
362 memcpy(RECHeaderInfo->EventUnknown1, &Buffer[p], 2);
363 RECHeaderInfo->EventDuration = 60 * Buffer[p + 0x0002] + Buffer[p + 3];
364 RECHeaderInfo->EventEventID = getDword(&Buffer[p + 0x0004], WrongEndian);
365 RECHeaderInfo->EventStartTime = getDword(&Buffer[p + 0x0008], WrongEndian);
366 RECHeaderInfo->EventEndTime = getDword(&Buffer[p + 0x000c], WrongEndian);
367 RECHeaderInfo->EventRunningStatus = Buffer[p + 0x0010];
368 EventTextLength = Buffer[p + 0x0011];
369 RECHeaderInfo->EventParentalRate = Buffer[p + 0x0012];
370 strncpy(RECHeaderInfo->EventEventName, &Buffer[p + 0x0013], EventTextLength);
371 strncpy(RECHeaderInfo->EventEventDescription, &Buffer[p + 0x0013 + EventTextLength], 257 - EventTextLength);
372 RECHeaderInfo->EventServiceID = getWord(&Buffer[p + 0x0114], WrongEndian);
373 memcpy(RECHeaderInfo->EventUnknown2, &Buffer[p + 0x0116], 14);
374
375 //Extended Event Info
376 p = 0x0170;
377 DecodeExtInfo(Buffer, p, RECHeaderInfo);
378
379 //Crypt Info
380 p = 0x057c;
381 RECHeaderInfo->CryptFlag = Buffer[p + 0x0000];
382 memcpy(RECHeaderInfo->CryptUnknown2, &Buffer[p + 0x0001], 3);
383
384 //Bookmarks
385 p = 0x0580;
386 memcpy(RECHeaderInfo->Bookmark, &Buffer[p + 0x0000], 64 * sizeof(dword));
387 RECHeaderInfo->Resume = getDword(&Buffer[p + 0x0100], WrongEndian);
388
389 TRACEEXIT();
390}
391
392void HDD_DecodeRECHeader_ST_T5800(byte *Buffer, tRECHeaderInfo *RECHeaderInfo)
393{
394 TRACEENTER();
395
396 dword p;
397 byte EventTextLength;
398
399 //Header
400 p = 0;
401 memcpy(RECHeaderInfo->HeaderUnknown2, &Buffer[p + 6], 2);
402 RECHeaderInfo->HeaderDuration = getWord(&Buffer[p + 0x0008], WrongEndian);
403 RECHeaderInfo->HeaderSvcNumber = getWord(&Buffer[p + 0x000a], WrongEndian);
404 RECHeaderInfo->HeaderSvcType = getWord(&Buffer[p + 0x000c], WrongEndian);
405
406 //Service Info
407 p = 0x000e;
408 RECHeaderInfo->SISatIndex = Buffer[p + 0x0000];
409 RECHeaderInfo->SIServiceType = Buffer[p + 0x0001];
410 RECHeaderInfo->SITPIdx = getWord(&Buffer[p + 0x0002], WrongEndian) >> 6;
411 RECHeaderInfo->SITunerNum = (getWord(&Buffer[p + 0x0002], WrongEndian) >> 4) & 3;
412 RECHeaderInfo->SIDelFlag = (getWord(&Buffer[p + 0x0002], WrongEndian) >> 3) & 1;
413 RECHeaderInfo->SICASFlag = (getWord(&Buffer[p + 0x0002], WrongEndian) >> 2) & 1;
414 RECHeaderInfo->SILockFlag = (getWord(&Buffer[p + 0x0002], WrongEndian) >> 1) & 1;
415 RECHeaderInfo->SISkipFlag = (getWord(&Buffer[p + 0x0002], WrongEndian) ) & 1;
416
417 RECHeaderInfo->SIServiceID = getWord(&Buffer[p + 0x0004], WrongEndian);
418 RECHeaderInfo->SIPMTPID = getWord(&Buffer[p + 0x0006], WrongEndian);
419 RECHeaderInfo->SIPCRPID = getWord(&Buffer[p + 0x0008], WrongEndian);
420 RECHeaderInfo->SIVideoPID = getWord(&Buffer[p + 0x000a], WrongEndian);
421 RECHeaderInfo->SIAudioPID = getWord(&Buffer[p + 0x000c], WrongEndian);
422 strncpy(RECHeaderInfo->SISvcName, &Buffer[p + 0x000e], 28);
423
424 //Transponder Info
425 p = 0x0038;
426 RECHeaderInfo->TPChannelNumber = getWord(&Buffer[p + 0x0000], WrongEndian);
427 RECHeaderInfo->TPBandwidth = Buffer[p + 0x0002];
428 RECHeaderInfo->TPUnknown2 = Buffer[p + 0x0003];
429 RECHeaderInfo->TPFrequency = getDword(&Buffer[p + 0x0004], WrongEndian);
430 RECHeaderInfo->TPTSID = getWord(&Buffer[p + 0x0008], WrongEndian);
431 RECHeaderInfo->TPLPHPStream = Buffer[p + 0x000a];
432 RECHeaderInfo->TPUnknown4 = Buffer[p + 0x000b];
433 RECHeaderInfo->TPOriginalNetworkID = getWord(&Buffer[p + 0x000c], WrongEndian);
434 RECHeaderInfo->TPNetworkID = getWord(&Buffer[p + 0x000e], WrongEndian);
435
436 //Event Info
437 p = 0x0048;
438 memcpy(RECHeaderInfo->EventUnknown1, &Buffer[p], 2);
439 RECHeaderInfo->EventDuration = 60 * Buffer[p + 0x0002] + Buffer[p + 3];
440 RECHeaderInfo->EventEventID = getDword(&Buffer[p + 0x0004], WrongEndian);
441 RECHeaderInfo->EventStartTime = getDword(&Buffer[p + 0x0008], WrongEndian);
442 RECHeaderInfo->EventEndTime = getDword(&Buffer[p + 0x000c], WrongEndian);
443 RECHeaderInfo->EventRunningStatus = Buffer[p + 0x0010];
444 EventTextLength = Buffer[p + 0x0011];
445 RECHeaderInfo->EventParentalRate = Buffer[p + 0x0012];
446 strncpy(RECHeaderInfo->EventEventName, &Buffer[p + 0x0013], EventTextLength);
447 strncpy(RECHeaderInfo->EventEventDescription, &Buffer[p + 0x0013 + EventTextLength], 257 - EventTextLength);
448 RECHeaderInfo->EventServiceID = getWord(&Buffer[p + 0x0114], WrongEndian);
449 memcpy(RECHeaderInfo->EventUnknown2, &Buffer[p + 0x0116], 10);
450
451 //Extended Event Info
452 p = 0x016c;
453 DecodeExtInfo(Buffer, p, RECHeaderInfo);
454
455 //Crypt Info
456 p = 0x0578;
457 RECHeaderInfo->CryptFlag = Buffer[p + 0x0000];
458 memcpy(RECHeaderInfo->CryptUnknown2, &Buffer[p + 0x0001], 3);
459
460 //Bookmarks
461 p = 0x057c;
462 memcpy(RECHeaderInfo->Bookmark, &Buffer[p + 0x0000], 64 * sizeof(dword));
463 RECHeaderInfo->Resume = getDword(&Buffer[p + 0x0100], WrongEndian);
464
465 TRACEEXIT();
466}
467
468void HDD_DecodeRECHeader_ST_TMSS(byte *Buffer, tRECHeaderInfo *RECHeaderInfo)
469{
470 TRACEENTER();
471
472 dword p;
473 word Flags;
474 byte EventTextLength;
475
476 //Header
477 p = 0;
478 memcpy(RECHeaderInfo->HeaderUnknown2, &Buffer[p + 6], 2);
479 RECHeaderInfo->HeaderStartTime = getDword(&Buffer[p + 0x0008], WrongEndian);
480 RECHeaderInfo->HeaderDuration = getWord(&Buffer[p + 0x000c], WrongEndian);
481 RECHeaderInfo->HeaderDurationSec = getWord(&Buffer[p + 0x000e], WrongEndian);
482
483 RECHeaderInfo->CryptFlag = Buffer[p + 0x0010] & 0x03;
484 RECHeaderInfo->HeaderFlags = Buffer[p + 0x0010] & 0xfc;
485
486 RECHeaderInfo->HeaderCopyFlag = Buffer[p + 0x0011] & 0x80;
487 RECHeaderInfo->HeaderTSFlag = Buffer[p + 0x0011] & 0x40;
488 RECHeaderInfo->HeaderFlags2 = Buffer[p + 0x0011] & 0x3f;
489
490 memcpy(RECHeaderInfo->HeaderUnknown4, &Buffer[p + 0x0012], 10);
491
492 //Service Info
493 p = 0x001c;
494 RECHeaderInfo->SISatIndex = Buffer[p + 0x0000];
495 RECHeaderInfo->SIServiceType = Buffer[p + 0x0001];
496
497 Flags = getWord(&Buffer[p +0x0002], WrongEndian);
498 RECHeaderInfo->SITPIdx = Flags & 0x3ff;
499 RECHeaderInfo->SITunerNum = (Flags >> 10) & 3;
500 RECHeaderInfo->SIDelFlag = (Flags >> 12) & 1;
501 RECHeaderInfo->SICASFlag = (Flags >> 13) & 1;
502 RECHeaderInfo->SILockFlag = (Flags >> 14) & 1;
503 RECHeaderInfo->SISkipFlag = Flags >> 15;
504
505 RECHeaderInfo->SIServiceID = getWord(&Buffer[p + 0x0004], WrongEndian);
506 RECHeaderInfo->SIPMTPID = getWord(&Buffer[p + 0x0006], WrongEndian);
507 RECHeaderInfo->SIPCRPID = getWord(&Buffer[p + 0x0008], WrongEndian);
508 RECHeaderInfo->SIVideoPID = getWord(&Buffer[p + 0x000a], WrongEndian);
509 RECHeaderInfo->SIAudioPID = getWord(&Buffer[p + 0x000c], WrongEndian);
510
511 strncpy(RECHeaderInfo->SISvcName, &Buffer[p + 0x000e], 24);
512
513 RECHeaderInfo->SIVideoStreamType = Buffer[p + 0x0026];
514 RECHeaderInfo->SIAudioStreamType = Buffer[p + 0x0027];
515
516 //Event Info
517 p = 0x0044;
518 memcpy(RECHeaderInfo->EventUnknown1, &Buffer[p], 2);
519 RECHeaderInfo->EventDuration = 60 * Buffer[p + 3] + Buffer[p + 2];
520 RECHeaderInfo->EventEventID = getDword(&Buffer[p + 0x0004], WrongEndian);
521 RECHeaderInfo->EventStartTime = getDword(&Buffer[p + 0x0008], WrongEndian);
522 RECHeaderInfo->EventEndTime = getDword(&Buffer[p + 0x000c], WrongEndian);
523 RECHeaderInfo->EventRunningStatus = Buffer[p + 0x0010];
524 EventTextLength = Buffer[p + 0x0011];
525 RECHeaderInfo->EventParentalRate = Buffer[p + 0x0012];
526 strncpy(RECHeaderInfo->EventEventName, &Buffer[p + 0x0013], EventTextLength);
527 strncpy(RECHeaderInfo->EventEventDescription, &Buffer[p + 0x0013 + EventTextLength], 273 - EventTextLength);
528
529 //Extended Event Info
530 p = 0x0168;
531 DecodeExtInfo(Buffer, p, RECHeaderInfo);
532
533 //Transponder info
534 p = 0x0574;
535 RECHeaderInfo->TPSatIndex = Buffer[p];
536
537 Flags = getWord(&Buffer[p + 1], WrongEndian);
538 RECHeaderInfo->TPPolarization = Flags & 0x01;
539 RECHeaderInfo->TPMode = (Flags >> 1) & 0x07;
540 RECHeaderInfo->TPSystem = (Flags >> 4) & 0x01;
541 RECHeaderInfo->TPModulation = (Flags >> 5) & 0x03;
542 RECHeaderInfo->TPFEC = (Flags >> 7) & 0x0f;
543 RECHeaderInfo->TPPilot = (Flags >> 11) & 0x01;
544
545 RECHeaderInfo->TPUnknown2 = Buffer[p + 3];
546 RECHeaderInfo->TPFrequency = getDword(&Buffer[p + 4], WrongEndian);
547 RECHeaderInfo->TPSymbolRate = getWord(&Buffer [p + 8], WrongEndian);
548 RECHeaderInfo->TPTSID = getWord(&Buffer [p + 10], WrongEndian);
549 RECHeaderInfo->TPNetworkID = getWord(&Buffer [p + 12], WrongEndian);
550 RECHeaderInfo->TPOriginalNetworkID = getWord(&Buffer [p + 14], WrongEndian);
551
552 //Crypt Info: see header flags
553
554 //Bookmarks
555 p = 0x0584;
556 RECHeaderInfo->NrBookmarks = getDword(&Buffer[p + 0x0000], WrongEndian);
557 memcpy(RECHeaderInfo->Bookmark, &Buffer[p + 0x0004], 177 * sizeof(dword));
558 RECHeaderInfo->Resume = getDword(&Buffer[p + 0x02c8], WrongEndian);
559
560 TRACEEXIT();
561}
562
563void HDD_DecodeRECHeader_ST_TMST(byte *Buffer, tRECHeaderInfo *RECHeaderInfo)
564{
565 TRACEENTER();
566
567 dword p;
568 word Flags;
569 byte EventTextLength;
570
571 //Header
572 p = 0;
573 memcpy(RECHeaderInfo->HeaderUnknown2, &Buffer[p + 6], 2);
574 RECHeaderInfo->HeaderStartTime = getDword(&Buffer[p + 0x0008], WrongEndian);
575 RECHeaderInfo->HeaderDuration = getWord(&Buffer[p + 0x000c], WrongEndian);
576 RECHeaderInfo->HeaderDurationSec = getWord(&Buffer[p + 0x000e], WrongEndian);
577
578 RECHeaderInfo->CryptFlag = Buffer[p + 0x0010] & 0x03;
579 RECHeaderInfo->HeaderFlags = Buffer[p + 0x0010] & 0xfc;
580
581 RECHeaderInfo->HeaderCopyFlag = Buffer[p + 0x0011] & 0x80;
582 RECHeaderInfo->HeaderTSFlag = Buffer[p + 0x0011] & 0x40;
583 RECHeaderInfo->HeaderFlags2 = Buffer[p + 0x0011] & 0x3f;
584
585
586 memcpy(RECHeaderInfo->HeaderUnknown4, &Buffer[p + 0x0012], 10);
587
588 //Service Info
589 p = 0x001c;
590 RECHeaderInfo->SISatIndex = Buffer[p + 0x0000];
591 RECHeaderInfo->SIServiceType = Buffer[p + 0x0001];
592
593 Flags = getWord(&Buffer[p +0x0002], WrongEndian);
594 RECHeaderInfo->SITPIdx = Flags & 0x3ff;
595 RECHeaderInfo->SITunerNum = (Flags >> 10) & 3;
596 RECHeaderInfo->SIDelFlag = (Flags >> 12) & 1;
597 RECHeaderInfo->SICASFlag = (Flags >> 13) & 1;
598 RECHeaderInfo->SILockFlag = (Flags >> 14) & 1;
599 RECHeaderInfo->SISkipFlag = Flags >> 15;
600
601 RECHeaderInfo->SIServiceID = getWord(&Buffer[p + 0x0004], WrongEndian);
602 RECHeaderInfo->SIPMTPID = getWord(&Buffer[p + 0x0006], WrongEndian);
603 RECHeaderInfo->SIPCRPID = getWord(&Buffer[p + 0x0008], WrongEndian);
604 RECHeaderInfo->SIVideoPID = getWord(&Buffer[p + 0x000a], WrongEndian);
605 RECHeaderInfo->SIAudioPID = getWord(&Buffer[p + 0x000c], WrongEndian);
606
607 strncpy(RECHeaderInfo->SISvcName, &Buffer[p + 0x000e], 24);
608
609 RECHeaderInfo->SIVideoStreamType = Buffer[p + 0x0026];
610 RECHeaderInfo->SIAudioStreamType = Buffer[p + 0x0027];
611
612 //Event Info
613 p = 0x0044;
614 memcpy(RECHeaderInfo->EventUnknown1, &Buffer[p], 2);
615 RECHeaderInfo->EventDuration = 60 * Buffer[p + 3] + Buffer[p + 2];
616 RECHeaderInfo->EventEventID = getDword(&Buffer[p + 0x0004], WrongEndian);
617 RECHeaderInfo->EventStartTime = getDword(&Buffer[p + 0x0008], WrongEndian);
618 RECHeaderInfo->EventEndTime = getDword(&Buffer[p + 0x000c], WrongEndian);
619 RECHeaderInfo->EventRunningStatus = Buffer[p + 0x0010];
620 EventTextLength = Buffer[p + 0x0011];
621 RECHeaderInfo->EventParentalRate = Buffer[p + 0x0012];
622 strncpy(RECHeaderInfo->EventEventName, &Buffer[p + 0x0013], EventTextLength);
623 strncpy(RECHeaderInfo->EventEventDescription, &Buffer[p + 0x0013 + EventTextLength], 273 - EventTextLength);
624
625 //Extended Event Info
626 p = 0x0168;
627 DecodeExtInfo(Buffer, p, RECHeaderInfo);
628
629 //Transponder info
630 p = 0x0574;
631 RECHeaderInfo->TPSatIndex = Buffer[p + 0x0000];
632 RECHeaderInfo->TPChannelNumber = Buffer[p + 0x0001];
633 RECHeaderInfo->TPBandwidth = Buffer[p + 0x0002];
634 RECHeaderInfo->TPUnknown2 = Buffer[p + 0x0003];
635 RECHeaderInfo->TPFrequency = getDword(&Buffer[p + 0x0004], WrongEndian);
636 RECHeaderInfo->TPTSID = getWord(&Buffer[p + 0x0008], WrongEndian);
637 RECHeaderInfo->TPLPHPStream = Buffer[p + 0x000a];
638 RECHeaderInfo->TPUnknown4 = Buffer[p + 0x000b];
639 RECHeaderInfo->TPOriginalNetworkID = getWord(&Buffer[p + 0x000c], WrongEndian);
640 RECHeaderInfo->TPNetworkID = getWord(&Buffer[p + 0x000e], WrongEndian);
641
642 //Crypt Info: see header
643
644 //Bookmarks
645 p = 0x0584;
646 RECHeaderInfo->NrBookmarks = getDword(&Buffer[p + 0x0000], WrongEndian);
647 memcpy(RECHeaderInfo->Bookmark, &Buffer[p + 0x0004], 177 * sizeof(dword));
648 RECHeaderInfo->Resume = getDword(&Buffer[p + 0x02c8], WrongEndian);
649
650 TRACEEXIT();
651}
652
653void HDD_DecodeRECHeader_ST_TMSC(byte *Buffer, tRECHeaderInfo *RECHeaderInfo)
654{
655 TRACEENTER();
656
657 dword p;
658 word Flags;
659 byte EventTextLength;
660
661 //Header
662 p = 0;
663 memcpy(RECHeaderInfo->HeaderUnknown2, &Buffer[p + 6], 2);
664 RECHeaderInfo->HeaderStartTime = getDword(&Buffer[p + 0x0008], WrongEndian);
665 RECHeaderInfo->HeaderDuration = getWord(&Buffer[p + 0x000c], WrongEndian);
666 RECHeaderInfo->HeaderDurationSec = getWord(&Buffer[p + 0x000e], WrongEndian);
667
668 RECHeaderInfo->CryptFlag = Buffer[p + 0x0010] & 0x03;
669 RECHeaderInfo->HeaderFlags = Buffer[p + 0x0010] & 0xfc;
670
671 RECHeaderInfo->HeaderCopyFlag = Buffer[p + 0x0011] & 0x80;
672 RECHeaderInfo->HeaderTSFlag = Buffer[p + 0x0011] & 0x40;
673 RECHeaderInfo->HeaderFlags2 = Buffer[p + 0x0011] & 0x3f;
674
675 memcpy(RECHeaderInfo->HeaderUnknown4, &Buffer[p + 0x0012], 10);
676
677 //Service Info
678 p = 0x001c;
679 RECHeaderInfo->SISatIndex = Buffer[p + 0x0000];
680 RECHeaderInfo->SIServiceType = Buffer[p + 0x0001];
681
682 Flags = getWord(&Buffer[p +0x0002], WrongEndian);
683 RECHeaderInfo->SITPIdx = Flags & 0x3ff;
684 RECHeaderInfo->SITunerNum = (Flags >> 10) & 3;
685 RECHeaderInfo->SIDelFlag = (Flags >> 12) & 1;
686 RECHeaderInfo->SICASFlag = (Flags >> 13) & 1;
687 RECHeaderInfo->SILockFlag = (Flags >> 14) & 1;
688 RECHeaderInfo->SISkipFlag = Flags >> 15;
689
690 RECHeaderInfo->SIServiceID = getWord(&Buffer[p + 0x0004], WrongEndian);
691 RECHeaderInfo->SIPMTPID = getWord(&Buffer[p + 0x0006], WrongEndian);
692 RECHeaderInfo->SIPCRPID = getWord(&Buffer[p + 0x0008], WrongEndian);
693 RECHeaderInfo->SIVideoPID = getWord(&Buffer[p + 0x000a], WrongEndian);
694 RECHeaderInfo->SIAudioPID = getWord(&Buffer[p + 0x000c], WrongEndian);
695
696 strncpy(RECHeaderInfo->SISvcName, &Buffer[p + 0x000e], 24);
697
698 RECHeaderInfo->SIVideoStreamType = Buffer[p + 0x0026];
699 RECHeaderInfo->SIAudioStreamType = Buffer[p + 0x0027];
700
701 //Event Info
702 p = 0x0044;
703 memcpy(RECHeaderInfo->EventUnknown1, &Buffer[p], 2);
704 RECHeaderInfo->EventDuration = 60 * Buffer[p + 3] + Buffer[p + 2];
705 RECHeaderInfo->EventEventID = getDword(&Buffer[p + 0x0004], WrongEndian);
706 RECHeaderInfo->EventStartTime = getDword(&Buffer[p + 0x0008], WrongEndian);
707 RECHeaderInfo->EventEndTime = getDword(&Buffer[p + 0x000c], WrongEndian);
708 RECHeaderInfo->EventRunningStatus = Buffer[p + 0x0010];
709 EventTextLength = Buffer[p + 0x0011];
710 RECHeaderInfo->EventParentalRate = Buffer[p + 0x0012];
711 strncpy(RECHeaderInfo->EventEventName, &Buffer[p + 0x0013], EventTextLength);
712 strncpy(RECHeaderInfo->EventEventDescription, &Buffer[p + 0x0013 + EventTextLength], 273 - EventTextLength);
713
714 //Extended Event Info
715 p = 0x0168;
716 DecodeExtInfo(Buffer, p, RECHeaderInfo);
717
718 //Transponder info
719 p = 0x0574;
720 RECHeaderInfo->TPFrequency = getDword(&Buffer[p + 0x0000], WrongEndian) >> 8;
721 RECHeaderInfo->TPSymbolRate = getWord(&Buffer[p + 0x0004], WrongEndian);
722 RECHeaderInfo->TPTSID = getWord(&Buffer[p + 0x0006], WrongEndian);
723 RECHeaderInfo->TPOriginalNetworkID = getWord(&Buffer[p + 0x0008], WrongEndian);
724 RECHeaderInfo->TPModulation = Buffer[p + 0x000a];
725 RECHeaderInfo->TPUnknown6 = Buffer[p + 0x000b];
726
727 //Crypt Info: see header flags
728
729 //Bookmarks
730 p = 0x0580;
731 RECHeaderInfo->NrBookmarks = getDword(&Buffer[p + 0x0000], WrongEndian);
732 memcpy(RECHeaderInfo->Bookmark, &Buffer[p + 0x0004], 177 * sizeof(dword));
733 RECHeaderInfo->Resume = getDword(&Buffer[p + 0x02c8], WrongEndian);
734
735 TRACEEXIT();
736}
737
738void HDD_DecodeRECHeader_ST_TF7k7HDPVR(byte *Buffer, tRECHeaderInfo *RECHeaderInfo)
739{
740 TRACEENTER();
741
742 dword p;
743 word TPFlags1;
744 byte EventTextLength;
745
746 //Header
747 p = 0x4d0;
748 memcpy(RECHeaderInfo->HeaderUnknown2, &Buffer[p + 0x0006], 2);
749 RECHeaderInfo->HeaderDuration = getWord(&Buffer[p + 0x0008], WrongEndian);
750 RECHeaderInfo->HeaderSvcNumber = getWord(&Buffer[p + 0x000a], WrongEndian);
751 RECHeaderInfo->HeaderSvcType = getWord(&Buffer[p + 0x000c], WrongEndian);
752
753 //Service Info
754 p = 0x04de;
755 RECHeaderInfo->SISatIndex = Buffer[p + 0x0000];
756 RECHeaderInfo->SIServiceType = Buffer[p + 0x0001];
757
758 TPFlags1 = getWord(&Buffer[p + 0x0002], WrongEndian);
759 RECHeaderInfo->SITPIdx = TPFlags1 & 0x3ff;
760 RECHeaderInfo->SITunerNum = (TPFlags1 >> 10) & 3;
761 RECHeaderInfo->SISkipFlag = (TPFlags1 >> 12) & 1;
762 RECHeaderInfo->SILockFlag = (TPFlags1 >> 13) & 1;
763 RECHeaderInfo->SICASFlag = (TPFlags1 >> 14) & 1;
764 RECHeaderInfo->SIDelFlag = (TPFlags1 >> 15) & 1;
765
766 RECHeaderInfo->SIServiceID = getWord(&Buffer[p + 0x0004], WrongEndian);
767 RECHeaderInfo->SIPMTPID = getWord(&Buffer[p + 0x0006], WrongEndian);
768 RECHeaderInfo->SIPCRPID = getWord(&Buffer[p + 0x0008], WrongEndian);
769 RECHeaderInfo->SIVideoPID = getWord(&Buffer[p + 0x000a], WrongEndian);
770 RECHeaderInfo->SIAudioPID = getWord(&Buffer[p + 0x000c], WrongEndian);
771 strncpy(RECHeaderInfo->SISvcName, &Buffer[p + 0x000e], 28);
772
773 //Transponder Info
774 p = 0x0508;
775 RECHeaderInfo->TPSatIndex = Buffer[p + 0x0000];
776
777 RECHeaderInfo->TPFlags2 = Buffer[p + 0x0001];
778 RECHeaderInfo->TPPolarization = RECHeaderInfo->TPFlags2 & 1;
779 RECHeaderInfo->TPMode = (RECHeaderInfo->TPFlags2 >> 1) & 7;
780 RECHeaderInfo->TPFlags2 = RECHeaderInfo->TPFlags2 & 0x00f0;
781
782 memcpy(RECHeaderInfo->TPUnknown3, &Buffer[p + 0x0002], 2);
783 RECHeaderInfo->TPFrequency = getDword(&Buffer[p + 0x0004], WrongEndian);
784 RECHeaderInfo->TPSymbolRate = getWord(&Buffer[p + 0x0008], WrongEndian);
785 RECHeaderInfo->TPTSID = getWord(&Buffer[p + 0x000a], WrongEndian);
786 memcpy(RECHeaderInfo->TPUnknown5, &Buffer[p + 0x000c], 2);
787 RECHeaderInfo->TPOriginalNetworkID = getWord(&Buffer[p + 0x000e], WrongEndian);
788
789 //Event Info
790 p = 0x0518;
791 memcpy(RECHeaderInfo->EventUnknown1, &Buffer[p], 2);
792 RECHeaderInfo->EventDuration = 60 * Buffer[p + 0x0003] + Buffer[p + 0x0002];
793 RECHeaderInfo->EventEventID = getDword(&Buffer[p + 0x0004], WrongEndian);
794 RECHeaderInfo->EventStartTime = getDword(&Buffer[p + 0x0008], WrongEndian);
795 RECHeaderInfo->EventEndTime = getDword(&Buffer[p + 0x000c], WrongEndian);
796 RECHeaderInfo->EventRunningStatus = Buffer[p + 0x0010];
797 EventTextLength = Buffer[p + 0x0011];
798 RECHeaderInfo->EventParentalRate = Buffer[p + 0x0012];
799 strncpy(RECHeaderInfo->EventEventName, &Buffer[p + 0x0013], EventTextLength);
800 strncpy(RECHeaderInfo->EventEventDescription, &Buffer[p + 0x0013 + EventTextLength], 257 - EventTextLength);
801 RECHeaderInfo->EventServiceID = getWord(&Buffer[p + 0x0114], WrongEndian);
802 memcpy(RECHeaderInfo->EventUnknown2, &Buffer[p + 0x0116], 14);
803
804 //Extended Event Info
805 p = 0x063c;
806 DecodeExtInfo(Buffer, p, RECHeaderInfo);
807
808 //Crypt Info
809 p = 0x0a48;
810 RECHeaderInfo->CryptFlag = Buffer[p + 0x0000];
811 memcpy(RECHeaderInfo->CryptUnknown2, &Buffer[p + 0x0001], 3);
812
813 //Bookmarks
814 p = 0x0a4c;
815 memcpy(RECHeaderInfo->Bookmark, &Buffer[p + 0x0000], 64 * sizeof(dword));
816 RECHeaderInfo->Resume = getDword(&Buffer[p + 0x0100], WrongEndian);
817
818 TRACEEXIT();
819}
820
821
822bool HDD_DecodeRECHeader(byte *Buffer, tRECHeaderInfo *RECHeaderInfo, SYSTEM_TYPE SystemType)
823{
824 TRACEENTER();
825
826 bool ret;
827
828 if(SystemType == ST_UNKNOWN) SystemType = GetSystemType();
829
830 memset(RECHeaderInfo, 0, sizeof(tRECHeaderInfo));
831
832 //Is this a REC header?
833 RECHeaderInfo->HeaderMagic = (Buffer[0] << 24) | (Buffer[1] << 16) | (Buffer[2] << 8) | Buffer[3];
834 if(RECHeaderInfo->HeaderMagic != 0x54467263)
835 {
836 TRACEEXIT();
837 return FALSE;
838 }
839
840 RECHeaderInfo->HeaderVersion = getWord(&Buffer[4], FALSE);
841
842 //Check the endianess of the file
843 WrongEndian = (RECHeaderInfo->HeaderVersion == 0x0050) || (RECHeaderInfo->HeaderVersion == 0x1050) || (RECHeaderInfo->HeaderVersion == 0x0080);
844 if(WrongEndian) RECHeaderInfo->HeaderVersion = getWord(&Buffer[4], TRUE);
845
846 ret = TRUE;
847 switch(SystemType)
848 {
849 case ST_UNKNOWN: ret = FALSE; break;
850 case ST_S: HDD_DecodeRECHeader_ST_S(Buffer, RECHeaderInfo); break;
851 case ST_T: HDD_DecodeRECHeader_ST_T(Buffer, RECHeaderInfo); break;
852 case ST_C: HDD_DecodeRECHeader_ST_C(Buffer, RECHeaderInfo); break;
853 case ST_T5700: HDD_DecodeRECHeader_ST_T5700(Buffer, RECHeaderInfo); break;
854 case ST_TMSS: HDD_DecodeRECHeader_ST_TMSS(Buffer, RECHeaderInfo); break;
855 case ST_TMST: HDD_DecodeRECHeader_ST_TMST(Buffer, RECHeaderInfo); break;
856 case ST_TMSC: HDD_DecodeRECHeader_ST_TMSC(Buffer, RECHeaderInfo); break;
857 case ST_T5800: HDD_DecodeRECHeader_ST_T5800(Buffer, RECHeaderInfo); break;
858 case ST_ST: ret = FALSE; break;
859 case ST_CT: ret = FALSE; break;
860 case ST_TF7k7HDPVR: HDD_DecodeRECHeader_ST_TF7k7HDPVR(Buffer, RECHeaderInfo); break;
861 case ST_NRTYPES: ret = FALSE; break;
862 }
863
864 TRACEEXIT();
865 return ret;
866}
void HDD_DecodeRECHeader_ST_S(byte *Buffer, tRECHeaderInfo *RECHeaderInfo)
void DecodeExtInfo(byte *Buffer, dword p, tRECHeaderInfo *RECHeaderInfo)
bool WrongEndian
dword getDword(const void *buffer, bool NeedsByteSwapping)
bool HDD_DecodeRECHeader(byte *Buffer, tRECHeaderInfo *RECHeaderInfo, SYSTEM_TYPE SystemType)
void HDD_DecodeRECHeader_ST_T(byte *Buffer, tRECHeaderInfo *RECHeaderInfo)
word getWord(const void *buffer, bool NeedsByteSwapping)
void HDD_DecodeRECHeader_ST_T5800(byte *Buffer, tRECHeaderInfo *RECHeaderInfo)
void HDD_DecodeRECHeader_ST_C(byte *Buffer, tRECHeaderInfo *RECHeaderInfo)
void HDD_DecodeRECHeader_ST_TMSS(byte *Buffer, tRECHeaderInfo *RECHeaderInfo)
void HDD_DecodeRECHeader_ST_TMSC(byte *Buffer, tRECHeaderInfo *RECHeaderInfo)
void HDD_DecodeRECHeader_ST_TF7k7HDPVR(byte *Buffer, tRECHeaderInfo *RECHeaderInfo)
void HDD_DecodeRECHeader_ST_TMST(byte *Buffer, tRECHeaderInfo *RECHeaderInfo)
void HDD_DecodeRECHeader_ST_T5700(byte *Buffer, tRECHeaderInfo *RECHeaderInfo)
bool StrReplace(char *String, const char *Find, const char *Replace)
Definition: StrReplace.c:4
SYSTEM_TYPE GetSystemType(void)
Definition: GetSystemType.c:3
#define TRACEEXIT()
Definition: libFireBird.h:1244
#define TRACEENTER()
Definition: libFireBird.h:1243
SYSTEM_TYPE
Definition: libFireBird.h:66
@ ST_CT
Definition: libFireBird.h:77
@ ST_T
Definition: libFireBird.h:69
@ ST_TMSC
Definition: libFireBird.h:74
@ ST_UNKNOWN
Definition: libFireBird.h:67
@ ST_T5700
Definition: libFireBird.h:71
@ ST_TMST
Definition: libFireBird.h:73
@ ST_T5800
Definition: libFireBird.h:75
@ ST_TMSS
Definition: libFireBird.h:72
@ ST_ST
Definition: libFireBird.h:76
@ ST_NRTYPES
Definition: libFireBird.h:79
@ ST_TF7k7HDPVR
Definition: libFireBird.h:78
@ ST_S
Definition: libFireBird.h:68
@ ST_C
Definition: libFireBird.h:70
char EventEventName[273]
Definition: libFireBird.h:2367
byte SIAudioStreamType
Definition: libFireBird.h:2335
byte TPUnknown7[8]
Definition: libFireBird.h:2359
dword EventStartTime
Definition: libFireBird.h:2363
char EventEventDescription[273]
Definition: libFireBird.h:2368
byte TPUnknown3[2]
Definition: libFireBird.h:2355
word ExtEventServiceID
Definition: libFireBird.h:2373
byte EventUnknown2[14]
Definition: libFireBird.h:2371
dword ExtEventEventID
Definition: libFireBird.h:2374
byte TPUnknown5[2]
Definition: libFireBird.h:2357
byte ExtEventNrItemizedPairs
Definition: libFireBird.h:2378
byte ExtEventUnknown1[3]
Definition: libFireBird.h:2379
dword Bookmark[177]
Definition: libFireBird.h:2385
char ExtEventText[1024]
Definition: libFireBird.h:2376
byte SIVideoStreamType
Definition: libFireBird.h:2334
dword HeaderStartTime
Definition: libFireBird.h:2307
word HeaderDurationSec
Definition: libFireBird.h:2309
word ExtEventTextLength
Definition: libFireBird.h:2375
byte HeaderUnknown4[10]
Definition: libFireBird.h:2318
word TPOriginalNetworkID
Definition: libFireBird.h:2351
char SISvcName[28]
Definition: libFireBird.h:2333
byte HeaderUnknown2[2]
Definition: libFireBird.h:2317
byte CryptUnknown2[3]
Definition: libFireBird.h:2382
byte EventRunningStatus
Definition: libFireBird.h:2365
byte EventParentalRate
Definition: libFireBird.h:2366
byte EventUnknown1[2]
Definition: libFireBird.h:2370