2 namespace eval VMEncoder {
4 variable JP3Dencoder "../bin/jp3d_vm_enc.exe"
7 proc VMEncoder::create { nb } {
9 set frame [$nb insert end VMEncoder -text "Encoder"]
10 set topf [frame $frame.topf]
11 set midf [frame $frame.midf]
12 set bottomf [frame $frame.bottomf]
13 set srcf [TitleFrame $topf.srcf -text "Source"]
14 set dstf [TitleFrame $topf.dstf -text "Destination"]
15 set Tparf [TitleFrame $midf.parfT -text "Transform Parameters"]
16 set Cparf [TitleFrame $midf.parfC -text "Coding Parameters"]
18 set frame1 [$srcf getframe]
19 VMEncoder::_sourceE $frame1
21 set frame2 [$dstf getframe]
22 VMEncoder::_destinationE $frame2
24 set frame3 [$Tparf getframe]
25 VMEncoder::_transformE $frame3
27 set frame4 [$Cparf getframe]
28 VMEncoder::_codingE $frame4
30 set butE [Button $bottomf.butE -text "Encode!" \
31 -command "VMEncoder::_encode $frame1 $frame2" \
32 -helptext "Encoding trigger button"]
33 set butR [Button $bottomf.butR -text "Restore defaults" \
34 -command "VMEncoder::_reset $frame1 $frame2 $frame3 $frame4" \
35 -helptext "Reset to default values"]
37 pack $srcf $dstf -side left -fill y -padx 4 -expand yes
38 pack $topf -pady 2 -fill x
40 pack $Tparf $Cparf -side left -fill both -padx 4 -expand yes
41 pack $midf -pady 2 -fill x
43 pack $butE $butR -side left -padx 40 -pady 5 -fill y -expand yes
44 pack $bottomf -pady 2 -fill x
49 proc VMEncoder::_sourceE { parent } {
53 set labsrc [LabelFrame $parent.labsrc -text "Select volume file to encode: " -side top \
54 -anchor w -relief flat -borderwidth 0]
55 set subsrc [$labsrc getframe]
56 set list [entry $subsrc.entrysrc -width 30 -textvariable VMDecoder::var(source)]
58 set labbrw [LabelFrame $parent.labbrw -side top -anchor w -relief flat -borderwidth 0]
59 set subbrw [$labbrw getframe]
60 set butbrw [button $subbrw.butbrw -image [Bitmap::get open] \
61 -relief raised -borderwidth 1 -padx 1 -pady 1 \
62 -command "fileDialogE . $subsrc.entrysrc open"]
65 pack $butbrw -side top
66 pack $labsrc $labbrw -side left -fill both -expand yes
69 proc VMEncoder::_destinationE { parent } {
73 set labdst [LabelFrame $parent.labdst -text "Save compressed volume as: " -side top \
74 -anchor w -relief flat -borderwidth 0]
75 set subdst [$labdst getframe]
76 set list [entry $subdst.entrydst -width 30 -textvariable VMDecoder::var(destination)]
78 set labbrw [LabelFrame $parent.labbrw -side top -anchor w -relief flat -borderwidth 0]
79 set subbrw [$labbrw getframe]
80 set butbrw [button $subbrw.butbrw -image [Bitmap::get save] \
81 -relief raised -borderwidth 1 -padx 1 -pady 1 \
82 -command "fileDialogE . $subdst.entrydst save"]
85 pack $butbrw -side top
86 pack $labdst $labbrw -side left -fill both -expand yes
89 proc VMEncoder::_codingE { parent } {
92 ########### CODING #############
93 set labcod [LabelFrame $parent.labcod -side top -anchor w -relief sunken -borderwidth 1]
94 set subcod [$labcod getframe]
96 set framerate [frame $subcod.framerate -borderwidth 1]
97 set labrate [LabelEntry $framerate.labrate -label "Rates: " -labelwidth 9 -labelanchor w \
98 -textvariable VMEncoder::var(rate) -editable 1 \
99 -helptext "Compression ratios for different layers (R1, R2, R3,...). If R=1, lossless coding" ]
100 set VMEncoder::var(rate) "1"
102 set framecblk [frame $subcod.framecblk -borderwidth 1]
103 set labcblk [LabelEntry $framecblk.labcblk -label "Codeblock: " -labelwidth 9 -labelanchor w \
104 -textvariable VMEncoder::var(cblksize) -editable 1 \
105 -helptext "Codeblock size (X, Y, Z)" ]
106 set VMEncoder::var(cblksize) "64,64,64"
108 set frametile [frame $subcod.frametile -borderwidth 1]
109 set labtile [LabelEntry $frametile.labtile -label "Tile size: " -labelwidth 9 -labelanchor w \
110 -textvariable VMEncoder::var(tilesize) -editable 1 \
111 -helptext "Tile size (X, Y, Z)" ]
112 set VMEncoder::var(tilesize) "512,512,512"
114 set framesop [frame $subcod.framesop -borderwidth 1]
115 set chksop [checkbutton $framesop.chksop -text "Write SOP marker" \
116 -variable VMEncoder::var(sop) -onvalue 1 -offvalue 0 ]
117 set frameeph [frame $subcod.frameeph -borderwidth 1]
118 set chkeph [checkbutton $frameeph.chkeph -text "Write EPH marker" \
119 -variable VMEncoder::var(eph) -onvalue 1 -offvalue 0 ]
121 set framepoc [frame $subcod.framepoc -borderwidth 1]
122 set labpoc [label $framepoc.labpoc -text "Progression order: " ]
123 set progorder [ComboBox $framepoc.progorder \
124 -text {Choose a progression order} \
126 -textvariable VMEncoder::var(progorder) \
127 -values {"LRCP" "RLCP" "RPCL" "PCRL" "CPRL"} \
128 -helptext "Progression order"]
129 set VMEncoder::var(progorder) "LRCP"
131 pack $labrate -side left -padx 2 -anchor n
132 pack $labcblk -side left -padx 2 -anchor n
133 pack $labpoc $progorder -side left -padx 2 -anchor w
134 #pack $labtile -side left -padx 2 -anchor n
135 pack $chksop -side left -padx 2 -anchor w
136 pack $chkeph -side left -padx 2 -anchor w
137 ########### ENTROPY CODING #############
138 set labent [LabelFrame $parent.labent -text "Entropy Coding" -side top -anchor w -relief sunken -borderwidth 1]
139 set subent [$labent getframe]
140 foreach entval {2EB 3EB} entropy {2D_EBCOT 3D_EBCOT} {
141 set rad [radiobutton $subent.$entval \
143 -variable VMEncoder::var(encoding) \
144 -command "disableGR $entval $labcblk $progorder $labrate $chksop $chkeph" \
150 pack $subent -padx 2 -anchor n
152 pack $framerate $framecblk $framepoc $framesop $frameeph -side top -anchor w
153 pack $subcod -anchor n
155 pack $labent $labcod -side left -fill both -padx 4 -expand yes
160 proc VMEncoder::_transformE { parent } {
164 ########### TRANSFORM #############
165 set labtrf [LabelFrame $parent.labtrf -text "Transform" -side top -anchor w -relief sunken -borderwidth 1]
166 set subtrf [$labtrf getframe]
167 set labres [LabelFrame $parent.labres -side top -anchor w -relief sunken -borderwidth 1]
168 set subres [$labres getframe]
170 ########### ATK #############
171 set frameatk [frame $subres.frameatk -borderwidth 1]
172 set labatk [label $frameatk.labatk -text "Wavelet kernel: " -anchor w]
173 set atk [ComboBox $frameatk.atk \
174 -textvariable VMEncoder::var(atk) \
176 -text {Choose a wavelet kernel} \
178 -values {"R5.3" "I9.7"} ]
179 set VMEncoder::var(atk) "R5.3"
180 pack $labatk $atk -side left -anchor w
181 ########### RESOLUTIONS #############
182 set frameres1 [frame $subres.frameres1 -borderwidth 1]
183 set labresolution [label $frameres1.labresol -text "Resolutions: " -anchor w ]
184 set frameres2 [frame $subres.frameres2 -borderwidth 1]
185 set labresX [label $frameres2.labresX -text " X" -anchor w ]
186 set labresY [label $frameres2.labresY -text " Y" -anchor w ]
187 set labresZ [label $frameres2.labresZ -text " Z" -anchor w ]
190 set resX [SpinBox $frameres2.spinresX \
191 -range {1 6 1} -textvariable VMEncoder::var(resX) \
192 -helptext "Number of resolutions in X" \
195 set resY [SpinBox $frameres2.spinresY \
196 -range {1 6 1} -textvariable VMEncoder::var(resY) \
197 -helptext "Number of resolutions in Y" \
200 set resZ [SpinBox $frameres2.spinresZ \
201 -range {1 6 1} -textvariable VMEncoder::var(resZ) \
202 -helptext "Number of resolutions in Z" \
206 set VMEncoder::var(resX) 3
207 set VMEncoder::var(resY) 3
208 set VMEncoder::var(resZ) 3
210 ########### TRF #############
211 foreach trfval {2DWT 3DWT} trf {2D-DWT 3D-DWT} {
212 set rad [radiobutton $subtrf.$trfval -text $trf \
213 -variable VMEncoder::var(transform) \
214 -command "disable3RLS $trfval $atk $resX $resY $resZ"\
220 pack $subtrf -side left -padx 2 -pady 4
222 pack $labresolution -padx 2 -side left -anchor w
223 pack $labresX $resX -padx 2 -side left -anchor w
224 pack $labresY $resY -padx 2 -side left -anchor w
225 pack $labresZ $resZ -padx 2 -side left -anchor w
227 pack $frameres1 -side top -fill x
228 pack $frameres2 $frameatk -side top -padx 2 -pady 4 -anchor n
230 pack $subres -side left -padx 2 -pady 4
231 pack $labtrf $labres -side left -fill both -padx 4 -expand yes
235 proc VMEncoder::_encode { framesrc framedst } {
239 set source [$framesrc.labsrc.f.entrysrc get ]
240 set destination [$framedst.labdst.f.entrydst get ]
241 set cond1 [string match *.pgx [string tolower $source]]
242 set cond2 [string match *-*.pgx [string tolower $source]]
243 set cond3 [string match *.bin [string tolower $source]]
246 set pattern [string range $source 0 [expr [string length $source]-5]]
247 set pattern $pattern$img
248 set exist [file exists $pattern]
250 #comprobamos datos son correctos
251 if {($cond1 == 1) && ($cond2 == 0)} {
252 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
256 MessageDlg .msgdlg -parent . -message "Error : Source file is not defined !" -type ok -icon error
257 } elseif {$destination == ""} {
258 MessageDlg .msgdlg -parent . -message "Error : Destination file is not defined !" -type ok -icon error
259 } elseif { ($VMEncoder::var(transform) != "3RLS") && ($VMEncoder::var(atk) == "Choose a wavelet transformation kernel") } {
260 MessageDlg .msgdlg -parent . -title "Info" -message "Please choose a wavelet transformation kernel"\
261 -type ok -icon warning
262 } elseif {($exist == 0) && ($cond1 == 0) && ($cond3 == 1)} {
263 MessageDlg .msgdlg -parent . -message "Error : IMG file associated to BIN volume file not found in same directory !" -type ok -icon info
266 #creamos datain a partir de los parametros de entrada
267 # set dirJP3Dencoder [mk_relativepath $VMEncoder::JP3Dencoder]
268 set dirJP3Dencoder $VMEncoder::JP3Dencoder
269 set datain [concat " $dirJP3Dencoder -i [mk_relativepath $source] "]
271 set datain [concat " $datain -m [mk_relativepath $pattern] "]
273 set datain [concat " $datain -o [mk_relativepath $destination] "]
274 if {$VMEncoder::var(encoding) != "2EB"} {
275 set datain [concat " $datain -C $VMEncoder::var(encoding) "]
277 if {$VMEncoder::var(transform) == "2DWT"} {
278 set datain [concat " $datain -n $VMEncoder::var(resX),$VMEncoder::var(resY) "]
279 } elseif {$VMEncoder::var(transform) == "3DWT"} {
280 set datain [concat " $datain -n $VMEncoder::var(resX),$VMEncoder::var(resY),$VMEncoder::var(resZ) "]
283 set datain [concat " $datain -r $VMEncoder::var(rate) "]
285 if {$VMEncoder::var(atk) == "I9.7"} {
286 set datain [concat " $datain -I "]
288 if {$VMEncoder::var(sop) == 1} {
289 set datain [concat " $datain -SOP "]
291 if {$VMEncoder::var(eph) == 1} {
292 set datain [concat " $datain -EPH "]
294 if {$VMEncoder::var(progorder) != "LRCP"} {
295 set datain [concat " $datain -p $VMEncoder::var(progorder) "]
297 if {$VMEncoder::var(cblksize) != "64,64,64"} {
298 set datain [concat " $datain -b $VMEncoder::var(cblksize) "]
302 #Making this work would be great !!!
303 set VMEncoder::var(progval) 10
304 ProgressDlg .progress -parent . -title "Wait..." \
307 -textvariable "Compute in progress..."\
308 -variable VMEncoder::progval \
310 -command {destroy .progress}
311 after 200 set VMEncoder::var(progval) 2
312 set fp [open "| $datain " r+]
313 fconfigure $fp -buffering line
314 set jp3dVM::dataout [concat "EXECUTED PROGRAM:\n\t$datain"]
315 while {-1 != [gets $fp tmp]} {
316 set jp3dVM::dataout [concat "$jp3dVM::dataout\n$tmp"]
319 set cond [string first "ERROR" $jp3dVM::dataout]
320 set cond2 [string first "RESULT" $jp3dVM::dataout]
322 MessageDlg .msgdlg -parent . -message [string range $jp3dVM::dataout [expr $cond-1] end] -type ok -icon error
323 } elseif {$cond2 != -1} {
324 MessageDlg .msgdlg -parent . -message [string range $jp3dVM::dataout [expr $cond2+7] end] -type ok -icon info
327 #Must do something with this !!! [pid $fp]
333 proc VMEncoder::_reset { framesrc framedst frametrf framecod} {
337 #Restore defaults values
338 set VMEncoder::var(transform) 2DWT
339 set VMEncoder::var(encoding) 2EB
340 set VMEncoder::var(atk) "R5.3"
341 set VMEncoder::var(progorder) "LRCP"
342 set atk $frametrf.labres.f.frameatk.atk
343 set resX $frametrf.labres.f.frameres2.spinresX
344 set resY $frametrf.labres.f.frameres2.spinresY
345 set resZ $frametrf.labres.f.frameres2.spinresZ
346 disable3RLS 2DWT $atk $resX $resY $resZ
347 set labcblk $framecod.labcod.f.framecblk.labcblk
348 set progorder $framecod.labcod.f.framepoc.progorder
349 set labrate $framecod.labcod.f.framerate.labrate
350 set chksop $framecod.labcod.f.framesop.chksop
351 set chkeph $framecod.labcod.f.frameeph.chkeph
352 disableGR 3EB $labcblk $progorder $labrate $chksop $chkeph
354 $framesrc.labsrc.f.entrysrc delete 0 end
355 $framedst.labdst.f.entrydst delete 0 end
358 proc fileDialogE {w ent operation} {
363 if {$operation == "open"} {
365 {"Source Image Files" {.pgx .bin} }
368 set file [tk_getOpenFile -filetypes $types -parent $w]
369 if {[string compare $file ""]} {
371 $ent insert end $file
376 {"JP3D Files" {.jp3d} }
377 {"JPEG2000 Files" {.j2k} }
380 set file [tk_getSaveFile -filetypes $types -parent $w \
381 -initialfile Untitled -defaultextension .jp3d]
382 if {[string compare $file ""]} {
384 $ent insert end $file
390 proc mk_relativepath {abspath} {
392 set mydir [split [string trimleft [pwd] {/}] {/}]
393 set abspathcomps [split [string trimleft $abspath {/}] {/}]
396 while {$i<[llength $mydir]} {
397 if {![string compare [lindex $abspathcomps $i] [lindex $mydir $i]]} {
403 set h [expr [llength $mydir]-$i]
404 set j [expr [llength $abspathcomps]-$i]
411 set relpath "../$relpath"
416 set h [llength $abspathcomps]
418 set relpath [concat $relpath[lindex $abspathcomps [expr [llength $abspathcomps]-$j]]/]
422 return [string trim $relpath {/}]
425 proc disable3RLS {flag atk resX resY resZ} {
427 if {$flag == "3RLS"} {
428 $atk configure -state disabled
429 $resX configure -state disabled
430 $resY configure -state disabled
431 $resZ configure -state disabled
432 } elseif {$flag == "2DWT"} {
433 $atk configure -state normal
434 $resX configure -state normal
435 $resY configure -state normal
436 $resZ configure -state disabled
437 } elseif {$flag == "3DWT"} {
438 $atk configure -state normal
439 $resX configure -state normal
440 $resY configure -state normal
441 $resZ configure -state normal
445 proc disableGR {flag labcblk progorder labrate chksop chkeph} {
447 if {$flag == "2EB"} {
448 $labcblk configure -state normal
449 $progorder configure -state normal
450 $labrate configure -state normal
451 $chksop configure -state normal
452 $chkeph configure -state normal
453 set VMEncoder::var(cblksize) "64,64,64"
454 set VMEncoder::var(tilesize) "512,512,512"
455 } elseif {$flag == "3EB"} {
456 $labcblk configure -state normal
457 $progorder configure -state normal
458 $labrate configure -state normal
459 $chksop configure -state normal
460 $chkeph configure -state normal
461 set VMEncoder::var(cblksize) "64,64,64"
462 set VMEncoder::var(tilesize) "512,512,512"
464 $labcblk configure -state disabled
465 $progorder configure -state disabled
466 $labrate configure -state disabled
467 $chksop configure -state disabled
468 $chkeph configure -state disabled