ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Linux-DVB/DVB.xs
(Generate patch)

Comparing Linux-DVB/DVB.xs (file contents):
Revision 1.3 by root, Sun Apr 3 02:16:05 2005 UTC vs.
Revision 1.6 by root, Wed May 24 21:00:09 2006 UTC

7#include <linux/dvb/frontend.h> 7#include <linux/dvb/frontend.h>
8#include <linux/dvb/dmx.h> 8#include <linux/dvb/dmx.h>
9 9
10#define CONST(name) { #name, name } 10#define CONST(name) { #name, name }
11 11
12typedef int FE_fd;
13
12enum { 14enum {
13 SCT_PAT = 0x00, 15 SCT_PAT = 0x00,
14 SCT_CAT = 0x01, 16 SCT_CAT = 0x01,
15 SCT_PMT = 0x02, 17 SCT_PMT = 0x02,
16 SCT_TSDT = 0x03, 18 SCT_TSDT = 0x03,
17 SCT_NIT = 0x40,//TODO 19 SCT_NIT = 0x40,//TODO
18 SCT_NIT_OTHER = 0x41, 20 SCT_NIT_OTHER = 0x41,
19 SCT_SDT = 0x42, 21 SCT_SDT = 0x42,
20 SCT_SDT_OTHER = 0x46, 22 SCT_SDT_OTHER = 0x46,
21 SCT_BAT = 0x4a,//TODO 23 SCT_BAT = 0x4a,//TODO
22 SCT_EIT_PRESENT = 0x4e, 24 SCT_EIT_PRESENT = 0x4e,
23 SCT_EIT_PRESENT_OTHER = 0x4f, 25 SCT_EIT_PRESENT_OTHER = 0x4f,
24 SCT_EIT_SCHEDULE0 = 0x50, 26 SCT_EIT_SCHEDULE0 = 0x50,
25 SCT_EIT_SCHEDULE15 = 0x5f, 27 SCT_EIT_SCHEDULE15 = 0x5f,
26 SCT_EIT_SCHEDULE_OTHER0 = 0x60, 28 SCT_EIT_SCHEDULE_OTHER0 = 0x60,
27 SCT_EIT_SCHEDULE_OTHER15 = 0x6f, 29 SCT_EIT_SCHEDULE_OTHER15 = 0x6f,
28 SCT_TDT = 0x70, 30 SCT_TDT = 0x70,
29 SCT_RST = 0x71, 31 SCT_RST = 0x71,
30 SCT_ST = 0x72, 32 SCT_ST = 0x72,
31 SCT_TOT = 0x73, 33 SCT_TOT = 0x73,
32 SCT_RNT = 0x74, 34 SCT_RNT = 0x74,
33 SCT_CST = 0x75, 35 SCT_CST = 0x75,
34 SCT_RCT = 0x76, 36 SCT_RCT = 0x76,
35 SCT_CIT = 0x77, 37 SCT_CIT = 0x77,
36 SCT_MPE = 0x78, 38 SCT_MPE = 0x78,
37 SCT_DIT = 0x7e, 39 SCT_DIT = 0x7e,
38 SCT_SIT = 0x7f, 40 SCT_SIT = 0x7f,
39}; 41};
40 42
41enum { 43enum {
44 DT_network_name = 0x40,
45 DT_service_list = 0x41,
46 DT_satellite_delivery_system = 0x43,
47 DT_cable_delivery_system = 0x44,
42 DT_service = 0x48, 48 DT_service = 0x48,
43 DT_country_availability = 0x49, 49 DT_country_availability = 0x49,
44 DT_linkage = 0x4a, 50 DT_linkage = 0x4a,
45 DT_short_event = 0x4d, 51 DT_short_event = 0x4d,
46 DT_extended_event = 0x4e, //NYI 52 DT_extended_event = 0x4e, //NYI
47 DT_component = 0x50, 53 DT_component = 0x50,
48 DT_content = 0x54, 54 DT_content = 0x54,
55 DT_terrestrial_delivery_system = 0x5A,
49 DT_private_data_specifier = 0x5f, 56 DT_private_data_specifier = 0x5f,
50 DT_short_smoothing_buffer = 0x61, //NYI 57 DT_short_smoothing_buffer = 0x61, //NYI
51 DT_scrambling_indicator = 0x65, //NYI 58 DT_scrambling_indicator = 0x65, //NYI
52 DT_PDC = 0x69, 59 DT_PDC = 0x69,
53}; 60};
54 61
55static const struct consts { 62static const struct consts {
56 const char *name; 63 const char *name;
57 const long value; 64 const long value;
224 CONST (SCT_CIT), 231 CONST (SCT_CIT),
225 CONST (SCT_MPE), 232 CONST (SCT_MPE),
226 CONST (SCT_DIT), 233 CONST (SCT_DIT),
227 CONST (SCT_SIT), 234 CONST (SCT_SIT),
228 235
236 CONST (DT_network_name),
237 CONST (DT_service_list),
238 CONST (DT_satellite_delivery_system),
239 CONST (DT_cable_delivery_system),
229 CONST (DT_service), 240 CONST (DT_service),
230 CONST (DT_country_availability), 241 CONST (DT_country_availability),
231 CONST (DT_linkage), 242 CONST (DT_linkage),
232 CONST (DT_short_event), 243 CONST (DT_short_event),
233 CONST (DT_extended_event), 244 CONST (DT_extended_event),
234 CONST (DT_component), 245 CONST (DT_component),
235 CONST (DT_content), 246 CONST (DT_content),
247 CONST (DT_terrestrial_delivery_system),
236 CONST (DT_private_data_specifier), 248 CONST (DT_private_data_specifier),
237 CONST (DT_short_smoothing_buffer), 249 CONST (DT_short_smoothing_buffer),
238 CONST (DT_scrambling_indicator), 250 CONST (DT_scrambling_indicator),
239 CONST (DT_PDC), 251 CONST (DT_PDC),
240}; 252};
324{ 336{
325 if (dec_sv) 337 if (dec_sv)
326 SvREFCNT_dec (dec_sv); 338 SvREFCNT_dec (dec_sv);
327 339
328 dec_sv = newSVsv (data); 340 dec_sv = newSVsv (data);
329 dec_data = SvPVbyte (dec_sv, dec_len); 341 dec_data = (u8 *)SvPVbyte (dec_sv, dec_len);
330 dec_ofs = 0; 342 dec_ofs = 0;
331 dec_len8 = dec_len << 3; 343 dec_len8 = dec_len << 3;
332} 344}
333 345
334static U32 346static U32
365} 377}
366 378
367U32 379U32
368clamp (U32 len) 380clamp (U32 len)
369{ 381{
370 return len < 4096 ? len : 0; 382 return len < 4096
383 && len <= dec_len8 - (dec_ofs >> 3) + 1 /* +1 to detect overflows */
384 ? len : 0;
385}
386
387/* works on SvPOK strings ONLY */
388void
389safe_sv_chop (SV *sv, STRLEN count)
390{
391 if ((U32)count >= (U32)SvCUR (sv))
392 SvCUR_set (sv, 0);
393 else
394 sv_chop (sv, SvPVX (sv) + count);
395}
396
397U32
398bcd_to_int (U32 bcd_number)
399{
400 U32 result = 0;
401 U32 multiplicator = 1;
402
403 while (bcd_number != 0)
404 {
405 result += (bcd_number & 0x0f) * multiplicator;
406 bcd_number >>= 4;
407 multiplicator *= 10;
408 }
409
410 return result;
371} 411}
372 412
373static SV * 413static SV *
374text2sv (u8 *data, U32 len) 414text2sv (u8 *data, U32 len)
375{ 415{
376 dSP; 416 dSP;
377 SV *sv = newSVpvn (data, clamp (len)); 417 SV *sv = newSVpvn ((char *)data, clamp (len));
378 418
379 PUSHMARK (SP); 419 PUSHMARK (SP);
380 XPUSHs (sv); 420 XPUSHs (sv);
381 PUTBACK; 421 PUTBACK;
382 call_pv ("Linux::DVB::Decode::text", G_VOID); 422 call_pv ("Linux::DVB::Decode::text", G_VOID);
384 return sv; 424 return sv;
385} 425}
386 426
387#define DEC_I(hv, bits, name) HVS (hv, name, newSViv (decode_field (bits))) 427#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 428#define DEC_T(hv, bytes, name) HVS (hv, name, text2sv (dec_data + (dec_ofs >> 3), clamp (bytes))), dec_ofs += clamp (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 429#define DEC_S(hv, bytes, name) HVS (hv, name, newSVpvn ((char *)dec_data + (dec_ofs >> 3), clamp (bytes))), dec_ofs += clamp (bytes) << 3
390 430
391static AV * 431static AV *
392decode_descriptors (long end) 432decode_descriptors (long end)
393{ 433{
394 AV *av = newAV (); 434 AV *av = newAV ();
410 if (end > dec_len8) 450 if (end > dec_len8)
411 return av; 451 return av;
412 452
413 switch (type) 453 switch (type)
414 { 454 {
455 case DT_network_name:
456 DEC_T (hv, (end - dec_ofs) >> 3, network_name);
457 break;
458
459 case DT_service_list:
460 {
461 AV *services = newAV ();
462 HVS (hv, services, newRV_noinc ((SV *)services));
463
464 while (dec_ofs < end)
465 {
466 HV *sv = newHV ();
467 av_push (services, newRV_noinc ((SV *)sv));
468
469 DEC_I (sv, 16, service_id);
470 DEC_I (sv, 8, service_type);
471
472 }
473 }
474
475 break;
476
477 case DT_satellite_delivery_system:
478 HVS (hv, frequency, newSVuv (bcd_to_int (decode_field (32))));
479 HVS (hv, orbital_position, newSVnv (bcd_to_int (decode_field (32)) / 10));
480 DEC_I (hv, 1, west_east_flag);
481 DEC_I (hv, 2, polarization);
482 DEC_I (hv, 5, modulation);
483 HVS (hv, symbol_rate, newSVuv (bcd_to_int (decode_field (28))));
484 DEC_I (hv, 4, fec_inner);
485 break;
486
487 case DT_cable_delivery_system:
488 {
489 I16 qam_modulation = -1;
490
491 HVS (hv, frequency, newSVuv (bcd_to_int (decode_field (32))));
492 decode_field (12); // reserved
493 DEC_I (hv, 4, fec_outer);
494
495 DEC_I (hv, 8, modulation);
496
497 if (dec_field >= 1 && dec_field <= 5)
498 qam_modulation = 1 << dec_field + 3;
499
500 HVS (hv, modulation_qam, newSViv (qam_modulation));
501
502 HVS (hv, symbol_rate, newSVuv (bcd_to_int (decode_field (28))));
503 DEC_I (hv, 4, fec_inner);
504
505 break;
506 }
507
415 case DT_service: 508 case DT_service:
416 DEC_I (hv, 8, service_type); 509 DEC_I (hv, 8, service_type);
417 len2 = decode_field (8); DEC_T (hv, len2, service_provider_name); 510 len2 = decode_field (8); DEC_T (hv, len2, service_provider_name);
418 len2 = decode_field (8); DEC_T (hv, len2, service_name); 511 len2 = decode_field (8); DEC_T (hv, len2, service_name);
419 break; 512 break;
507 600
508 av_push (av2, newRV_noinc ((SV *)ev)); 601 av_push (av2, newRV_noinc ((SV *)ev));
509 } 602 }
510 603
511 break; 604 break;
605
606 case DT_terrestrial_delivery_system:
607 {
608 I8 bandwidth_mhz = -1;
609
610 HVS (hv, centre_frequency, newSVuv (decode_field (32) * 10));
611
612 DEC_I (hv, 3, bandwidth);
613
614 if (dec_field <= 3)
615 bandwidth_mhz = 8 - dec_field;
616
617 HVS (hv, bandwidth_mhz, newSViv (bandwidth_mhz));
618
619 DEC_I (hv, 1, priority);
620 DEC_I (hv, 1, time_slicing_indicator);
621 DEC_I (hv, 1, mpe_fec_indicator);
622 decode_field (2); // reserved
623 DEC_I (hv, 2, constellation);
624 DEC_I (hv, 3, hierarchy_information);
625 DEC_I (hv, 3, code_rate_hp_stream);
626 DEC_I (hv, 3, code_rate_lp_stream);
627 DEC_I (hv, 2, guard_interval);
628 DEC_I (hv, 2, transmission_mode);
629 DEC_I (hv, 1, other_frequency_use);
630 decode_field (32);
631 }
632 break;
512 633
513 case DT_private_data_specifier: 634 case DT_private_data_specifier:
514 DEC_I (hv, 32, private_data_specifier); 635 DEC_I (hv, 32, private_data_specifier);
515 break; 636 break;
516 637
554 } 675 }
555 676
556MODULE = Linux::DVB PACKAGE = Linux::DVB::Frontend 677MODULE = Linux::DVB PACKAGE = Linux::DVB::Frontend
557 678
558SV * 679SV *
559_frontend_info (int fd) 680frontend_info (FE_fd fd)
560 CODE: 681 CODE:
561 struct dvb_frontend_info fi; 682 struct dvb_frontend_info fi;
562 HV *hv; 683 HV *hv;
563 684
564 if (ioctl (fd, FE_GET_INFO, &fi) < 0) 685 if (ioctl (fd, FE_GET_INFO, &fi) < 0)
581 RETVAL = (SV *)newRV_noinc ((SV *)hv); 702 RETVAL = (SV *)newRV_noinc ((SV *)hv);
582 OUTPUT: 703 OUTPUT:
583 RETVAL 704 RETVAL
584 705
585long 706long
586_read_status (int fd) 707read_status (FE_fd fd)
587 CODE: 708 CODE:
588 fe_status_t st; 709 fe_status_t st;
589 710
590 if (ioctl (fd, FE_READ_STATUS, &st) < 0) 711 if (ioctl (fd, FE_READ_STATUS, &st) < 0)
591 XSRETURN_UNDEF; 712 XSRETURN_UNDEF;
593 RETVAL = st; 714 RETVAL = st;
594 OUTPUT: 715 OUTPUT:
595 RETVAL 716 RETVAL
596 717
597U32 718U32
598_read_ber (int fd) 719read_ber (FE_fd fd)
599 CODE: 720 CODE:
600 uint32_t ber; 721 uint32_t ber;
601 if (ioctl (fd, FE_READ_BER, &ber) < 0) 722 if (ioctl (fd, FE_READ_BER, &ber) < 0)
602 XSRETURN_UNDEF; 723 XSRETURN_UNDEF;
603 724
604 RETVAL = ber; 725 RETVAL = ber;
605 OUTPUT: 726 OUTPUT:
606 RETVAL 727 RETVAL
607 728
608U32 729U32
609_read_snr (int fd) 730read_snr (FE_fd fd)
610 CODE: 731 CODE:
611 uint32_t ber; 732 uint32_t ber;
612 if (ioctl (fd, FE_READ_SNR, &ber) < 0) 733 if (ioctl (fd, FE_READ_SNR, &ber) < 0)
613 XSRETURN_UNDEF; 734 XSRETURN_UNDEF;
614 735
616 OUTPUT: 737 OUTPUT:
617 RETVAL 738 RETVAL
618 739
619 740
620I16 741I16
621_signal_strength (int fd) 742signal_strength (FE_fd fd)
622 CODE: 743 CODE:
623 int16_t st; 744 int16_t st;
624 if (ioctl (fd, FE_READ_SIGNAL_STRENGTH, &st) < 0) 745 if (ioctl (fd, FE_READ_SIGNAL_STRENGTH, &st) < 0)
625 XSRETURN_UNDEF; 746 XSRETURN_UNDEF;
626 747
628 OUTPUT: 749 OUTPUT:
629 RETVAL 750 RETVAL
630 751
631 752
632U32 753U32
633_uncorrected_blocks (int fd) 754uncorrected_blocks (FE_fd fd)
634 CODE: 755 CODE:
635 uint32_t ubl; 756 uint32_t ubl;
636 if (ioctl (fd, FE_READ_UNCORRECTED_BLOCKS, &ubl) < 0) 757 if (ioctl (fd, FE_READ_UNCORRECTED_BLOCKS, &ubl) < 0)
637 XSRETURN_UNDEF; 758 XSRETURN_UNDEF;
638 759
683 804
684 hv = newHV (); 805 hv = newHV ();
685 HVS_I (hv, e, status); 806 HVS_I (hv, e, status);
686 get_parameters (hv, &e.parameters, type); 807 get_parameters (hv, &e.parameters, type);
687 RETVAL = (SV *)newRV_noinc ((SV *)hv); 808 RETVAL = (SV *)newRV_noinc ((SV *)hv);
809 OUTPUT:
810 RETVAL
811
812int
813diseqc_reset_overload (FE_fd fd)
814 CODE:
815 RETVAL = !!ioctl (fd, FE_DISEQC_RESET_OVERLOAD);
816 OUTPUT:
817 RETVAL
818
819int
820diseqc_voltage (FE_fd fd, int volts)
821 CODE:
822 RETVAL = !!ioctl (fd, FE_SET_VOLTAGE, volts == 18
823 ? SEC_VOLTAGE_18
824 : SEC_VOLTAGE_13);
825 OUTPUT:
826 RETVAL
827
828int
829diseqc_tone (FE_fd fd, int on)
830 CODE:
831 RETVAL = !!ioctl (fd, FE_SET_TONE, on ? SEC_TONE_ON : SEC_TONE_OFF);
832 OUTPUT:
833 RETVAL
834
835int
836diseqc_send_burst (FE_fd fd, int type)
837 CODE:
838 RETVAL = !!ioctl (fd, FE_DISEQC_SEND_BURST, type ? SEC_MINI_B : SEC_MINI_A);
839 OUTPUT:
840 RETVAL
841
842int
843diseqc_cmd (FE_fd fd, SV *command_)
844 CODE:
845{
846 STRLEN len;
847 char *command = SvPVbyte (command_, len);
848 struct dvb_diseqc_master_cmd cmd;
849
850 memcpy (cmd.msg, command_, len);
851 cmd.msg_len = len;
852 RETVAL = !!ioctl (fd, FE_DISEQC_SEND_MASTER_CMD, &cmd);
853}
854 OUTPUT:
855 RETVAL
856
857SV *
858diseqc_reply (FE_fd fd, int timeout_ms)
859 CODE:
860{
861 struct dvb_diseqc_slave_reply rep;
862 rep.timeout = timeout_ms;
863
864 if (!!ioctl (fd, FE_DISEQC_RECV_SLAVE_REPLY, &rep))
865 RETVAL = newSVpvn ((char *)rep.msg, rep.msg_len);
866 else
867 RETVAL = &PL_sv_undef;
868}
688 OUTPUT: 869 OUTPUT:
689 RETVAL 870 RETVAL
690 871
691MODULE = Linux::DVB PACKAGE = Linux::DVB::Demux 872MODULE = Linux::DVB PACKAGE = Linux::DVB::Demux
692 873
752 RETVAL 933 RETVAL
753 934
754MODULE = Linux::DVB PACKAGE = Linux::DVB::Decode PREFIX = decode_ 935MODULE = Linux::DVB PACKAGE = Linux::DVB::Decode PREFIX = decode_
755 936
756void 937void
757set (SV *data) 938decode_set (SV *data)
758 CODE: 939 CODE:
759 940
760int 941int
761len () 942decode_len ()
762 CODE: 943 CODE:
763 RETVAL = (dec_ofs + 7) >> 3; 944 RETVAL = (dec_ofs + 7) >> 3;
764 OUTPUT: 945 OUTPUT:
765 RETVAL 946 RETVAL
766 947
767U32 948U32
768field (int bits) 949decode_field (int bits)
769 950
770SV * 951SV *
771si (SV *stream) 952decode_si (SV *stream)
772 CODE: 953 CODE:
773 HV *hv = newHV (); 954 HV *hv = newHV ();
774 955
956 int syntax_indicator;
775 U8 table_id; 957 U8 table_id;
776 U16 length; 958 U16 length;
777 long end; 959 long end;
778 960
779 decode_set (stream); 961 decode_set (stream);
781 do { 963 do {
782 DEC_I (hv, 8, table_id); 964 DEC_I (hv, 8, table_id);
783 table_id = dec_field; 965 table_id = dec_field;
784 } while (table_id == 0xff); 966 } while (table_id == 0xff);
785 967
786 DEC_I (hv, 1, section_syntax_indicator); 968 syntax_indicator = decode_field (1);
969 HVS (hv, section_syntax_indicator, newSViv (syntax_indicator));
970
787 decode_field (1); 971 decode_field (1);
788 decode_field (2); 972 decode_field (2);
789 973
790 length = decode_field (12); 974 length = decode_field (12);
791 end = dec_ofs + (length << 3); 975 end = dec_ofs + (length << 3);
792 976
977 if (syntax_indicator)
978 {
793 switch (table_id) 979 switch (table_id)
794 { 980 {
981 case SCT_NIT:
982 {
983 U16 descriptor_end_offset;
984
985 DEC_I (hv, 16, network_id);
986 decode_field (2); // reserved
987 DEC_I (hv, 5, version_number);
988 DEC_I (hv, 1, current_next_indicator);
989 DEC_I (hv, 8, section_number);
990 DEC_I (hv, 8, last_section_number);
991 decode_field (4); // reserved
992
993 AV *desc;
994 descriptor_end_offset = dec_ofs + (decode_field (12) << 3);
995 desc = decode_descriptors (descriptor_end_offset);
996 HVS (hv,network_descriptors, newRV_noinc ((SV *)desc));
997
998 decode_field (4); //reserved
999 decode_field (12); // Skip length, we read until the end
1000
1001 AV *events = newAV ();
1002 HVS (hv, events, newRV_noinc ((SV *)events));
1003 while (end - dec_ofs > 32)
1004 {
1005 long dll;
1006 HV *ev = newHV ();
1007 av_push (events, newRV_noinc ((SV *)ev));
1008
1009 DEC_I (ev, 16, transport_stream_id);
1010 DEC_I (ev, 16, original_network_id);
1011 decode_field (4);
1012
1013 dll = dec_ofs + (decode_field (12) << 3);
1014 desc = decode_descriptors (dll);
1015 HVS (ev, descriptors, newRV_noinc ((SV *)desc));
1016 }
1017
1018 decode_field (32); // skip CRC
1019 }
1020
1021 break;
1022
795 case SCT_EIT_PRESENT: 1023 case SCT_EIT_PRESENT:
796 case SCT_EIT_PRESENT_OTHER: 1024 case SCT_EIT_PRESENT_OTHER:
797 case SCT_EIT_SCHEDULE0...SCT_EIT_SCHEDULE15: //GCC 1025 case SCT_EIT_SCHEDULE0...SCT_EIT_SCHEDULE15: //GCC
798 case SCT_EIT_SCHEDULE_OTHER0...SCT_EIT_SCHEDULE_OTHER15: //GCC 1026 case SCT_EIT_SCHEDULE_OTHER0...SCT_EIT_SCHEDULE_OTHER15: //GCC
799 DEC_I (hv, 16, service_id);
800 decode_field (2);
801 DEC_I (hv, 5, version_number);
802 DEC_I (hv, 1, current_next_indicator);
803 DEC_I (hv, 8, section_number);
804 DEC_I (hv, 8, last_section_number);
805 DEC_I (hv, 16, transport_stream_id);
806 DEC_I (hv, 16, original_network_id);
807 DEC_I (hv, 8, segment_last_section_number);
808 DEC_I (hv, 8, last_table_id);
809
810 AV *events = newAV ();
811 HVS (hv, events, newRV_noinc ((SV *)events));
812
813 while (end - dec_ofs > 32)
814 {
815 long dll;
816 AV *desc;
817 HV *ev = newHV ();
818 av_push (events, newRV_noinc ((SV *)ev));
819
820 DEC_I (ev, 16, event_id);
821 DEC_I (ev, 16, start_time_mjd);
822 DEC_I (ev, 24, start_time_hms);
823 DEC_I (ev, 24, duration);
824 DEC_I (ev, 3, running_status);
825 DEC_I (ev, 1, free_CA_mode);
826
827 dll = dec_ofs + (decode_field (12) << 3);
828
829 desc = decode_descriptors (dll);
830 HVS (ev, descriptors, newRV_noinc ((SV *)desc));
831 }
832
833 decode_field (32); // skip CRC
834
835 break;
836
837 case SCT_SDT:
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);
847
848 AV *services = newAV ();
849 HVS (hv, services, newRV_noinc ((SV *)services));
850
851 while (end - dec_ofs > 32)
852 {
853 HV *ev = newHV ();
854 U32 dll;
855 AV *desc;
856 av_push (services, newRV_noinc ((SV *)ev));
857
858 DEC_I (ev, 16, service_id); 1027 DEC_I (hv, 16, service_id);
859 decode_field (6); 1028 decode_field (2);
860 DEC_I (ev, 1, EIT_schedule_flags); 1029 DEC_I (hv, 5, version_number);
861 DEC_I (ev, 1, EIT_present_following_flag); 1030 DEC_I (hv, 1, current_next_indicator);
1031 DEC_I (hv, 8, section_number);
1032 DEC_I (hv, 8, last_section_number);
1033 DEC_I (hv, 16, transport_stream_id);
1034 DEC_I (hv, 16, original_network_id);
1035 DEC_I (hv, 8, segment_last_section_number);
1036 DEC_I (hv, 8, last_table_id);
1037
1038 AV *events = newAV ();
1039 HVS (hv, events, newRV_noinc ((SV *)events));
1040
1041 while (end - dec_ofs > 32)
1042 {
1043 long dll;
1044 AV *desc;
1045 HV *ev = newHV ();
1046 av_push (events, newRV_noinc ((SV *)ev));
1047
1048 DEC_I (ev, 16, event_id);
1049 DEC_I (ev, 16, start_time_mjd);
1050 DEC_I (ev, 24, start_time_hms);
1051 DEC_I (ev, 24, duration);
862 DEC_I (ev, 3, running_status); 1052 DEC_I (ev, 3, running_status);
863 DEC_I (ev, 1, free_CA_mode); 1053 DEC_I (ev, 1, free_CA_mode);
864 1054
865 dll = dec_ofs + (decode_field (12) << 3); 1055 dll = dec_ofs + (decode_field (12) << 3);
866 1056
867 desc = decode_descriptors (dll); 1057 desc = decode_descriptors (dll);
868 HVS (ev, descriptors, newRV_noinc ((SV *)desc)); 1058 HVS (ev, descriptors, newRV_noinc ((SV *)desc));
869 } 1059 }
870 1060
871 decode_field (32); // skip CRC 1061 decode_field (32); // skip CRC
1062
872 break; 1063 break;
873 1064
1065 case SCT_SDT:
1066 case SCT_SDT_OTHER:
1067 DEC_I (hv, 16, transport_stream_id);
1068 decode_field (2);
1069 DEC_I (hv, 5, version_number);
1070 DEC_I (hv, 1, current_next_indicator);
1071 DEC_I (hv, 8, section_number);
1072 DEC_I (hv, 8, last_section_number);
1073 DEC_I (hv, 16, original_network_id);
1074 decode_field (8);
1075
1076 AV *services = newAV ();
1077 HVS (hv, services, newRV_noinc ((SV *)services));
1078
1079 while (end - dec_ofs > 32)
1080 {
1081 HV *ev = newHV ();
1082 U32 dll;
1083 AV *desc;
1084 av_push (services, newRV_noinc ((SV *)ev));
1085
1086 DEC_I (ev, 16, service_id);
1087 decode_field (6);
1088 DEC_I (ev, 1, EIT_schedule_flags);
1089 DEC_I (ev, 1, EIT_present_following_flag);
1090 DEC_I (ev, 3, running_status);
1091 DEC_I (ev, 1, free_CA_mode);
1092
1093 dll = dec_ofs + (decode_field (12) << 3);
1094
1095 desc = decode_descriptors (dll);
1096 HVS (ev, descriptors, newRV_noinc ((SV *)desc));
1097 }
1098
1099 decode_field (32); // skip CRC
1100 break;
1101
874 default: 1102 default:
875 DEC_S (hv, length, raw_data); 1103 DEC_S (hv, length, raw_data);
876 break; 1104 break;
1105 }
1106
1107 if (decode_overflow)
1108 {
1109 SvREFCNT_dec (hv);
1110 safe_sv_chop (stream, (end + 7) >> 3);
1111 XSRETURN_UNDEF;
1112 }
1113
1114 safe_sv_chop (stream, (dec_ofs + 7) >> 3);
877 } 1115 }
878 1116 else
879 if (decode_overflow)
880 { 1117 {
881 SvREFCNT_dec (hv); 1118 SvREFCNT_dec (hv);
1119 safe_sv_chop (stream, (end + 7) >> 3);
882 XSRETURN_UNDEF; 1120 XSRETURN_UNDEF;
883 } 1121 }
884 1122
885 sv_chop (stream, SvPVX (stream) + ((dec_ofs + 7) >> 3));
886
887 RETVAL = (SV *)newRV_noinc ((SV *)hv); 1123 RETVAL = (SV *)newRV_noinc ((SV *)hv);
888 OUTPUT: 1124 OUTPUT:
889 RETVAL 1125 RETVAL
890 1126

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines