#------------------------------------------------------------------------
#
# 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 DvmAvi
package require DvmPnm
#---------------------------------------------------------------
# This script decodes an avi video stream into a series of ppms
#---------------------------------------------------------------
#---------------------------------------------------------------
# This procedure encode 3 byte image into a bitstream bs,
# using bitparser bp, and output it to a tcl channel called
# name. Assumes that the header is already encoded in the
# bitstream. (This is an improvement over the routines in pnmlib.tcl
# since it reuse the same header and bitstream)
#---------------------------------------------------------------
proc write_ppm {r g b bs bp name} {
set chan [open $name w]
fconfigure $chan -translation binary -buffersize 65536
set curr [bitparser_tell $bp]
ppm_encode $r $g $b $bp
bitstream_channel_write $bs $chan 0
bitparser_seek $bp $curr
close $chan
}
if {$argc != 1} {
puts "enter input mpeg file :"
set inname [gets stdin]
} else {
set inname [lindex $argv 0]
}
set hdr [avi_file_open "$inname"]
set shdr [avi_stream_open $hdr 0]
set w [avi_stream_get_width $shdr]
set h [avi_stream_get_height $shdr]
set ln [avi_stream_get_length $shdr]
set r [byte_new $w $h]
set g [byte_new $w $h]
set b [byte_new $w $h]
#----------------------------------------------------------------
# initialize stuff for ppm file output
# we only need to write the header once.
#----------------------------------------------------------------
set pnmhdr [pnm_hdr_new]
pnm_hdr_set_type $pnmhdr "ppm-bin"
pnm_hdr_set_width $pnmhdr $w
pnm_hdr_set_height $pnmhdr $h
pnm_hdr_set_maxval $pnmhdr 255
set outbs [bitstream_new [expr 3*$w*$h + 20]]
set outbp [bitparser_new]
bitparser_wrap $outbp $outbs
pnm_hdr_encode $pnmhdr $outbp
pnm_hdr_free $pnmhdr
#----------------------------------------------------------------
# Now do the decode
#----------------------------------------------------------------
avi_stream_start_decode $shdr
for {set i 0} {$i < $ln} {incr i} {
avi_video_frame_read $shdr $r $g $b
write_ppm $r $g $b $outbs $outbp [format "%03di.ppm" $i]
puts -nonewline " $i"
flush stdout
}
puts ""
byte_free $r
byte_free $g
byte_free $b
avi_stream_close $shdr
avi_file_close $hdr