#------------------------------------------------------------------------
#
# 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 DvmJpeg
package require DvmPnm
package require DvmColor
source ../lib/pnmlib.tcl
if {$argc < 2} {
puts "Enter input JPEG file :"
set infile [gets stdin]
puts "Enter output PPM file :"
set outfile [gets stdin]
} else {
set infile [lindex $argv 0]
set outfile [lindex $argv 1]
}
set bs [bitstream_mmap_read_new $infile]
set bp [bitparser_new]
bitparser_wrap $bp $bs
set h [jpeg_hdr_new]
jpeg_hdr_parse $bp $h
set s [jpeg_scan_hdr_new]
jpeg_scan_hdr_parse $bp $h $s
set nc [jpeg_scan_hdr_get_num_of_components $s]
set wi [jpeg_hdr_get_width $h]
set hi [jpeg_hdr_get_height $h]
set bw [expr int(($wi + 7)/8)]
set bh [expr int(($hi + 7)/8)]
set mbw [jpeg_hdr_get_max_block_width $h]
set mbh [jpeg_hdr_get_max_block_height $h]
set sclist {}
for {set i 0} {$i < $nc} {incr i} {
set id [jpeg_scan_hdr_get_scan_id $s $i]
set xdec($i) [expr $mbw/[jpeg_hdr_get_block_width $h $id]]
set ydec($i) [expr $mbh/[jpeg_hdr_get_block_height $h $id]]
lappend sclist [sc_new [expr $bw/$xdec($i)] [expr $bh/$ydec($i)]]
}
eval jpeg_scan_parse $bp $h $s $sclist
set pw [expr $bw*8]
set ph [expr $bh*8]
set y [byte_new [expr $pw/$xdec(0)] [expr $ph/$ydec(0)]]
set u [byte_new [expr $pw/$xdec(1)] [expr $ph/$ydec(1)]]
set v [byte_new [expr $pw/$xdec(2)] [expr $ph/$ydec(2)]]
set r [byte_new $pw $ph]
set g [byte_new $pw $ph]
set b [byte_new $pw $ph]
sc_i_to_byte [lindex $sclist 0] $y
sc_i_to_byte [lindex $sclist 1] $u
sc_i_to_byte [lindex $sclist 2] $v
if {$mbh == 1} {
yuv_to_rgb_422 $y $u $v $r $g $b
} else {
yuv_to_rgb_420 $y $u $v $r $g $b
}
set obs [bitstream_new [expr 20 + 3*[byte_get_width $r]*[byte_get_height $r]]]
set obp [bitparser_new]
bitparser_wrap $obp $obs
set out [open $outfile w]
fconfigure $out -translation binary
set pp [pnm_hdr_new]
pnm_hdr_set_width $pp $pw
pnm_hdr_set_height $pp $ph
pnm_hdr_set_maxval $pp 255
pnm_hdr_set_type $pp ppm-bin
pnm_hdr_encode $pp $obp
ppm_encode $r $g $b $obp
set size [bitparser_tell $obp]
bitstream_channel_write_segment $obs $out 0 $size
pnm_hdr_free $pp
bitparser_free $obp
bitparser_free $bp
bitstream_free $obs
bitstream_mmap_read_free $bs
byte_free $y
byte_free $u
byte_free $v
byte_free $r
byte_free $g
byte_free $b