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.3 by root, Sun Apr 3 02:16:05 2005 UTC

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,
37 SCT_DIT = 0x7e, 37 SCT_DIT = 0x7e,
38 SCT_SIT = 0x7f, 38 SCT_SIT = 0x7f,
39}; 39};
40 40
41enum { 41enum {
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
230static void 246static void
231set_parameters (HV *hv, struct dvb_frontend_parameters *p, fe_type_t type) 247get_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
281static void
282set_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
259typedef unsigned char u8; 312typedef unsigned char u8;
260 313
261static SV *dec_sv; 314static SV *dec_sv;
262static u8 *dec_data; 315static u8 *dec_data;
263static long dec_ofs, dec_len8; 316static long dec_ofs, dec_len8;
309 } 362 }
310 363
311 return dec_field = r; 364 return dec_field = r;
312} 365}
313 366
367U32
368clamp (U32 len)
369{
370 return len < 4096 ? len : 0;
371}
372
373static SV *
374text2sv (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
317static AV * 391static AV *
318decode_descriptors (long end) 392decode_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
643int
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
491SV * 660SV *
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
506SV * 675SV *
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
522MODULE = Linux::DVB PACKAGE = Linux::DVB::Demux 691MODULE = 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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines