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 {