#------------------------------------------------------------------------ # # 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 outbssize 65536 set inbp [bitparser_new] set inbs [bitstream_mmap_read_new $streams] set outbs [bitstream_new $outbssize] set file [open $outfile w] fconfigure $file -translation binary -buffersize 65536 #set len [bitstream_channel_read $bs $file 0] bitparser_wrap $inbp $inbs set pkthdr [mpeg_pkt_hdr_new] set currout 0 while {1} { # Find the header. If not found, we are done. set len [mpeg_pkt_hdr_find $inbp] if {$len == -1} { break } # Parse the header and check for stream id. set len [mpeg_pkt_hdr_parse $inbp $pkthdr] set sid [mpeg_pkt_hdr_get_stream_id $pkthdr] if {[expr $sid - 192] != $id} { continue } # so far so good. this is the stream we want. # calculate the length and dump it. set pktlen [mpeg_pkt_hdr_get_length $pkthdr] set len [expr $pktlen + 6 - $len] set currin [bitparser_tell $inbp] # if the bitstream is going to be full, flush the bitstream # to the output file # NOTE : instead of flushing, you can do other things here, # e.g. decode the mpeg. if {[expr $currout + $len] > $outbssize} { bitstream_channel_write_segment $outbs $file 0 $currout set currout 0 } bitstream_dump $inbs $currin $outbs $currout $len bitparser_seek $inbp [expr $len + $currin] set currout [expr $len + $currout] } bitstream_channel_write_segment $outbs $file 0 $currout close $file