summaryrefslogtreecommitdiff
path: root/src/bin/jp3d/tcltk/encoder.tcl
blob: 6c4a508399abd2804e0a9741e5848c4586ba4eb6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470

namespace eval VMEncoder {
	variable var
	variable JP3Dencoder "../bin/bin/volume_to_jp3d"
}

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