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