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.1 by root, Mon Sep 6 06:25:12 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, 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,
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,
46 DT_service = 0x48,
47 DT_country_availability = 0x49,
48 DT_linkage = 0x4a,
42 DT_short_event = 0x4d, 49 DT_short_event = 0x4d,
43 DT_extended_event = 0x4e, 50 DT_extended_event = 0x4e, //NYI
44 DT_component = 0x50, 51 DT_component = 0x50,
45 DT_content = 0x54, 52 DT_content = 0x54,
53 DT_terrestrial_delivery_system = 0x5A,
46 DT_private_data_specifier = 0x5f, 54 DT_private_data_specifier = 0x5f,
47 DT_short_smoothing_buffer = 0x61, //NYI 55 DT_short_smoothing_buffer = 0x61, //NYI
48 DT_scrambling_indicator = 0x65, //NYI 56 DT_scrambling_indicator = 0x65, //NYI
49 DT_PDC = 0x69, 57 DT_PDC = 0x69,
50}; 58};
51 59
52static const struct consts { 60static const struct consts {
53 const char *name; 61 const char *name;
54 const long value; 62 const long value;
220 CONST (SCT_RCT), 228 CONST (SCT_RCT),
221 CONST (SCT_CIT), 229 CONST (SCT_CIT),
222 CONST (SCT_MPE), 230 CONST (SCT_MPE),
223 CONST (SCT_DIT), 231 CONST (SCT_DIT),
224 CONST (SCT_SIT), 232 CONST (SCT_SIT),
233
234 CONST (DT_network_name),
235 CONST (DT_service_list),
236 CONST (DT_satellite_delivery_system),
237 CONST (DT_cable_delivery_system),
238 CONST (DT_service),
239 CONST (DT_country_availability),
240 CONST (DT_linkage),
241 CONST (DT_short_event),
242 CONST (DT_extended_event),
243 CONST (DT_component),
244 CONST (DT_content),
245 CONST (DT_terrestrial_delivery_system),
246 CONST (DT_private_data_specifier),
247 CONST (DT_short_smoothing_buffer),
248 CONST (DT_scrambling_indicator),
249 CONST (DT_PDC),
225}; 250};
226 251
227#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)
228#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)
254#define HVS(hv,name,sv) hv_store (hv, #name, sizeof (#name) - 1, (sv), 0)
229 255
230static void 256static void
231set_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)
232{ 258{
233 HVS_I (hv, (*p), frequency); 259 HVS_I (hv, (*p), frequency);
234 HVS_I (hv, (*p), inversion); 260 HVS_I (hv, (*p), inversion);
235 261
236 switch (type) 262 switch (type)
254 HVS_I (hv, (*p).u.ofdm, transmission_mode); 280 HVS_I (hv, (*p).u.ofdm, transmission_mode);
255 break; 281 break;
256 } 282 }
257} 283}
258 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
259typedef unsigned char u8; 322typedef unsigned char u8;
260 323
261static SV *dec_sv; 324static SV *dec_sv;
262static u8 *dec_data; 325static u8 *dec_data;
263static long dec_ofs, dec_len8; 326static long dec_ofs, dec_len8;
271{ 334{
272 if (dec_sv) 335 if (dec_sv)
273 SvREFCNT_dec (dec_sv); 336 SvREFCNT_dec (dec_sv);
274 337
275 dec_sv = newSVsv (data); 338 dec_sv = newSVsv (data);
276 dec_data = SvPVbyte (dec_sv, dec_len); 339 dec_data = (u8 *)SvPVbyte (dec_sv, dec_len);
277 dec_ofs = 0; 340 dec_ofs = 0;
278 dec_len8 = dec_len << 3; 341 dec_len8 = dec_len << 3;
279} 342}
280 343
281static U32 344static U32
309 } 372 }
310 373
311 return dec_field = r; 374 return dec_field = r;
312} 375}
313 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
411static SV *
412text2sv (u8 *data, U32 len)
413{
414 dSP;
415 SV *sv = newSVpvn ((char *)data, clamp (len));
416
417 PUSHMARK (SP);
418 XPUSHs (sv);
419 PUTBACK;
420 call_pv ("Linux::DVB::Decode::text", G_VOID);
421
422 return sv;
423}
424
314#define DEC_I(hv, bits, name) hv_store (hv, #name, sizeof (#name) - 1, newSViv (decode_field (bits)), 0) 425#define DEC_I(hv, bits, name) HVS (hv, name, newSViv (decode_field (bits)))
426#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 427#define DEC_S(hv, bytes, name) HVS (hv, name, newSVpvn ((char *)dec_data + (dec_ofs >> 3), clamp (bytes))), dec_ofs += clamp (bytes) << 3
316 428
317static AV * 429static AV *
318decode_descriptors (long end) 430decode_descriptors (long end)
319{ 431{
320 AV *av = newAV (); 432 AV *av = newAV ();
321 433
322 while (dec_ofs < end) 434 while (dec_ofs < end)
323 { 435 {
324 HV *hv = newHV (); 436 HV *hv = newHV ();
325 U8 type, len, a; 437 U8 type, len, len2;
438 AV *av2;
326 long end; 439 long end, end2;
327 440
328 av_push (av, newRV_noinc ((SV *)hv)); 441 av_push (av, newRV_noinc ((SV *)hv));
329 442
330 DEC_I (hv, 8, type); 443 DEC_I (hv, 8, type);
331 type = dec_field; 444 type = dec_field;
332 len = decode_field (8); 445 len = decode_field (8);
333
334 end = dec_ofs + (len << 3); 446 end = dec_ofs + (len << 3);
335 447
336 if (end > dec_len8) 448 if (end > dec_len8)
337 return av; 449 return av;
338 450
339 switch (type) 451 switch (type)
340 { 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
506 case DT_service:
507 DEC_I (hv, 8, service_type);
508 len2 = decode_field (8); DEC_T (hv, len2, service_provider_name);
509 len2 = decode_field (8); DEC_T (hv, len2, service_name);
510 break;
511
512 case DT_country_availability:
513 DEC_I (hv, 1, country_availability_flag);
514 decode_field (7);
515
516 DEC_S (hv, (end - dec_ofs) >> 3, private_data);
517 //while (dec_ofs + 24 <= end)
518 // av_push (av,
519 break;
520
521 case DT_linkage:
522 DEC_I (hv, 16, transport_stream_id);
523 DEC_I (hv, 16, original_network_id);
524 DEC_I (hv, 16, service_id);
525 DEC_I (hv, 8, linkage_type);
526
527 if (dec_field == 8)
528 {
529 U32 hot, org;
530
531 DEC_I (hv, 8, hand_over_type); hot = dec_field;
532 decode_field (3);
533 DEC_I (hv, 1, origin_type); org = dec_field;
534
535 if (hot > 0x00 && hot < 0x04)
536 DEC_I (hv, 16, network_id);
537
538 if (org == 0)
539 DEC_I (hv, 16, initial_service_id);
540 }
541
542 DEC_S (hv, (end - dec_ofs) >> 3, private_data);
543 break;
544
341 case DT_PDC: 545 case DT_PDC:
342 decode_field (4); 546 decode_field (4);
343 DEC_I (hv, 20, programme_identification_label); 547 DEC_I (hv, 20, programme_identification_label);
344 break; 548 break;
345 549
347 decode_field (4); 551 decode_field (4);
348 DEC_I (hv, 4, stream_content); 552 DEC_I (hv, 4, stream_content);
349 DEC_I (hv, 8, component_type); 553 DEC_I (hv, 8, component_type);
350 DEC_I (hv, 8, component_tag); 554 DEC_I (hv, 8, component_tag);
351 DEC_S (hv, 3, ISO_639_language_code); 555 DEC_S (hv, 3, ISO_639_language_code);
352 DEC_S (hv, (end - dec_ofs) >> 3, text); 556 DEC_T (hv, (end - dec_ofs) >> 3, text);
353 break; 557 break;
354 558
355 case DT_short_event: 559 case DT_short_event:
356 DEC_S (hv, 3, ISO_639_language_code); 560 DEC_S (hv, 3, ISO_639_language_code);
357 a = decode_field (8); DEC_S (hv, a, event_name); 561 len2 = decode_field (8); DEC_T (hv, len2, event_name);
358 a = decode_field (8); DEC_S (hv, a, text); 562 len2 = decode_field (8); DEC_T (hv, len2, text);
359 break; 563 break;
360 564
565 case DT_extended_event:
566 DEC_I (hv, 4, descriptor_number);
567 DEC_I (hv, 4, last_descriptor_number);
568 DEC_S (hv, 3, ISO_639_language_code);
569
570 len2 = decode_field (8); end2 = dec_ofs + (len2 << 3);
571 av2 = newAV ();
572 HVS (hv, items, newRV_noinc ((SV *)av2));
573
574 while (dec_ofs < end2)
575 {
576 AV *av3 = newAV ();
577 len2 = decode_field (8); av_push (av3, text2sv (dec_data + (dec_ofs >> 3), len2)), dec_ofs += len << 3;
578 len2 = decode_field (8); av_push (av3, text2sv (dec_data + (dec_ofs >> 3), len2)), dec_ofs += len << 3;
579
580 av_push (av2, newRV_noinc ((SV *)av3));
581 }
582
583 len2 = decode_field (8); DEC_T (hv, len2, text);
584 break;
585
361 case DT_content: 586 case DT_content:
362 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
363 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;
364 631
365 case DT_private_data_specifier: 632 case DT_private_data_specifier:
366 DEC_I (hv, 32, private_data_specifier); 633 DEC_I (hv, 32, private_data_specifier);
367 break; 634 break;
368 635
369 default: 636 default:
370 fprintf (stderr, "UNKXXX %x\n", type);//D 637 //fprintf (stderr, "UNKXXX %x\n", type);//D
638
371 case 0: 639 case 0:
372 case DT_extended_event:
373 case 0x80: 640 case 0x80:
374 case 0x81: 641 case 0x81:
375 case 0x82: 642 case 0x82:
643 case 0x83:
376 case 0x84: 644 case 0x84:
377 case 0x85: 645 case 0x85:
646 case 0x8d:
647 case 0x8e:
648 case 0xb2:
378 DEC_S (hv, len, raw_data); 649 DEC_S (hv, len, raw_data);
379 break; 650 break;
380 } 651 }
381 652
382 dec_ofs = end; // re-sync, in case of problems 653 dec_ofs = end; // re-sync, in case of problems
486 757
487 RETVAL = ubl; 758 RETVAL = ubl;
488 OUTPUT: 759 OUTPUT:
489 RETVAL 760 RETVAL
490 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
491SV * 779SV *
492_get (int fd, int type) 780_get (int fd, int type)
493 CODE: 781 CODE:
494 struct dvb_frontend_parameters p; 782 struct dvb_frontend_parameters p;
495 HV *hv; 783 HV *hv;
496 784
497 if (ioctl (fd, FE_GET_FRONTEND, &p) < 0) 785 if (ioctl (fd, FE_GET_FRONTEND, &p) < 0)
498 XSRETURN_UNDEF; 786 XSRETURN_UNDEF;
499 787
500 hv = newHV (); 788 hv = newHV ();
501 set_parameters (hv, &p, type); 789 get_parameters (hv, &p, type);
502 RETVAL = (SV *)newRV_noinc ((SV *)hv); 790 RETVAL = (SV *)newRV_noinc ((SV *)hv);
503 OUTPUT: 791 OUTPUT:
504 RETVAL 792 RETVAL
505 793
506SV * 794SV *
512 if (ioctl (fd, FE_GET_EVENT, &e) < 0) 800 if (ioctl (fd, FE_GET_EVENT, &e) < 0)
513 XSRETURN_UNDEF; 801 XSRETURN_UNDEF;
514 802
515 hv = newHV (); 803 hv = newHV ();
516 HVS_I (hv, e, status); 804 HVS_I (hv, e, status);
517 set_parameters (hv, &e.parameters, type); 805 get_parameters (hv, &e.parameters, type);
518 RETVAL = (SV *)newRV_noinc ((SV *)hv); 806 RETVAL = (SV *)newRV_noinc ((SV *)hv);
519 OUTPUT: 807 OUTPUT:
520 RETVAL 808 RETVAL
521 809
522MODULE = Linux::DVB PACKAGE = Linux::DVB::Demux 810MODULE = Linux::DVB PACKAGE = Linux::DVB::Demux
583 RETVAL 871 RETVAL
584 872
585MODULE = Linux::DVB PACKAGE = Linux::DVB::Decode PREFIX = decode_ 873MODULE = Linux::DVB PACKAGE = Linux::DVB::Decode PREFIX = decode_
586 874
587void 875void
588set (SV *data) 876decode_set (SV *data)
589 CODE: 877 CODE:
590 878
591int 879int
592len () 880decode_len ()
593 CODE: 881 CODE:
594 RETVAL = (dec_ofs + 7) >> 3; 882 RETVAL = (dec_ofs + 7) >> 3;
595 OUTPUT: 883 OUTPUT:
596 RETVAL 884 RETVAL
597 885
598U32 886U32
599field (int bits) 887decode_field (int bits)
600 888
601SV * 889SV *
602si (SV *stream) 890decode_si (SV *stream)
603 CODE: 891 CODE:
604 HV *hv = newHV (); 892 HV *hv = newHV ();
605 893
894 int syntax_indicator;
606 U8 table_id; 895 U8 table_id;
607 U16 length; 896 U16 length;
608 long end; 897 long end;
609 898
610 decode_set (stream); 899 decode_set (stream);
612 do { 901 do {
613 DEC_I (hv, 8, table_id); 902 DEC_I (hv, 8, table_id);
614 table_id = dec_field; 903 table_id = dec_field;
615 } while (table_id == 0xff); 904 } while (table_id == 0xff);
616 905
617 DEC_I (hv, 1, section_syntax_indicator); 906 syntax_indicator = decode_field (1);
907 HVS (hv, section_syntax_indicator, newSViv (syntax_indicator));
908
618 decode_field (1); 909 decode_field (1);
619 decode_field (2); 910 decode_field (2);
620 911
621 length = decode_field (12); 912 length = decode_field (12);
622 end = dec_ofs + (length << 3); 913 end = dec_ofs + (length << 3);
623 914
915 if (syntax_indicator)
916 {
624 switch (table_id) 917 switch (table_id)
625 { 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
626 case SCT_EIT_PRESENT: 961 case SCT_EIT_PRESENT:
627 case SCT_EIT_PRESENT_OTHER: 962 case SCT_EIT_PRESENT_OTHER:
628 case SCT_EIT_SCHEDULE0...SCT_EIT_SCHEDULE15: //GCC 963 case SCT_EIT_SCHEDULE0...SCT_EIT_SCHEDULE15: //GCC
629 case SCT_EIT_SCHEDULE_OTHER0...SCT_EIT_SCHEDULE_OTHER15: //GCC 964 case SCT_EIT_SCHEDULE_OTHER0...SCT_EIT_SCHEDULE_OTHER15: //GCC
630 DEC_I (hv, 16, service_id);
631 decode_field (2);
632 DEC_I (hv, 5, version_number);
633 DEC_I (hv, 1, current_next_indicator);
634 DEC_I (hv, 8, section_number);
635 DEC_I (hv, 8, last_section_number);
636 DEC_I (hv, 16, transport_stream_id);
637 DEC_I (hv, 16, original_network_id);
638 DEC_I (hv, 8, segment_last_section_number);
639 DEC_I (hv, 8, last_table_id);
640
641 AV *events = newAV ();
642 hv_store (hv, "events", 6, newRV_noinc ((SV *)events), 0);
643
644 while (end - dec_ofs > 32)
645 {
646 long dll;
647 AV *desc;
648 HV *ev = newHV ();
649 av_push (events, newRV_noinc ((SV *)ev));
650
651 DEC_I (ev, 16, event_id);
652 DEC_I (ev, 16, start_time_mjd);
653 DEC_I (ev, 24, start_time_hms);
654 DEC_I (ev, 24, duration);
655 DEC_I (ev, 3, running_status);
656 DEC_I (ev, 1, free_CA_mode);
657
658 dll = dec_ofs + (decode_field (12) << 3);
659
660 desc = decode_descriptors (dll);
661 hv_store (ev, "descriptors", 11, newRV_noinc ((SV *)desc), 0);
662 }
663
664 decode_field (32); // skip CRC
665
666 break;
667#if 0 // service desc table
668 case SCT_SDT:
669 case SCT_SDT_OTHER:
670
671 AV *events = newAV ();
672 hv_store (hv, "events", 0, newRV_noinc (events), 0);
673
674 while (end - dec_ofs > 32)
675 {
676 HV *ev = newHV ();
677 U32 dll;
678 av_push (events, newRV_noinc (ev));
679
680 DEC_I (ev, 16, service_id); 965 DEC_I (hv, 16, service_id);
681 decode_field (6); 966 decode_field (2);
967 DEC_I (hv, 5, version_number);
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);
990 DEC_I (ev, 3, running_status);
991 DEC_I (ev, 1, free_CA_mode);
992
993 dll = dec_ofs + (decode_field (12) << 3);
994
995 desc = decode_descriptors (dll);
996 HVS (ev, descriptors, newRV_noinc ((SV *)desc));
997 }
998
999 decode_field (32); // skip CRC
1000
1001 break;
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);
682 DEC_I (ev, 1, EIT_schedule_flags); 1026 DEC_I (ev, 1, EIT_schedule_flags);
683 DEC_I (ev, 1, EIT_present_following_flag); 1027 DEC_I (ev, 1, EIT_present_following_flag);
684 DEC_I (ev, 3, running_status); 1028 DEC_I (ev, 3, running_status);
685 DEC_I (ev, 1, free_CA_mode); 1029 DEC_I (ev, 1, free_CA_mode);
686 1030
687 dll = decode_field (12); 1031 dll = dec_ofs + (decode_field (12) << 3);
1032
1033 desc = decode_descriptors (dll);
1034 HVS (ev, descriptors, newRV_noinc ((SV *)desc));
688 1035 }
689 DEC_I (ev, 1, free_CA_mode);
690 }
691 1036
692 decode_field (32); // skip CRC 1037 decode_field (32); // skip CRC
693 //DEC_S (hv, length + 3 - (dec_ofs >> 3), raw_data);
694 break; 1038 break;
695#endif 1039
696 default: 1040 default:
697 DEC_S (hv, length, raw_data); 1041 DEC_S (hv, length, raw_data);
698 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);
699 } 1053 }
700 1054 else
701 if (decode_overflow)
702 { 1055 {
703 SvREFCNT_dec (hv); 1056 SvREFCNT_dec (hv);
1057 safe_sv_chop (stream, (end + 7) >> 3);
704 XSRETURN_UNDEF; 1058 XSRETURN_UNDEF;
705 } 1059 }
706 1060
707 sv_chop (stream, SvPVX (stream) + ((dec_ofs + 7) >> 3));
708
709 RETVAL = (SV *)newRV_noinc ((SV *)hv); 1061 RETVAL = (SV *)newRV_noinc ((SV *)hv);
710 OUTPUT: 1062 OUTPUT:
711 RETVAL 1063 RETVAL
712 1064

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines