| |
| namespace eval VMEncoder { |
| variable var |
| variable JP3Dencoder "../bin/volume_to_jp3d.exe" |
| } |
| |
| proc VMEncoder::create { nb } { |
| |
| set frame [$nb insert end VMEncoder -text "Encoder"] |
| set topf [frame $frame.topf] |
| set midf [frame $frame.midf] |
| set bottomf [frame $frame.bottomf] |
| set srcf [TitleFrame $topf.srcf -text "Source"] |
| set dstf [TitleFrame $topf.dstf -text "Destination"] |
| set Tparf [TitleFrame $midf.parfT -text "Transform Parameters"] |
| set Cparf [TitleFrame $midf.parfC -text "Coding Parameters"] |
| |
| set frame1 [$srcf getframe] |
| VMEncoder::_sourceE $frame1 |
| |
| set frame2 [$dstf getframe] |
| VMEncoder::_destinationE $frame2 |
| |
| set frame3 [$Tparf getframe] |
| VMEncoder::_transformE $frame3 |
| |
| set frame4 [$Cparf getframe] |
| VMEncoder::_codingE $frame4 |
| |
| set butE [Button $bottomf.butE -text "Encode!" \ |
| -command "VMEncoder::_encode $frame1 $frame2" \ |
| -helptext "Encoding trigger button"] |
| set butR [Button $bottomf.butR -text "Restore defaults" \ |
| -command "VMEncoder::_reset $frame1 $frame2 $frame3 $frame4" \ |
| -helptext "Reset to default values"] |
| |
| pack $srcf $dstf -side left -fill y -padx 4 -expand yes |
| pack $topf -pady 2 -fill x |
| |
| pack $Tparf $Cparf -side left -fill both -padx 4 -expand yes |
| pack $midf -pady 2 -fill x |
| |
| pack $butE $butR -side left -padx 40 -pady 5 -fill y -expand yes |
| pack $bottomf -pady 2 -fill x |
| |
| return $frame |
| } |
| |
| proc VMEncoder::_sourceE { parent } { |
| |
| variable var |
| |
| set labsrc [LabelFrame $parent.labsrc -text "Select volume file to encode: " -side top \ |
| -anchor w -relief flat -borderwidth 0] |
| set subsrc [$labsrc getframe] |
| set list [entry $subsrc.entrysrc -width 30 -textvariable VMDecoder::var(source)] |
| |
| set labbrw [LabelFrame $parent.labbrw -side top -anchor w -relief flat -borderwidth 0] |
| set subbrw [$labbrw getframe] |
| set butbrw [button $subbrw.butbrw -image [Bitmap::get open] \ |
| -relief raised -borderwidth 1 -padx 1 -pady 1 \ |
| -command "fileDialogE . $subsrc.entrysrc open"] |
| |
| pack $list -side top |
| pack $butbrw -side top |
| pack $labsrc $labbrw -side left -fill both -expand yes |
| } |
| |
| proc VMEncoder::_destinationE { parent } { |
| |
| variable var |
| |
| set labdst [LabelFrame $parent.labdst -text "Save compressed volume as: " -side top \ |
| -anchor w -relief flat -borderwidth 0] |
| set subdst [$labdst getframe] |
| set list [entry $subdst.entrydst -width 30 -textvariable VMDecoder::var(destination)] |
| |
| set labbrw [LabelFrame $parent.labbrw -side top -anchor w -relief flat -borderwidth 0] |
| set subbrw [$labbrw getframe] |
| set butbrw [button $subbrw.butbrw -image [Bitmap::get save] \ |
| -relief raised -borderwidth 1 -padx 1 -pady 1 \ |
| -command "fileDialogE . $subdst.entrydst save"] |
| |
| pack $list -side top |
| pack $butbrw -side top |
| pack $labdst $labbrw -side left -fill both -expand yes |
| } |
| |
| proc VMEncoder::_codingE { parent } { |
| |
| |
| ########### CODING ############# |
| set labcod [LabelFrame $parent.labcod -side top -anchor w -relief sunken -borderwidth 1] |
| set subcod [$labcod getframe] |
| |
| set framerate [frame $subcod.framerate -borderwidth 1] |
| set labrate [LabelEntry $framerate.labrate -label "Rates: " -labelwidth 9 -labelanchor w \ |
| -textvariable VMEncoder::var(rate) -editable 1 \ |
| -helptext "Compression ratios for different layers (R1, R2, R3,...). If R=1, lossless coding" ] |
| set VMEncoder::var(rate) "1" |
| |
| set framecblk [frame $subcod.framecblk -borderwidth 1] |
| set labcblk [LabelEntry $framecblk.labcblk -label "Codeblock: " -labelwidth 9 -labelanchor w \ |
| -textvariable VMEncoder::var(cblksize) -editable 1 \ |
| -helptext "Codeblock size (X, Y, Z)" ] |
| set VMEncoder::var(cblksize) "64,64,64" |
| |
| set frametile [frame $subcod.frametile -borderwidth 1] |
| set labtile [LabelEntry $frametile.labtile -label "Tile size: " -labelwidth 9 -labelanchor w \ |
| -textvariable VMEncoder::var(tilesize) -editable 1 \ |
| -helptext "Tile size (X, Y, Z)" ] |
| set VMEncoder::var(tilesize) "512,512,512" |
| |
| set framesop [frame $subcod.framesop -borderwidth 1] |
| set chksop [checkbutton $framesop.chksop -text "Write SOP marker" \ |
| -variable VMEncoder::var(sop) -onvalue 1 -offvalue 0 ] |
| set frameeph [frame $subcod.frameeph -borderwidth 1] |
| set chkeph [checkbutton $frameeph.chkeph -text "Write EPH marker" \ |
| -variable VMEncoder::var(eph) -onvalue 1 -offvalue 0 ] |
| |
| set framepoc [frame $subcod.framepoc -borderwidth 1] |
| set labpoc [label $framepoc.labpoc -text "Progression order: " ] |
| set progorder [ComboBox $framepoc.progorder \ |
| -text {Choose a progression order} \ |
| -width 10 \ |
| -textvariable VMEncoder::var(progorder) \ |
| -values {"LRCP" "RLCP" "RPCL" "PCRL" "CPRL"} \ |
| -helptext "Progression order"] |
| set VMEncoder::var(progorder) "LRCP" |
| |
| pack $labrate -side left -padx 2 -anchor n |
| pack $labcblk -side left -padx 2 -anchor n |
| pack $labpoc $progorder -side left -padx 2 -anchor w |
| #pack $labtile -side left -padx 2 -anchor n |
| pack $chksop -side left -padx 2 -anchor w |
| pack $chkeph -side left -padx 2 -anchor w |
| ########### ENTROPY CODING ############# |
| set labent [LabelFrame $parent.labent -text "Entropy Coding" -side top -anchor w -relief sunken -borderwidth 1] |
| set subent [$labent getframe] |
| foreach entval {2EB 3EB} entropy {2D_EBCOT 3D_EBCOT} { |
| set rad [radiobutton $subent.$entval \ |
| -text $entropy \ |
| -variable VMEncoder::var(encoding) \ |
| -command "disableGR $entval $labcblk $progorder $labrate $chksop $chkeph" \ |
| -value $entval ] |
| pack $rad -anchor w |
| } |
| $subent.2EB select |
| |
| pack $subent -padx 2 -anchor n |
| |
| pack $framerate $framecblk $framepoc $framesop $frameeph -side top -anchor w |
| pack $subcod -anchor n |
| |
| pack $labent $labcod -side left -fill both -padx 4 -expand yes |
| |
| |
| } |
| |
| proc VMEncoder::_transformE { parent } { |
| |
| variable var |
| |
| ########### TRANSFORM ############# |
| set labtrf [LabelFrame $parent.labtrf -text "Transform" -side top -anchor w -relief sunken -borderwidth 1] |
| set subtrf [$labtrf getframe] |
| set labres [LabelFrame $parent.labres -side top -anchor w -relief sunken -borderwidth 1] |
| set subres [$labres getframe] |
| |
| ########### ATK ############# |
| set frameatk [frame $subres.frameatk -borderwidth 1] |
| set labatk [label $frameatk.labatk -text "Wavelet kernel: " -anchor w] |
| set atk [ComboBox $frameatk.atk \ |
| -textvariable VMEncoder::var(atk) \ |
| -width 20 \ |
| -text {Choose a wavelet kernel} \ |
| -editable false \ |
| -values {"R5.3" "I9.7"} ] |
| set VMEncoder::var(atk) "R5.3" |
| pack $labatk $atk -side left -anchor w |
| ########### RESOLUTIONS ############# |
| set frameres1 [frame $subres.frameres1 -borderwidth 1] |
| set labresolution [label $frameres1.labresol -text "Resolutions: " -anchor w ] |
| set frameres2 [frame $subres.frameres2 -borderwidth 1] |
| set labresX [label $frameres2.labresX -text " X" -anchor w ] |
| set labresY [label $frameres2.labresY -text " Y" -anchor w ] |
| set labresZ [label $frameres2.labresZ -text " Z" -anchor w ] |
| |
| |
| set resX [SpinBox $frameres2.spinresX \ |
| -range {1 6 1} -textvariable VMEncoder::var(resX) \ |
| -helptext "Number of resolutions in X" \ |
| -width 3 \ |
| -editable false ] |
| set resY [SpinBox $frameres2.spinresY \ |
| -range {1 6 1} -textvariable VMEncoder::var(resY) \ |
| -helptext "Number of resolutions in Y" \ |
| -width 3 \ |
| -editable false ] |
| set resZ [SpinBox $frameres2.spinresZ \ |
| -range {1 6 1} -textvariable VMEncoder::var(resZ) \ |
| -helptext "Number of resolutions in Z" \ |
| -width 3 \ |
| -editable false \ |
| -state disabled ] |
| set VMEncoder::var(resX) 3 |
| set VMEncoder::var(resY) 3 |
| set VMEncoder::var(resZ) 3 |
| |
| ########### TRF ############# |
| foreach trfval {2DWT 3DWT} trf {2D-DWT 3D-DWT} { |
| set rad [radiobutton $subtrf.$trfval -text $trf \ |
| -variable VMEncoder::var(transform) \ |
| -command "disable3RLS $trfval $atk $resX $resY $resZ"\ |
| -value $trfval ] |
| pack $rad -anchor w |
| } |
| $subtrf.2DWT select |
| |
| pack $subtrf -side left -padx 2 -pady 4 |
| |
| pack $labresolution -padx 2 -side left -anchor w |
| pack $labresX $resX -padx 2 -side left -anchor w |
| pack $labresY $resY -padx 2 -side left -anchor w |
| pack $labresZ $resZ -padx 2 -side left -anchor w |
| |
| pack $frameres1 -side top -fill x |
| pack $frameres2 $frameatk -side top -padx 2 -pady 4 -anchor n |
| |
| pack $subres -side left -padx 2 -pady 4 |
| pack $labtrf $labres -side left -fill both -padx 4 -expand yes |
| } |
| |
| |
| proc VMEncoder::_encode { framesrc framedst } { |
| |
| variable var |
| |
| set source [$framesrc.labsrc.f.entrysrc get ] |
| set destination [$framedst.labdst.f.entrydst get ] |
| set cond1 [string match *.pgx [string tolower $source]] |
| set cond2 [string match *-*.pgx [string tolower $source]] |
| set cond3 [string match *.bin [string tolower $source]] |
| |
| set img ".img" |
| set pattern [string range $source 0 [expr [string length $source]-5]] |
| set pattern $pattern$img |
| set exist [file exists $pattern] |
| |
| #comprobamos datos son correctos |
| if {($cond1 == 1) && ($cond2 == 0)} { |
| MessageDlg .msgdlg -parent . -message "Info : Really want to encode an slice instead of a volume?.\n For a group of .pgx slices, name must contain a - denoting a sequential index!" -type ok -icon info |
| } |
| |
| if {$source == ""} { |
| MessageDlg .msgdlg -parent . -message "Error : Source file is not defined !" -type ok -icon error |
| } elseif {$destination == ""} { |
| MessageDlg .msgdlg -parent . -message "Error : Destination file is not defined !" -type ok -icon error |
| } elseif { ($VMEncoder::var(transform) != "3RLS") && ($VMEncoder::var(atk) == "Choose a wavelet transformation kernel") } { |
| MessageDlg .msgdlg -parent . -title "Info" -message "Please choose a wavelet transformation kernel"\ |
| -type ok -icon warning |
| } elseif {($exist == 0) && ($cond1 == 0) && ($cond3 == 1)} { |
| MessageDlg .msgdlg -parent . -message "Error : IMG file associated to BIN volume file not found in same directory !" -type ok -icon info |
| } else { |
| |
| #creamos datain a partir de los parametros de entrada |
| # set dirJP3Dencoder [mk_relativepath $VMEncoder::JP3Dencoder] |
| set dirJP3Dencoder $VMEncoder::JP3Dencoder |
| set datain [concat " $dirJP3Dencoder -i [mk_relativepath $source] "] |
| if {$cond3 == 1} { |
| set datain [concat " $datain -m [mk_relativepath $pattern] "] |
| } |
| set datain [concat " $datain -o [mk_relativepath $destination] "] |
| if {$VMEncoder::var(encoding) != "2EB"} { |
| set datain [concat " $datain -C $VMEncoder::var(encoding) "] |
| } |
| if {$VMEncoder::var(transform) == "2DWT"} { |
| set datain [concat " $datain -n $VMEncoder::var(resX),$VMEncoder::var(resY) "] |
| } elseif {$VMEncoder::var(transform) == "3DWT"} { |
| set datain [concat " $datain -n $VMEncoder::var(resX),$VMEncoder::var(resY),$VMEncoder::var(resZ) "] |
| } |
| |
| set datain [concat " $datain -r $VMEncoder::var(rate) "] |
| |
| if {$VMEncoder::var(atk) == "I9.7"} { |
| set datain [concat " $datain -I "] |
| } |
| if {$VMEncoder::var(sop) == 1} { |
| set datain [concat " $datain -SOP "] |
| } |
| if {$VMEncoder::var(eph) == 1} { |
| set datain [concat " $datain -EPH "] |
| } |
| if {$VMEncoder::var(progorder) != "LRCP"} { |
| set datain [concat " $datain -p $VMEncoder::var(progorder) "] |
| } |
| if {$VMEncoder::var(cblksize) != "64,64,64"} { |
| set datain [concat " $datain -b $VMEncoder::var(cblksize) "] |
| } |
| |
| |
| #Making this work would be great !!! |
| set VMEncoder::var(progval) 10 |
| ProgressDlg .progress -parent . -title "Wait..." \ |
| -type infinite \ |
| -width 20 \ |
| -textvariable "Compute in progress..."\ |
| -variable VMEncoder::progval \ |
| -stop "Stop" \ |
| -command {destroy .progress} |
| after 200 set VMEncoder::var(progval) 2 |
| set fp [open "| $datain " r+] |
| fconfigure $fp -buffering line |
| set jp3dVM::dataout [concat "EXECUTED PROGRAM:\n\t$datain"] |
| while {-1 != [gets $fp tmp]} { |
| set jp3dVM::dataout [concat "$jp3dVM::dataout\n$tmp"] |
| } |
| destroy .progress |
| set cond [string first "ERROR" $jp3dVM::dataout] |
| set cond2 [string first "RESULT" $jp3dVM::dataout] |
| if {$cond != -1} { |
| MessageDlg .msgdlg -parent . -message [string range $jp3dVM::dataout [expr $cond-1] end] -type ok -icon error |
| } elseif {$cond2 != -1} { |
| MessageDlg .msgdlg -parent . -message [string range $jp3dVM::dataout [expr $cond2+7] end] -type ok -icon info |
| close $fp |
| } else { |
| #Must do something with this !!! [pid $fp] |
| close $fp |
| } |
| } |
| } |
| |
| proc VMEncoder::_reset { framesrc framedst frametrf framecod} { |
| |
| variable var |
| |
| #Restore defaults values |
| set VMEncoder::var(transform) 2DWT |
| set VMEncoder::var(encoding) 2EB |
| set VMEncoder::var(atk) "R5.3" |
| set VMEncoder::var(progorder) "LRCP" |
| set atk $frametrf.labres.f.frameatk.atk |
| set resX $frametrf.labres.f.frameres2.spinresX |
| set resY $frametrf.labres.f.frameres2.spinresY |
| set resZ $frametrf.labres.f.frameres2.spinresZ |
| disable3RLS 2DWT $atk $resX $resY $resZ |
| set labcblk $framecod.labcod.f.framecblk.labcblk |
| set progorder $framecod.labcod.f.framepoc.progorder |
| set labrate $framecod.labcod.f.framerate.labrate |
| set chksop $framecod.labcod.f.framesop.chksop |
| set chkeph $framecod.labcod.f.frameeph.chkeph |
| disableGR 3EB $labcblk $progorder $labrate $chksop $chkeph |
| |
| $framesrc.labsrc.f.entrysrc delete 0 end |
| $framedst.labdst.f.entrydst delete 0 end |
| } |
| |
| proc fileDialogE {w ent operation} { |
| |
| variable file |
| variable i j |
| |
| if {$operation == "open"} { |
| set types { |
| {"Source Image Files" {.pgx .bin} } |
| {"All files" *} |
| } |
| set file [tk_getOpenFile -filetypes $types -parent $w] |
| if {[string compare $file ""]} { |
| $ent delete 0 end |
| $ent insert end $file |
| $ent xview moveto 1 |
| } |
| } else { |
| set types { |
| {"JP3D Files" {.jp3d} } |
| {"JPEG2000 Files" {.j2k} } |
| {"All files" *} |
| } |
| set file [tk_getSaveFile -filetypes $types -parent $w \ |
| -initialfile Untitled -defaultextension .jp3d] |
| if {[string compare $file ""]} { |
| $ent delete 0 end |
| $ent insert end $file |
| $ent xview moveto 1 |
| } |
| } |
| } |
| |
| proc mk_relativepath {abspath} { |
| |
| set mydir [split [string trimleft [pwd] {/}] {/}] |
| set abspathcomps [split [string trimleft $abspath {/}] {/}] |
| |
| set i 0 |
| while {$i<[llength $mydir]} { |
| if {![string compare [lindex $abspathcomps $i] [lindex $mydir $i]]} { |
| incr i |
| } else { |
| break |
| } |
| } |
| set h [expr [llength $mydir]-$i] |
| set j [expr [llength $abspathcomps]-$i] |
| |
| if {!$h} { |
| set relpath "./" |
| } else { |
| set relpath "" |
| while { $h > 0 } { |
| set relpath "../$relpath" |
| incr h -1 |
| } |
| } |
| |
| set h [llength $abspathcomps] |
| while { $h > $i } { |
| set relpath [concat $relpath[lindex $abspathcomps [expr [llength $abspathcomps]-$j]]/] |
| incr h -1 |
| incr j -1 |
| } |
| return [string trim $relpath {/}] |
| } |
| |
| proc disable3RLS {flag atk resX resY resZ} { |
| |
| if {$flag == "3RLS"} { |
| $atk configure -state disabled |
| $resX configure -state disabled |
| $resY configure -state disabled |
| $resZ configure -state disabled |
| } elseif {$flag == "2DWT"} { |
| $atk configure -state normal |
| $resX configure -state normal |
| $resY configure -state normal |
| $resZ configure -state disabled |
| } elseif {$flag == "3DWT"} { |
| $atk configure -state normal |
| $resX configure -state normal |
| $resY configure -state normal |
| $resZ configure -state normal |
| } |
| } |
| |
| proc disableGR {flag labcblk progorder labrate chksop chkeph} { |
| |
| if {$flag == "2EB"} { |
| $labcblk configure -state normal |
| $progorder configure -state normal |
| $labrate configure -state normal |
| $chksop configure -state normal |
| $chkeph configure -state normal |
| set VMEncoder::var(cblksize) "64,64,64" |
| set VMEncoder::var(tilesize) "512,512,512" |
| } elseif {$flag == "3EB"} { |
| $labcblk configure -state normal |
| $progorder configure -state normal |
| $labrate configure -state normal |
| $chksop configure -state normal |
| $chkeph configure -state normal |
| set VMEncoder::var(cblksize) "64,64,64" |
| set VMEncoder::var(tilesize) "512,512,512" |
| } else { |
| $labcblk configure -state disabled |
| $progorder configure -state disabled |
| $labrate configure -state disabled |
| $chksop configure -state disabled |
| $chkeph configure -state disabled |
| } |
| } |