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.7 by root, Mon Feb 25 04:53:35 2008 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;
175 CONST (DMX_PES_VIDEO), 182 CONST (DMX_PES_VIDEO),
176 CONST (DMX_PES_TELETEXT), 183 CONST (DMX_PES_TELETEXT),
177 CONST (DMX_PES_SUBTITLE), 184 CONST (DMX_PES_SUBTITLE),
178 CONST (DMX_PES_PCR), 185 CONST (DMX_PES_PCR),
179 186
180 CONST (DMX_SCRAMBLING_EV), 187 //CONST (DMX_SCRAMBLING_EV),
181 CONST (DMX_FRONTEND_EV), 188 //CONST (DMX_FRONTEND_EV),
182 189
183 CONST (DMX_CHECK_CRC), 190 CONST (DMX_CHECK_CRC),
184 CONST (DMX_ONESHOT), 191 CONST (DMX_ONESHOT),
185 CONST (DMX_IMMEDIATE_START), 192 CONST (DMX_IMMEDIATE_START),
186 CONST (DMX_KERNEL_CLIENT), 193 CONST (DMX_KERNEL_CLIENT),
193 CONST (DMX_SOURCE_DVR0), 200 CONST (DMX_SOURCE_DVR0),
194 CONST (DMX_SOURCE_DVR1), 201 CONST (DMX_SOURCE_DVR1),
195 CONST (DMX_SOURCE_DVR2), 202 CONST (DMX_SOURCE_DVR2),
196 CONST (DMX_SOURCE_DVR3), 203 CONST (DMX_SOURCE_DVR3),
197 204
198 CONST (DMX_SCRAMBLING_OFF), 205 //CONST (DMX_SCRAMBLING_OFF),
199 CONST (DMX_SCRAMBLING_ON), 206 //CONST (DMX_SCRAMBLING_ON),
200 207
201 // constants defined by this file 208 // constants defined by this file
202 CONST (SCT_PAT), 209 CONST (SCT_PAT),
203 CONST (SCT_CAT), 210 CONST (SCT_CAT),
204 CONST (SCT_PMT), 211 CONST (SCT_PMT),
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 case SCT_NIT_OTHER:
983 {
984 U16 descriptor_end_offset;
985
986 DEC_I (hv, 16, network_id);
987 decode_field (2); // reserved
988 DEC_I (hv, 5, version_number);
989 DEC_I (hv, 1, current_next_indicator);
990 DEC_I (hv, 8, section_number);
991 DEC_I (hv, 8, last_section_number);
992 decode_field (4); // reserved
993
994 AV *desc;
995 descriptor_end_offset = dec_ofs + (decode_field (12) << 3);
996 desc = decode_descriptors (descriptor_end_offset);
997 HVS (hv,network_descriptors, newRV_noinc ((SV *)desc));
998
999 decode_field (4); //reserved
1000 decode_field (12); // Skip length, we read until the end
1001
1002 AV *events = newAV ();
1003 HVS (hv, events, newRV_noinc ((SV *)events));
1004 while (end - dec_ofs > 32)
1005 {
1006 long dll;
1007 HV *ev = newHV ();
1008 av_push (events, newRV_noinc ((SV *)ev));
1009
1010 DEC_I (ev, 16, transport_stream_id);
1011 DEC_I (ev, 16, original_network_id);
1012 decode_field (4);
1013
1014 dll = dec_ofs + (decode_field (12) << 3);
1015 desc = decode_descriptors (dll);
1016 HVS (ev, descriptors, newRV_noinc ((SV *)desc));
1017 }
1018
1019 decode_field (32); // skip CRC
1020 }
1021
1022 break;
1023
795 case SCT_EIT_PRESENT: 1024 case SCT_EIT_PRESENT:
796 case SCT_EIT_PRESENT_OTHER: 1025 case SCT_EIT_PRESENT_OTHER:
797 case SCT_EIT_SCHEDULE0...SCT_EIT_SCHEDULE15: //GCC 1026 case SCT_EIT_SCHEDULE0...SCT_EIT_SCHEDULE15: //GCC
798 case SCT_EIT_SCHEDULE_OTHER0...SCT_EIT_SCHEDULE_OTHER15: //GCC 1027 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);
859 decode_field (6);
860 DEC_I (ev, 1, EIT_schedule_flags);
861 DEC_I (ev, 1, EIT_present_following_flag);
862 DEC_I (ev, 3, running_status);
863 DEC_I (ev, 1, free_CA_mode);
864
865 dll = dec_ofs + (decode_field (12) << 3);
866 1028 {
1029 DEC_I (hv, 16, service_id);
1030 decode_field (2);
1031 DEC_I (hv, 5, version_number);
1032 DEC_I (hv, 1, current_next_indicator);
1033 DEC_I (hv, 8, section_number);
1034 DEC_I (hv, 8, last_section_number);
1035 DEC_I (hv, 16, transport_stream_id);
1036 DEC_I (hv, 16, original_network_id);
1037 DEC_I (hv, 8, segment_last_section_number);
1038 DEC_I (hv, 8, last_table_id);
1039
1040 AV *events = newAV ();
1041 HVS (hv, events, newRV_noinc ((SV *)events));
1042
1043 while (end - dec_ofs > 32)
1044 {
1045 long dll;
1046 AV *desc;
1047 HV *ev = newHV ();
1048 av_push (events, newRV_noinc ((SV *)ev));
1049
1050 DEC_I (ev, 16, event_id);
1051 DEC_I (ev, 16, start_time_mjd);
1052 DEC_I (ev, 24, start_time_hms);
1053 DEC_I (ev, 24, duration);
1054 DEC_I (ev, 3, running_status);
1055 DEC_I (ev, 1, free_CA_mode);
1056
1057 dll = dec_ofs + (decode_field (12) << 3);
1058
1059 desc = decode_descriptors (dll);
1060 HVS (ev, descriptors, newRV_noinc ((SV *)desc));
1061 }
1062
1063 decode_field (32); // skip CRC
1064 }
1065
1066 break;
1067
1068 case SCT_SDT:
1069 case SCT_SDT_OTHER:
1070 DEC_I (hv, 16, transport_stream_id);
1071 decode_field (2);
1072 DEC_I (hv, 5, version_number);
1073 DEC_I (hv, 1, current_next_indicator);
1074 DEC_I (hv, 8, section_number);
1075 DEC_I (hv, 8, last_section_number);
1076 DEC_I (hv, 16, original_network_id);
1077 decode_field (8);
1078
1079 AV *services = newAV ();
1080 HVS (hv, services, newRV_noinc ((SV *)services));
1081
1082 while (end - dec_ofs > 32)
1083 {
1084 HV *ev = newHV ();
1085 U32 dll;
1086 AV *desc;
1087 av_push (services, newRV_noinc ((SV *)ev));
1088
1089 DEC_I (ev, 16, service_id);
1090 decode_field (6);
1091 DEC_I (ev, 1, EIT_schedule_flags);
1092 DEC_I (ev, 1, EIT_present_following_flag);
1093 DEC_I (ev, 3, running_status);
1094 DEC_I (ev, 1, free_CA_mode);
1095
1096 dll = dec_ofs + (decode_field (12) << 3);
1097
867 desc = decode_descriptors (dll); 1098 desc = decode_descriptors (dll);
868 HVS (ev, descriptors, newRV_noinc ((SV *)desc)); 1099 HVS (ev, descriptors, newRV_noinc ((SV *)desc));
869 } 1100 }
870 1101
871 decode_field (32); // skip CRC 1102 decode_field (32); // skip CRC
872 break; 1103 break;
873 1104
874 default: 1105 default:
875 DEC_S (hv, length, raw_data); 1106 DEC_S (hv, length, raw_data);
876 break; 1107 break;
1108 }
1109
1110 if (decode_overflow)
1111 {
1112 SvREFCNT_dec (hv);
1113 safe_sv_chop (stream, (end + 7) >> 3);
1114 XSRETURN_UNDEF;
1115 }
1116
1117 safe_sv_chop (stream, (dec_ofs + 7) >> 3);
877 } 1118 }
878 1119 else
879 if (decode_overflow)
880 { 1120 {
881 SvREFCNT_dec (hv); 1121 SvREFCNT_dec (hv);
1122 safe_sv_chop (stream, (end + 7) >> 3);
882 XSRETURN_UNDEF; 1123 XSRETURN_UNDEF;
883 } 1124 }
884 1125
885 sv_chop (stream, SvPVX (stream) + ((dec_ofs + 7) >> 3));
886
887 RETVAL = (SV *)newRV_noinc ((SV *)hv); 1126 RETVAL = (SV *)newRV_noinc ((SV *)hv);
888 OUTPUT: 1127 OUTPUT:
889 RETVAL 1128 RETVAL
890 1129

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines