summaryrefslogtreecommitdiff
path: root/src/bin/jp3d/tcltk/decoder.tcl
blob: 98edcde9489f55ca14bedd57ebea233d155c4c98 (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

namespace eval VMDecoder {
	variable var
	variable JP3Ddecoder "../bin/jp3d_to_volume.exe"
	#variable JP3Ddecoder "jp3d_to_volume.exe"
}


proc VMDecoder::create { nb } {
	variable var

	set frameD [$nb insert end VMDecoder -text "Decoder"]
	set topfD	[frame $frameD.topfD]
	set medfD	[frame $frameD.medfD]
	set bottomfD	[frame $frameD.bottomfD]
	set srcfD [TitleFrame $topfD.srcfD -text "Source"]
	set dstfD [TitleFrame $topfD.dstfD -text "Destination"]
	set paramfD [TitleFrame $medfD.paramfD -text "Decoding parameters"]
	set infofD [TitleFrame $medfD.infofD -text "Distortion measures"]

	set frame1 [$srcfD getframe]
	_sourceD  $frame1
	set frame2  [$dstfD getframe]
	_destinationD  $frame2
	set frame3  [$infofD getframe]
	_originalD $frame3
	set frame4  [$paramfD getframe]
	_paramsD $frame4

	set butD   [Button $bottomfD.butD -text "Decode!" \
		   -command  "VMDecoder::_decode $frame1 $frame2 $frame3" \
		   -helptext "Decoding trigger button"]
	set butR   [Button $bottomfD.butR -text "Save info" \
		   -command  "VMDecoder::_save $frame3" \
		   -helptext "Save information"]
	
	pack $srcfD $dstfD -side left -fill both -padx 10 -ipadx 5 -expand yes
	pack $topfD -pady 4 -fill x
	
	pack $paramfD $infofD -side left -fill both -padx 10 -pady 2 -ipadx 5 -expand yes
	pack $medfD -pady 4 -fill x 

	pack $butD $butR -side left -padx 4 -pady 5 -expand yes
	pack $bottomfD -pady 4 -fill x

return $frameD
}


proc fileDialogD {w ent operation} {

	variable file
	
	if {$operation == "open"} {
		#-----Type names---------Extension(s)---
		set types {
		{"JP3D Files"	   {.jp3d}	}
		{"All files"		*}
		}
		set file [tk_getOpenFile -filetypes $types -parent $w ]
	} elseif {$operation == "original"} {
		#-----Type names---------Extension(s)---
		set types {
		{"BIN Raw Image Files"  {.bin}  }
		{"PGX Raw Image Files"	{.pgx}	}
		{"All files"		*}
		}
		set file [tk_getOpenFile -filetypes $types -parent $w ]
	} else {
		#-----Type names---------Extension(s)---
		set types {
		{"BIN Raw Image Files"  {.bin}  }
		{"PGX Raw Image Files"	{.pgx}	}
		{"All files"		*}
		}
		set file [tk_getSaveFile -filetypes $types -parent $w -initialfile Untitled -defaultextension "*.bin"]
	}
	if {[string compare $file ""]} {
		$ent delete 0 end
		$ent insert end $file
		$ent xview moveto 1
	}
}

proc VMDecoder::_sourceD { parent } {
	
	variable var
	
	set labsrcD [LabelFrame $parent.labsrcD -text "Select compressed file: " -side top \
			-anchor w -relief flat -borderwidth 0]
	set subsrcD [$labsrcD getframe]
	set listD [entry $subsrcD.entrysrcD -width 40 -textvariable VMDecoder::var(sourceD)]
	
	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 "fileDialogD . $subsrcD.entrysrcD open"]
	
	pack $listD -side top
	pack $butbrw -side top
	pack $labsrcD $labbrw -side left -fill both -expand yes


}

proc VMDecoder::_destinationD { parent } {
	
	variable var
	
	set labdstD [LabelFrame $parent.labdstD -text "Save decompressed volume file(s) as: " -side top \
			-anchor w -relief flat -borderwidth 0]
	set subdstD [$labdstD getframe]
	set listD [entry $subdstD.entrydstD -width 40 -textvariable VMDecoder::var(destinationD)]
	
	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 "fileDialogD . $subdstD.entrydstD save"]

	pack $listD -side top
	pack $butbrw -side top
	pack $labdstD $labbrw -side left -fill both -expand yes
}

proc VMDecoder::_originalD { parent } {
	
	variable var
	
	set laborgD [LabelFrame $parent.laborgD -text "Select original file: " -side top \
			-anchor w -relief flat -borderwidth 0]
	set suborgD [$laborgD getframe]
	set listorgD [entry $suborgD.entryorgD -width 30 -textvariable VMDecoder::var(originalD)]
	
	set labbrw2 [LabelFrame $parent.labbrw2 -side top -anchor w -relief flat -borderwidth 0]
	set subbrw2 [$labbrw2 getframe]
	set butbrw2 [button $subbrw2.butbrw2 -image [Bitmap::get open] \
		-relief raised -borderwidth 1 -padx 1 -pady 1 \
		-command "fileDialogD . $suborgD.entryorgD original"]
	
	set infoD [Label $parent.infoD -relief sunken -textvariable VMDecoder::var(decodinfo) -justify left]

	pack $listorgD -side left -anchor n
	pack $butbrw2 -side left -anchor n
	pack $infoD -side bottom -anchor nw -pady 4 -ipadx 150 -ipady 20 -expand yes
	pack $laborgD $labbrw2 -side left -fill both 


}

