int config_write_template(const char *file, const struct config *cfg) { FILE *f = NULL; int err = 0; const char *modpath; bool modpath_valid = false; if (!file || !cfg) return EINVAL; info("config: creating config template %s\n", file); f = fopen(file, "w"); if (!f) { warning("config: writing %s: %m\n", file, errno); return errno; } (void)re_fprintf(f, "#\n" "# baresip configuration\n" "#\n" "\n" "#------------------------------------" "------------------------------------------\n"); (void)re_fprintf(f, "%H", core_config_template, cfg); (void)re_fprintf(f, "\n#------------------------------------" "------------------------------------------\n" "# Modules\n" "\n"); modpath = detect_module_path(&modpath_valid); (void)re_fprintf(f, "%smodule_path\t\t%s\n", modpath_valid ? "" : "#", modpath); (void)re_fprintf(f, "\n# UI Modules\n"); #if defined (WIN32) (void)re_fprintf(f, "module\t\t\t" MOD_PRE "wincons" MOD_EXT "\n"); #else (void)re_fprintf(f, "module\t\t\t" MOD_PRE "stdio" MOD_EXT "\n"); #endif (void)re_fprintf(f, "#module\t\t\t" MOD_PRE "cons" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" MOD_PRE "evdev" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" MOD_PRE "httpd" MOD_EXT "\n"); (void)re_fprintf(f, "\n# Audio codec Modules (in order)\n"); (void)re_fprintf(f, "#module\t\t\t" MOD_PRE "opus" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" MOD_PRE "silk" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" MOD_PRE "amr" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" MOD_PRE "g7221" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" MOD_PRE "g722" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" MOD_PRE "g726" MOD_EXT "\n"); (void)re_fprintf(f, "module\t\t\t" MOD_PRE "g711" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" MOD_PRE "gsm" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" MOD_PRE "l16" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" MOD_PRE "speex" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" MOD_PRE "bv32" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" MOD_PRE "mpa" MOD_EXT "\n"); (void)re_fprintf(f, "\n# Audio filter Modules (in encoding order)\n"); (void)re_fprintf(f, "module\t\t\t" MOD_PRE "vumeter" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" MOD_PRE "sndfile" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" MOD_PRE "speex_aec" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" MOD_PRE "speex_pp" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" MOD_PRE "plc" MOD_EXT "\n"); (void)re_fprintf(f, "\n# Audio driver Modules\n"); #if defined (ANDROID) (void)re_fprintf(f, "module\t\t\t" MOD_PRE "opensles" MOD_EXT "\n"); #elif defined (DARWIN) (void)re_fprintf(f, "module\t\t\t" MOD_PRE "coreaudio" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" MOD_PRE "audiounit" MOD_EXT "\n"); #elif defined (FREEBSD) (void)re_fprintf(f, "module\t\t\t" MOD_PRE "oss" MOD_EXT "\n"); #elif defined (OPENBSD) (void)re_fprintf(f, "module\t\t\t" MOD_PRE "sndio" MOD_EXT "\n"); #elif defined (WIN32) (void)re_fprintf(f, "module\t\t\t" MOD_PRE "winwave" MOD_EXT "\n"); #else (void)re_fprintf(f, "module\t\t\t" MOD_PRE "alsa" MOD_EXT "\n"); #endif (void)re_fprintf(f, "#module\t\t\t" MOD_PRE "portaudio" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" MOD_PRE "aubridge" MOD_EXT "\n"); #ifdef USE_VIDEO (void)re_fprintf(f, "\n# Video codec Modules (in order)\n"); #ifdef USE_AVCODEC (void)re_fprintf(f, "module\t\t\t" MOD_PRE "avcodec" MOD_EXT "\n"); #else (void)re_fprintf(f, "#module\t\t\t" MOD_PRE "avcodec" MOD_EXT "\n"); #endif (void)re_fprintf(f, "#module\t\t\t" MOD_PRE "vp8" MOD_EXT "\n"); (void)re_fprintf(f, "\n# Video filter Modules (in encoding order)\n"); (void)re_fprintf(f, "#module\t\t\t" MOD_PRE "selfview" MOD_EXT "\n"); (void)re_fprintf(f, "\n# Video source modules\n"); #if defined (DARWIN) #ifdef QTCAPTURE_RUNLOOP (void)re_fprintf(f, "module\t\t\t" MOD_PRE "qtcapture" MOD_EXT "\n"); #else (void)re_fprintf(f, "module\t\t\t" MOD_PRE "avcapture" MOD_EXT "\n"); #endif #else (void)re_fprintf(f, "#module\t\t\t" MOD_PRE "v4l" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" MOD_PRE "v4l2" MOD_EXT "\n"); #endif #ifdef USE_AVFORMAT (void)re_fprintf(f, "#module\t\t\t" MOD_PRE "avformat" MOD_EXT "\n"); #endif (void)re_fprintf(f, "#module\t\t\t" MOD_PRE "x11grab" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" MOD_PRE "cairo" MOD_EXT "\n"); (void)re_fprintf(f, "\n# Video display modules\n"); #ifdef DARWIN (void)re_fprintf(f, "module\t\t\t" MOD_PRE "opengl" MOD_EXT "\n"); #endif (void)re_fprintf(f, "#module\t\t\t" MOD_PRE "x11" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" MOD_PRE "sdl2" MOD_EXT "\n"); #endif /* USE_VIDEO */ (void)re_fprintf(f, "\n# Audio/Video source modules\n" "#module\t\t\t" MOD_PRE "rst" MOD_EXT "\n" "#module\t\t\t" MOD_PRE "gst" MOD_EXT "\n"); (void)re_fprintf(f, "\n# Media NAT modules\n"); (void)re_fprintf(f, "module\t\t\t" MOD_PRE "stun" MOD_EXT "\n"); (void)re_fprintf(f, "module\t\t\t" MOD_PRE "turn" MOD_EXT "\n"); (void)re_fprintf(f, "module\t\t\t" MOD_PRE "ice" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" MOD_PRE "natpmp" MOD_EXT "\n"); (void)re_fprintf(f, "\n# Media encryption modules\n"); (void)re_fprintf(f, "#module\t\t\t" MOD_PRE "srtp" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" MOD_PRE "dtls_srtp" MOD_EXT "\n"); (void)re_fprintf(f, "\n"); (void)re_fprintf(f, "\n#------------------------------------" "------------------------------------------\n"); (void)re_fprintf(f, "# Temporary Modules (loaded then unloaded)\n"); (void)re_fprintf(f, "\n"); (void)re_fprintf(f, "module_tmp\t\t" MOD_PRE "uuid" MOD_EXT "\n"); (void)re_fprintf(f, "module_tmp\t\t" MOD_PRE "account" MOD_EXT "\n"); (void)re_fprintf(f, "\n"); (void)re_fprintf(f, "\n#------------------------------------" "------------------------------------------\n"); (void)re_fprintf(f, "# Application Modules\n"); (void)re_fprintf(f, "\n"); (void)re_fprintf(f, "module_app\t\t" MOD_PRE "auloop"MOD_EXT"\n"); (void)re_fprintf(f, "module_app\t\t" MOD_PRE "contact"MOD_EXT"\n"); (void)re_fprintf(f, "module_app\t\t" MOD_PRE "menu"MOD_EXT"\n"); (void)re_fprintf(f, "#module_app\t\t" MOD_PRE "mwi"MOD_EXT"\n"); (void)re_fprintf(f, "#module_app\t\t" MOD_PRE "natbd"MOD_EXT"\n"); (void)re_fprintf(f, "#module_app\t\t" MOD_PRE "presence"MOD_EXT"\n"); (void)re_fprintf(f, "#module_app\t\t" MOD_PRE "syslog"MOD_EXT"\n"); #ifdef USE_VIDEO (void)re_fprintf(f, "module_app\t\t" MOD_PRE "vidloop"MOD_EXT"\n"); #endif (void)re_fprintf(f, "\n"); (void)re_fprintf(f, "\n#------------------------------------" "------------------------------------------\n"); (void)re_fprintf(f, "# Module parameters\n"); (void)re_fprintf(f, "\n"); (void)re_fprintf(f, "\n"); (void)re_fprintf(f, "cons_listen\t\t0.0.0.0:5555\n"); (void)re_fprintf(f, "\n"); (void)re_fprintf(f, "http_listen\t\t0.0.0.0:8000\n"); (void)re_fprintf(f, "\n"); (void)re_fprintf(f, "evdev_device\t\t/dev/input/event0\n"); (void)re_fprintf(f, "\n# Speex codec parameters\n"); (void)re_fprintf(f, "speex_quality\t\t7 # 0-10\n"); (void)re_fprintf(f, "speex_complexity\t7 # 0-10\n"); (void)re_fprintf(f, "speex_enhancement\t0 # 0-1\n"); (void)re_fprintf(f, "speex_mode_nb\t\t3 # 1-6\n"); (void)re_fprintf(f, "speex_mode_wb\t\t6 # 1-6\n"); (void)re_fprintf(f, "speex_vbr\t\t0 # Variable Bit Rate 0-1\n"); (void)re_fprintf(f, "speex_vad\t\t0 # Voice Activity Detection 0-1\n"); (void)re_fprintf(f, "speex_agc_level\t\t8000\n"); (void)re_fprintf(f, "\n# Opus codec parameters\n"); (void)re_fprintf(f, "opus_bitrate\t\t28000 # 6000-510000\n"); (void)re_fprintf(f, "\n# Selfview\n" "video_selfview\t\twindow # {window,pip}\n" "#selfview_size\t\t64x64\n"); (void)re_fprintf(f, "\n# ICE\n" "ice_turn\t\tno\n" "ice_debug\t\tno\n" "ice_nomination\t\tregular\t# {regular,aggressive}\n" "ice_mode\t\tfull\t# {full,lite}\n"); if (f) (void)fclose(f); return err; }
/** * Write the baresip core config template to a file * * @param file Filename of output file * @param cfg Baresip core config * * @return 0 if success, otherwise errorcode */ int config_write_template(const char *file, const struct config *cfg) { FILE *f = NULL; int err = 0; const char *modpath; bool modpath_valid = false; if (!file || !cfg) return EINVAL; info("config: creating config template %s\n", file); f = fopen(file, "w"); if (!f) { warning("config: writing %s: %m\n", file, errno); return errno; } (void)re_fprintf(f, "#\n" "# baresip configuration\n" "#\n" "\n" "#------------------------------------" "------------------------------------------\n"); (void)re_fprintf(f, "%H", core_config_template, cfg); (void)re_fprintf(f, "\n#------------------------------------" "------------------------------------------\n" "# Modules\n" "\n"); modpath = detect_module_path(&modpath_valid); (void)re_fprintf(f, "%smodule_path\t\t%s\n", modpath_valid ? "" : "#", modpath); (void)re_fprintf(f, "\n# UI Modules\n"); #if defined (WIN32) (void)re_fprintf(f, "module\t\t\t" "wincons" MOD_EXT "\n"); #else (void)re_fprintf(f, "module\t\t\t" "stdio" MOD_EXT "\n"); #endif (void)re_fprintf(f, "#module\t\t\t" "cons" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" "evdev" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" "httpd" MOD_EXT "\n"); (void)re_fprintf(f, "\n# Audio codec Modules (in order)\n"); (void)re_fprintf(f, "#module\t\t\t" "opus" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" "amr" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" "g7221" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" "g722" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" "g726" MOD_EXT "\n"); (void)re_fprintf(f, "module\t\t\t" "g711" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" "gsm" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" "l16" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" "bv32" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" "mpa" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" "codec2" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" "ilbc" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" "isac" MOD_EXT "\n"); (void)re_fprintf(f, "\n# Audio filter Modules (in encoding order)\n"); (void)re_fprintf(f, "module\t\t\t" "vumeter" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" "sndfile" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" "speex_aec" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" "speex_pp" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" "plc" MOD_EXT "\n"); (void)re_fprintf(f, "\n# Audio driver Modules\n"); #if defined (ANDROID) (void)re_fprintf(f, "module\t\t\t" "opensles" MOD_EXT "\n"); #elif defined (DARWIN) (void)re_fprintf(f, "module\t\t\t" "coreaudio" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" "audiounit" MOD_EXT "\n"); #elif defined (FREEBSD) (void)re_fprintf(f, "module\t\t\t" "oss" MOD_EXT "\n"); #elif defined (OPENBSD) (void)re_fprintf(f, "module\t\t\t" "sndio" MOD_EXT "\n"); #elif defined (WIN32) (void)re_fprintf(f, "module\t\t\t" "winwave" MOD_EXT "\n"); #else (void)re_fprintf(f, "module\t\t\t" "alsa" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" "pulse" MOD_EXT "\n"); #endif (void)re_fprintf(f, "#module\t\t\t" "jack" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" "portaudio" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" "aubridge" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" "aufile" MOD_EXT "\n"); (void)re_fprintf(f, "\n# Video codec Modules (in order)\n"); (void)re_fprintf(f, "#module\t\t\t" "avcodec" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" "vp8" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" "vp9" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" "h265" MOD_EXT "\n"); (void)re_fprintf(f, "\n# Video filter Modules (in encoding order)\n"); (void)re_fprintf(f, "#module\t\t\t" "selfview" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" "snapshot" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" "swscale" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" "vidinfo" MOD_EXT "\n"); (void)re_fprintf(f, "\n# Video source modules\n"); #if defined (DARWIN) #ifdef QTCAPTURE_RUNLOOP (void)re_fprintf(f, "module\t\t\t" "qtcapture" MOD_EXT "\n"); #else (void)re_fprintf(f, "module\t\t\t" "avcapture" MOD_EXT "\n"); #endif #elif defined (WIN32) (void)re_fprintf(f, "module\t\t\t" "dshow" MOD_EXT "\n"); #else (void)re_fprintf(f, "#module\t\t\t" "v4l2" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" "v4l2_codec" MOD_EXT "\n"); #endif (void)re_fprintf(f, "#module\t\t\t" "avformat" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" "x11grab" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" "cairo" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" "vidbridge" MOD_EXT "\n"); (void)re_fprintf(f, "\n# Video display modules\n"); #ifdef DARWIN (void)re_fprintf(f, "#module\t\t\t" "opengl" MOD_EXT "\n"); #endif #ifdef LINUX (void)re_fprintf(f, "#module\t\t\t" "directfb" MOD_EXT "\n"); #endif (void)re_fprintf(f, "#module\t\t\t" "x11" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" "sdl2" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" "fakevideo" MOD_EXT "\n"); (void)re_fprintf(f, "\n# Audio/Video source modules\n"); (void)re_fprintf(f, "#module\t\t\t" "rst" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" "gst1" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" "gst_video1" MOD_EXT "\n"); (void)re_fprintf(f, "\n# Media NAT modules\n"); (void)re_fprintf(f, "module\t\t\t" "stun" MOD_EXT "\n"); (void)re_fprintf(f, "module\t\t\t" "turn" MOD_EXT "\n"); (void)re_fprintf(f, "module\t\t\t" "ice" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" "natpmp" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" "pcp" MOD_EXT "\n"); (void)re_fprintf(f, "\n# Media encryption modules\n"); (void)re_fprintf(f, "#module\t\t\t" "srtp" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" "dtls_srtp" MOD_EXT "\n"); (void)re_fprintf(f, "#module\t\t\t" "zrtp" MOD_EXT "\n"); (void)re_fprintf(f, "\n"); (void)re_fprintf(f, "\n#------------------------------------" "------------------------------------------\n"); (void)re_fprintf(f, "# Temporary Modules (loaded then unloaded)\n"); (void)re_fprintf(f, "\n"); (void)re_fprintf(f, "module_tmp\t\t" "uuid" MOD_EXT "\n"); (void)re_fprintf(f, "module_tmp\t\t" "account" MOD_EXT "\n"); (void)re_fprintf(f, "\n"); (void)re_fprintf(f, "\n#------------------------------------" "------------------------------------------\n"); (void)re_fprintf(f, "# Application Modules\n"); (void)re_fprintf(f, "\n"); (void)re_fprintf(f, "module_app\t\t" "auloop"MOD_EXT"\n"); (void)re_fprintf(f, "#module_app\t\t" "b2bua"MOD_EXT"\n"); (void)re_fprintf(f, "module_app\t\t" "contact"MOD_EXT"\n"); (void)re_fprintf(f, "module_app\t\t" "debug_cmd"MOD_EXT"\n"); #ifdef LINUX (void)re_fprintf(f, "#module_app\t\t" "dtmfio"MOD_EXT"\n"); #endif (void)re_fprintf(f, "#module_app\t\t" "echo"MOD_EXT"\n"); (void)re_fprintf(f, "#module_app\t\t" "gtk" MOD_EXT "\n"); (void)re_fprintf(f, "module_app\t\t" "menu"MOD_EXT"\n"); (void)re_fprintf(f, "#module_app\t\t" "mwi"MOD_EXT"\n"); (void)re_fprintf(f, "#module_app\t\t" "presence"MOD_EXT"\n"); (void)re_fprintf(f, "#module_app\t\t" "syslog"MOD_EXT"\n"); (void)re_fprintf(f, "#module_app\t\t" "mqtt" MOD_EXT "\n"); (void)re_fprintf(f, "#module_app\t\t" "ctrl_tcp" MOD_EXT "\n"); (void)re_fprintf(f, "module_app\t\t" "vidloop"MOD_EXT"\n"); (void)re_fprintf(f, "\n"); (void)re_fprintf(f, "\n#------------------------------------" "------------------------------------------\n"); (void)re_fprintf(f, "# Module parameters\n"); (void)re_fprintf(f, "\n"); (void)re_fprintf(f, "\n# UI Modules parameters\n"); (void)re_fprintf(f, "cons_listen\t\t0.0.0.0:5555 # cons\n"); (void)re_fprintf(f, "\n"); (void)re_fprintf(f, "http_listen\t\t0.0.0.0:8000 # httpd - server\n"); (void)re_fprintf(f, "\n"); (void)re_fprintf(f, "ctrl_tcp_listen\t\t0.0.0.0:4444 # ctrl_tcp\n"); (void)re_fprintf(f, "\n"); (void)re_fprintf(f, "evdev_device\t\t/dev/input/event0\n"); (void)re_fprintf(f, "\n# Opus codec parameters\n"); (void)re_fprintf(f, "opus_bitrate\t\t28000 # 6000-510000\n"); (void)re_fprintf(f, "#opus_stereo\t\tyes\n"); (void)re_fprintf(f, "#opus_sprop_stereo\tyes\n"); (void)re_fprintf(f, "#opus_cbr\t\tno\n"); (void)re_fprintf(f, "#opus_inbandfec\tno\n"); (void)re_fprintf(f, "#opus_dtx\t\tno\n"); (void)re_fprintf(f, "#opus_mirror\t\tno\n"); (void)re_fprintf(f, "#opus_complexity\t\t10\n"); (void)re_fprintf(f, "#opus_application\t\taudio\t# {voip,audio}\n"); (void)re_fprintf(f, "\n# Opus Multistream codec parameters\n"); (void)re_fprintf(f, "#opus_ms_channels\t2\t#total channels (2 or 4)\n"); (void)re_fprintf(f, "#opus_ms_streams\t\t2\t#number of streams\n"); (void)re_fprintf(f, "#opus_ms_c_streams\t2\t#number of coupled streams\n"); (void)re_fprintf(f, "\n"); (void)re_fprintf(f, "vumeter_stderr\t\tyes\n"); (void)re_fprintf(f, "\n# Selfview\n" "video_selfview\t\twindow # {window,pip}\n" "#selfview_size\t\t64x64\n"); (void)re_fprintf(f, "\n# ICE\n" "ice_turn\t\tno\n" "ice_debug\t\tno\n" "ice_nomination\t\tregular\t# {regular,aggressive}\n" "ice_mode\t\tfull\t# {full,lite}\n"); (void)re_fprintf(f, "\n# ZRTP\n" "#zrtp_hash\t\tno # Disable SDP zrtp-hash " "(not recommended)\n"); (void)re_fprintf(f, "\n# Menu\n" "#menu_bell\t\tyes\n" "#redial_attempts\t0 # Num or <inf>\n" "#redial_delay\t\t5 # Delay in seconds\n" "#ringback_disabled\tno\n" "#statmode_default\toff\n"); (void)re_fprintf(f, "\n# avcodec\n" "#avcodec_h264enc\tlibx264\n" "#avcodec_h264dec\th264\n"); (void)re_fprintf(f, "\n# h265\n" "#h265_encoder\t\tlibx265\n" "#h265_decoder\t\thevc\n"); if (f) (void)fclose(f); return err; }