6fadbb181c86339c4e8418ed424b2dc2c0120be0
[openjpeg.git] / tcltk / decoder.tcl
1 \r
2 namespace eval VMDecoder {\r
3         variable var\r
4         variable JP3Ddecoder "../bin/jp3d_vm_dec.exe"\r
5         #variable JP3Ddecoder "jp3d_vm_dec.exe"\r
6 }\r
7 \r
8 \r
9 proc VMDecoder::create { nb } {\r
10         variable var\r
11 \r
12         set frameD [$nb insert end VMDecoder -text "Decoder"]\r
13         set topfD       [frame $frameD.topfD]\r
14         set medfD       [frame $frameD.medfD]\r
15         set bottomfD    [frame $frameD.bottomfD]\r
16         set srcfD [TitleFrame $topfD.srcfD -text "Source"]\r
17         set dstfD [TitleFrame $topfD.dstfD -text "Destination"]\r
18         set paramfD [TitleFrame $medfD.paramfD -text "Decoding parameters"]\r
19         set infofD [TitleFrame $medfD.infofD -text "Distortion measures"]\r
20 \r
21         set frame1 [$srcfD getframe]\r
22         _sourceD  $frame1\r
23         set frame2  [$dstfD getframe]\r
24         _destinationD  $frame2\r
25         set frame3  [$infofD getframe]\r
26         _originalD $frame3\r
27         set frame4  [$paramfD getframe]\r
28         _paramsD $frame4\r
29 \r
30         set butD   [Button $bottomfD.butD -text "Decode!" \\r
31                    -command  "VMDecoder::_decode $frame1 $frame2 $frame3" \\r
32                    -helptext "Decoding trigger button"]\r
33         set butR   [Button $bottomfD.butR -text "Save info" \\r
34                    -command  "VMDecoder::_save $frame3" \\r
35                    -helptext "Save information"]\r
36         \r
37         pack $srcfD $dstfD -side left -fill both -padx 10 -ipadx 5 -expand yes\r
38         pack $topfD -pady 4 -fill x\r
39         \r
40         pack $paramfD $infofD -side left -fill both -padx 10 -pady 2 -ipadx 5 -expand yes\r
41         pack $medfD -pady 4 -fill x \r
42 \r
43         pack $butD $butR -side left -padx 4 -pady 5 -expand yes\r
44         pack $bottomfD -pady 4 -fill x\r
45 \r
46 return $frameD\r
47 }\r
48 \r
49 \r
50 proc fileDialogD {w ent operation} {\r
51 \r
52         variable file\r
53         \r
54         if {$operation == "open"} {\r
55                 #-----Type names---------Extension(s)---\r
56                 set types {\r
57                 {"JP3D Files"      {.jp3d}      }\r
58                 {"All files"            *}\r
59                 }\r
60                 set file [tk_getOpenFile -filetypes $types -parent $w ]\r
61         } elseif {$operation == "original"} {\r
62                 #-----Type names---------Extension(s)---\r
63                 set types {\r
64                 {"BIN Raw Image Files"  {.bin}  }\r
65                 {"PGX Raw Image Files"  {.pgx}  }\r
66                 {"All files"            *}\r
67                 }\r
68                 set file [tk_getOpenFile -filetypes $types -parent $w ]\r
69         } else {\r
70                 #-----Type names---------Extension(s)---\r
71                 set types {\r
72                 {"BIN Raw Image Files"  {.bin}  }\r
73                 {"PGX Raw Image Files"  {.pgx}  }\r
74                 {"All files"            *}\r
75                 }\r
76                 set file [tk_getSaveFile -filetypes $types -parent $w -initialfile Untitled -defaultextension "*.bin"]\r
77         }\r
78         if {[string compare $file ""]} {\r
79                 $ent delete 0 end\r
80                 $ent insert end $file\r
81                 $ent xview moveto 1\r
82         }\r
83 }\r
84 \r
85 proc VMDecoder::_sourceD { parent } {\r
86         \r
87         variable var\r
88         \r
89         set labsrcD [LabelFrame $parent.labsrcD -text "Select compressed file: " -side top \\r
90                         -anchor w -relief flat -borderwidth 0]\r
91         set subsrcD [$labsrcD getframe]\r
92         set listD [entry $subsrcD.entrysrcD -width 40 -textvariable VMDecoder::var(sourceD)]\r
93         \r
94         set labbrw [LabelFrame $parent.labbrw -side top -anchor w -relief flat -borderwidth 0]\r
95         set subbrw [$labbrw getframe]\r
96         set butbrw [button $subbrw.butbrw -image [Bitmap::get open] \\r
97                 -relief raised -borderwidth 1 -padx 1 -pady 1 \\r
98                 -command "fileDialogD . $subsrcD.entrysrcD open"]\r
99         \r
100         pack $listD -side top\r
101         pack $butbrw -side top\r
102         pack $labsrcD $labbrw -side left -fill both -expand yes\r
103 \r
104 \r
105 }\r
106 \r
107 proc VMDecoder::_destinationD { parent } {\r
108         \r
109         variable var\r
110         \r
111         set labdstD [LabelFrame $parent.labdstD -text "Save decompressed volume file(s) as: " -side top \\r
112                         -anchor w -relief flat -borderwidth 0]\r
113         set subdstD [$labdstD getframe]\r
114         set listD [entry $subdstD.entrydstD -width 40 -textvariable VMDecoder::var(destinationD)]\r
115         \r
116         set labbrw [LabelFrame $parent.labbrw -side top -anchor w -relief flat -borderwidth 0]\r
117         set subbrw [$labbrw getframe]\r
118         set butbrw [button $subbrw.butbrw -image [Bitmap::get save] \\r
119                 -relief raised -borderwidth 1 -padx 1 -pady 1 \\r
120                 -command "fileDialogD . $subdstD.entrydstD save"]\r
121 \r
122         pack $listD -side top\r
123         pack $butbrw -side top\r
124         pack $labdstD $labbrw -side left -fill both -expand yes\r
125 }\r
126 \r
127 proc VMDecoder::_originalD { parent } {\r
128         \r
129         variable var\r
130         \r
131         set laborgD [LabelFrame $parent.laborgD -text "Select original file: " -side top \\r
132                         -anchor w -relief flat -borderwidth 0]\r
133         set suborgD [$laborgD getframe]\r
134         set listorgD [entry $suborgD.entryorgD -width 30 -textvariable VMDecoder::var(originalD)]\r
135         \r
136         set labbrw2 [LabelFrame $parent.labbrw2 -side top -anchor w -relief flat -borderwidth 0]\r
137         set subbrw2 [$labbrw2 getframe]\r
138         set butbrw2 [button $subbrw2.butbrw2 -image [Bitmap::get open] \\r
139                 -relief raised -borderwidth 1 -padx 1 -pady 1 \\r
140                 -command "fileDialogD . $suborgD.entryorgD original"]\r
141         \r
142         set infoD [Label $parent.infoD -relief sunken -textvariable VMDecoder::var(decodinfo) -justify left]\r
143 \r
144         pack $listorgD -side left -anchor n\r
145         pack $butbrw2 -side left -anchor n\r
146         pack $infoD -side bottom -anchor nw -pady 4 -ipadx 150 -ipady 20 -expand yes\r
147         pack $laborgD $labbrw2 -side left -fill both \r
148 \r
149 \r
150 }\r
151 \r
152 proc VMDecoder::_paramsD { parent } {\r
153         \r
154         variable var\r
155         \r
156         ########### DECODING  #############\r
157         set labcod [LabelFrame $parent.labcod -side top -anchor w -relief sunken -borderwidth 1]\r
158         set subcod  [$labcod getframe]\r
159 \r
160                 set frameres [frame $subcod.frameres -borderwidth 1]\r
161                 set labres [LabelEntry $frameres.labres -label "Resolutions to discard: " -labelwidth 20 -labelanchor w \\r
162                    -textvariable VMDecoder::var(resdiscard) -editable 1 \\r
163                    -helptext "Number of highest resolution levels to be discarded on each dimension" ]\r
164         set VMDecoder::var(resdiscard) "0,0,0"\r
165         \r
166                 set framelayer [frame $subcod.framelayer -borderwidth 1]\r
167                 set lablayer [LabelEntry $framelayer.lablayer -label "Layers to decode: " -labelwidth 20 -labelanchor w \\r
168                    -textvariable VMDecoder::var(layer) -editable 1 \\r
169                    -helptext "Maximum number of quality layers to decode" ]\r
170         set VMDecoder::var(layer) "All"\r
171 \r
172         set framebe [frame $subcod.framebe -borderwidth 1]\r
173         set chkbe [checkbutton $framebe.chkbe -text "Write decoded file with BigEndian byte order" \\r
174                    -variable VMDecoder::var(be) -onvalue 1 -offvalue 0 ]\r
175 \r
176                 pack $labres -side left -padx 2 -anchor n\r
177                 pack $lablayer -side left -padx 2 -anchor n\r
178                 pack $chkbe -side left -padx 2 -anchor w\r
179                 pack $frameres $framelayer $framebe -side top -anchor w\r
180 \r
181         pack $subcod -anchor n\r
182         pack $labcod -side left -fill both -padx 4 -expand yes\r
183 }\r
184 \r
185 \r
186 proc VMDecoder::_decode { framesrc framedst frameinfo} {\r
187 \r
188         variable var\r
189 \r
190         set sourceD [$framesrc.labsrcD.f.entrysrcD get ]\r
191         set destinationD [$framedst.labdstD.f.entrydstD get ]\r
192         set originD [$frameinfo.laborgD.f.entryorgD get ]\r
193         set cond1 [string match *.pgx [string tolower $destinationD]]\r
194         set cond2 [string match *\**.pgx [string tolower $destinationD]]\r
195         set cond3 [string match *.bin [string tolower $destinationD]]\r
196         \r
197         #comprobamos datos son correctos\r
198         if {($cond1 == 1) && ($cond2 == 0)} {\r
199                 set pgx "*.pgx"\r
200                 set pattern [string range $destinationD 0 [expr [string length $destinationD]-5]]\r
201                 set destinationD $pattern$img\r
202         } elseif {$sourceD == ""} {\r
203           MessageDlg .msgdlg -parent . -message "Error : Source file is not defined !" -type ok -icon error \r
204         } elseif {$destinationD == ""} {\r
205           MessageDlg .msgdlg -parent . -message "Error : Destination file is not defined !" -type ok -icon error \r
206         } else {\r
207 \r
208                 #creamos datain a partir de los parametros de entrada\r
209                 #set dirJP3Ddecoder [mk_relativepath $VMDecoder::JP3Ddecoder]\r
210                 set dirJP3Ddecoder $VMDecoder::JP3Ddecoder\r
211                 set datain [concat " $dirJP3Ddecoder -i [mk_relativepath $sourceD] "]\r
212                 set datain [concat " $datain -o [mk_relativepath $destinationD] "]\r
213                 if {$originD != ""} {\r
214                         set datain [concat " $datain -O [mk_relativepath $originD] "]\r
215                         if {$cond3 == 1} {\r
216                                 set img ".img"\r
217                                 set pattern [string range $originD 0 [expr [string length $originD]-5]]\r
218                                 set pattern $pattern$img\r
219                                 if {[file exists $pattern]} {\r
220                                   set datain [concat " $datain -m [mk_relativepath $pattern] "]\r
221                                 } else {\r
222                                   MessageDlg .msgdlg -parent . -message "Error : IMG file associated to original BIN volume file not found in same directory !" -type ok -icon info \r
223                                 }\r
224                         }\r
225                 }\r
226                 if {$VMDecoder::var(resdiscard) != "0,0,0"} {\r
227                         set datain [concat " $datain -r $VMDecoder::var(resdiscard) "]\r
228                 }\r
229                 if {$VMDecoder::var(layer) != "All" && $VMDecoder::var(layer) > 0} {\r
230                         set datain [concat " $datain -l $VMDecoder::var(layer) "]\r
231                 }\r
232                 if {$VMDecoder::var(be) == 1} {\r
233                         set datain [concat " $datain -BE"]\r
234                 }\r
235                 \r
236                 set VMDecoder::var(progval) 10\r
237                 ProgressDlg .progress -parent . -title "Wait..." \\r
238                         -type         infinite \\r
239                         -width        20 \\r
240                         -textvariable "Compute in progress..."\\r
241                         -variable     VMDecoder::progval \\r
242                         -stop         "Stop" \\r
243                         -command      {destroy .progress}\r
244 \r
245                 after 200 set VMDecoder::var(progval) 2\r
246 \r
247                 set fp [open "| $datain " r+] \r
248                 fconfigure $fp -buffering line \r
249                 set jp3dVM::dataout [concat "EXECUTED PROGRAM:\n\t$datain"]\r
250                 while {-1 != [gets $fp tmp]} {\r
251                         set jp3dVM::dataout [concat "$jp3dVM::dataout\n$tmp"]\r
252                 }\r
253                 close $fp\r
254                 destroy .progress\r
255                 set cond [string first "ERROR" $jp3dVM::dataout]\r
256                 set cond2 [string first "PSNR" $jp3dVM::dataout]\r
257                 set cond3 [string first "RESULT" $jp3dVM::dataout]\r
258                 if {$cond != -1} {\r
259                    MessageDlg .msgdlg -parent . -message [string range $jp3dVM::dataout [expr $cond-1] end] -type ok -icon error\r
260                 } elseif {$cond3 != -1} {\r
261                         if {$cond2 != -1} {\r
262                                 set VMDecoder::var(decodinfo) [string range $jp3dVM::dataout [expr $cond2-1] end]\r
263                         }\r
264                         MessageDlg .msgdlg -parent . -message [string range $jp3dVM::dataout [expr $cond3-1] end] -type ok -icon info\r
265                 }\r
266         }\r
267 }\r
268 \r
269 proc VMDecoder::_save { frameinfo } {\r
270 \r
271 }\r
272 \r