#------------------------------------------------------------------------
#
# 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