5 #include "cfg-common.h"
7 extern int key_fifo_size
;
8 extern unsigned doubleclick_time
;
9 extern int noconsolecontrols
;
11 #if defined(HAVE_FBDEV)||defined(HAVE_VESA)
12 extern char *monitor_hfreq_str
;
13 extern char *monitor_vfreq_str
;
14 extern char *monitor_dotclock_str
;
18 extern char *fb_mode_cfgfile
;
19 extern char *fb_mode_name
;
22 extern char *dfb_params
;
25 extern int fakemono
; // defined in dec_audio.c
31 extern char *lirc_configfile
;
34 extern int vo_doublebuffering
;
38 extern int vo_directrendering
;
39 extern float vo_panscan
;
40 extern float vo_panscanrange
;
41 /* only used at startup (setting these values from configfile) */
42 extern int vo_gamma_brightness
;
43 extern int vo_gamma_saturation
;
44 extern int vo_gamma_contrast
;
45 extern int vo_gamma_hue
;
46 extern char *vo_geometry
;
49 extern int vo_keepaspect
;
50 extern int vo_rootwin
;
52 extern int opt_screen_size_x
;
53 extern int opt_screen_size_y
;
54 extern int fullscreen
;
59 extern char *ao_outputfilename
;
60 extern int ao_pcm_waveheader
;
63 extern char *mDisplayName
;
65 extern int stop_xscreensaver
;
66 extern char **vo_fstype_list
;
68 extern int vo_nomouse_input
;
72 extern int menu_startup
;
76 extern int vo_zr_parseoption(m_option_t
* conf
, char *opt
, char * param
);
77 extern void vo_zr_revertoption(m_option_t
* opt
,char* pram
);
81 extern m_option_t dxr2_opts
[];
85 extern char * skinName
;
91 extern int xinerama_screen
;
94 /* from libvo/aspect.c */
95 extern float monitor_aspect
;
96 extern float monitor_pixel_aspect
;
99 extern int readPPOpt(void *conf
, char *arg
);
100 extern void revertPPOpt(void *conf
, char* opt
);
101 extern char* pp_help
;
102 extern int enable_mouse_movements
;
103 extern int use_filedir_conf
;
105 m_option_t vd_conf
[]={
106 {"help", "Use MPlayer with an appropriate video file instead of live partners to avoid vd.\n", CONF_TYPE_PRINT
, CONF_NOCFG
|CONF_GLOBAL
, 0, 0, NULL
},
107 {NULL
, NULL
, 0, 0, 0, 0, NULL
}
111 * CONF_TYPE_FUNC_FULL :
112 * allows own implementations for passing the params
114 * the function receives parameter name and argument (if it does not start with - )
115 * useful with a conf.name like 'aa*' to parse several parameters to a function
116 * return 0 =ok, but we didn't need the param (could be the filename)
117 * return 1 =ok, we accepted the param
118 * negative values: see cfgparser.h, ERR_XXX
123 m_option_t mplayer_opts
[]={
124 /* name, pointer, type, flags, min, max */
126 //---------------------- libao/libvo options ------------------------
127 {"o", "Option -o has been renamed to -vo (video-out), use -vo.\n",
128 CONF_TYPE_PRINT
, CONF_NOCFG
, 0, 0, NULL
},
129 {"vo", &video_driver_list
, CONF_TYPE_STRING_LIST
, 0, 0, 0, NULL
},
130 {"ao", &audio_driver_list
, CONF_TYPE_STRING_LIST
, 0, 0, 0, NULL
},
131 {"fixed-vo", &fixed_vo
, CONF_TYPE_FLAG
,CONF_GLOBAL
, 0, 1, NULL
},
132 {"nofixed-vo", &fixed_vo
, CONF_TYPE_FLAG
,CONF_GLOBAL
, 0, 0, NULL
},
133 {"ontop", &vo_ontop
, CONF_TYPE_FLAG
, 0, 0, 1, NULL
},
134 {"noontop", &vo_ontop
, CONF_TYPE_FLAG
, 0, 1, 0, NULL
},
135 {"rootwin", &vo_rootwin
, CONF_TYPE_FLAG
, 0, 0, 1, NULL
},
136 {"border", &vo_border
, CONF_TYPE_FLAG
, 0, 0, 1, NULL
},
137 {"noborder", &vo_border
, CONF_TYPE_FLAG
, 0, 1, 0, NULL
},
139 {"aop", "-aop has been removed, use -af instead.\n", CONF_TYPE_PRINT
, CONF_NOCFG
, 0, 0, NULL
},
140 {"dsp", "-dsp has been removed. Use -ao oss:dsp_path instead.\n", CONF_TYPE_PRINT
, CONF_NOCFG
, 0, 0, NULL
},
141 {"mixer", &mixer_device
, CONF_TYPE_STRING
, 0, 0, 0, NULL
},
142 {"mixer-channel", &mixer_channel
, CONF_TYPE_STRING
, 0, 0, 0, NULL
},
143 {"softvol", &soft_vol
, CONF_TYPE_FLAG
, 0, 0, 1, NULL
},
144 {"nosoftvol", &soft_vol
, CONF_TYPE_FLAG
, 0, 1, 0, NULL
},
145 {"softvol-max", &soft_vol_max
, CONF_TYPE_FLOAT
, CONF_RANGE
, 10, 10000, NULL
},
146 {"volstep", &volstep
, CONF_TYPE_INT
, CONF_RANGE
, 0, 100, NULL
},
147 {"master", "Option -master has been removed, use -af volume instead.\n", CONF_TYPE_PRINT
, 0, 0, 0, NULL
},
148 // override audio buffer size (used only by -ao oss, anyway obsolete...)
149 {"abs", &ao_data
.buffersize
, CONF_TYPE_INT
, CONF_MIN
, 0, 0, NULL
},
152 {"aofile", "-aofile has been removed. Use -ao pcm:file=<filename> instead.\n", CONF_TYPE_PRINT
, 0, 0, 0, NULL
},
153 {"waveheader", "-waveheader has been removed. Use -ao pcm:waveheader instead.\n", CONF_TYPE_PRINT
, 0, 0, 1, NULL
},
154 {"nowaveheader", "-nowaveheader has been removed. Use -ao pcm:nowaveheader instead.\n", CONF_TYPE_PRINT
, 0, 1, 0, NULL
},
156 {"alsa", "-alsa has been removed. Remove it from your config file.\n",
157 CONF_TYPE_PRINT
, 0, 0, 0, NULL
},
158 {"noalsa", "-noalsa has been removed. Remove it from your config file.\n",
159 CONF_TYPE_PRINT
, 0, 0, 0, NULL
},
160 {"edlout", &edl_output_filename
, CONF_TYPE_STRING
, 0, 0, 0, NULL
},
163 {"display", &mDisplayName
, CONF_TYPE_STRING
, 0, 0, 0, NULL
},
168 {"z", "-z has been removed. Use -vo png:z=<0-9> instead.\n", CONF_TYPE_PRINT
, 0, 0, 0, NULL
},
172 {"jpeg", "-jpeg has been removed. Use -vo jpeg:<options> instead.\n",
173 CONF_TYPE_PRINT
, 0, 0, 0, NULL
},
176 {"sdl", "Use -vo sdl:driver=<driver> instead of -vo sdl -sdl driver.\n",
177 CONF_TYPE_PRINT
, 0, 0, 0, NULL
},
178 {"noxv", "-noxv has been removed. Use -vo sdl:nohwaccel instead.\n", CONF_TYPE_PRINT
, 0, 0, 0, NULL
},
179 {"forcexv", "-forcexv has been removed. Use -vo sdl:forcexv instead.\n", CONF_TYPE_PRINT
, 0, 0, 0, NULL
},
181 {"sdla", "Use -ao sdl:driver instead of -ao sdl -sdla driver.\n",
182 CONF_TYPE_PRINT
, 0, 0, 0, NULL
},
184 #if defined(HAVE_FBDEV)||defined(HAVE_VESA)
185 {"monitor-hfreq", &monitor_hfreq_str
, CONF_TYPE_STRING
, 0, 0, 0, NULL
},
186 {"monitor-vfreq", &monitor_vfreq_str
, CONF_TYPE_STRING
, 0, 0, 0, NULL
},
187 {"monitor-dotclock", &monitor_dotclock_str
, CONF_TYPE_STRING
, 0, 0, 0, NULL
},
191 {"fbmode", &fb_mode_name
, CONF_TYPE_STRING
, 0, 0, 0, NULL
},
192 {"fbmodeconfig", &fb_mode_cfgfile
, CONF_TYPE_STRING
, 0, 0, 0, NULL
},
195 #if DIRECTFBVERSION > 912
196 {"dfbopts", "-dfbopts has been removed. Use -vf directfb:dfbopts=... instead.\n", CONF_TYPE_PRINT
, 0, 0, 0, NULL
},
200 // force window width/height or resolution (with -vm)
201 {"x", &opt_screen_size_x
, CONF_TYPE_INT
, CONF_RANGE
, 0, 4096, NULL
},
202 {"y", &opt_screen_size_y
, CONF_TYPE_INT
, CONF_RANGE
, 0, 4096, NULL
},
203 // set screen dimensions (when not detectable or virtual!=visible)
204 {"screenw", &vo_screenwidth
, CONF_TYPE_INT
, CONF_RANGE
|CONF_OLD
, 0, 4096, NULL
},
205 {"screenh", &vo_screenheight
, CONF_TYPE_INT
, CONF_RANGE
|CONF_OLD
, 0, 4096, NULL
},
207 {"geometry", &vo_geometry
, CONF_TYPE_STRING
, 0, 0, 0, NULL
},
208 // set aspect ratio of monitor - useful for 16:9 TVout
209 {"monitoraspect", &monitor_aspect
, CONF_TYPE_FLOAT
, CONF_RANGE
, 0.2, 9.0, NULL
},
210 {"monitorpixelaspect", &monitor_pixel_aspect
, CONF_TYPE_FLOAT
, CONF_RANGE
, 0.0, 9.0, NULL
},
211 // video mode switching: (x11,xv,dga)
212 {"vm", &vidmode
, CONF_TYPE_FLAG
, 0, 0, 1, NULL
},
213 {"novm", &vidmode
, CONF_TYPE_FLAG
, 0, 1, 0, NULL
},
214 // start in fullscreen mode:
215 {"fs", &fullscreen
, CONF_TYPE_FLAG
, 0, 0, 1, NULL
},
216 {"nofs", &fullscreen
, CONF_TYPE_FLAG
, 0, 1, 0, NULL
},
217 // set fullscreen switch method (workaround for buggy WMs)
218 {"fsmode", "-fsmode is obsolete, avoid it and use -fstype instead.\nIf you really want it, try -fsmode-dontuse, but don't report bugs!\n", CONF_TYPE_PRINT
, CONF_RANGE
, 0, 31, NULL
},
219 {"fsmode-dontuse", &vo_fsmode
, CONF_TYPE_INT
, CONF_RANGE
, 0, 31, NULL
},
220 // set bpp (x11+vm, dga, fbdev, vesa, svga?)
221 {"bpp", &vo_dbpp
, CONF_TYPE_INT
, CONF_RANGE
, 0, 32, NULL
},
222 {"colorkey", &vo_colorkey
, CONF_TYPE_INT
, 0, 0, 0, NULL
},
223 {"nocolorkey", &vo_colorkey
, CONF_TYPE_FLAG
, 0, 0, 0x1000000, NULL
},
224 {"double", &vo_doublebuffering
, CONF_TYPE_FLAG
, 0, 0, 1, NULL
},
225 {"nodouble", &vo_doublebuffering
, CONF_TYPE_FLAG
, 0, 1, 0, NULL
},
226 // wait for v-sync (vesa)
227 {"vsync", &vo_vsync
, CONF_TYPE_FLAG
, 0, 0, 1, NULL
},
228 {"novsync", &vo_vsync
, CONF_TYPE_FLAG
, 0, 1, 0, NULL
},
229 {"panscan", &vo_panscan
, CONF_TYPE_FLOAT
, CONF_RANGE
, 0.0, 1.0, NULL
},
230 {"panscanrange", &vo_panscanrange
, CONF_TYPE_FLOAT
, CONF_RANGE
, -19.0, 99.0, NULL
},
232 {"grabpointer", &vo_grabpointer
, CONF_TYPE_FLAG
, 0, 0, 1, NULL
},
233 {"nograbpointer", &vo_grabpointer
, CONF_TYPE_FLAG
, 0, 1, 0, NULL
},
235 {"adapter", &vo_adapter_num
, CONF_TYPE_INT
, CONF_RANGE
, 0, 5, NULL
},
236 {"refreshrate",&vo_refresh_rate
,CONF_TYPE_INT
,CONF_RANGE
, 0,100, NULL
},
237 {"wid", &WinID
, CONF_TYPE_INT
, 0, 0, 0, NULL
},
239 // x11,xv,xmga,xvidix
240 {"icelayer", "-icelayer has been removed. Use -fstype layer:<number> instead.\n", CONF_TYPE_PRINT
, 0, 0, 0, NULL
},
241 {"stop-xscreensaver", &stop_xscreensaver
, CONF_TYPE_FLAG
, 0, 0, 1, NULL
},
242 {"nostop-xscreensaver", &stop_xscreensaver
, CONF_TYPE_FLAG
, 0, 1, 0, NULL
},
243 {"stop_xscreensaver", "Use -stop-xscreensaver instead, options with _ have been obsoleted.\n", CONF_TYPE_PRINT
, 0, 0, 0, NULL
},
244 {"fstype", &vo_fstype_list
, CONF_TYPE_STRING_LIST
, 0, 0, 0, NULL
},
246 {"nomouseinput", &vo_nomouse_input
, CONF_TYPE_FLAG
,0,0,-1,NULL
},
248 {"xineramascreen", &xinerama_screen
, CONF_TYPE_INT
, CONF_RANGE
, -2, 32, NULL
},
250 {"brightness",&vo_gamma_brightness
, CONF_TYPE_INT
, CONF_RANGE
, -100, 100, NULL
},
251 {"saturation",&vo_gamma_saturation
, CONF_TYPE_INT
, CONF_RANGE
, -100, 100, NULL
},
252 {"contrast",&vo_gamma_contrast
, CONF_TYPE_INT
, CONF_RANGE
, -100, 100, NULL
},
253 {"hue",&vo_gamma_hue
, CONF_TYPE_INT
, CONF_RANGE
, -100, 100, NULL
},
254 {"keepaspect", &vo_keepaspect
, CONF_TYPE_FLAG
, 0, 0, 1, NULL
},
255 {"nokeepaspect", &vo_keepaspect
, CONF_TYPE_FLAG
, 0, 1, 0, NULL
},
257 // direct rendering (decoding to video out buffer)
258 {"dr", &vo_directrendering
, CONF_TYPE_FLAG
, 0, 0, 1, NULL
},
259 {"nodr", &vo_directrendering
, CONF_TYPE_FLAG
, 0, 1, 0, NULL
},
260 {"vaa_dr", "-vaa_dr has been removed, use -dr.\n", CONF_TYPE_PRINT
, 0, 0, 0, NULL
},
261 {"vaa_nodr", "-vaa_nodr has been removed, use -nodr.\n", CONF_TYPE_PRINT
, 0, 0, 0, NULL
},
265 {"aa*", "-aa* has been removed. Use -vo aa:suboption instead.\n", CONF_TYPE_PRINT
, 0, 0, 0, NULL
},
270 {"zr*", vo_zr_parseoption
, CONF_TYPE_FUNC_FULL
, 0, 0, 0, &vo_zr_revertoption
},
274 {"dxr2", &dxr2_opts
, CONF_TYPE_SUBCONFIG
, 0, 0, 0, NULL
},
278 //---------------------- mplayer-only options ------------------------
280 {"use-filedir-conf", &use_filedir_conf
, CONF_TYPE_FLAG
, CONF_GLOBAL
, 0, 1, NULL
},
281 {"nouse-filedir-conf", &use_filedir_conf
, CONF_TYPE_FLAG
, CONF_GLOBAL
, 1, 0, NULL
},
283 {"crash-debug", &crash_debug
, CONF_TYPE_FLAG
, CONF_GLOBAL
, 0, 1, NULL
},
284 {"nocrash-debug", &crash_debug
, CONF_TYPE_FLAG
, CONF_GLOBAL
, 1, 0, NULL
},
286 {"osdlevel", &osd_level
, CONF_TYPE_INT
, CONF_RANGE
, 0, 3, NULL
},
287 {"osd-duration", &osd_duration
, CONF_TYPE_INT
, CONF_MIN
, 0, 0, NULL
},
289 {"menu", &use_menu
, CONF_TYPE_FLAG
, CONF_GLOBAL
, 0, 1, NULL
},
290 {"nomenu", &use_menu
, CONF_TYPE_FLAG
, CONF_GLOBAL
, 1, 0, NULL
},
291 {"menu-root", &menu_root
, CONF_TYPE_STRING
, CONF_GLOBAL
, 0, 0, NULL
},
292 {"menu-cfg", &menu_cfg
, CONF_TYPE_STRING
, CONF_GLOBAL
, 0, 0, NULL
},
293 {"menu-startup", &menu_startup
, CONF_TYPE_FLAG
, CONF_GLOBAL
, 0, 1, NULL
},
295 {"menu", "OSD menu support was not compiled in.\n", CONF_TYPE_PRINT
,0, 0, 0, NULL
},
298 // these should be moved to -common, and supported in MEncoder
299 {"vobsub", &vobsub_name
, CONF_TYPE_STRING
, 0, 0, 0, NULL
},
300 {"vobsubid", &vobsub_id
, CONF_TYPE_INT
, CONF_RANGE
, 0, 31, NULL
},
302 {"sstep", &step_sec
, CONF_TYPE_INT
, CONF_MIN
, 0, 0, NULL
},
304 {"framedrop", &frame_dropping
, CONF_TYPE_FLAG
, 0, 0, 1, NULL
},
305 {"hardframedrop", &frame_dropping
, CONF_TYPE_FLAG
, 0, 0, 2, NULL
},
306 {"noframedrop", &frame_dropping
, CONF_TYPE_FLAG
, 0, 1, 0, NULL
},
308 {"autoq", &auto_quality
, CONF_TYPE_INT
, CONF_RANGE
, 0, 100, NULL
},
310 {"benchmark", &benchmark
, CONF_TYPE_FLAG
, 0, 0, 1, NULL
},
312 // dump some stream out instead of playing the file
313 // this really should be in MEncoder instead of MPlayer... -> TODO
314 {"dumpfile", &stream_dump_name
, CONF_TYPE_STRING
, 0, 0, 0, NULL
},
315 {"dumpaudio", &stream_dump_type
, CONF_TYPE_FLAG
, 0, 0, 1, NULL
},
316 {"dumpvideo", &stream_dump_type
, CONF_TYPE_FLAG
, 0, 0, 2, NULL
},
317 {"dumpsub", &stream_dump_type
, CONF_TYPE_FLAG
, 0, 0, 3, NULL
},
318 {"dumpmpsub", &stream_dump_type
, CONF_TYPE_FLAG
, 0, 0, 4, NULL
},
319 {"dumpstream", &stream_dump_type
, CONF_TYPE_FLAG
, 0, 0, 5, NULL
},
320 {"dumpsrtsub", &stream_dump_type
, CONF_TYPE_FLAG
, 0, 0, 6, NULL
},
321 {"dumpmicrodvdsub", &stream_dump_type
, CONF_TYPE_FLAG
, 0, 0, 7, NULL
},
322 {"dumpjacosub", &stream_dump_type
, CONF_TYPE_FLAG
, 0, 0, 8, NULL
},
323 {"dumpsami", &stream_dump_type
, CONF_TYPE_FLAG
, 0, 0, 9, NULL
},
326 {"lircconf", &lirc_configfile
, CONF_TYPE_STRING
, CONF_GLOBAL
, 0, 0, NULL
},
329 {"gui", "The -gui option will only work as the first command line argument.\n", CONF_TYPE_PRINT
, 0, 0, 0, (void *)1},
330 {"nogui", "The -nogui option will only work as the first command line argument.\n", CONF_TYPE_PRINT
, 0, 0, 0, (void *)1},
333 {"skin", &skinName
, CONF_TYPE_STRING
, CONF_GLOBAL
, 0, 0, NULL
},
334 {"enqueue", &enqueue
, CONF_TYPE_FLAG
, 0, 0, 1, NULL
},
335 {"noenqueue", &enqueue
, CONF_TYPE_FLAG
, 0, 0, 0, NULL
},
336 {"guiwid", &guiWinID
, CONF_TYPE_INT
, 0, 0, 0, NULL
},
339 {"noloop", &loop_times
, CONF_TYPE_FLAG
, 0, 0, -1, NULL
},
340 {"loop", &loop_times
, CONF_TYPE_INT
, CONF_RANGE
, -1, 10000, NULL
},
341 {"playlist", NULL
, CONF_TYPE_STRING
, 0, 0, 0, NULL
},
344 {"correct-pts", &correct_pts
, CONF_TYPE_FLAG
, 0, 0, 1, NULL
},
345 {"no-correct-pts", &correct_pts
, CONF_TYPE_FLAG
, 0, 1, 0, NULL
},
346 {"noautosync", &autosync
, CONF_TYPE_FLAG
, 0, 0, -1, NULL
},
347 {"autosync", &autosync
, CONF_TYPE_INT
, CONF_RANGE
, 0, 10000, NULL
},
348 // {"dapsync", &dapsync, CONF_TYPE_FLAG, 0, 0, 1, NULL},
349 // {"nodapsync", &dapsync, CONF_TYPE_FLAG, 0, 1, 0, NULL},
351 {"softsleep", &softsleep
, CONF_TYPE_FLAG
, 0, 0, 1, NULL
},
353 {"nortc", &nortc
, CONF_TYPE_FLAG
, 0, 0, 1, NULL
},
354 {"rtc", &nortc
, CONF_TYPE_FLAG
, 0, 0, 0, NULL
},
355 {"rtc-device", &rtc_device
, CONF_TYPE_STRING
, 0, 0, 0, NULL
},
358 {"term-osd", &term_osd
, CONF_TYPE_FLAG
, 0, 0, 1, NULL
},
359 {"noterm-osd", &term_osd
, CONF_TYPE_FLAG
, 0, 0, 0, NULL
},
360 {"term-osd-esc", &term_osd_esc
, CONF_TYPE_STRING
, 0, 0, 1, NULL
},
361 {"playing-msg", &playing_msg
, CONF_TYPE_STRING
, 0, 0, 0, NULL
},
363 {"slave", &slave_mode
, CONF_TYPE_FLAG
,CONF_GLOBAL
, 0, 1, NULL
},
364 {"idle", &player_idle_mode
, CONF_TYPE_FLAG
,CONF_GLOBAL
, 0, 1, NULL
},
365 {"noidle", &player_idle_mode
, CONF_TYPE_FLAG
,CONF_GLOBAL
, 0, 0, NULL
},
366 {"use-stdin", "-use-stdin has been renamed to -noconsolecontrols, use that instead.", CONF_TYPE_PRINT
, 0, 0, 0, NULL
},
367 {"key-fifo-size", &key_fifo_size
, CONF_TYPE_INT
, CONF_RANGE
, 2, 65000, NULL
},
368 {"noconsolecontrols", &noconsolecontrols
, CONF_TYPE_FLAG
, CONF_GLOBAL
, 0, 1, NULL
},
369 {"consolecontrols", &noconsolecontrols
, CONF_TYPE_FLAG
, CONF_GLOBAL
, 0, 0, NULL
},
370 {"mouse-movements", &enable_mouse_movements
, CONF_TYPE_FLAG
, CONF_GLOBAL
, 0, 1, NULL
},
371 {"nomouse-movements", &enable_mouse_movements
, CONF_TYPE_FLAG
, CONF_GLOBAL
, 0, 0, NULL
},
372 {"doubleclick-time", &doubleclick_time
, CONF_TYPE_INT
, CONF_RANGE
, 0, 1000, NULL
},
375 #include "cfg-common.h"
378 {"list-properties", &list_properties
, CONF_TYPE_FLAG
, CONF_GLOBAL
, 0, 1, NULL
},
379 {"identify", &mp_msg_levels
[MSGT_IDENTIFY
], CONF_TYPE_FLAG
, CONF_GLOBAL
, 0, MSGL_V
, NULL
},
380 {"-help", help_text
, CONF_TYPE_PRINT
, CONF_NOCFG
|CONF_GLOBAL
, 0, 0, NULL
},
381 {"help", help_text
, CONF_TYPE_PRINT
, CONF_NOCFG
|CONF_GLOBAL
, 0, 0, NULL
},
382 {"h", help_text
, CONF_TYPE_PRINT
, CONF_NOCFG
|CONF_GLOBAL
, 0, 0, NULL
},
384 {"vd", vd_conf
, CONF_TYPE_SUBCONFIG
, 0, 0, 0, NULL
},
385 {NULL
, NULL
, 0, 0, 0, 0, NULL
}