proc VMDecoder::_paramsD { parent } {
	
	variable var
	
	########### DECODING  #############
	set labcod [LabelFrame $parent.labcod -side top -anchor w -relief sunken -borderwidth 1]
	set subcod  [$labcod getframe]

		set frameres [frame $subcod.frameres -borderwidth 1]
		set labres [LabelEntry $frameres.labres -label "Resolutions to discard: " -labelwidth 20 -labelanchor w \
                   -textvariable VMDecoder::var(resdiscard) -editable 1 \
                   -helptext "Number of highest resolution levels to be discarded on each dimension" ]
	set VMDecoder::var(resdiscard) "0,0,0"
	
		set framelayer [frame $subcod.framelayer -borderwidth 1]
		set lablayer [LabelEntry $framelayer.lablayer -label "Layers to decode: " -labelwidth 20 -labelanchor w \
                   -textvariable VMDecoder::var(layer) -editable 1 \
                   -helptext "Maximum number of quality layers to decode" ]
	set VMDecoder::var(layer) "All"

	set framebe [frame $subcod.framebe -borderwidth 1]
	set chkbe [checkbutton $framebe.chkbe -text "Write decoded file with BigEndian byte order" \
		   -variable VMDecoder::var(be) -onvalue 1 -offvalue 0 ]

		pack $labres -side left -padx 2 -anchor n
		pack $lablayer -side left -padx 2 -anchor n
		pack $chkbe -side left -padx 2 -anchor w
		pack $frameres $framelayer $framebe -side top -anchor w

	pack $subcod -anchor n
	pack $labcod -side left -fill both -padx 4 -expand yes
}


proc VMDecoder::_decode { framesrc framedst frameinfo} {

	variable var

	set sourceD [$framesrc.labsrcD.f.entrysrcD get ]
	set destinationD [$framedst.labdstD.f.entrydstD get ]
	set originD [$frameinfo.laborgD.f.entryorgD get ]
	set cond1 [string match *.pgx [string tolower $destinationD]]
	set cond2 [string match *\**.pgx [string tolower $destinationD]]
	set cond3 [string match *.bin [string tolower $destinationD]]
	
	#comprobamos datos son correctos
	if {($cond1 == 1) && ($cond2 == 0)} {
		set pgx "*.pgx"
		set pattern [string range $destinationD 0 [expr [string length $destinationD]-5]]
		set destinationD $pattern$img
	} elseif {$sourceD == ""} {
	  MessageDlg .msgdlg -parent . -message "Error : Source file is not defined !" -type ok -icon error 
	} elseif {$destinationD == ""} {
	  MessageDlg .msgdlg -parent . -message "Error : Destination file is not defined !" -type ok -icon error 
	} else {

		#creamos datain a partir de los parametros de entrada
		#set dirJP3Ddecoder [mk_relativepath $VMDecoder::JP3Ddecoder]
		set dirJP3Ddecoder $VMDecoder::JP3Ddecoder
		set datain [concat " $dirJP3Ddecoder -i [mk_relativepath $sourceD] "]
		set datain [concat " $datain -o [mk_relativepath $destinationD] "]
		if {$originD != ""} {
			set datain [concat " $datain -O [mk_relativepath $originD] "]
			if {$cond3 == 1} {
				set img ".img"
				set pattern [string range $originD 0 [expr [string length $originD]-5]]
				set pattern $pattern$img
				if {[file exists $pattern]} {
				  set datain [concat " $datain -m [mk_relativepath $pattern] "]
				} else {
				  MessageDlg .msgdlg -parent . -message "Error : IMG file associated to original BIN volume file not found in same directory !" -type ok -icon info 
				}
			}
		}
		if {$VMDecoder::var(resdiscard) != "0,0,0"} {
			set datain [concat " $datain -r $VMDecoder::var(resdiscard) "]
		}
		if {$VMDecoder::var(layer) != "All" && $VMDecoder::var(layer) > 0} {
			set datain [concat " $datain -l $VMDecoder::var(layer) "]
		}
		if {$VMDecoder::var(be) == 1} {
			set datain [concat " $datain -BE"]
		}
		
		set VMDecoder::var(progval) 10
		ProgressDlg .progress -parent . -title "Wait..." \
			-type         infinite \
			-width        20 \
			-textvariable "Compute in progress..."\
			-variable     VMDecoder::progval \
			-stop         "Stop" \
			-command      {destroy .progress}

		after 200 set VMDecoder::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"]
		}
		close $fp
		destroy .progress
		set cond [string first "ERROR" $jp3dVM::dataout]
		set cond2 [string first "PSNR" $jp3dVM::dataout]
		set cond3 [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 {$cond3 != -1} {
			if {$cond2 != -1} {
				set VMDecoder::var(decodinfo) [string range $jp3dVM::dataout [expr $cond2-1] end]
			}
			MessageDlg .msgdlg -parent . -message [string range $jp3dVM::dataout [expr $cond3-1] end] -type ok -icon info
		}
	}
}

proc VMDecoder::_save { frameinfo } {

}