--- rec.pl	2009-01-25 16:32:56.000000000 +0900
+++ recFS.pl	2010-02-26 01:00:00.000000000 +0900
@@ -10,10 +10,11 @@
 $| = 1;
 
 my %opts = ();
-getopts('h:d:', \%opts);
+getopts('h:d:f', \%opts);
 
 my $ch = $opts{'h'};
 my $dir = $opts{'d'};
+my $fullseg = $opts{'f'};
 
 if ($ch eq '' || $dir eq '') {
 	die "Usage: $0 -h CH -d DIR\n";
@@ -27,10 +28,15 @@
 
 my $TS = undef;
 my $IDX = undef;
+my $FTS = undef;
+my $IDZ = undef;
 
 my $tot = undef;
 my $hour = -1;
 my $bytes = 0;
+my $packets= 0;
+my @known_pids = (0x10,0x11,0x12,0x14,0x24,0x26,0x27,0x28,0x1fff);
+my @stream_pids =();
 
 while(read(STDIN, my $buf, $packetsize)) {
 	my $pos = 0;
@@ -78,6 +84,11 @@
 								$bytes = 0;
 							}
 
+							if($FTS){
+							    close($FTS);
+							    close($IDZ);
+							    $packets = 0;
+							}
 							my($yy, $mm, $dd, $hh, $ii, $ss) = &mjdToDate($tot);
 							my $sy = substr($yy, -2);
 							my $date = sprintf("%02d%02d%02d", $sy, $mm, $dd);
@@ -85,6 +96,8 @@
 							my $tsdir = sprintf("%s/%s", $dir, $date);
 							my $tsfile = sprintf("%s/%s.ts", $tsdir, $file);
 							my $idxfile = sprintf("%s/%s.idx", $tsdir, $file);
+							my $ftsfile = sprintf("%s/%s.f.ts", $tsdir, $file);
+							my $idzfile = sprintf("%s/%s.f.idx", $tsdir, $file);
 							system("/bin/mkdir -p $tsdir");
 
 							sysopen($TS, $tsfile, O_WRONLY | O_CREAT | O_APPEND);
@@ -94,10 +107,29 @@
 							select($IDX); $| = 1; select(STDOUT);
 
 							$bytes += sysseek($TS, 0, SEEK_END);
+							if($fullseg){
+							    sysopen($FTS, $ftsfile, O_WRONLY | O_CREAT | O_APPEND);
+							    sysopen($IDZ, $idzfile, O_WRONLY | O_CREAT | O_APPEND);
+
+#							    select($FTS); $| = 1; select(STDOUT);
+							    select($IDZ); $| = 1; select(STDOUT);
+							    my $fract = sysseek($FTS,0,SEEK_END)%188;
+							    if($fract){
+								while($fract<188){
+								    print $TS pack("C",0xFF);
+								    $fract++;
+								}
+							    }
+							    $packets += sysseek($FTS, 0, SEEK_END)/188;
+							}
+
 							$hour = $tot->{hour};
 						}
 
 						print $IDX pack('nCCCL', $tot->{mjd}, $tot->{hour}, $tot->{min}, $tot->{sec}, $bytes);
+						if($IDZ){
+						    print $IDZ pack('nCCCL', $tot->{mjd}, $tot->{hour}, $tot->{min}, $tot->{sec}, $packets);
+						}
 					}
 				}
 			}
@@ -112,10 +144,49 @@
 
 		$status--;
 
-		if ($TS) {
+		my $save = 0;
+		foreach my $save_pid (@known_pids,@stream_pids){
+		    if($pid == $save_pid){
+			$save = 1;
+		    }
+		}
+		if($pid == 0x1FC8){
+		    $pos+=3;
+		    my $pmtsize = vec($buf,$pos++,8);
+		    $pos+=4;
+		    $pmtsize -= 4;
+		    my @pids=();
+		    while($pmtsize>4){
+			my $type = vec($buf,$pos++,8);
+			my $a = vec($buf,$pos++,8);
+			my $b = vec($buf,$pos++,8);
+			my $spid = ($a & 0x1F) << 8 | $b;
+			push(@pids,$spid);
+			$pos++;
+			my $lsize = vec($buf,$pos++,8);
+			$pos+=$lsize;
+			$pmtsize -= (5+$lsize);
+		    }
+		    my $_crc32 = CRC::crc32(substr($buf, 5, $pos - 5));
+		    my $a = vec($buf,$pos++,8);
+		    my $b = vec($buf,$pos++,8);
+		    my $c = vec($buf,$pos++,8);
+		    my $d = vec($buf,$pos++,8);
+		    my $crc32 = $a << 24 | $b << 16 | $c << 8 | $d;
+	    
+		    if($crc32 == $crc32){
+			@stream_pids = @pids;
+			$save = 1;
+		    }
+		}
+		if ($TS && $save == 1) {
 			print $TS $buf;
 			$bytes += 188;
 		}
+		if ($FTS){
+		    print $FTS $buf;
+		    $packets ++;
+		}
 
 	} else {
 		$packetsize = 1;
