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 {