… | |
… | |
12 | enum { |
12 | enum { |
13 | SCT_PAT = 0x00, |
13 | SCT_PAT = 0x00, |
14 | SCT_CAT = 0x01, |
14 | SCT_CAT = 0x01, |
15 | SCT_PMT = 0x02, |
15 | SCT_PMT = 0x02, |
16 | SCT_TSDT = 0x03, |
16 | SCT_TSDT = 0x03, |
17 | SCT_NIT = 0x40, |
17 | SCT_NIT = 0x40,//TODO |
18 | SCT_NIT_OTHER = 0x41, |
18 | SCT_NIT_OTHER = 0x41, |
19 | SCT_SDT = 0x42, |
19 | SCT_SDT = 0x42, |
20 | SCT_SDT_OTHER = 0x46, |
20 | SCT_SDT_OTHER = 0x46, |
21 | SCT_BAT = 0x4a, |
21 | SCT_BAT = 0x4a,//TODO |
22 | SCT_EIT_PRESENT = 0x4e, |
22 | SCT_EIT_PRESENT = 0x4e, |
23 | SCT_EIT_PRESENT_OTHER = 0x4f, |
23 | SCT_EIT_PRESENT_OTHER = 0x4f, |
24 | SCT_EIT_SCHEDULE0 = 0x50, |
24 | SCT_EIT_SCHEDULE0 = 0x50, |
25 | SCT_EIT_SCHEDULE15 = 0x5f, |
25 | SCT_EIT_SCHEDULE15 = 0x5f, |
26 | SCT_EIT_SCHEDULE_OTHER0 = 0x60, |
26 | SCT_EIT_SCHEDULE_OTHER0 = 0x60, |
… | |
… | |
37 | SCT_DIT = 0x7e, |
37 | SCT_DIT = 0x7e, |
38 | SCT_SIT = 0x7f, |
38 | SCT_SIT = 0x7f, |
39 | }; |
39 | }; |
40 | |
40 | |
41 | enum { |
41 | enum { |
|
|
42 | DT_service = 0x48, |
|
|
43 | DT_country_availability = 0x49, |
|
|
44 | DT_linkage = 0x4a, |
42 | DT_short_event = 0x4d, |
45 | DT_short_event = 0x4d, |
43 | DT_extended_event = 0x4e, |
46 | DT_extended_event = 0x4e, //NYI |
44 | DT_component = 0x50, |
47 | DT_component = 0x50, |
45 | DT_content = 0x54, |
48 | DT_content = 0x54, |
46 | DT_private_data_specifier = 0x5f, |
49 | DT_private_data_specifier = 0x5f, |
47 | DT_short_smoothing_buffer = 0x61, //NYI |
50 | DT_short_smoothing_buffer = 0x61, //NYI |
48 | DT_scrambling_indicator = 0x65, //NYI |
51 | DT_scrambling_indicator = 0x65, //NYI |
… | |
… | |
220 | CONST (SCT_RCT), |
223 | CONST (SCT_RCT), |
221 | CONST (SCT_CIT), |
224 | CONST (SCT_CIT), |
222 | CONST (SCT_MPE), |
225 | CONST (SCT_MPE), |
223 | CONST (SCT_DIT), |
226 | CONST (SCT_DIT), |
224 | CONST (SCT_SIT), |
227 | CONST (SCT_SIT), |
|
|
228 | |
|
|
229 | CONST (DT_service), |
|
|
230 | CONST (DT_country_availability), |
|
|
231 | CONST (DT_linkage), |
|
|
232 | CONST (DT_short_event), |
|
|
233 | CONST (DT_extended_event), |
|
|
234 | CONST (DT_component), |
|
|
235 | CONST (DT_content), |
|
|
236 | CONST (DT_private_data_specifier), |
|
|
237 | CONST (DT_short_smoothing_buffer), |
|
|
238 | CONST (DT_scrambling_indicator), |
|
|
239 | CONST (DT_PDC), |
225 | }; |
240 | }; |
226 | |
241 | |
227 | #define HVS_S(hv,struct,member) hv_store (hv, #member, sizeof (#member) - 1, newSVpv (struct.member, 0), 0) |
242 | #define HVS_S(hv,struct,member) hv_store (hv, #member, sizeof (#member) - 1, newSVpv (struct.member, 0), 0) |
228 | #define HVS_I(hv,struct,member) hv_store (hv, #member, sizeof (#member) - 1, newSViv (struct.member), 0) |
243 | #define HVS_I(hv,struct,member) hv_store (hv, #member, sizeof (#member) - 1, newSViv (struct.member), 0) |
|
|
244 | #define HVS(hv,name,sv) hv_store (hv, #name, sizeof (#name) - 1, (sv), 0) |
229 | |
245 | |
230 | static void |
246 | static void |
231 | set_parameters (HV *hv, struct dvb_frontend_parameters *p, fe_type_t type) |
247 | get_parameters (HV *hv, struct dvb_frontend_parameters *p, fe_type_t type) |
232 | { |
248 | { |
233 | HVS_I (hv, (*p), frequency); |
249 | HVS_I (hv, (*p), frequency); |
234 | HVS_I (hv, (*p), inversion); |
250 | HVS_I (hv, (*p), inversion); |
235 | |
251 | |
236 | switch (type) |
252 | switch (type) |
… | |
… | |
254 | HVS_I (hv, (*p).u.ofdm, transmission_mode); |
270 | HVS_I (hv, (*p).u.ofdm, transmission_mode); |
255 | break; |
271 | break; |
256 | } |
272 | } |
257 | } |
273 | } |
258 | |
274 | |
|
|
275 | #define HVF_I(hv,struct,member) \ |
|
|
276 | if (v = hv_fetch (hv, #member, sizeof (#member) - 1, 0)) \ |
|
|
277 | struct.member = SvIV (*v); \ |
|
|
278 | else \ |
|
|
279 | croak ("required hash key '%s' not specified", #member); |
|
|
280 | |
|
|
281 | static void |
|
|
282 | set_parameters (HV *hv, struct dvb_frontend_parameters *p, fe_type_t type) |
|
|
283 | { |
|
|
284 | SV **v; |
|
|
285 | |
|
|
286 | HVF_I (hv, (*p), frequency); |
|
|
287 | HVF_I (hv, (*p), inversion); |
|
|
288 | |
|
|
289 | switch (type) |
|
|
290 | { |
|
|
291 | case FE_QPSK: |
|
|
292 | HVF_I (hv, (*p).u.qpsk, symbol_rate); |
|
|
293 | HVF_I (hv, (*p).u.qpsk, fec_inner); |
|
|
294 | break; |
|
|
295 | |
|
|
296 | case FE_QAM: |
|
|
297 | HVF_I (hv, (*p).u.qam, symbol_rate); |
|
|
298 | HVF_I (hv, (*p).u.qam, fec_inner); |
|
|
299 | HVF_I (hv, (*p).u.qam, modulation); |
|
|
300 | break; |
|
|
301 | |
|
|
302 | case FE_OFDM: |
|
|
303 | HVF_I (hv, (*p).u.ofdm, bandwidth); |
|
|
304 | HVF_I (hv, (*p).u.ofdm, code_rate_HP); |
|
|
305 | HVF_I (hv, (*p).u.ofdm, code_rate_LP); |
|
|
306 | HVF_I (hv, (*p).u.ofdm, constellation); |
|
|
307 | HVF_I (hv, (*p).u.ofdm, transmission_mode); |
|
|
308 | break; |
|
|
309 | } |
|
|
310 | } |
|
|
311 | |
259 | typedef unsigned char u8; |
312 | typedef unsigned char u8; |
260 | |
313 | |
261 | static SV *dec_sv; |
314 | static SV *dec_sv; |
262 | static u8 *dec_data; |
315 | static u8 *dec_data; |
263 | static long dec_ofs, dec_len8; |
316 | static long dec_ofs, dec_len8; |
… | |
… | |
309 | } |
362 | } |
310 | |
363 | |
311 | return dec_field = r; |
364 | return dec_field = r; |
312 | } |
365 | } |
313 | |
366 | |
|
|
367 | U32 |
|
|
368 | clamp (U32 len) |
|
|
369 | { |
|
|
370 | return len < 4096 ? len : 0; |
|
|
371 | } |
|
|
372 | |
|
|
373 | static SV * |
|
|
374 | text2sv (u8 *data, U32 len) |
|
|
375 | { |
|
|
376 | dSP; |
|
|
377 | SV *sv = newSVpvn (data, clamp (len)); |
|
|
378 | |
|
|
379 | PUSHMARK (SP); |
|
|
380 | XPUSHs (sv); |
|
|
381 | PUTBACK; |
|
|
382 | call_pv ("Linux::DVB::Decode::text", G_VOID); |
|
|
383 | |
|
|
384 | return sv; |
|
|
385 | } |
|
|
386 | |
314 | #define DEC_I(hv, bits, name) hv_store (hv, #name, sizeof (#name) - 1, newSViv (decode_field (bits)), 0) |
387 | #define DEC_I(hv, bits, name) HVS (hv, name, newSViv (decode_field (bits))) |
|
|
388 | #define DEC_T(hv, bytes, name) HVS (hv, name, text2sv (dec_data + (dec_ofs >> 3), clamp (bytes))), dec_ofs += clamp (bytes) << 3 |
315 | #define DEC_S(hv, bytes, name) hv_store (hv, #name, sizeof (#name) - 1, newSVpvn (dec_data + (dec_ofs >> 3), (bytes)), 0), dec_ofs += (bytes) << 3 |
389 | #define DEC_S(hv, bytes, name) HVS (hv, name, newSVpvn (dec_data + (dec_ofs >> 3), clamp (bytes))), dec_ofs += clamp (bytes) << 3 |
316 | |
390 | |
317 | static AV * |
391 | static AV * |
318 | decode_descriptors (long end) |
392 | decode_descriptors (long end) |
319 | { |
393 | { |
320 | AV *av = newAV (); |
394 | AV *av = newAV (); |
321 | |
395 | |
322 | while (dec_ofs < end) |
396 | while (dec_ofs < end) |
323 | { |
397 | { |
324 | HV *hv = newHV (); |
398 | HV *hv = newHV (); |
325 | U8 type, len, a; |
399 | U8 type, len, len2; |
|
|
400 | AV *av2; |
326 | long end; |
401 | long end, end2; |
327 | |
402 | |
328 | av_push (av, newRV_noinc ((SV *)hv)); |
403 | av_push (av, newRV_noinc ((SV *)hv)); |
329 | |
404 | |
330 | DEC_I (hv, 8, type); |
405 | DEC_I (hv, 8, type); |
331 | type = dec_field; |
406 | type = dec_field; |
332 | len = decode_field (8); |
407 | len = decode_field (8); |
333 | |
|
|
334 | end = dec_ofs + (len << 3); |
408 | end = dec_ofs + (len << 3); |
335 | |
409 | |
336 | if (end > dec_len8) |
410 | if (end > dec_len8) |
337 | return av; |
411 | return av; |
338 | |
412 | |
339 | switch (type) |
413 | switch (type) |
340 | { |
414 | { |
|
|
415 | case DT_service: |
|
|
416 | DEC_I (hv, 8, service_type); |
|
|
417 | len2 = decode_field (8); DEC_T (hv, len2, service_provider_name); |
|
|
418 | len2 = decode_field (8); DEC_T (hv, len2, service_name); |
|
|
419 | break; |
|
|
420 | |
|
|
421 | case DT_country_availability: |
|
|
422 | DEC_I (hv, 1, country_availability_flag); |
|
|
423 | decode_field (7); |
|
|
424 | |
|
|
425 | DEC_S (hv, (end - dec_ofs) >> 3, private_data); |
|
|
426 | //while (dec_ofs + 24 <= end) |
|
|
427 | // av_push (av, |
|
|
428 | break; |
|
|
429 | |
|
|
430 | case DT_linkage: |
|
|
431 | DEC_I (hv, 16, transport_stream_id); |
|
|
432 | DEC_I (hv, 16, original_network_id); |
|
|
433 | DEC_I (hv, 16, service_id); |
|
|
434 | DEC_I (hv, 8, linkage_type); |
|
|
435 | |
|
|
436 | if (dec_field == 8) |
|
|
437 | { |
|
|
438 | U32 hot, org; |
|
|
439 | |
|
|
440 | DEC_I (hv, 8, hand_over_type); hot = dec_field; |
|
|
441 | decode_field (3); |
|
|
442 | DEC_I (hv, 1, origin_type); org = dec_field; |
|
|
443 | |
|
|
444 | if (hot > 0x00 && hot < 0x04) |
|
|
445 | DEC_I (hv, 16, network_id); |
|
|
446 | |
|
|
447 | if (org == 0) |
|
|
448 | DEC_I (hv, 16, initial_service_id); |
|
|
449 | } |
|
|
450 | |
|
|
451 | DEC_S (hv, (end - dec_ofs) >> 3, private_data); |
|
|
452 | break; |
|
|
453 | |
341 | case DT_PDC: |
454 | case DT_PDC: |
342 | decode_field (4); |
455 | decode_field (4); |
343 | DEC_I (hv, 20, programme_identification_label); |
456 | DEC_I (hv, 20, programme_identification_label); |
344 | break; |
457 | break; |
345 | |
458 | |
… | |
… | |
347 | decode_field (4); |
460 | decode_field (4); |
348 | DEC_I (hv, 4, stream_content); |
461 | DEC_I (hv, 4, stream_content); |
349 | DEC_I (hv, 8, component_type); |
462 | DEC_I (hv, 8, component_type); |
350 | DEC_I (hv, 8, component_tag); |
463 | DEC_I (hv, 8, component_tag); |
351 | DEC_S (hv, 3, ISO_639_language_code); |
464 | DEC_S (hv, 3, ISO_639_language_code); |
352 | DEC_S (hv, (end - dec_ofs) >> 3, text); |
465 | DEC_T (hv, (end - dec_ofs) >> 3, text); |
353 | break; |
466 | break; |
354 | |
467 | |
355 | case DT_short_event: |
468 | case DT_short_event: |
356 | DEC_S (hv, 3, ISO_639_language_code); |
469 | DEC_S (hv, 3, ISO_639_language_code); |
357 | a = decode_field (8); DEC_S (hv, a, event_name); |
470 | len2 = decode_field (8); DEC_T (hv, len2, event_name); |
358 | a = decode_field (8); DEC_S (hv, a, text); |
471 | len2 = decode_field (8); DEC_T (hv, len2, text); |
|
|
472 | break; |
|
|
473 | |
|
|
474 | case DT_extended_event: |
|
|
475 | DEC_I (hv, 4, descriptor_number); |
|
|
476 | DEC_I (hv, 4, last_descriptor_number); |
|
|
477 | DEC_S (hv, 3, ISO_639_language_code); |
|
|
478 | |
|
|
479 | len2 = decode_field (8); end2 = dec_ofs + (len2 << 3); |
|
|
480 | av2 = newAV (); |
|
|
481 | HVS (hv, items, newRV_noinc ((SV *)av2)); |
|
|
482 | |
|
|
483 | while (dec_ofs < end2) |
|
|
484 | { |
|
|
485 | AV *av3 = newAV (); |
|
|
486 | len2 = decode_field (8); av_push (av3, text2sv (dec_data + (dec_ofs >> 3), len2)), dec_ofs += len << 3; |
|
|
487 | len2 = decode_field (8); av_push (av3, text2sv (dec_data + (dec_ofs >> 3), len2)), dec_ofs += len << 3; |
|
|
488 | |
|
|
489 | av_push (av2, newRV_noinc ((SV *)av3)); |
|
|
490 | } |
|
|
491 | |
|
|
492 | len2 = decode_field (8); DEC_T (hv, len2, text); |
359 | break; |
493 | break; |
360 | |
494 | |
361 | case DT_content: |
495 | case DT_content: |
362 | DEC_S (hv, len, content); |
496 | av2 = newAV (); |
|
|
497 | HVS (hv, items, newRV_noinc ((SV *)av2)); |
|
|
498 | |
|
|
499 | while (dec_ofs < end) |
|
|
500 | { |
|
|
501 | HV *ev = newHV (); |
|
|
502 | |
|
|
503 | DEC_I (ev, 4, content_nibble_level_1); |
|
|
504 | DEC_I (ev, 4, content_nibble_level_2); |
|
|
505 | DEC_I (ev, 4, user_nibble_1); |
|
|
506 | DEC_I (ev, 4, user_nibble_2); |
|
|
507 | |
|
|
508 | av_push (av2, newRV_noinc ((SV *)ev)); |
|
|
509 | } |
|
|
510 | |
363 | break; |
511 | break; |
364 | |
512 | |
365 | case DT_private_data_specifier: |
513 | case DT_private_data_specifier: |
366 | DEC_I (hv, 32, private_data_specifier); |
514 | DEC_I (hv, 32, private_data_specifier); |
367 | break; |
515 | break; |
368 | |
516 | |
369 | default: |
517 | default: |
370 | fprintf (stderr, "UNKXXX %x\n", type);//D |
518 | //fprintf (stderr, "UNKXXX %x\n", type);//D |
|
|
519 | |
371 | case 0: |
520 | case 0: |
372 | case DT_extended_event: |
|
|
373 | case 0x80: |
521 | case 0x80: |
374 | case 0x81: |
522 | case 0x81: |
375 | case 0x82: |
523 | case 0x82: |
|
|
524 | case 0x83: |
376 | case 0x84: |
525 | case 0x84: |
377 | case 0x85: |
526 | case 0x85: |
|
|
527 | case 0x8d: |
|
|
528 | case 0x8e: |
|
|
529 | case 0xb2: |
378 | DEC_S (hv, len, raw_data); |
530 | DEC_S (hv, len, raw_data); |
379 | break; |
531 | break; |
380 | } |
532 | } |
381 | |
533 | |
382 | dec_ofs = end; // re-sync, in case of problems |
534 | dec_ofs = end; // re-sync, in case of problems |
… | |
… | |
486 | |
638 | |
487 | RETVAL = ubl; |
639 | RETVAL = ubl; |
488 | OUTPUT: |
640 | OUTPUT: |
489 | RETVAL |
641 | RETVAL |
490 | |
642 | |
|
|
643 | int |
|
|
644 | _set (int fd, SV *parameters, int type) |
|
|
645 | CODE: |
|
|
646 | struct dvb_frontend_parameters p; |
|
|
647 | |
|
|
648 | if (!SvROK (parameters) || SvTYPE (SvRV (parameters)) != SVt_PVHV) |
|
|
649 | croak ("Linux::DVB::Frontend::set requires a hash as argument"); |
|
|
650 | |
|
|
651 | set_parameters ((HV *)SvRV (parameters), &p, type); |
|
|
652 | |
|
|
653 | if (ioctl (fd, FE_SET_FRONTEND, &p) < 0) |
|
|
654 | XSRETURN_UNDEF; |
|
|
655 | |
|
|
656 | RETVAL = 1; |
|
|
657 | OUTPUT: |
|
|
658 | RETVAL |
|
|
659 | |
491 | SV * |
660 | SV * |
492 | _get (int fd, int type) |
661 | _get (int fd, int type) |
493 | CODE: |
662 | CODE: |
494 | struct dvb_frontend_parameters p; |
663 | struct dvb_frontend_parameters p; |
495 | HV *hv; |
664 | HV *hv; |
496 | |
665 | |
497 | if (ioctl (fd, FE_GET_FRONTEND, &p) < 0) |
666 | if (ioctl (fd, FE_GET_FRONTEND, &p) < 0) |
498 | XSRETURN_UNDEF; |
667 | XSRETURN_UNDEF; |
499 | |
668 | |
500 | hv = newHV (); |
669 | hv = newHV (); |
501 | set_parameters (hv, &p, type); |
670 | get_parameters (hv, &p, type); |
502 | RETVAL = (SV *)newRV_noinc ((SV *)hv); |
671 | RETVAL = (SV *)newRV_noinc ((SV *)hv); |
503 | OUTPUT: |
672 | OUTPUT: |
504 | RETVAL |
673 | RETVAL |
505 | |
674 | |
506 | SV * |
675 | SV * |
… | |
… | |
512 | if (ioctl (fd, FE_GET_EVENT, &e) < 0) |
681 | if (ioctl (fd, FE_GET_EVENT, &e) < 0) |
513 | XSRETURN_UNDEF; |
682 | XSRETURN_UNDEF; |
514 | |
683 | |
515 | hv = newHV (); |
684 | hv = newHV (); |
516 | HVS_I (hv, e, status); |
685 | HVS_I (hv, e, status); |
517 | set_parameters (hv, &e.parameters, type); |
686 | get_parameters (hv, &e.parameters, type); |
518 | RETVAL = (SV *)newRV_noinc ((SV *)hv); |
687 | RETVAL = (SV *)newRV_noinc ((SV *)hv); |
519 | OUTPUT: |
688 | OUTPUT: |
520 | RETVAL |
689 | RETVAL |
521 | |
690 | |
522 | MODULE = Linux::DVB PACKAGE = Linux::DVB::Demux |
691 | MODULE = Linux::DVB PACKAGE = Linux::DVB::Demux |
… | |
… | |
637 | DEC_I (hv, 16, original_network_id); |
806 | DEC_I (hv, 16, original_network_id); |
638 | DEC_I (hv, 8, segment_last_section_number); |
807 | DEC_I (hv, 8, segment_last_section_number); |
639 | DEC_I (hv, 8, last_table_id); |
808 | DEC_I (hv, 8, last_table_id); |
640 | |
809 | |
641 | AV *events = newAV (); |
810 | AV *events = newAV (); |
642 | hv_store (hv, "events", 6, newRV_noinc ((SV *)events), 0); |
811 | HVS (hv, events, newRV_noinc ((SV *)events)); |
643 | |
812 | |
644 | while (end - dec_ofs > 32) |
813 | while (end - dec_ofs > 32) |
645 | { |
814 | { |
646 | long dll; |
815 | long dll; |
647 | AV *desc; |
816 | AV *desc; |
… | |
… | |
656 | DEC_I (ev, 1, free_CA_mode); |
825 | DEC_I (ev, 1, free_CA_mode); |
657 | |
826 | |
658 | dll = dec_ofs + (decode_field (12) << 3); |
827 | dll = dec_ofs + (decode_field (12) << 3); |
659 | |
828 | |
660 | desc = decode_descriptors (dll); |
829 | desc = decode_descriptors (dll); |
661 | hv_store (ev, "descriptors", 11, newRV_noinc ((SV *)desc), 0); |
830 | HVS (ev, descriptors, newRV_noinc ((SV *)desc)); |
662 | } |
831 | } |
663 | |
832 | |
664 | decode_field (32); // skip CRC |
833 | decode_field (32); // skip CRC |
665 | |
834 | |
666 | break; |
835 | break; |
667 | #if 0 // service desc table |
836 | |
668 | case SCT_SDT: |
837 | case SCT_SDT: |
669 | case SCT_SDT_OTHER: |
838 | case SCT_SDT_OTHER: |
|
|
839 | DEC_I (hv, 16, transport_stream_id); |
|
|
840 | decode_field (2); |
|
|
841 | DEC_I (hv, 5, version_number); |
|
|
842 | DEC_I (hv, 1, current_next_indicator); |
|
|
843 | DEC_I (hv, 8, section_number); |
|
|
844 | DEC_I (hv, 8, last_section_number); |
|
|
845 | DEC_I (hv, 16, original_network_id); |
|
|
846 | decode_field (8); |
670 | |
847 | |
671 | AV *events = newAV (); |
848 | AV *services = newAV (); |
672 | hv_store (hv, "events", 0, newRV_noinc (events), 0); |
849 | HVS (hv, services, newRV_noinc ((SV *)services)); |
673 | |
850 | |
674 | while (end - dec_ofs > 32) |
851 | while (end - dec_ofs > 32) |
675 | { |
852 | { |
676 | HV *ev = newHV (); |
853 | HV *ev = newHV (); |
677 | U32 dll; |
854 | U32 dll; |
|
|
855 | AV *desc; |
678 | av_push (events, newRV_noinc (ev)); |
856 | av_push (services, newRV_noinc ((SV *)ev)); |
679 | |
857 | |
680 | DEC_I (ev, 16, service_id); |
858 | DEC_I (ev, 16, service_id); |
681 | decode_field (6); |
859 | decode_field (6); |
682 | DEC_I (ev, 1, EIT_schedule_flags); |
860 | DEC_I (ev, 1, EIT_schedule_flags); |
683 | DEC_I (ev, 1, EIT_present_following_flag); |
861 | DEC_I (ev, 1, EIT_present_following_flag); |
684 | DEC_I (ev, 3, running_status); |
862 | DEC_I (ev, 3, running_status); |
685 | DEC_I (ev, 1, free_CA_mode); |
863 | DEC_I (ev, 1, free_CA_mode); |
686 | |
864 | |
687 | dll = decode_field (12); |
865 | dll = dec_ofs + (decode_field (12) << 3); |
688 | |
866 | |
689 | DEC_I (ev, 1, free_CA_mode); |
867 | desc = decode_descriptors (dll); |
|
|
868 | HVS (ev, descriptors, newRV_noinc ((SV *)desc)); |
690 | } |
869 | } |
691 | |
870 | |
692 | decode_field (32); // skip CRC |
871 | decode_field (32); // skip CRC |
693 | //DEC_S (hv, length + 3 - (dec_ofs >> 3), raw_data); |
|
|
694 | break; |
872 | break; |
695 | #endif |
873 | |
696 | default: |
874 | default: |
697 | DEC_S (hv, length, raw_data); |
875 | DEC_S (hv, length, raw_data); |
698 | break; |
876 | break; |
699 | } |
877 | } |
700 | |
878 | |