1 /*
2  *			GPAC - Multimedia Framework C SDK
3  *
4  *			Authors: Jean Le Feuvre
5  *			Copyright (c) Telecom ParisTech 2000-2012
6  *					All rights reserved
7  *
8  *  This file is part of GPAC / Osmo4 wxWidgets GUI
9  *
10  *  GPAC is free software; you can redistribute it and/or modify
11  *  it under the terms of the GNU Lesser General Public License as published by
12  *  the Free Software Foundation; either version 2, or (at your option)
13  *  any later version.
14  *
15  *  GPAC is distributed in the hope that it will be useful,
16  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  *  GNU Lesser General Public License for more details.
19  *
20  *  You should have received a copy of the GNU Lesser General Public
21  *  License along with this library; see the file COPYING.  If not, write to
22  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
23  *
24  *
25  */
26 
27 #include "wxOsmo4.h"
28 #include <gpac/options.h>
29 #include <gpac/modules/codec.h>
30 #include <gpac/modules/raster2d.h>
31 #include <gpac/modules/font.h>
32 #include <gpac/modules/audio_out.h>
33 #include <gpac/modules/video_out.h>
34 
35 #include <gpac/iso639.h>
36 
37 #include "wxGPACControl.h"
38 
39 
40 #define NUM_RATES 11
41 static const char *BIFSRates[11] =
42 {
43 	"5.0",
44 	"7.5",
45 	"10.0",
46 	"12.5",
47 	"15.0",
48 	"24.0",
49 	"25.0",
50 	"30.0",
51 	"50.0",
52 	"60.0",
53 	"100.0"
54 };
55 
SetYUVLabel()56 void wxGPACControl::SetYUVLabel()
57 {
58 	u32 yuv_format = gf_term_get_option(m_pApp->m_term, GF_OPT_YUV_FORMAT);
59 	if (!yuv_format) {
60 		m_yuvtxt->SetLabel(wxT("(No YUV used)"));
61 	} else {
62 		char str[100];
63 		sprintf(str, "(%s used)", gf_4cc_to_str(yuv_format));
64 		m_yuvtxt->SetLabel(wxString(str, wxConvUTF8) );
65 	}
66 }
67 
wxGPACControl(wxWindow * parent)68 wxGPACControl::wxGPACControl(wxWindow *parent)
69 	: wxDialog(parent, -1, wxString(wxT("GPAC Control Panel")))
70 {
71 	const char *sOpt;
72 	SetSize(320, 240);
73 	u32 i;
74 	wxBoxSizer *bs;
75 	Centre();
76 
77 	m_pApp = (wxOsmo4Frame *)parent;
78 
79 	s_main = new wxBoxSizer(wxVERTICAL);
80 
81 	s_header = new wxBoxSizer(wxHORIZONTAL);
82 	//s_header->Add(new wxStaticText(this, 0, wxT("Category"), wxDefaultPosition, wxSize(60, 20)), wxALIGN_CENTER);
83 	m_select = new wxComboBox(this, ID_SELECT, wxT(""), wxDefaultPosition, wxSize(120, 30), 0, NULL, wxCB_READONLY);
84 	s_header->Add(m_select, 2, wxALIGN_CENTER | wxADJUST_MINSIZE);
85 	s_header->Add( new wxButton(this, ID_APPLY, wxT("Apply"), wxDefaultPosition,
86 #ifdef WIN32
87 	                            wxSize(40, 20)
88 #else
89 	                            wxSize(40, 30)
90 #endif
91 	                           ),
92 	               1, wxALIGN_TOP|wxALIGN_RIGHT|wxADJUST_MINSIZE);
93 	s_main->Add(s_header, 0, wxEXPAND, 0);
94 
95 	/*general section*/
96 	s_general = new wxBoxSizer(wxVERTICAL);
97 	m_loop = new wxCheckBox(this, 0, wxT("Loop at End"), wxPoint(10, 40), wxSize(140, 20));
98 	s_general->Add(m_loop);
99 	m_lookforsubs = new wxCheckBox(this, 0, wxT("Look for Subtitles"), wxPoint(180, 40), wxSize(140, 20));
100 	s_general->Add(m_lookforsubs);
101 	m_noconsole = new wxCheckBox(this, 0, wxT("Disable console messages"), wxPoint(10, 80), wxSize(180, 20));
102 	s_general->Add(m_noconsole);
103 	m_viewxmt = new wxCheckBox(this, 0, wxT("View graph in XMT-A format"), wxPoint(10, 120), wxSize(180, 20));
104 	s_general->Add(m_viewxmt);
105 	s_main->Add(s_general, 0, wxEXPAND, 0);
106 
107 	/*MPEG-4 systems*/
108 	s_mpeg4 = new wxBoxSizer(wxVERTICAL);
109 	bs = new wxBoxSizer(wxHORIZONTAL);
110 	bs->Add(new wxStaticText(this, 0, wxT("Prefered Stream Language")), wxALIGN_CENTER | wxADJUST_MINSIZE);
111 	m_lang = new wxComboBox(this, 0, wxT(""), wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY);
112 	bs->Add(m_lang, wxALIGN_CENTER | wxADJUST_MINSIZE);
113 	s_mpeg4->Add(bs, 0, wxALL|wxEXPAND, 2);
114 
115 	bs = new wxBoxSizer(wxHORIZONTAL);
116 	bs->Add(new wxStaticText(this, 0, wxT("Decoder Threading Mode")), wxALIGN_CENTER | wxADJUST_MINSIZE);
117 	m_thread = new wxComboBox(this, 0, wxT(""), wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY);
118 	bs->Add(m_thread, wxALIGN_CENTER | wxADJUST_MINSIZE);
119 	s_mpeg4->Add(bs, 0, wxALL|wxEXPAND, 2);
120 	m_bifsalwaysdrawn = new wxCheckBox(this, 0, wxT("Always draw late BIFS frames"));
121 	s_mpeg4->Add(m_bifsalwaysdrawn);
122 	m_singletime = new wxCheckBox(this, 0, wxT("Force Single Timeline"));
123 	s_mpeg4->Add(m_singletime);
124 	s_main->Add(s_mpeg4, 0, wxEXPAND, 0);
125 
126 	/*media decoders*/
127 	s_mdec = new wxBoxSizer(wxVERTICAL);
128 	bs = new wxBoxSizer(wxHORIZONTAL);
129 	bs->Add(new wxStaticText(this, 0, wxT("Prefered Audio Output")), wxALIGN_CENTER | wxADJUST_MINSIZE);
130 	m_decaudio = new wxComboBox(this, 0, wxT(""), wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY);
131 	bs->Add(m_decaudio, wxALIGN_CENTER | wxADJUST_MINSIZE);
132 	s_mdec->Add(bs, 0, wxALL|wxEXPAND, 2);
133 	bs = new wxBoxSizer(wxHORIZONTAL);
134 	bs->Add(new wxStaticText(this, 0, wxT("Prefered Video Output")), wxALIGN_CENTER | wxADJUST_MINSIZE);
135 	m_decvideo = new wxComboBox(this, 0, wxT(""), wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY);
136 	bs->Add(m_decvideo, wxALIGN_CENTER | wxADJUST_MINSIZE);
137 	s_mdec->Add(bs, 0, wxALL|wxEXPAND, 2);
138 	s_main->Add(s_mdec, 0, wxEXPAND, 0);
139 
140 	/*Rendering*/
141 	s_rend = new wxBoxSizer(wxVERTICAL);
142 	bs = new wxBoxSizer(wxHORIZONTAL);
143 	bs->Add(new wxStaticText(this, 0, wxT("Target Frame Rate")), wxALIGN_CENTER | wxADJUST_MINSIZE);
144 	m_fps = new wxComboBox(this, 0, wxT(""), wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY);
145 	bs->Add(m_fps, wxALIGN_CENTER | wxADJUST_MINSIZE);
146 	s_rend->Add(bs, 0, wxALL|wxEXPAND, 2);
147 	bs = new wxBoxSizer(wxHORIZONTAL);
148 	bs->Add(new wxStaticText(this, 0, wxT("Anti-Aliasing")), wxALIGN_CENTER | wxADJUST_MINSIZE);
149 	m_aa = new wxComboBox(this, 0, wxT(""), wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY);
150 	bs->Add(m_aa, wxALIGN_CENTER | wxADJUST_MINSIZE);
151 	s_rend->Add(bs, 0, wxALL|wxEXPAND, 2);
152 	bs = new wxBoxSizer(wxHORIZONTAL);
153 	bs->Add(new wxStaticText(this, 0, wxT("Graphics Driver")), wxALIGN_CENTER | wxADJUST_MINSIZE);
154 	m_graph = new wxComboBox(this, 0, wxT(""), wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY);
155 	bs->Add(m_graph, wxALIGN_CENTER | wxADJUST_MINSIZE);
156 	s_rend->Add(bs, 0, wxALL|wxEXPAND, 2);
157 	bs = new wxBoxSizer(wxHORIZONTAL);
158 	m_draw_bounds = new wxComboBox(this, 0, wxT(""), wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY);
159 	bs->Add(new wxStaticText(this, 0, wxT("Bounds")), wxALIGN_CENTER | wxADJUST_MINSIZE | wxALIGN_RIGHT);
160 	bs->Add(m_draw_bounds, wxALIGN_CENTER | wxADJUST_MINSIZE);
161 	s_rend->Add(bs, 0, wxALL|wxEXPAND, 2);
162 	m_fast = new wxCheckBox(this, 0, wxT("Fast Rendering"));
163 	m_force_size = new wxCheckBox(this, 0, wxT("Force Scene Size"));
164 	bs = new wxBoxSizer(wxHORIZONTAL);
165 	bs->Add(m_fast, wxALIGN_CENTER | wxADJUST_MINSIZE);
166 	bs->Add(m_force_size, wxALIGN_CENTER | wxADJUST_MINSIZE);
167 	s_rend->Add(bs, 0, wxALL|wxEXPAND, 2);
168 	m_use3D = new wxCheckBox(this, 0, wxT("Use 3D Renderer"));
169 	s_rend->Add(m_use3D, 0, wxALL|wxEXPAND, 2);
170 	m_bWas3D = m_use3D->GetValue();
171 	s_main->Add(s_rend, 0, wxEXPAND, 0);
172 
173 	/*Render 2D*/
174 	s_rend2d = new wxBoxSizer(wxVERTICAL);
175 	m_direct = new wxCheckBox(this, 0, wxT("Direct Rendering"));
176 	s_rend2d->Add(m_direct, 0, wxALL|wxEXPAND, 2);
177 	m_scalable = new wxCheckBox(this, 0, wxT("Scalable Zoom"));
178 	s_rend2d->Add(m_scalable, 0, wxALL|wxEXPAND, 2);
179 	bs = new wxBoxSizer(wxHORIZONTAL);
180 	m_noyuv = new wxCheckBox(this, 0, wxT("Disable YUV hardware"));
181 	bs->Add(m_noyuv, wxALIGN_CENTER | wxADJUST_MINSIZE);
182 	m_yuvtxt = new wxStaticText(this, 0, wxT("(No YUV used)"), wxDefaultPosition, wxSize(60, 20), wxALIGN_LEFT);
183 	bs->Add(m_yuvtxt, wxALIGN_CENTER|wxADJUST_MINSIZE);
184 	s_rend2d->Add(bs, 0, wxALL|wxEXPAND, 2);
185 	s_main->Add(s_rend2d, 0, wxEXPAND, 0);
186 
187 	/*Render 3D*/
188 	s_rend3d = new wxBoxSizer(wxVERTICAL);
189 	m_raster_outlines = new wxCheckBox(this, 0, wxT("Use OpenGL Raster outlines"));
190 	s_rend3d->Add(m_raster_outlines, 0, wxALL|wxEXPAND, 2);
191 	m_polyaa = new wxCheckBox(this, 0, wxT("Enable polygon anti-aliasing"));
192 	s_rend3d->Add(m_polyaa, 0, wxALL|wxEXPAND, 2);
193 	m_nobackcull = new wxCheckBox(this, 0, wxT("Disable backface culling"));
194 	s_rend3d->Add(m_nobackcull, 0, wxALL|wxEXPAND, 2);
195 
196 	bs = new wxBoxSizer(wxHORIZONTAL);
197 	bs->Add(new wxStaticText(this, 0, wxT("Wireframe mode")), wxALIGN_CENTER | wxADJUST_MINSIZE);
198 	m_wire = new wxComboBox(this, 0, wxT(""), wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY);
199 	bs->Add(m_wire, wxALIGN_CENTER | wxADJUST_MINSIZE);
200 	s_rend3d->Add(bs, 0, wxALL|wxEXPAND, 2);
201 
202 	bs = new wxBoxSizer(wxHORIZONTAL);
203 	bs->Add(new wxStaticText(this, 0, wxT("Draw Normals")), wxALIGN_CENTER | wxADJUST_MINSIZE);
204 	m_normals = new wxComboBox(this, 0, wxT(""), wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY);
205 	bs->Add(m_normals, wxALIGN_CENTER | wxADJUST_MINSIZE);
206 	s_rend3d->Add(bs, 0, wxALL|wxEXPAND, 2);
207 
208 	m_emulpow2 = new wxCheckBox(this, 0, wxT("Emulate power-of-two textures for video"));
209 	s_rend3d->Add(m_emulpow2, 0, wxALL|wxEXPAND, 2);
210 	m_norectext = new wxCheckBox(this, 0, wxT("Disable rectangular texture extensions"));
211 	s_rend3d->Add(m_norectext, 0, wxALL|wxEXPAND, 2);
212 	m_copypixels = new wxCheckBox(this, 0, wxT("Bitmap node uses direct pixel copy"));
213 	s_rend3d->Add(m_copypixels, 0, wxALL|wxEXPAND, 2);
214 	s_main->Add(s_rend3d, 0, wxEXPAND, 0);
215 
216 	/*video*/
217 	s_video = new wxBoxSizer(wxVERTICAL);
218 	bs = new wxBoxSizer(wxHORIZONTAL);
219 	bs->Add(new wxStaticText(this, 0, wxT("Video Driver")), wxALIGN_CENTER | wxADJUST_MINSIZE | wxALIGN_RIGHT);
220 	m_video = new wxComboBox(this, 0, wxT(""), wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY);
221 	bs->Add(m_video , wxALIGN_CENTER | wxADJUST_MINSIZE);
222 	s_video->Add(bs, 0, wxALL|wxEXPAND, 2);
223 	m_switchres = new wxCheckBox(this, 0, wxT("Change video resolution in fullscreen"));
224 	s_video->Add(m_switchres, 0, wxALL|wxEXPAND, 2);
225 	m_usehwmem = new wxCheckBox(this, 0, wxT("Use hardware memory in 2D mode"));
226 	s_video->Add(m_usehwmem, 0, wxALL|wxEXPAND, 2);
227 	s_main->Add(s_video, 0, wxEXPAND, 0);
228 
229 
230 	/*audio*/
231 	s_audio = new wxBoxSizer(wxVERTICAL);
232 	bs = new wxBoxSizer(wxHORIZONTAL);
233 	bs->Add(new wxStaticText(this, 0, wxT("Audio Driver")), wxALIGN_CENTER | wxADJUST_MINSIZE);
234 	m_audio = new wxComboBox(this, ID_AUDIO_DRIVER, wxT(""), wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY);
235 	bs->Add(m_audio, wxALIGN_CENTER | wxADJUST_MINSIZE);
236 	s_audio->Add(bs, 0, wxALL|wxEXPAND, 2);
237 	m_forcecfg = new wxCheckBox(this, ID_FORCE_AUDIO, wxT("Force Audio Config"));
238 	m_forcecfg->SetValue(1);
239 	s_audio->Add(m_forcecfg, 0, wxALL|wxEXPAND, 2);
240 
241 
242 	bs = new wxBoxSizer(wxHORIZONTAL);
243 	bs->Add(new wxStaticText(this, 0, wxT("Number of buffers")), wxALIGN_CENTER|wxADJUST_MINSIZE);
244 	m_nbbuf = new wxSpinCtrl(this, -1, wxT(""), wxDefaultPosition, wxSize(20, 20), wxSP_WRAP | wxSP_ARROW_KEYS, 1, 30, 15);
245 	m_nbbuf->SetValue(8);
246 	bs->Add(m_nbbuf, wxALIGN_CENTER | wxADJUST_MINSIZE);
247 	s_audio->Add(bs, 0, wxALL|wxEXPAND, 2);
248 
249 	bs = new wxBoxSizer(wxHORIZONTAL);
250 	bs->Add(new wxStaticText(this, 0, wxT("Total length in ms")), wxALIGN_CENTER | wxADJUST_MINSIZE);
251 	m_buflen = new wxSpinCtrl(this, -1, wxT(""), wxDefaultPosition, wxSize(20, 20), wxSP_WRAP | wxSP_ARROW_KEYS, 1, 1000);
252 	m_buflen->SetValue(400);
253 	bs->Add(m_buflen, wxALIGN_CENTER | wxADJUST_MINSIZE|wxLEFT,10);
254 	s_audio->Add(bs, 0, wxALL|wxEXPAND, 2);
255 
256 	m_noresync = new wxCheckBox(this, -1, wxT("Disable Resynchronization"));
257 	s_audio->Add(m_noresync);
258 	m_nomulitch = new wxCheckBox(this, -1, wxT("Disable Multichannel"));
259 	s_audio->Add(m_nomulitch);
260 #ifdef WIN32
261 	m_notifs = new wxCheckBox(this, -1, wxT("Disable DirectSound Notifications"));
262 	s_audio->Add(m_notifs);
263 #endif
264 	s_main->Add(s_audio, 0, wxEXPAND, 0);
265 
266 	/*font*/
267 	s_font = new wxBoxSizer(wxVERTICAL);
268 	bs = new wxBoxSizer(wxHORIZONTAL);
269 	bs->Add(new wxStaticText(this, 0, wxT("Font Engine")), wxALIGN_CENTER | wxADJUST_MINSIZE | wxALIGN_RIGHT);
270 	m_font = new wxComboBox(this, 0, wxT(""), wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY);
271 	bs->Add(m_font, wxALIGN_CENTER | wxADJUST_MINSIZE);
272 	s_font->Add(bs, 0, wxALL|wxEXPAND, 2);
273 	bs = new wxBoxSizer(wxHORIZONTAL);
274 	bs->Add(new wxStaticText(this, 0, wxT("System Font Directory")), wxALIGN_CENTER | wxADJUST_MINSIZE | wxALIGN_RIGHT);
275 	m_fontdir = new wxButton(this, ID_FONT_DIR, wxT("..."), wxDefaultPosition, wxDefaultSize);
276 	bs->Add(m_fontdir, wxALIGN_CENTER | wxADJUST_MINSIZE);
277 	s_font->Add(bs, 0, wxALL|wxEXPAND, 2);
278 	bs = new wxBoxSizer(wxHORIZONTAL);
279 	bs->Add(new wxStaticText(this, 0, wxT("Text Texturing Mode")), wxALIGN_CENTER | wxADJUST_MINSIZE | wxALIGN_RIGHT);
280 	m_texturemode = new wxComboBox(this, 0, wxT(""), wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY);
281 	bs->Add(m_texturemode, wxALIGN_CENTER | wxADJUST_MINSIZE);
282 	s_font->Add(bs, 0, wxALL|wxEXPAND, 2);
283 	s_main->Add(s_font, 0, wxEXPAND, 0);
284 
285 	/*download*/
286 	s_dnld = new wxBoxSizer(wxVERTICAL);
287 	bs = new wxBoxSizer(wxHORIZONTAL);
288 	bs->Add(new wxStaticText(this, 0, wxT("Cache Directory")), wxALIGN_CENTER | wxADJUST_MINSIZE | wxALIGN_RIGHT);
289 	m_cachedir = new wxButton(this, ID_CACHE_DIR, wxT("..."));
290 	bs->Add(m_cachedir, wxALIGN_CENTER | wxADJUST_MINSIZE);
291 	s_dnld->Add(bs, 0, wxALL|wxEXPAND, 2);
292 	m_cleancache = new wxCheckBox(this, -1, wxT("Remove temp files on exit"));
293 	s_dnld->Add(m_cleancache);
294 	m_restartcache = new wxCheckBox(this, -1, wxT("Always redownload incomplete cached files"));
295 	s_dnld->Add(m_restartcache);
296 	bs = new wxBoxSizer(wxHORIZONTAL);
297 	m_progressive = new wxCheckBox(this, ID_PROGRESSIVE, wxT("XML progressive load"));
298 	bs->Add(m_progressive, wxALIGN_CENTER | wxADJUST_MINSIZE);
299 	m_sax_duration = new wxTextCtrl(this, 0, wxT(""), wxPoint(10, 120), wxSize(60, 20));
300 	bs->Add(m_sax_duration, wxALIGN_CENTER | wxADJUST_MINSIZE);
301 	bs->Add(new wxStaticText(this, 0, wxT("max load slice (ms)")), wxADJUST_MINSIZE | wxALIGN_CENTER);
302 	s_dnld->Add(bs, 0, wxALL|wxEXPAND, 2);
303 	bs = new wxBoxSizer(wxHORIZONTAL);
304 	m_use_proxy = new wxCheckBox(this, ID_USE_PROXY, wxT("Use proxy"));
305 	bs->Add(m_use_proxy, wxALIGN_CENTER | wxADJUST_MINSIZE);
306 	m_proxy_name = new wxTextCtrl(this, 0, wxT(""), wxPoint(10, 120), wxSize(60, 20));
307 	bs->Add(m_proxy_name, wxALIGN_CENTER | wxADJUST_MINSIZE);
308 	s_dnld->Add(bs, 0, wxALL|wxEXPAND, 2);
309 	s_main->Add(s_dnld, 0, wxEXPAND, 0);
310 
311 	/*streaming*/
312 	s_stream = new wxBoxSizer(wxVERTICAL);
313 	bs = new wxBoxSizer(wxHORIZONTAL);
314 	bs->Add(new wxStaticText(this, 0, wxT("Default RTSP port")), wxALIGN_CENTER | wxADJUST_MINSIZE | wxALIGN_RIGHT);
315 	m_port = new wxComboBox(this, ID_RTSP_PORT, wxT(""), wxPoint(160, 40), wxSize(140, 30), 0, NULL, wxCB_READONLY);
316 	bs->Add(m_port, wxALIGN_CENTER | wxADJUST_MINSIZE);
317 	s_stream->Add(bs, 0, wxALL|wxEXPAND, 2);
318 	m_rtsp = new wxCheckBox(this, ID_RTP_OVER_RTSP, wxT("RTP over RTSP"), wxPoint(10, 80), wxSize(140, 20));
319 	m_reorder = new wxCheckBox(this, -1, wxT("use RTP reordering"), wxPoint(160, 80), wxSize(130, 20));
320 	bs = new wxBoxSizer(wxHORIZONTAL);
321 	bs->Add(m_rtsp, wxALIGN_CENTER | wxADJUST_MINSIZE);
322 	bs->Add(m_reorder, wxALIGN_CENTER | wxADJUST_MINSIZE);
323 	s_stream->Add(bs, 0, wxALL|wxEXPAND, 2);
324 	bs = new wxBoxSizer(wxHORIZONTAL);
325 	m_timeout = new wxTextCtrl(this, 0, wxT(""), wxPoint(10, 120), wxSize(60, 20));
326 	bs->Add(new wxStaticText(this, 0, wxT("Control Timeout (ms): ")), wxALIGN_CENTER | wxADJUST_MINSIZE | wxALIGN_RIGHT);
327 	bs->Add(m_timeout, wxALIGN_CENTER | wxADJUST_MINSIZE);
328 	s_stream->Add(bs, 0, wxALL|wxEXPAND, 2);
329 	bs = new wxBoxSizer(wxHORIZONTAL);
330 	m_buffer = new wxTextCtrl(this, 0, wxT(""), wxPoint(10, 150), wxSize(60, 20));
331 	bs->Add(new wxStaticText(this, 0, wxT("Media Buffering (ms): ")), wxALIGN_CENTER | wxADJUST_MINSIZE | wxALIGN_RIGHT);
332 	bs->Add(m_buffer, wxALIGN_CENTER | wxADJUST_MINSIZE);
333 	s_stream->Add(bs, 0, wxALL|wxEXPAND, 2);
334 	bs = new wxBoxSizer(wxHORIZONTAL);
335 	m_dorebuffer = new wxCheckBox(this, ID_RTSP_REBUFFER, wxT("Rebuffer if below"));
336 	bs->Add(m_dorebuffer, wxALIGN_CENTER | wxADJUST_MINSIZE);
337 	m_rebuffer = new wxTextCtrl(this, 0, wxT(""), wxPoint(200, 180), wxSize(60, 20));
338 	bs->Add(m_rebuffer, wxALIGN_CENTER | wxADJUST_MINSIZE);
339 	m_rebuffer->Disable();
340 	s_stream->Add(bs, 0, wxALL|wxEXPAND, 2);
341 	s_main->Add(s_stream, 0, wxEXPAND, 0);
342 
343 	/*streaming cache*/
344 	s_rec = new wxBoxSizer(wxVERTICAL);
345 	bs = new wxBoxSizer(wxHORIZONTAL);
346 	bs->Add(new wxStaticText(this, 0, wxT("Record To: ")), wxALIGN_CENTER | wxADJUST_MINSIZE | wxALIGN_RIGHT);
347 	m_recdir = new wxButton(this, ID_RECORD_DIR, wxT("..."));
348 	bs->Add(m_recdir, wxALIGN_CENTER | wxADJUST_MINSIZE);
349 	s_rec->Add(bs, 0, wxALL|wxEXPAND, 2);
350 	m_overwrite = new wxCheckBox(this, -1, wxT("Overwrite existing files"));
351 	s_rec->Add(m_overwrite);
352 	bs = new wxBoxSizer(wxHORIZONTAL);
353 	m_usename = new wxCheckBox(this, ID_USE_FILENAME, wxT("Use filename"));
354 	m_recfile = new wxTextCtrl(this, 0, wxT(""));
355 	bs->Add(m_usename, wxALIGN_CENTER | wxADJUST_MINSIZE);
356 	bs->Add(m_recfile, wxALIGN_CENTER | wxADJUST_MINSIZE);
357 	s_rec->Add(bs, 0, wxALL|wxEXPAND, 2);
358 	s_main->Add(s_rec, 0, wxEXPAND, 0);
359 
360 	/*load options*/
361 	GF_Config *cfg = m_pApp->m_user.config;
362 	/*general*/
363 	sOpt = gf_cfg_get_key(cfg, "General", "Loop");
364 	m_loop->SetValue((sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
365 	sOpt = gf_cfg_get_key(cfg, "General", "LookForSubtitles");
366 	m_lookforsubs->SetValue((sOpt && !stricmp(sOpt, "no")) ? 1 : 0);
367 	sOpt = gf_cfg_get_key(cfg, "General", "ConsoleOff");
368 	m_noconsole->SetValue((sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
369 	sOpt = gf_cfg_get_key(cfg, "General", "ViewXMT");
370 	m_viewxmt->SetValue((sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
371 
372 	/*lang config*/
373 	u32 count = gf_lang_get_count();
374 	for (i=0; i<count; i++) {
375 		m_lang->Append(wxString(gf_lang_get_name(i), wxConvUTF8) );
376 	}
377 
378 	sOpt = gf_cfg_get_key(cfg, "Systems", "Language3CC");
379 	if (!sOpt) sOpt = "eng";
380 	s32 select = gf_lang_find(sOpt);
381 	if (select<0) select = 0;
382 	m_lang->SetSelection(select);
383 
384 	/*systems config*/
385 	sOpt = gf_cfg_get_key(cfg, "Systems", "ThreadingPolicy");
386 	select = 0;
387 	m_thread->Append(wxT("Single Thread"));
388 	m_thread->Append(wxT("Mutli Thread"));
389 	if (sOpt && !stricmp(sOpt, "Multi")) select = 1;
390 	m_thread->Append(wxT("Free"));
391 	if (sOpt && !stricmp(sOpt, "Free")) select = 2;
392 	m_thread->SetSelection(select);
393 	sOpt = gf_cfg_get_key(cfg, "Systems", "ForceSingleClock");
394 	m_singletime->SetValue((sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
395 	sOpt = gf_cfg_get_key(cfg, "Systems", "AlwaysDrawBIFS");
396 	m_bifsalwaysdrawn->SetValue((sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
397 
398 
399 	/*audio dec enum*/
400 	sOpt = gf_cfg_get_key(cfg, "Systems", "DefAudioDec");
401 	u32 count = gf_modules_get_count(m_pApp->m_user.modules);
402 	GF_BaseDecoder *ifc_d;
403 	select = 0;
404 	s32 to_sel = 0;
405 	for (i=0; i<count; i++) {
406 		ifc_d = (GF_BaseDecoder *) gf_modules_load_interface(m_pApp->m_user.modules, i, GF_MEDIA_DECODER_INTERFACE);
407 		if (!ifc_d) continue;
408 		if (ifc_d->CanHandleStream(ifc_d, GF_STREAM_AUDIO, NULL, 0)) {
409 			if (sOpt && !stricmp(ifc_d->module_name, sOpt)) select = to_sel;
410 			m_decaudio->Append(wxString(ifc_d->module_name, wxConvUTF8) );
411 			to_sel++;
412 		}
413 		gf_modules_close_interface((GF_BaseInterface *) ifc_d);
414 	}
415 	m_decaudio->SetSelection(select);
416 
417 	/*video dec enum*/
418 	sOpt = gf_cfg_get_key(cfg, "Systems", "DefVideoDec");
419 	select = to_sel = 0;
420 	for (i=0; i<count; i++) {
421 		ifc_d = (GF_BaseDecoder *) gf_modules_load_interface(m_pApp->m_user.modules, i, GF_MEDIA_DECODER_INTERFACE);
422 		if (!ifc_d) continue;
423 		if (ifc_d->CanHandleStream(ifc_d, GF_STREAM_VISUAL, NULL, 0)) {
424 			if (sOpt && !stricmp(ifc_d->module_name, sOpt)) select = to_sel;
425 			m_decvideo->Append(wxString(ifc_d->module_name, wxConvUTF8) );
426 			to_sel++;
427 		}
428 		gf_modules_close_interface((GF_BaseInterface *) ifc_d);
429 	}
430 	m_decvideo->SetSelection(select);
431 
432 	/*rendering FIXME*/
433 	m_bWas3D = 0;
434 	m_use3D->SetValue(m_bWas3D ? 1 : 0);
435 
436 	sOpt = gf_cfg_get_key(cfg, "Compositor", "ForceSceneSize");
437 	m_force_size->SetValue( (sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
438 
439 	sOpt = gf_cfg_get_key(cfg, "Compositor", "FrameRate");
440 	if (!sOpt) sOpt = "30.0";
441 	select = 0;
442 	for (i = 0; i<NUM_RATES; i++) {
443 		m_fps->Append(wxString(BIFSRates[i], wxConvUTF8) );
444 		if (sOpt && !stricmp(sOpt, BIFSRates[i]) ) select = i;
445 	}
446 	m_fps->SetSelection(select);
447 
448 	sOpt = gf_cfg_get_key(cfg, "Compositor", "HighSpeed");
449 	m_fast->SetValue( (sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
450 
451 	sOpt = gf_cfg_get_key(cfg, "Compositor", "AntiAlias");
452 	m_aa->Append(wxT("None"));
453 	m_aa->Append(wxT("Text only"));
454 	m_aa->Append(wxT("Complete"));
455 	select = 2;
456 	if (sOpt && !stricmp(sOpt, "Text")) select = 1;
457 	else if (sOpt && !stricmp(sOpt, "None")) select = 0;
458 	m_aa->SetSelection(select);
459 
460 	sOpt = gf_cfg_get_key(cfg, "Compositor", "BoundingVolume");
461 	m_draw_bounds->Append(wxT("None"));
462 	m_draw_bounds->Append(wxT("Box/Rect"));
463 	m_draw_bounds->Append(wxT("AABB Tree"));
464 	select = 0;
465 	if (sOpt && !stricmp(sOpt, "Box")) select = 1;
466 	else if (sOpt && !stricmp(sOpt, "AABB")) select = 2;
467 	m_draw_bounds->SetSelection(select);
468 
469 	/*render2d*/
470 	sOpt = gf_cfg_get_key(cfg, "Compositor", "DirectDraw");
471 	m_direct->SetValue( (sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
472 	sOpt = gf_cfg_get_key(cfg, "Compositor", "ScalableZoom");
473 	m_scalable->SetValue( (sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
474 	sOpt = gf_cfg_get_key(cfg, "Compositor", "DisableYUV");
475 	m_noyuv->SetValue( (sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
476 	SetYUVLabel();
477 
478 	/*graphics driver enum*/
479 	sOpt = gf_cfg_get_key(cfg, "core", "raster2d");
480 	GF_BaseInterface *ifce;
481 	select = to_sel = 0;
482 	for (i=0; i<count; i++) {
483 		ifce = gf_modules_load_interface(m_pApp->m_user.modules, i, GF_RASTER_2D_INTERFACE);
484 		if (!ifce) continue;
485 		if (sOpt && !stricmp(((GF_BaseInterface *)ifce)->module_name, sOpt)) select = to_sel;
486 		m_graph->Append(wxString(((GF_BaseInterface *)ifce)->module_name, wxConvUTF8) );
487 		gf_modules_close_interface(ifce);
488 		to_sel++;
489 	}
490 	m_graph->SetSelection(select);
491 
492 	/*render3d*/
493 	sOpt = gf_cfg_get_key(cfg, "Compositor", "RasterOutlines");
494 	m_raster_outlines->SetValue( (sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
495 	sOpt = gf_cfg_get_key(cfg, "Compositor", "EmulatePOW2");
496 	m_emulpow2->SetValue((sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
497 	sOpt = gf_cfg_get_key(cfg, "Compositor", "PolygonAA");
498 	m_polyaa->SetValue((sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
499 	sOpt = gf_cfg_get_key(cfg, "Compositor", "BackFaceCulling");
500 	m_nobackcull->SetValue((sOpt && !stricmp(sOpt, "Off")) ? 1 : 0);
501 	sOpt = gf_cfg_get_key(cfg, "Compositor", "Wireframe");
502 	sOpt = gf_cfg_get_key(cfg, "Compositor", "BitmapCopyPixels");
503 	m_copypixels->SetValue((sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
504 	sOpt = gf_cfg_get_key(cfg, "Compositor", "DisableRectExt");
505 	m_norectext->SetValue((sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
506 	m_wire->Append(wxT("No Wireframe"));
507 	m_wire->Append(wxT("Wireframe Only"));
508 	m_wire->Append(wxT("Solid and Wireframe"));
509 	sOpt = gf_cfg_get_key(cfg, "Compositor", "Wireframe");
510 	if (sOpt && !stricmp(sOpt, "WireOnly")) m_wire->SetSelection(1);
511 	else if (sOpt && !stricmp(sOpt, "WireOnSolid")) m_wire->SetSelection(2);
512 	else m_wire->SetSelection(0);
513 	m_normals->Append(wxT("Never"));
514 	m_normals->Append(wxT("Per Face"));
515 	m_normals->Append(wxT("Per Vertex"));
516 	sOpt = gf_cfg_get_key(cfg, "Compositor", "DrawNormals");
517 	if (sOpt && !stricmp(sOpt, "PerFace")) m_normals->SetSelection(1);
518 	else if (sOpt && !stricmp(sOpt, "PerVertex")) m_normals->SetSelection(2);
519 	else m_normals->SetSelection(0);
520 
521 	/*video*/
522 	m_switchres->SetValue( gf_cfg_get_bool(cfg, "core", "switch-vres") );
523 	sOpt = gf_cfg_get_key(cfg, "core", "hwvmem");
524 	m_usehwmem->SetValue( (sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
525 	sOpt = gf_cfg_get_key(cfg, "core", "video-output");
526 	select = to_sel = 0;
527 	for (i=0; i<count; i++) {
528 		ifce = gf_modules_load_interface(m_pApp->m_user.modules, i, GF_VIDEO_OUTPUT_INTERFACE);
529 		if (!ifce) continue;
530 		if (sOpt && !stricmp(((GF_BaseInterface *)ifce)->module_name, sOpt)) select = to_sel;
531 		m_video->Append(wxString(((GF_BaseInterface *)ifce)->module_name, wxConvUTF8) );
532 		gf_modules_close_interface(ifce);
533 		to_sel++;
534 	}
535 	m_video->SetSelection(select);
536 
537 	/*audio*/
538 	sOpt = gf_cfg_get_key(cfg, "Audio", "ForceConfig");
539 	m_forcecfg->SetValue( (sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
540 	sOpt = gf_cfg_get_key(cfg, "Audio", "NumBuffers");
541 	m_nbbuf->SetValue( sOpt ? wxString(sOpt, wxConvUTF8) : wxT("2"));
542 	sOpt = gf_cfg_get_key(cfg, "Audio", "TotalDuration");
543 	m_buflen->SetValue( sOpt ? wxString(sOpt, wxConvUTF8) : wxT("120"));
544 	wxCommandEvent event;
545 	ForceAudio(event);
546 	sOpt = gf_cfg_get_key(cfg, "Audio", "NoResync");
547 	m_noresync->SetValue( (sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
548 	sOpt = gf_cfg_get_key(cfg, "Audio", "DisableMultiChannel");
549 	m_nomulitch->SetValue( (sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
550 
551 	/*driver enum*/
552 	sOpt = gf_cfg_get_key(cfg, "core", "audio-output");
553 	select = to_sel = 0;
554 	for (i=0; i<count; i++) {
555 		ifce = gf_modules_load_interface(m_pApp->m_user.modules, i, GF_AUDIO_OUTPUT_INTERFACE);
556 		if (!ifce) continue;
557 		if (sOpt && !stricmp(((GF_BaseInterface *)ifce)->module_name, sOpt)) select = to_sel;
558 		m_audio->Append(wxString(((GF_BaseInterface *)ifce)->module_name, wxConvUTF8) );
559 		gf_modules_close_interface(ifce);
560 		to_sel++;
561 	}
562 	m_audio->SetSelection(select);
563 #ifdef WIN32
564 	sOpt = gf_cfg_get_key(cfg, "Audio", "DisableNotification");
565 	m_notifs->SetValue( (sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
566 	wxCommandEvent audevt;
567 	OnSetAudioDriver(audevt);
568 #endif
569 
570 	/*font*/
571 	sOpt = gf_cfg_get_key(cfg, "FontCache", "FontReader");
572 	to_sel = select = 0;
573 	for (i=0; i<count; i++) {
574 		ifce = gf_modules_load_interface(m_pApp->m_user.modules, i, GF_FONT_READER_INTERFACE);
575 		if (!ifce) continue;
576 		if (sOpt && !stricmp(((GF_BaseInterface *)ifce)->module_name, sOpt)) select = to_sel;
577 		m_font->Append(wxString(((GF_BaseInterface *)ifce)->module_name, wxConvUTF8) );
578 		gf_modules_close_interface(ifce);
579 		to_sel++;
580 	}
581 	m_font->SetSelection(select);
582 	sOpt = gf_cfg_get_key(cfg, "FontCache", "FontDirectory");
583 	if (sOpt) m_fontdir->SetLabel(wxString(sOpt, wxConvUTF8) );
584 	sOpt = gf_cfg_get_key(cfg, "Compositor", "TextureTextMode");
585 	m_texturemode->Append(wxT("Default"));
586 	m_texturemode->Append(wxT("Never"));
587 	m_texturemode->Append(wxT("Always"));
588 	if (sOpt && !stricmp(sOpt, "Always")) m_texturemode->SetSelection(2);
589 	else if (sOpt && !stricmp(sOpt, "3D")) m_texturemode->SetSelection(1);
590 	else m_texturemode->SetSelection(0);
591 
592 	/*downloader*/
593 	sOpt = gf_cfg_get_key(cfg, "Core", "CacheDirectory");
594 	if (sOpt) m_cachedir->SetLabel(wxString(sOpt, wxConvUTF8) );
595 	sOpt = gf_cfg_get_key(cfg, "Core", "CleanCache");
596 	m_cleancache->SetValue( (sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
597 	sOpt = gf_cfg_get_key(cfg, "Core", "RestartFiles");
598 	m_restartcache->SetValue( (sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
599 	sOpt = gf_cfg_get_key(cfg, "SAXLoader", "Progressive");
600 	m_progressive->SetValue( (sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
601 	sOpt = gf_cfg_get_key(cfg, "SAXLoader", "MaxDuration");
602 	m_sax_duration->SetValue(sOpt ? wxString(sOpt, wxConvUTF8) : wxT("30"));
603 	if (! m_progressive->GetValue()) m_sax_duration->Enable(0);
604 
605 	sOpt = gf_cfg_get_key(cfg, "Core", "HTTPProxyEnabled");
606 	m_use_proxy->SetValue( (sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
607 	char szProxy[GF_MAX_PATH];
608 	strcpy(szProxy, "");
609 	sOpt = gf_cfg_get_key(cfg, "Core", "HTTPProxyName");
610 	if (sOpt) {
611 		strcat(szProxy, sOpt);
612 		sOpt = gf_cfg_get_key(cfg, "Core", "HTTPProxyPort");
613 		if (sOpt) {
614 			strcat(szProxy, ":");
615 			strcat(szProxy, sOpt);
616 		}
617 	} else {
618 		m_use_proxy->SetValue(0);
619 	}
620 	m_proxy_name->SetValue( wxString((char *)szProxy, wxConvUTF8) );
621 	if (! m_use_proxy->GetValue()) m_proxy_name->Enable(0);
622 
623 	/*streaming*/
624 	m_port->Append(wxT("554 (RTSP standard)"));
625 	m_port->Append(wxT("7070 (RTSP ext)"));
626 	m_port->Append(wxT("80 (RTSP / HTTP tunnel)"));
627 	m_port->Append(wxT("8080 (RTSP / HTTP tunnel)"));
628 	sOpt = gf_cfg_get_key(cfg, "Streaming", "DefaultPort");
629 	u32 port = 554;
630 	Bool force_rtsp = 0;
631 	if (sOpt) port = atoi(sOpt);
632 	switch (port) {
633 	case 8080:
634 		m_port->SetSelection(3);
635 		force_rtsp = 1;
636 		break;
637 	case 80:
638 		m_port->SetSelection(2);
639 		force_rtsp = 1;
640 		break;
641 	case 7070:
642 		m_port->SetSelection(1);
643 		break;
644 	default:
645 		m_port->SetSelection(0);
646 		break;
647 	}
648 
649 	Bool use_rtsp = 0;
650 	sOpt = gf_cfg_get_key(cfg, "Streaming", "RTPoverRTSP");
651 	if (sOpt && !stricmp(sOpt, "yes")) use_rtsp = 1;
652 
653 	if (force_rtsp) {
654 		m_rtsp->SetValue(1);
655 		m_rtsp->Enable(0);
656 		m_reorder->SetValue(0);
657 		m_reorder->Enable(0);
658 	} else {
659 		m_rtsp->SetValue(use_rtsp ? 1 : 0);
660 		m_rtsp->Enable(1);
661 		m_reorder->Enable(1);
662 		sOpt = gf_cfg_get_key(cfg, "Streaming", "ReorderSize");
663 		m_reorder->SetValue( (sOpt && !stricmp(sOpt, "0")) ? 1 : 0);
664 	}
665 	sOpt = gf_cfg_get_key(cfg, "Streaming", "RTSPTimeout");
666 	m_timeout->SetValue(sOpt ? wxString(sOpt, wxConvUTF8) : wxT("30000"));
667 	sOpt = gf_cfg_get_key(cfg, "Network", "BufferLength");
668 	m_buffer->SetValue(sOpt ? wxString(sOpt, wxConvUTF8) : wxT("3000"));
669 	sOpt = gf_cfg_get_key(cfg, "Network", "RebufferLength");
670 	u32 buf_len = 0;
671 	if (sOpt) buf_len = atoi(sOpt);
672 	if (buf_len) {
673 		m_dorebuffer->SetValue(1);
674 		m_rebuffer->SetValue(wxString(sOpt, wxConvUTF8));
675 		m_rebuffer->Enable(1);
676 	} else {
677 		m_dorebuffer->SetValue(0);
678 		m_rebuffer->SetValue(wxT("0"));
679 		m_rebuffer->Enable(0);
680 	}
681 
682 	RTPoverRTSP(event);
683 
684 	sOpt = gf_cfg_get_key(cfg, "StreamingCache", "RecordDirectory");
685 	if (!sOpt) sOpt = gf_cfg_get_key(cfg, "Core", "CacheDirectory");
686 	if (sOpt) m_recdir->SetLabel(wxString(sOpt, wxConvUTF8));
687 	sOpt = gf_cfg_get_key(cfg, "StreamingCache", "KeepExistingFiles");
688 	m_overwrite->SetValue((sOpt && !stricmp(sOpt, "yes")) ? 0 : 1);
689 
690 	sOpt = gf_cfg_get_key(cfg, "StreamingCache", "BaseFileName");
691 	if (sOpt) {
692 		m_usename->SetValue(1);
693 		m_recfile->Enable(1);
694 		m_recfile->SetValue(wxString(sOpt, wxConvUTF8));
695 	} else {
696 		m_usename->SetValue(0);
697 		m_recfile->Enable(0);
698 		m_recfile->SetValue(wxT("uses service URL"));
699 	}
700 
701 	m_select->Append(wxT("General"));
702 	m_select->Append(wxT("MPEG-4 Systems"));
703 	m_select->Append(wxT("Media Decoders"));
704 	m_select->Append(wxT("Compositor"));
705 	m_select->Append(wxT("Renderer 2D"));
706 	m_select->Append(wxT("Renderer 3D"));
707 	m_select->Append(wxT("Video Output"));
708 	m_select->Append(wxT("Audio Output"));
709 	m_select->Append(wxT("Text Engine"));
710 	m_select->Append(wxT("File Download"));
711 	m_select->Append(wxT("Real-Time Streaming"));
712 	m_select->Append(wxT("Streaming Cache"));
713 
714 	sOpt = gf_cfg_get_key(cfg, "General", "ConfigPanel");
715 	m_sel = sOpt ? atoi(sOpt) : 0;
716 	if (m_sel>11) m_sel=11;
717 	m_select->SetSelection(m_sel);
718 
719 	DoSelect();
720 }
721 
BEGIN_EVENT_TABLE(wxGPACControl,wxDialog)722 BEGIN_EVENT_TABLE(wxGPACControl, wxDialog)
723 	EVT_BUTTON(ID_APPLY, wxGPACControl::Apply)
724 	EVT_COMBOBOX(ID_SELECT, wxGPACControl::OnSetSelection)
725 	EVT_CHECKBOX(ID_FORCE_AUDIO, wxGPACControl::ForceAudio)
726 	EVT_COMBOBOX(ID_AUDIO_DRIVER, wxGPACControl::OnSetAudioDriver)
727 	EVT_BUTTON(ID_FONT_DIR, wxGPACControl::FontDir)
728 	EVT_BUTTON(ID_CACHE_DIR, wxGPACControl::CacheDir)
729 	EVT_CHECKBOX(ID_PROGRESSIVE, wxGPACControl::OnProgressive)
730 	EVT_CHECKBOX(ID_USE_PROXY, wxGPACControl::OnUseProxy)
731 	EVT_CHECKBOX(ID_RTP_OVER_RTSP, wxGPACControl::RTPoverRTSP)
732 	EVT_CHECKBOX(ID_RTSP_REBUFFER, wxGPACControl::Rebuffer)
733 	EVT_COMBOBOX(ID_RTSP_PORT, wxGPACControl::OnSetRTSPPort)
734 	EVT_CHECKBOX(ID_USE_FILENAME, wxGPACControl::OnUseFileName)
735 	EVT_BUTTON(ID_RECORD_DIR, wxGPACControl::OnRecDir)
736 END_EVENT_TABLE()
737 
738 
739 wxGPACControl::~wxGPACControl()
740 {
741 	char str[20];
742 	sprintf(str, "%d", m_sel);
743 	gf_cfg_set_key(m_pApp->m_user.config, "General", "ConfigPanel", str);
744 }
745 
746 
DoSelect()747 void wxGPACControl::DoSelect()
748 {
749 
750 	/*hide everything*/
751 	s_main->Show(s_general, false);
752 	s_main->Show(s_mpeg4, false);
753 	s_main->Show(s_mdec, false);
754 	s_main->Show(s_rend, false);
755 	s_main->Show(s_rend2d, false);
756 	s_main->Show(s_rend3d, false);
757 	s_main->Show(s_video, false);
758 	s_main->Show(s_audio, false);
759 	s_main->Show(s_font, false);
760 	s_main->Show(s_dnld, false);
761 	s_main->Show(s_stream, false);
762 	s_main->Show(s_rec, false);
763 	switch (m_sel) {
764 	case 0:
765 		s_main->Show(s_general, true);
766 		break;
767 	case 1:
768 		s_main->Show(s_mpeg4, true);
769 		break;
770 	case 2:
771 		s_main->Show(s_mdec, true);
772 		break;
773 	case 3:
774 		s_main->Show(s_rend, true);
775 		break;
776 	case 4:
777 		s_main->Show(s_rend2d, true);
778 		break;
779 	case 5:
780 		s_main->Show(s_rend3d, true);
781 		break;
782 	case 6:
783 		s_main->Show(s_video, true);
784 		break;
785 	case 7:
786 		s_main->Show(s_audio, true);
787 		break;
788 	case 8:
789 		s_main->Show(s_font, true);
790 		break;
791 	case 9:
792 		s_main->Show(s_dnld, true);
793 		break;
794 	case 10:
795 		s_main->Show(s_stream, true);
796 		break;
797 	case 11:
798 		s_main->Show(s_rec, true);
799 		break;
800 	}
801 	SetSizer(s_main);
802 	s_main->Fit(this);
803 	//s_main->Layout();
804 	return;
805 
806 }
807 
OnSetSelection(wxCommandEvent & WXUNUSED (event))808 void wxGPACControl::OnSetSelection(wxCommandEvent &WXUNUSED(event))
809 {
810 	m_sel = m_select->GetSelection();
811 	DoSelect();
812 }
813 
FontDir(wxCommandEvent & WXUNUSED (event))814 void wxGPACControl::FontDir(wxCommandEvent &WXUNUSED(event))
815 {
816 	wxDirDialog dlg(this);
817 	dlg.SetPath(m_fontdir->GetLabel());
818 	if (dlg.ShowModal() == wxID_OK) {
819 		m_fontdir->SetLabel(dlg.GetPath());
820 	}
821 }
CacheDir(wxCommandEvent & WXUNUSED (event))822 void wxGPACControl::CacheDir(wxCommandEvent &WXUNUSED(event))
823 {
824 	wxDirDialog dlg(this);
825 	dlg.SetPath(m_cachedir->GetLabel());
826 	if (dlg.ShowModal() == wxID_OK) {
827 		m_cachedir->SetLabel(dlg.GetPath());
828 	}
829 }
830 
OnProgressive(wxCommandEvent & WXUNUSED (event))831 void wxGPACControl::OnProgressive(wxCommandEvent &WXUNUSED(event))
832 {
833 	m_sax_duration->Enable(m_progressive->GetValue() ? 1 : 0);
834 }
835 
OnUseProxy(wxCommandEvent & WXUNUSED (event))836 void wxGPACControl::OnUseProxy(wxCommandEvent &WXUNUSED(event))
837 {
838 	m_proxy_name->Enable(m_use_proxy->GetValue() ? 1 : 0);
839 }
840 
RTPoverRTSP(wxCommandEvent & WXUNUSED (event))841 void wxGPACControl::RTPoverRTSP(wxCommandEvent &WXUNUSED(event))
842 {
843 	m_reorder->Enable(m_rtsp->GetValue() ? 0 : 1);
844 }
845 
Rebuffer(wxCommandEvent & WXUNUSED (event))846 void wxGPACControl::Rebuffer(wxCommandEvent &WXUNUSED(event))
847 {
848 	if (m_dorebuffer->GetValue()) {
849 		m_rebuffer->Enable();
850 	} else {
851 		m_rebuffer->Disable();
852 	}
853 }
854 
OnSetRTSPPort(wxCommandEvent & WXUNUSED (event))855 void wxGPACControl::OnSetRTSPPort(wxCommandEvent &WXUNUSED(event))
856 {
857 	if (m_port->GetSelection() > 1) {
858 		m_rtsp->Enable(0);
859 		m_reorder->Enable(0);
860 	} else {
861 		m_rtsp->Enable(1);
862 		m_reorder->Enable(1);
863 	}
864 }
865 
OnRecDir(wxCommandEvent & WXUNUSED (event))866 void wxGPACControl::OnRecDir(wxCommandEvent &WXUNUSED(event))
867 {
868 	wxDirDialog dlg(this);
869 	dlg.SetPath(m_recdir->GetLabel());
870 	if (dlg.ShowModal() == wxID_OK) {
871 		m_recdir->SetLabel(dlg.GetPath());
872 	}
873 }
874 
OnUseFileName(wxCommandEvent & WXUNUSED (event))875 void wxGPACControl::OnUseFileName(wxCommandEvent &WXUNUSED(event))
876 {
877 	if (m_usename->GetValue()) {
878 		m_recfile->Enable();
879 		m_recfile->SetValue(wxT("record"));
880 	} else {
881 		m_recfile->Disable();
882 		m_recfile->SetValue(wxT("uses service URL"));
883 	}
884 }
885 
ForceAudio(wxCommandEvent & WXUNUSED (event))886 void wxGPACControl::ForceAudio(wxCommandEvent &WXUNUSED(event))
887 {
888 	if (m_forcecfg->GetValue()) {
889 		m_nbbuf->Enable();
890 		m_buflen->Enable();
891 	} else {
892 		m_nbbuf->Disable();
893 		m_buflen->Disable();
894 	}
895 }
896 
OnSetAudioDriver(wxCommandEvent & WXUNUSED (event))897 void wxGPACControl::OnSetAudioDriver(wxCommandEvent &WXUNUSED(event))
898 {
899 #ifdef WIN32
900 	if (strstr(m_audio->GetStringSelection().mb_str(wxConvUTF8), "DirectSound")) {
901 		m_notifs->Enable(1);
902 	} else {
903 		m_notifs->Enable(0);
904 	}
905 #endif
906 }
907 
908 
909 
Apply(wxCommandEvent & WXUNUSED (event))910 void wxGPACControl::Apply(wxCommandEvent &WXUNUSED(event))
911 {
912 	/*save options*/
913 	GF_Config *cfg = m_pApp->m_user.config;
914 
915 	m_pApp->m_loop = m_loop->GetValue() ? 1 : 0;
916 	gf_cfg_set_key(cfg, "General", "Loop", m_loop->GetValue() ? "yes" : "no");
917 	m_pApp->m_lookforsubs = m_lookforsubs->GetValue() ? 1 : 0;
918 	gf_cfg_set_key(cfg, "General", "LookForSubtitles",  m_lookforsubs->GetValue() ? "yes" : "no");
919 	m_pApp->m_console_off = m_noconsole->GetValue() ? 1 : 0;
920 	gf_cfg_set_key(cfg, "General", "ConsoleOff", m_noconsole->GetValue() ? "yes" : "no");
921 	gf_cfg_set_key(cfg, "General", "ViewXMT", m_viewxmt->GetValue() ? "yes" : "no");
922 
923 	s32 sel = m_lang->GetSelection();
924 	gf_cfg_set_key(cfg, "Systems", "LanguageName", gf_lang_get_name(sel) );
925 	gf_cfg_set_key(cfg, "Systems", "Language3CC", gf_lang_get_3cc(sel) );
926 	gf_cfg_set_key(cfg, "Systems", "Language2CC", gf_lang_get_2cc(sel) );
927 
928 
929 	sel = m_thread->GetSelection();
930 	gf_cfg_set_key(cfg, "Systems", "ThreadingPolicy", (sel==0) ? "Single" : ( (sel==1) ? "Multi" : "Free"));
931 	gf_cfg_set_key(cfg, "Systems", "ForceSingleClock", m_singletime->GetValue() ? "yes" : "no");
932 	gf_cfg_set_key(cfg, "Systems", "AlwaysDrawBIFS", m_bifsalwaysdrawn->GetValue() ? "yes" : "no");
933 
934 	gf_cfg_set_key(cfg, "Systems", "DefAudioDec", m_decaudio->GetStringSelection().mb_str(wxConvUTF8));
935 	gf_cfg_set_key(cfg, "Systems", "DefVideoDec", m_decvideo->GetStringSelection().mb_str(wxConvUTF8));
936 
937 
938 	gf_cfg_set_key(cfg, "Compositor", "HighSpeed", m_fast->GetValue() ? "yes" : "no");
939 	gf_cfg_set_key(cfg, "Compositor", "ForceSceneSize", m_force_size->GetValue() ? "yes" : "no");
940 
941 	gf_cfg_set_key(cfg, "Compositor", "FrameRate", BIFSRates[m_fps->GetSelection()]);
942 	sel = m_aa->GetSelection();
943 	gf_cfg_set_key(cfg, "Compositor", "AntiAlias", (sel==0) ? "None" : ( (sel==1) ? "Text" : "All"));
944 	sel = m_draw_bounds->GetSelection();
945 	gf_cfg_set_key(cfg, "Compositor", "BoundingVolume", (sel==2) ? "AABB" : (sel==1) ? "Box" : "None");
946 
947 	Bool is_3D = m_use3D->GetValue() ? 1 : 0;
948 	if (m_bWas3D != is_3D) {
949 		/*FIXME*/
950 	}
951 	gf_cfg_set_key(cfg, "core", "raster2d", m_graph->GetStringSelection().mb_str(wxConvUTF8));
952 
953 	gf_cfg_set_key(cfg, "Compositor", "DirectDraw", m_direct->GetValue() ? "yes" : "no");
954 	gf_cfg_set_key(cfg, "Compositor", "ScalableZoom", m_scalable->GetValue() ? "yes" : "no");
955 	gf_cfg_set_key(cfg, "Compositor", "DisableYUV", m_noyuv->GetValue() ? "yes" : "no");
956 
957 	gf_cfg_set_key(cfg, "Compositor", "RasterOutlines", m_raster_outlines->GetValue() ? "yes" : "no");
958 	gf_cfg_set_key(cfg, "Compositor", "EmulatePOW2", m_emulpow2->GetValue() ? "yes" : "no");
959 	gf_cfg_set_key(cfg, "Compositor", "PolygonAA", m_polyaa->GetValue() ? "yes" : "no");
960 	gf_cfg_set_key(cfg, "Compositor", "DisableRectExt", m_norectext->GetValue() ? "yes" : "no");
961 	gf_cfg_set_key(cfg, "Compositor", "BitmapCopyPixels", m_copypixels->GetValue() ? "yes" : "no");
962 	gf_cfg_set_key(cfg, "Compositor", "BackFaceCulling", m_nobackcull->GetValue() ? "Off" : "On");
963 
964 	sel = m_wire->GetSelection();
965 	gf_cfg_set_key(cfg, "Compositor", "Wireframe", (sel==2) ? "WireOnSolid" : ( (sel==1) ? "WireOnly" : "WireNone" ) );
966 	sel = m_normals->GetSelection();
967 	gf_cfg_set_key(cfg, "Compositor", "DrawNormals", (sel==2) ? "PerVertex" : ( (sel==1) ? "PerFace" : "Never" ) );
968 
969 	gf_cfg_set_key(cfg, "core", "switch-vres", m_switchres->GetValue() ? "yes" : "no");
970 	gf_cfg_set_key(cfg, "core", "hwvmem", m_usehwmem->GetValue() ? "yes" : "no");
971 	gf_cfg_set_key(cfg, "core", "video-output", m_video->GetStringSelection().mb_str(wxConvUTF8));
972 
973 
974 	gf_cfg_set_key(cfg, "Audio", "ForceConfig", m_forcecfg->GetValue() ? "yes" : "no");
975 	gf_cfg_set_key(cfg, "Audio", "NoResync", m_noresync->GetValue() ? "yes" : "no");
976 	gf_cfg_set_key(cfg, "Audio", "DisableMultiChannel", m_nomulitch->GetValue() ? "yes" : "no");
977 
978 	gf_cfg_set_key(cfg, "Audio", "NumBuffers", wxString::Format(wxT("%d"), m_nbbuf->GetValue()).mb_str(wxConvUTF8) );
979 	gf_cfg_set_key(cfg, "Audio", "TotalDuration", wxString::Format(wxT("%d"), m_buflen->GetValue()).mb_str(wxConvUTF8) );
980 	gf_cfg_set_key(cfg, "core", "audio-output", m_audio->GetStringSelection().mb_str(wxConvUTF8));
981 #ifdef WIN32
982 	if (m_notifs->IsEnabled())
983 		gf_cfg_set_key(cfg, "Audio", "DisableNotification", m_notifs->GetValue() ? "yes" : "no");
984 #endif
985 
986 	gf_cfg_set_key(cfg, "FontCache", "FontReader", m_font->GetStringSelection().mb_str(wxConvUTF8));
987 	gf_cfg_set_key(cfg, "FontCache", "FontDirectory", m_fontdir->GetLabel().mb_str(wxConvUTF8));
988 	switch (m_texturemode->GetSelection()) {
989 	case 2:
990 		gf_cfg_set_key(cfg, "Compositor", "TextureTextMode", "Always");
991 		break;
992 	case 1:
993 		gf_cfg_set_key(cfg, "Compositor", "TextureTextMode", "Never");
994 		break;
995 	default:
996 		gf_cfg_set_key(cfg, "Compositor", "TextureTextMode", "Default");
997 		break;
998 	}
999 
1000 	gf_cfg_set_key(cfg, "Core", "CleanCache", m_cleancache->GetValue() ? "yes" : "no");
1001 	gf_cfg_set_key(cfg, "Core", "RestartFiles", m_restartcache->GetValue() ? "yes" : "no");
1002 	gf_cfg_set_key(cfg, "SAXLoader", "Progressive", m_progressive->GetValue() ? "yes" : "no");
1003 	gf_cfg_set_key(cfg, "SAXLoader", "MaxDuration", m_sax_duration->GetLabel().mb_str(wxConvUTF8));
1004 	gf_cfg_set_key(cfg, "Core", "CacheDirectory", m_cachedir->GetLabel().mb_str(wxConvUTF8));
1005 
1006 
1007 	Bool force_rtsp = 0;
1008 	switch (m_port->GetSelection()) {
1009 	case 3:
1010 		gf_cfg_set_key(cfg, "Streaming", "DefaultPort", "8080");
1011 		force_rtsp = 1;
1012 		break;
1013 	case 2:
1014 		gf_cfg_set_key(cfg, "Streaming", "DefaultPort", "80");
1015 		force_rtsp = 1;
1016 		break;
1017 	case 1:
1018 		gf_cfg_set_key(cfg, "Streaming", "DefaultPort", "7070");
1019 		break;
1020 	default:
1021 		gf_cfg_set_key(cfg, "Streaming", "DefaultPort", "554");
1022 		break;
1023 	}
1024 
1025 	if (force_rtsp) {
1026 		gf_cfg_set_key(cfg, "Streaming", "RTPoverRTSP", "yes");
1027 	} else {
1028 		gf_cfg_set_key(cfg, "Streaming", "RTPoverRTSP", m_rtsp->GetValue() ? "yes" : "no");
1029 		if (!m_rtsp->GetValue()) gf_cfg_set_key(cfg, "Streaming", "ReorderSize", m_dorebuffer->GetValue() ? "30" : "0");
1030 	}
1031 
1032 	gf_cfg_set_key(cfg, "Streaming", "RTSPTimeout", m_timeout->GetValue().mb_str(wxConvUTF8));
1033 	gf_cfg_set_key(cfg, "Network", "BufferLength", m_buffer->GetValue().mb_str(wxConvUTF8));
1034 	if (m_dorebuffer->GetValue()) {
1035 		gf_cfg_set_key(cfg, "Network", "RebufferLength", m_rebuffer->GetValue().mb_str(wxConvUTF8));
1036 	} else {
1037 		gf_cfg_set_key(cfg, "Network", "RebufferLength", "0");
1038 	}
1039 
1040 	gf_cfg_set_key(cfg, "StreamingCache", "KeepExistingFiles", m_overwrite->GetValue() ? "no" : "yes");
1041 	if (m_usename->GetValue()) {
1042 		gf_cfg_set_key(cfg, "StreamingCache", "BaseFileName", m_recfile->GetValue().mb_str(wxConvUTF8));
1043 	} else {
1044 		gf_cfg_set_key(cfg, "StreamingCache", "BaseFileName", NULL);
1045 	}
1046 	gf_cfg_set_key(cfg, "StreamingCache", "RecordDirectory", m_recdir->GetLabel().mb_str(wxConvUTF8));
1047 
1048 
1049 	gf_term_set_option(m_pApp->m_term, GF_OPT_RELOAD_CONFIG, 1);
1050 }
1051 
1052