Mercurial > pt1
comparison recpt1/tssplitter_lite.c @ 132:9783d247d1c9
imported Shaolin-san's NIT fix patch. The original patch can be obtained at http://microgroove.jp/shaolin/2010/09/a_tiny_patch_for_recpt1tssplitter_litec.html
author | Yoshiki Yazawa <yaz@honeyplanet.jp> |
---|---|
date | Wed, 27 Jun 2012 06:51:23 +0900 |
parents | 9e9dbb17b70f |
children | 550ee373afbc |
comparison
equal
deleted
inserted
replaced
131:2dc994610477 | 132:9783d247d1c9 |
---|---|
388 * | 388 * |
389 * PAT を解析し、出力対象チャンネルが含まれているかチェックを行い、PAT を再構築する | 389 * PAT を解析し、出力対象チャンネルが含まれているかチェックを行い、PAT を再構築する |
390 */ | 390 */ |
391 static int AnalyzePat(splitter *sp, unsigned char *buf) | 391 static int AnalyzePat(splitter *sp, unsigned char *buf) |
392 #if 0 | 392 #if 0 |
393 splitter *sp | |
394 unsigned char** pat, // [out] PAT 情報(再構築後) | |
395 unsigned char* pids, // [out] 出力対象 PID 情報 | |
396 char** sid_list, // [in] 出力対象サービス ID のリスト | |
397 unsigned char* pmt_pids, // [out] サービス ID に対応する PMT の PID | |
398 int* pmt_retain // [out] 残すPMTの数 | |
399 | |
393 unsigned char* buf, // [in] 読み込んだバッファ | 400 unsigned char* buf, // [in] 読み込んだバッファ |
394 unsigned char** pat, // [out] PAT 情報(再構築後) | |
395 unsigned char* pids, // [out] 出力対象 PID 情報 | |
396 char** sid_list, // [in] 出力対象サービス ID のリスト | |
397 unsigned char* pmt_pids, // [out] サービス ID に対応する PMT の PID | |
398 int* pmt_retain // [out] 残すPMTの数 | |
399 #endif | 401 #endif |
400 { | 402 { |
401 int pos[MAX_PID]; | 403 int pos[MAX_PID]; |
402 int service_id; | 404 int service_id; |
403 int i, j, k; | 405 int i, j, k; |
421 sp->pmt_retain = 0; | 423 sp->pmt_retain = 0; |
422 memset(pos, 0, sizeof(pos)); | 424 memset(pos, 0, sizeof(pos)); |
423 size = buf[7]; | 425 size = buf[7]; |
424 | 426 |
425 /* prescan SID/PMT */ | 427 /* prescan SID/PMT */ |
426 for(i = 17, j = 0; i < (size + 8) - 4; i = i + 4, j++) { | 428 for(i = 13, j = 0; i < (size + 8) - 4; i = i + 4) { |
429 | |
430 pid = GetPid(&buf[i+2]); | |
431 if(pid == 0x0010) | |
432 continue; | |
433 | |
427 avail_sids[j] = (buf[i] << 8) + buf[i+1]; | 434 avail_sids[j] = (buf[i] << 8) + buf[i+1]; |
428 sp->avail_pmts[j] = GetPid(&buf[i+2]); | 435 sp->avail_pmts[j] = pid; |
436 j++; | |
429 } | 437 } |
430 sp->num_pmts = j; | 438 sp->num_pmts = j; |
431 | 439 |
432 // 対象チャンネル判定 | 440 // 対象チャンネル判定 |
433 /* size + 8 = パケット全長 */ | 441 /* size + 8 = パケット全長 */ |
434 /* 最終 4 バイトはCRCなので飛ばす */ | 442 /* 最終 4 バイトはCRCなので飛ばす */ |
435 for(i = 17; i < (size + 8) - 4; i = i + 4) { | 443 for(i = 13; i < (size + 8) - 4; i = i + 4) { |
444 | |
445 pid = GetPid(&buf[i+2]); | |
446 if(pid == 0x0010) | |
447 continue; | |
436 | 448 |
437 service_id = (buf[i] << 8) + buf[i+1]; | 449 service_id = (buf[i] << 8) + buf[i+1]; |
438 p = sid_list; | 450 p = sid_list; |
439 | 451 |
440 while(*p) { | 452 while(*p) { |
529 } /* while */ | 541 } /* while */ |
530 } | 542 } |
531 | 543 |
532 /* if sid has been specified but no sid found, fall back to all */ | 544 /* if sid has been specified but no sid found, fall back to all */ |
533 if(*sid_list && !sid_found) { | 545 if(*sid_list && !sid_found) { |
534 for(i = 17; i < (size + 8) - 4; i = i + 4) { | 546 for(i = 13; i < (size + 8) - 4; i = i + 4) { |
547 | |
548 pid = GetPid(&buf[i+2]); | |
549 if(pid==0x0010) | |
550 continue; | |
551 | |
535 service_id = (buf[i] << 8) + buf[i+1]; | 552 service_id = (buf[i] << 8) + buf[i+1]; |
536 pid = GetPid(&buf[i + 2]); | 553 pid = GetPid(&buf[i + 2]); |
537 *(pmt_pids+pid) = 1; | 554 *(pmt_pids+pid) = 1; |
538 *(pids+pid) = 1; | 555 *(pids+pid) = 1; |
539 pos[pid] = i; | 556 pos[pid] = i; |
549 for(k=0; k < sp->num_pmts; k++) | 566 for(k=0; k < sp->num_pmts; k++) |
550 fprintf(stderr, "%d ", avail_sids[k]); | 567 fprintf(stderr, "%d ", avail_sids[k]); |
551 fprintf(stderr, "\n"); | 568 fprintf(stderr, "\n"); |
552 fprintf(stderr, "Chosen sid =%s\n", chosen_sid); | 569 fprintf(stderr, "Chosen sid =%s\n", chosen_sid); |
553 | 570 |
554 #if 0 | 571 #if 1 |
555 /* print PMTs */ | 572 /* print PMTs */ |
556 fprintf(stderr, "Available PMT = "); | 573 fprintf(stderr, "Available PMT = "); |
557 for(k=0; k < sp->num_pmts; k++) | 574 for(k=0; k < sp->num_pmts; k++) |
558 fprintf(stderr, "%d ", sp->avail_pmts[k].pid); | 575 fprintf(stderr, "0x%x ", sp->avail_pmts[k]); |
559 fprintf(stderr, "\n"); | 576 fprintf(stderr, "\n"); |
560 #endif | 577 #endif |
561 | 578 |
562 // PAT 再構築 | 579 // PAT 再構築 |
563 result = RecreatePat(sp, buf, pos); | 580 result = RecreatePat(sp, buf, pos); |
564 #if 0 | 581 #if 0 |
565 int tc; | 582 int tc; |
566 for(tc=0; tc<188; tc++) | 583 for(tc=0; tc<188; tc++) |
567 fprintf(stderr, "%02x ", *(pat+tc)); | 584 fprintf(stderr, "%02x ", *(sp->pat+tc)); |
568 #endif | 585 #endif |
569 } | 586 } |
570 | 587 |
571 return(result); | 588 return(result); |
572 } | 589 } |
576 * | 593 * |
577 * PMT から出力対象チャンネル以外のチャンネル情報を削除し、PAT を再構築する | 594 * PMT から出力対象チャンネル以外のチャンネル情報を削除し、PAT を再構築する |
578 */ | 595 */ |
579 static int RecreatePat(splitter *sp, unsigned char *buf, int *pos) | 596 static int RecreatePat(splitter *sp, unsigned char *buf, int *pos) |
580 #if 0 | 597 #if 0 |
598 splitter *sp // [in/out] | |
599 unsigned char** pat, // [out] PAT 情報(再構築後) | |
600 unsigned char* pids, // [out] 出力対象 PID 情報 | |
601 | |
581 unsigned char* buf, // [in] 読み込んだバッファ | 602 unsigned char* buf, // [in] 読み込んだバッファ |
582 unsigned char** pat, // [out] PAT 情報(再構築後) | |
583 unsigned char* pids, // [out] 出力対象 PID 情報 | |
584 int *pos // [in] 取得対象 PMT のバッファ中の位置 | 603 int *pos // [in] 取得対象 PMT のバッファ中の位置 |
585 #endif | 604 #endif |
586 { | 605 { |
587 unsigned char y[LENGTH_CRC_DATA]; | 606 unsigned char y[LENGTH_CRC_DATA]; |
588 int crc; | 607 int crc; |
592 int pid_num = 0; | 611 int pid_num = 0; |
593 | 612 |
594 // CRC 計算のためのデータ | 613 // CRC 計算のためのデータ |
595 { | 614 { |
596 // チャンネルによって変わらない部分 | 615 // チャンネルによって変わらない部分 |
597 for (i = 0; i < LENGTH_PAT_HEADER; i++) | 616 for (i = 0; i < LENGTH_PAT_HEADER - 4; i++) |
598 { | 617 { |
599 y[i] = buf[i + 5]; | 618 y[i] = buf[i + 5]; |
600 } | 619 } |
620 | |
621 // NIT | |
622 y[LENGTH_PAT_HEADER-4] = 0x00; | |
623 y[LENGTH_PAT_HEADER-3] = 0x00; | |
624 y[LENGTH_PAT_HEADER-2] = 0xe0; | |
625 y[LENGTH_PAT_HEADER-1] = 0x10; | |
626 | |
601 // チャンネルによって変わる部分 | 627 // チャンネルによって変わる部分 |
602 for (i = 0; i < MAX_PID; i++) | 628 for (i = 0; i < MAX_PID; i++) |
603 { | 629 { |
604 if(pos[i] != 0) | 630 if(pos[i] != 0) |
605 { | 631 { |