Mercurial > pt1.oyama
comparison src/tssplitter_lite.c @ 167:b21f1e823ec3
Import NIT fix patch.(http://microgroove.jp/shaolin/2010/09/a_tiny_patch_for_recpt1tssplitter_litec.html)
author | Naoya OYAMA <naoya.oyama@gmail.com> |
---|---|
date | Sat, 06 Oct 2012 21:57:42 +0900 |
parents | 7d8a5bb874ad |
children | 4f3640bf350d |
comparison
equal
deleted
inserted
replaced
166:726fe10d9e4a | 167:b21f1e823ec3 |
---|---|
604 sp->pmt_retain = 0; | 604 sp->pmt_retain = 0; |
605 memset(pos, 0, sizeof(pos)); | 605 memset(pos, 0, sizeof(pos)); |
606 size = buf[7]; | 606 size = buf[7]; |
607 | 607 |
608 /* prescan SID/PMT */ | 608 /* prescan SID/PMT */ |
609 for(i = 17, j = 0; i < (size + 8) - 4; i = i + 4, j++) { | 609 for(i = 13, j = 0; i < (size + 8) - 4; i = i + 4) { |
610 avail_sids[j] = (buf[i] << 8) + buf[i+1]; | 610 pid = GetPid(&buf[i+2]); |
611 sp->avail_pmts[j] = GetPid(&buf[i+2]); | 611 if(pid == 0x0010) |
612 continue; | |
613 avail_sids[j] = (buf[i] << 8) + buf[i+2]; | |
614 sp->avail_pmts[j] = pid; | |
615 j++; | |
612 } | 616 } |
613 sp->num_pmts = j; | 617 sp->num_pmts = j; |
614 | 618 |
615 // 対象チャンネル判定 | 619 // 対象チャンネル判定 |
616 /* size + 8 = パケット全長 */ | 620 /* size + 8 = パケット全長 */ |
617 /* 最終 4 バイトはCRCなので飛ばす */ | 621 /* 最終 4 バイトはCRCなので飛ばす */ |
618 for(i = 17; i < (size + 8) - 4; i = i + 4) { | 622 for(i = 13; i < (size + 8) - 4; i = i + 4) { |
623 pid = GetPid(&buf[i+2]); | |
624 if(pid==0x0010) | |
625 continue; | |
619 | 626 |
620 service_id = (buf[i] << 8) + buf[i+1]; | 627 service_id = (buf[i] << 8) + buf[i+1]; |
621 p = sid_list; | 628 p = sid_list; |
622 | 629 |
623 while(*p) { | 630 while(*p) { |
744 | 751 |
745 #if 0 | 752 #if 0 |
746 /* print PMTs */ | 753 /* print PMTs */ |
747 fprintf(stderr, "Available PMT = "); | 754 fprintf(stderr, "Available PMT = "); |
748 for(k=0; k < sp->num_pmts; k++) | 755 for(k=0; k < sp->num_pmts; k++) |
749 fprintf(stderr, "%d ", sp->avail_pmts[k]); | 756 fprintf(stderr, "0x%x ", sp->avail_pmts[k]); |
750 fprintf(stderr, "\n"); | 757 fprintf(stderr, "\n"); |
751 #endif | 758 #endif |
752 | 759 |
753 // PAT 再構築 | 760 // PAT 再構築 |
754 result = RecreatePat(sp, buf, pos); | 761 result = RecreatePat(sp, buf, pos); |
755 #if 0 | 762 #if 0 |
756 int tc; | 763 int tc; |
757 for(tc=0; tc<188; tc++) | 764 for(tc=0; tc<188; tc++) |
758 fprintf(stderr, "%02x ", *(pat+tc)); | 765 fprintf(stderr, "%02x ", *(sp->pat+tc)); |
759 #endif | 766 #endif |
760 } | 767 } |
761 | 768 |
762 return(result); | 769 return(result); |
763 } | 770 } |
767 * | 774 * |
768 * PMT から出力対象チャンネル以外のチャンネル情報を削除し、PAT を再構築する | 775 * PMT から出力対象チャンネル以外のチャンネル情報を削除し、PAT を再構築する |
769 */ | 776 */ |
770 static int RecreatePat(splitter *sp, unsigned char *buf, int *pos) | 777 static int RecreatePat(splitter *sp, unsigned char *buf, int *pos) |
771 #if 0 | 778 #if 0 |
779 splitter *sp // [in/out] splitter | |
772 unsigned char* buf, // [in] 読み込んだバッファ | 780 unsigned char* buf, // [in] 読み込んだバッファ |
773 unsigned char** pat, // [out] PAT 情報(再構築後) | 781 int *pos // [in] 取得対象 PMT のバッファ中の位置 |
774 unsigned char* pids, // [out] 出力対象 PID 情報 | |
775 int *pos) // [in] 取得対象 PMT のバッファ中の位置 | |
776 #endif | 782 #endif |
777 { | 783 { |
778 unsigned char y[LENGTH_CRC_DATA]; | 784 unsigned char y[LENGTH_CRC_DATA]; |
779 int crc; | 785 int crc; |
780 int i; | 786 int i; |
783 int pid_num = 0; | 789 int pid_num = 0; |
784 | 790 |
785 // CRC 計算のためのデータ | 791 // CRC 計算のためのデータ |
786 { | 792 { |
787 // チャンネルによって変わらない部分 | 793 // チャンネルによって変わらない部分 |
788 for (i = 0; i < LENGTH_PAT_HEADER; i++) | 794 for (i = 0; i < LENGTH_PAT_HEADER - 4; i++) |
789 { | 795 { |
790 y[i] = buf[i + 5]; | 796 y[i] = buf[i + 5]; |
791 } | 797 } |
798 // NIT | |
799 y[LENGTH_PAT_HEADER-4] = 0x00; | |
800 y[LENGTH_PAT_HEADER-3] = 0x00; | |
801 y[LENGTH_PAT_HEADER-2] = 0xe0; | |
802 y[LENGTH_PAT_HEADER-1] = 0x10; | |
792 // チャンネルによって変わる部分 | 803 // チャンネルによって変わる部分 |
793 for (i = 0; i < MAX_PID; i++) | 804 for (i = 0; i < MAX_PID; i++) |
794 { | 805 { |
795 if(pos[i] != 0) | 806 if(pos[i] != 0) |
796 { | 807 { |