#------------------------------------------------------------------------
#
# Copyright (c) 1997-1998 by Cornell University.
#
# See the file "license.txt" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
#------------------------------------------------------------------------
package require DvmBasic
package require DvmMpeg
if {$argc < 3} {
puts "enter MPEG system streams input file :"
set streams [gets stdin]
puts "enter stream id you want to extract :"
set id [gets stdin]
puts "enter output filename :"
set outfile [gets stdin]
} else {
set streams [lindex $argv 0]
set id [lindex $argv 1]
set outfile [lindex $argv 2]
}
#----------------------------------------------------------------
# open file, create new bitparser, new bitstream, read first
# 65535 bytes from file into bitstream and attached the bitparser
# to the bitstream
#----------------------------------------------------------------
set bp [bitparser_new]
set bs [bitstream_new 65535]
set file [open $streams r]
fconfigure $file -translation binary -buffersize 65535
set len [bitstream_channel_read $bs $file 0]
bitparser_wrap $bp $bs
#----------------------------------------------------------------
# build the system toc
#----------------------------------------------------------------
set toc [mpeg_sys_toc_new]
set off 0
mpeg_sys_toc_add $bp $toc $off
while {![eof $file]} {
set pos [bitparser_tell $bp]
set bytesInBuf [expr 65535-$pos]
bitstream_shift $bs $pos
set off [expr $off + $pos]
bitstream_channel_read $bs $file $bytesInBuf
bitparser_seek $bp 0
mpeg_sys_toc_add $bp $toc $off
}
#----------------------------------------------------------------
# use the toc to demux the video stream
#----------------------------------------------------------------
seek $file 0
set outfile [open $outfile w]
fconfigure $outfile -translation binary -buffersize 65535
set index [ mpeg_sys_toc_get_filter $toc $id]
set len [ bitstream_channel_filter_in $bs $file 0 $index ]
while {$len == 65535} {
bitstream_channel_write_segment $bs $outfile 0 $len
set len [bitstream_channel_filter_in $bs $file 0 $index]
}
bitstream_channel_write_segment $bs $outfile 0 $len
mpeg_sys_toc_free $toc
bitstream_free $bs