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.2 by root, Wed Sep 8 19:47:30 2004 UTC vs.
Revision 1.5 by root, Wed May 24 17:17:16 2006 UTC

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
12enum { 12enum {
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,//TODO 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,//TODO 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,
27 SCT_EIT_SCHEDULE_OTHER15 = 0x6f, 27 SCT_EIT_SCHEDULE_OTHER15 = 0x6f,
28 SCT_TDT = 0x70, 28 SCT_TDT = 0x70,
29 SCT_RST = 0x71, 29 SCT_RST = 0x71,
30 SCT_ST = 0x72, 30 SCT_ST = 0x72,
31 SCT_TOT = 0x73, 31 SCT_TOT = 0x73,
32 SCT_RNT = 0x74, 32 SCT_RNT = 0x74,
33 SCT_CST = 0x75, 33 SCT_CST = 0x75,
34 SCT_RCT = 0x76, 34 SCT_RCT = 0x76,
35 SCT_CIT = 0x77, 35 SCT_CIT = 0x77,
36 SCT_MPE = 0x78, 36 SCT_MPE = 0x78,
37 SCT_DIT = 0x7e, 37 SCT_DIT = 0x7e,
38 SCT_SIT = 0x7f, 38 SCT_SIT = 0x7f,
39}; 39};
40 40
41enum { 41enum {
42 DT_network_name = 0x40,
43 DT_service_list = 0x41,
44 DT_satellite_delivery_system = 0x43,
45 DT_cable_delivery_system = 0x44,
42 DT_service = 0x48, 46 DT_service = 0x48,
43 DT_country_availability = 0x49, 47 DT_country_availability = 0x49,
44 DT_linkage = 0x4a, 48 DT_linkage = 0x4a,
45 DT_short_event = 0x4d, 49 DT_short_event = 0x4d,
46 DT_extended_event = 0x4e, //NYI 50 DT_extended_event = 0x4e, //NYI
47 DT_component = 0x50, 51 DT_component = 0x50,
48 DT_content = 0x54, 52 DT_content = 0x54,
53 DT_terrestrial_delivery_system = 0x5A,
49 DT_private_data_specifier = 0x5f, 54 DT_private_data_specifier = 0x5f,
50 DT_short_smoothing_buffer = 0x61, //NYI 55 DT_short_smoothing_buffer = 0x61, //NYI
51 DT_scrambling_indicator = 0x65, //NYI 56 DT_scrambling_indicator = 0x65, //NYI
52 DT_PDC = 0x69, 57 DT_PDC = 0x69,
53}; 58};
54 59
55static const struct consts { 60static const struct consts {
56 const char *name; 61 const char *name;
57 const long value; 62 const long value;
224 CONST (SCT_CIT), 229 CONST (SCT_CIT),
225 CONST (SCT_MPE), 230 CONST (SCT_MPE),
226 CONST (SCT_DIT), 231 CONST (SCT_DIT),
227 CONST (SCT_SIT), 232 CONST (SCT_SIT),
228 233
234 CONST (DT_network_name),
235 CONST (DT_service_list),
236 CONST (DT_satellite_delivery_system),
237 CONST (DT_cable_delivery_system),
229 CONST (DT_service), 238 CONST (DT_service),
230 CONST (DT_country_availability), 239 CONST (DT_country_availability),
231 CONST (DT_linkage), 240 CONST (DT_linkage),
232 CONST (DT_short_event), 241 CONST (DT_short_event),
233 CONST (DT_extended_event), 242 CONST (DT_extended_event),
234 CONST (DT_component), 243 CONST (DT_component),
235 CONST (DT_content), 244 CONST (DT_content),
245 CONST (DT_terrestrial_delivery_system),
236 CONST (DT_private_data_specifier), 246 CONST (DT_private_data_specifier),
237 CONST (DT_short_smoothing_buffer), 247 CONST (DT_short_smoothing_buffer),
238 CONST (DT_scrambling_indicator), 248 CONST (DT_scrambling_indicator),
239 CONST (DT_PDC), 249 CONST (DT_PDC),
240}; 250};
242#define HVS_S(hv,struct,member) hv_store (hv, #member, sizeof (#member) - 1, newSVpv (struct.member, 0), 0) 252#define HVS_S(hv,struct,member) hv_store (hv, #member, sizeof (#member) - 1, newSVpv (struct.member, 0), 0)
243#define HVS_I(hv,struct,member) hv_store (hv, #member, sizeof (#member) - 1, newSViv (struct.member), 0) 253#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) 254#define HVS(hv,name,sv) hv_store (hv, #name, sizeof (#name) - 1, (sv), 0)
245 255
246static void 256static void
247set_parameters (HV *hv, struct dvb_frontend_parameters *p, fe_type_t type) 257get_parameters (HV *hv, struct dvb_frontend_parameters *p, fe_type_t type)
248{ 258{
249 HVS_I (hv, (*p), frequency); 259 HVS_I (hv, (*p), frequency);
250 HVS_I (hv, (*p), inversion); 260 HVS_I (hv, (*p), inversion);
251 261
252 switch (type) 262 switch (type)
270 HVS_I (hv, (*p).u.ofdm, transmission_mode); 280 HVS_I (hv, (*p).u.ofdm, transmission_mode);
271 break; 281 break;
272 } 282 }
273} 283}
274 284
285#define HVF_I(hv,struct,member) \
286 if (v = hv_fetch (hv, #member, sizeof (#member) - 1, 0)) \
287 struct.member = SvIV (*v); \
288 else \
289 croak ("required hash key '%s' not specified", #member);
290
291static void
292set_parameters (HV *hv, struct dvb_frontend_parameters *p, fe_type_t type)
293{
294 SV **v;
295
296 HVF_I (hv, (*p), frequency);
297 HVF_I (hv, (*p), inversion);
298
299 switch (type)
300 {
301 case FE_QPSK:
302 HVF_I (hv, (*p).u.qpsk, symbol_rate);
303 HVF_I (hv, (*p).u.qpsk, fec_inner);
304 break;
305
306 case FE_QAM:
307 HVF_I (hv, (*p).u.qam, symbol_rate);
308 HVF_I (hv, (*p).u.qam, fec_inner);
309 HVF_I (hv, (*p).u.qam, modulation);
310 break;
311
312 case FE_OFDM:
313 HVF_I (hv, (*p).u.ofdm, bandwidth);
314 HVF_I (hv, (*p).u.ofdm, code_rate_HP);
315 HVF_I (hv, (*p).u.ofdm, code_rate_LP);
316 HVF_I (hv, (*p).u.ofdm, constellation);
317 HVF_I (hv, (*p).u.ofdm, transmission_mode);
318 break;
319 }
320}
321
275typedef unsigned char u8; 322typedef unsigned char u8;
276 323
277static SV *dec_sv; 324static SV *dec_sv;
278static u8 *dec_data; 325static u8 *dec_data;
279static long dec_ofs, dec_len8; 326static long dec_ofs, dec_len8;
287{ 334{
288 if (dec_sv) 335 if (dec_sv)
289 SvREFCNT_dec (dec_sv); 336 SvREFCNT_dec (dec_sv);
290 337
291 dec_sv = newSVsv (data); 338 dec_sv = newSVsv (data);
292 dec_data = SvPVbyte (dec_sv, dec_len); 339 dec_data = (u8 *)SvPVbyte (dec_sv, dec_len);
293 dec_ofs = 0; 340 dec_ofs = 0;
294 dec_len8 = dec_len << 3; 341 dec_len8 = dec_len << 3;
295} 342}
296 343
297static U32 344static U32
325 } 372 }
326 373
327 return dec_field = r; 374 return dec_field = r;
328} 375}
329 376
377U32
378clamp (U32 len)
379{
380 return len < 4096
381 && len <= dec_len8 - (dec_ofs >> 3) + 1 /* +1 to detect overflows */
382 ? len : 0;
383}
384
385/* works on SvPOK strings ONLY */
386void
387safe_sv_chop (SV *sv, STRLEN count)
388{
389 if ((U32)count >= (U32)SvCUR (sv))
390 SvCUR_set (sv, 0);
391 else
392 sv_chop (sv, SvPVX (sv) + count);
393}
394
395U32
396bcd_to_int (U32 bcd_number)
397{
398 U32 result = 0;
399 U32 multiplicator = 1;
400
401 while (bcd_number != 0)
402 {
403 result += (bcd_number & 0x0f) * multiplicator;
404 bcd_number >>= 4;
405 multiplicator *= 10;
406 }
407
408 return result;
409}
410
330static SV * 411static SV *
331text2sv (u8 *data, U32 len) 412text2sv (u8 *data, U32 len)
332{ 413{
333 dSP; 414 dSP;
334 SV *sv = newSVpvn (data, len); 415 SV *sv = newSVpvn ((char *)data, clamp (len));
335 416
336 PUSHMARK (SP); 417 PUSHMARK (SP);
337 XPUSHs (sv); 418 XPUSHs (sv);
338 PUTBACK; 419 PUTBACK;
339 call_pv ("Linux::DVB::Decode::text", G_VOID); 420 call_pv ("Linux::DVB::Decode::text", G_VOID);
340 421
341 return sv; 422 return sv;
342} 423}
343 424
344#define DEC_I(hv, bits, name) HVS (hv, name, newSViv (decode_field (bits))) 425#define DEC_I(hv, bits, name) HVS (hv, name, newSViv (decode_field (bits)))
345#define DEC_T(hv, bytes, name) HVS (hv, name, text2sv (dec_data + (dec_ofs >> 3), (bytes))), dec_ofs += (bytes) << 3 426#define DEC_T(hv, bytes, name) HVS (hv, name, text2sv (dec_data + (dec_ofs >> 3), clamp (bytes))), dec_ofs += clamp (bytes) << 3
346#define DEC_S(hv, bytes, name) HVS (hv, name, newSVpvn (dec_data + (dec_ofs >> 3), (bytes))), dec_ofs += (bytes) << 3 427#define DEC_S(hv, bytes, name) HVS (hv, name, newSVpvn ((char *)dec_data + (dec_ofs >> 3), clamp (bytes))), dec_ofs += clamp (bytes) << 3
347 428
348static AV * 429static AV *
349decode_descriptors (long end) 430decode_descriptors (long end)
350{ 431{
351 AV *av = newAV (); 432 AV *av = newAV ();
367 if (end > dec_len8) 448 if (end > dec_len8)
368 return av; 449 return av;
369 450
370 switch (type) 451 switch (type)
371 { 452 {
453 case DT_network_name:
454 DEC_T (hv, (end - dec_ofs) >> 3, network_name);
455 break;
456
457 case DT_service_list:
458 {
459 AV *services = newAV ();
460 HVS (hv, services, newRV_noinc ((SV *)services));
461
462 while (dec_ofs < end)
463 {
464 HV *sv = newHV ();
465 av_push (services, newRV_noinc ((SV *)sv));
466
467 DEC_I (sv, 16, service_id);
468 DEC_I (sv, 8, service_type);
469
470 }
471 }
472
473 break;
474
475 case DT_satellite_delivery_system:
476 HVS (hv, frequency, newSVuv (bcd_to_int (decode_field (32))));
477 HVS (hv, orbital_position, newSVnv (bcd_to_int (decode_field (32)) / 10));
478 DEC_I (hv, 1, west_east_flag);
479 DEC_I (hv, 2, polarization);
480 DEC_I (hv, 5, modulation);
481 HVS (hv, symbol_rate, newSVuv (bcd_to_int (decode_field (28))));
482 DEC_I (hv, 4, fec_inner);
483 break;
484
485 case DT_cable_delivery_system:
486 {
487 I16 qam_modulation = -1;
488
489 HVS (hv, frequency, newSVuv (bcd_to_int (decode_field (32))));
490 decode_field (12); // reserved
491 DEC_I (hv, 4, fec_outer);
492
493 DEC_I (hv, 8, modulation);
494
495 if (dec_field >= 1 && dec_field <= 5)
496 qam_modulation = 1 << dec_field + 3;
497
498 HVS (hv, modulation_qam, newSViv (qam_modulation));
499
500 HVS (hv, symbol_rate, newSVuv (bcd_to_int (decode_field (28))));
501 DEC_I (hv, 4, fec_inner);
502
503 break;
504 }
505
372 case DT_service: 506 case DT_service:
373 DEC_I (hv, 8, service_type); 507 DEC_I (hv, 8, service_type);
374 len2 = decode_field (8); DEC_T (hv, len2, service_provider_name); 508 len2 = decode_field (8); DEC_T (hv, len2, service_provider_name);
375 len2 = decode_field (8); DEC_T (hv, len2, service_name); 509 len2 = decode_field (8); DEC_T (hv, len2, service_name);
376 break; 510 break;
448 582
449 len2 = decode_field (8); DEC_T (hv, len2, text); 583 len2 = decode_field (8); DEC_T (hv, len2, text);
450 break; 584 break;
451 585
452 case DT_content: 586 case DT_content:
453 DEC_S (hv, len, content); 587 av2 = newAV ();
588 HVS (hv, items, newRV_noinc ((SV *)av2));
589
590 while (dec_ofs < end)
591 {
592 HV *ev = newHV ();
593
594 DEC_I (ev, 4, content_nibble_level_1);
595 DEC_I (ev, 4, content_nibble_level_2);
596 DEC_I (ev, 4, user_nibble_1);
597 DEC_I (ev, 4, user_nibble_2);
598
599 av_push (av2, newRV_noinc ((SV *)ev));
600 }
601
454 break; 602 break;
603
604 case DT_terrestrial_delivery_system:
605 {
606 I8 bandwidth_mhz = -1;
607
608 HVS (hv, centre_frequency, newSVuv (decode_field (32) * 10));
609
610 DEC_I (hv, 3, bandwidth);
611
612 if (dec_field <= 3)
613 bandwidth_mhz = 8 - dec_field;
614
615 HVS (hv, bandwidth_mhz, newSViv (bandwidth_mhz));
616
617 DEC_I (hv, 1, priority);
618 DEC_I (hv, 1, time_slicing_indicator);
619 DEC_I (hv, 1, mpe_fec_indicator);
620 decode_field (2); // reserved
621 DEC_I (hv, 2, constellation);
622 DEC_I (hv, 3, hierarchy_information);
623 DEC_I (hv, 3, code_rate_hp_stream);
624 DEC_I (hv, 3, code_rate_lp_stream);
625 DEC_I (hv, 2, guard_interval);
626 DEC_I (hv, 2, transmission_mode);
627 DEC_I (hv, 1, other_frequency_use);
628 decode_field (32);
629 }
630 break;
455 631
456 case DT_private_data_specifier: 632 case DT_private_data_specifier:
457 DEC_I (hv, 32, private_data_specifier); 633 DEC_I (hv, 32, private_data_specifier);
458 break; 634 break;
459 635
460 default: 636 default:
461 fprintf (stderr, "UNKXXX %x\n", type);//D 637 //fprintf (stderr, "UNKXXX %x\n", type);//D
638
462 case 0: 639 case 0:
463 case 0x80: 640 case 0x80:
464 case 0x81: 641 case 0x81:
465 case 0x82: 642 case 0x82:
466 case 0x83: 643 case 0x83:
580 757
581 RETVAL = ubl; 758 RETVAL = ubl;
582 OUTPUT: 759 OUTPUT:
583 RETVAL 760 RETVAL
584 761
762int
763_set (int fd, SV *parameters, int type)
764 CODE:
765 struct dvb_frontend_parameters p;
766
767 if (!SvROK (parameters) || SvTYPE (SvRV (parameters)) != SVt_PVHV)
768 croak ("Linux::DVB::Frontend::set requires a hash as argument");
769
770 set_parameters ((HV *)SvRV (parameters), &p, type);
771
772 if (ioctl (fd, FE_SET_FRONTEND, &p) < 0)
773 XSRETURN_UNDEF;
774
775 RETVAL = 1;
776 OUTPUT:
777 RETVAL
778
585SV * 779SV *
586_get (int fd, int type) 780_get (int fd, int type)
587 CODE: 781 CODE:
588 struct dvb_frontend_parameters p; 782 struct dvb_frontend_parameters p;
589 HV *hv; 783 HV *hv;
590 784
591 if (ioctl (fd, FE_GET_FRONTEND, &p) < 0) 785 if (ioctl (fd, FE_GET_FRONTEND, &p) < 0)
592 XSRETURN_UNDEF; 786 XSRETURN_UNDEF;
593 787
594 hv = newHV (); 788 hv = newHV ();
595 set_parameters (hv, &p, type); 789 get_parameters (hv, &p, type);
596 RETVAL = (SV *)newRV_noinc ((SV *)hv); 790 RETVAL = (SV *)newRV_noinc ((SV *)hv);
597 OUTPUT: 791 OUTPUT:
598 RETVAL 792 RETVAL
599 793
600SV * 794SV *
606 if (ioctl (fd, FE_GET_EVENT, &e) < 0) 800 if (ioctl (fd, FE_GET_EVENT, &e) < 0)
607 XSRETURN_UNDEF; 801 XSRETURN_UNDEF;
608 802
609 hv = newHV (); 803 hv = newHV ();
610 HVS_I (hv, e, status); 804 HVS_I (hv, e, status);
611 set_parameters (hv, &e.parameters, type); 805 get_parameters (hv, &e.parameters, type);
612 RETVAL = (SV *)newRV_noinc ((SV *)hv); 806 RETVAL = (SV *)newRV_noinc ((SV *)hv);
613 OUTPUT: 807 OUTPUT:
614 RETVAL 808 RETVAL
615 809
616MODULE = Linux::DVB PACKAGE = Linux::DVB::Demux 810MODULE = Linux::DVB PACKAGE = Linux::DVB::Demux
677 RETVAL 871 RETVAL
678 872
679MODULE = Linux::DVB PACKAGE = Linux::DVB::Decode PREFIX = decode_ 873MODULE = Linux::DVB PACKAGE = Linux::DVB::Decode PREFIX = decode_
680 874
681void 875void
682set (SV *data) 876decode_set (SV *data)
683 CODE: 877 CODE:
684 878
685int 879int
686len () 880decode_len ()
687 CODE: 881 CODE:
688 RETVAL = (dec_ofs + 7) >> 3; 882 RETVAL = (dec_ofs + 7) >> 3;
689 OUTPUT: 883 OUTPUT:
690 RETVAL 884 RETVAL
691 885
692U32 886U32
693field (int bits) 887decode_field (int bits)
694 888
695SV * 889SV *
696si (SV *stream) 890decode_si (SV *stream)
697 CODE: 891 CODE:
698 HV *hv = newHV (); 892 HV *hv = newHV ();
699 893
894 int syntax_indicator;
700 U8 table_id; 895 U8 table_id;
701 U16 length; 896 U16 length;
702 long end; 897 long end;
703 898
704 decode_set (stream); 899 decode_set (stream);
706 do { 901 do {
707 DEC_I (hv, 8, table_id); 902 DEC_I (hv, 8, table_id);
708 table_id = dec_field; 903 table_id = dec_field;
709 } while (table_id == 0xff); 904 } while (table_id == 0xff);
710 905
711 DEC_I (hv, 1, section_syntax_indicator); 906 syntax_indicator = decode_field (1);
907 HVS (hv, section_syntax_indicator, newSViv (syntax_indicator));
908
712 decode_field (1); 909 decode_field (1);
713 decode_field (2); 910 decode_field (2);
714 911
715 length = decode_field (12); 912 length = decode_field (12);
716 end = dec_ofs + (length << 3); 913 end = dec_ofs + (length << 3);
717 914
915 if (syntax_indicator)
916 {
718 switch (table_id) 917 switch (table_id)
719 { 918 {
919 case SCT_NIT:
920 {
921 U16 descriptor_end_offset;
922
923 DEC_I (hv, 16, network_id);
924 decode_field (2); // reserved
925 DEC_I (hv, 5, version_number);
926 DEC_I (hv, 1, current_next_indicator);
927 DEC_I (hv, 8, section_number);
928 DEC_I (hv, 8, last_section_number);
929 decode_field (4); // reserved
930
931 AV *desc;
932 descriptor_end_offset = dec_ofs + (decode_field (12) << 3);
933 desc = decode_descriptors (descriptor_end_offset);
934 HVS (hv,network_descriptors, newRV_noinc ((SV *)desc));
935
936 decode_field (4); //reserved
937 decode_field (12); // Skip length, we read until the end
938
939 AV *events = newAV ();
940 HVS (hv, events, newRV_noinc ((SV *)events));
941 while (end - dec_ofs > 32)
942 {
943 long dll;
944 HV *ev = newHV ();
945 av_push (events, newRV_noinc ((SV *)ev));
946
947 DEC_I (ev, 16, transport_stream_id);
948 DEC_I (ev, 16, original_network_id);
949 decode_field (4);
950
951 dll = dec_ofs + (decode_field (12) << 3);
952 desc = decode_descriptors (dll);
953 HVS (ev, descriptors, newRV_noinc ((SV *)desc));
954 }
955
956 decode_field (32); // skip CRC
957 }
958
959 break;
960
720 case SCT_EIT_PRESENT: 961 case SCT_EIT_PRESENT:
721 case SCT_EIT_PRESENT_OTHER: 962 case SCT_EIT_PRESENT_OTHER:
722 case SCT_EIT_SCHEDULE0...SCT_EIT_SCHEDULE15: //GCC 963 case SCT_EIT_SCHEDULE0...SCT_EIT_SCHEDULE15: //GCC
723 case SCT_EIT_SCHEDULE_OTHER0...SCT_EIT_SCHEDULE_OTHER15: //GCC 964 case SCT_EIT_SCHEDULE_OTHER0...SCT_EIT_SCHEDULE_OTHER15: //GCC
724 DEC_I (hv, 16, service_id);
725 decode_field (2);
726 DEC_I (hv, 5, version_number);
727 DEC_I (hv, 1, current_next_indicator);
728 DEC_I (hv, 8, section_number);
729 DEC_I (hv, 8, last_section_number);
730 DEC_I (hv, 16, transport_stream_id);
731 DEC_I (hv, 16, original_network_id);
732 DEC_I (hv, 8, segment_last_section_number);
733 DEC_I (hv, 8, last_table_id);
734
735 AV *events = newAV ();
736 HVS (hv, events, newRV_noinc ((SV *)events));
737
738 while (end - dec_ofs > 32)
739 {
740 long dll;
741 AV *desc;
742 HV *ev = newHV ();
743 av_push (events, newRV_noinc ((SV *)ev));
744
745 DEC_I (ev, 16, event_id);
746 DEC_I (ev, 16, start_time_mjd);
747 DEC_I (ev, 24, start_time_hms);
748 DEC_I (ev, 24, duration);
749 DEC_I (ev, 3, running_status);
750 DEC_I (ev, 1, free_CA_mode);
751
752 dll = dec_ofs + (decode_field (12) << 3);
753
754 desc = decode_descriptors (dll);
755 HVS (ev, descriptors, newRV_noinc ((SV *)desc));
756 }
757
758 decode_field (32); // skip CRC
759
760 break;
761
762 case SCT_SDT:
763 case SCT_SDT_OTHER:
764 DEC_I (hv, 16, transport_stream_id);
765 decode_field (2);
766 DEC_I (hv, 5, version_number);
767 DEC_I (hv, 1, current_next_indicator);
768 DEC_I (hv, 8, section_number);
769 DEC_I (hv, 8, last_section_number);
770 DEC_I (hv, 16, original_network_id);
771 decode_field (8);
772
773 AV *services = newAV ();
774 HVS (hv, services, newRV_noinc ((SV *)services));
775
776 while (end - dec_ofs > 32)
777 {
778 HV *ev = newHV ();
779 U32 dll;
780 AV *desc;
781 av_push (services, newRV_noinc ((SV *)ev));
782
783 DEC_I (ev, 16, service_id); 965 DEC_I (hv, 16, service_id);
784 decode_field (6); 966 decode_field (2);
785 DEC_I (ev, 1, EIT_schedule_flags); 967 DEC_I (hv, 5, version_number);
786 DEC_I (ev, 1, EIT_present_following_flag); 968 DEC_I (hv, 1, current_next_indicator);
969 DEC_I (hv, 8, section_number);
970 DEC_I (hv, 8, last_section_number);
971 DEC_I (hv, 16, transport_stream_id);
972 DEC_I (hv, 16, original_network_id);
973 DEC_I (hv, 8, segment_last_section_number);
974 DEC_I (hv, 8, last_table_id);
975
976 AV *events = newAV ();
977 HVS (hv, events, newRV_noinc ((SV *)events));
978
979 while (end - dec_ofs > 32)
980 {
981 long dll;
982 AV *desc;
983 HV *ev = newHV ();
984 av_push (events, newRV_noinc ((SV *)ev));
985
986 DEC_I (ev, 16, event_id);
987 DEC_I (ev, 16, start_time_mjd);
988 DEC_I (ev, 24, start_time_hms);
989 DEC_I (ev, 24, duration);
787 DEC_I (ev, 3, running_status); 990 DEC_I (ev, 3, running_status);
788 DEC_I (ev, 1, free_CA_mode); 991 DEC_I (ev, 1, free_CA_mode);
789 992
790 dll = dec_ofs + (decode_field (12) << 3); 993 dll = dec_ofs + (decode_field (12) << 3);
791 994
792 desc = decode_descriptors (dll); 995 desc = decode_descriptors (dll);
793 HVS (ev, descriptors, newRV_noinc ((SV *)desc)); 996 HVS (ev, descriptors, newRV_noinc ((SV *)desc));
794 } 997 }
795 998
796 decode_field (32); // skip CRC 999 decode_field (32); // skip CRC
1000
797 break; 1001 break;
798 1002
1003 case SCT_SDT:
1004 case SCT_SDT_OTHER:
1005 DEC_I (hv, 16, transport_stream_id);
1006 decode_field (2);
1007 DEC_I (hv, 5, version_number);
1008 DEC_I (hv, 1, current_next_indicator);
1009 DEC_I (hv, 8, section_number);
1010 DEC_I (hv, 8, last_section_number);
1011 DEC_I (hv, 16, original_network_id);
1012 decode_field (8);
1013
1014 AV *services = newAV ();
1015 HVS (hv, services, newRV_noinc ((SV *)services));
1016
1017 while (end - dec_ofs > 32)
1018 {
1019 HV *ev = newHV ();
1020 U32 dll;
1021 AV *desc;
1022 av_push (services, newRV_noinc ((SV *)ev));
1023
1024 DEC_I (ev, 16, service_id);
1025 decode_field (6);
1026 DEC_I (ev, 1, EIT_schedule_flags);
1027 DEC_I (ev, 1, EIT_present_following_flag);
1028 DEC_I (ev, 3, running_status);
1029 DEC_I (ev, 1, free_CA_mode);
1030
1031 dll = dec_ofs + (decode_field (12) << 3);
1032
1033 desc = decode_descriptors (dll);
1034 HVS (ev, descriptors, newRV_noinc ((SV *)desc));
1035 }
1036
1037 decode_field (32); // skip CRC
1038 break;
1039
799 default: 1040 default:
800 DEC_S (hv, length, raw_data); 1041 DEC_S (hv, length, raw_data);
801 break; 1042 break;
1043 }
1044
1045 if (decode_overflow)
1046 {
1047 SvREFCNT_dec (hv);
1048 safe_sv_chop (stream, (end + 7) >> 3);
1049 XSRETURN_UNDEF;
1050 }
1051
1052 safe_sv_chop (stream, (dec_ofs + 7) >> 3);
802 } 1053 }
803 1054 else
804 if (decode_overflow)
805 { 1055 {
806 SvREFCNT_dec (hv); 1056 SvREFCNT_dec (hv);
1057 safe_sv_chop (stream, (end + 7) >> 3);
807 XSRETURN_UNDEF; 1058 XSRETURN_UNDEF;
808 } 1059 }
809 1060
810 sv_chop (stream, SvPVX (stream) + ((dec_ofs + 7) >> 3));
811
812 RETVAL = (SV *)newRV_noinc ((SV *)hv); 1061 RETVAL = (SV *)newRV_noinc ((SV *)hv);
813 OUTPUT: 1062 OUTPUT:
814 RETVAL 1063 RETVAL
815 1064

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines