static void build_command_line(struct ffmpeg_muxer *stream, struct dstr *cmd) { obs_encoder_t *vencoder = obs_output_get_video_encoder(stream->output); obs_encoder_t *aencoders[MAX_AUDIO_MIXES]; int num_tracks = 0; for (;;) { obs_encoder_t *aencoder = obs_output_get_audio_encoder( stream->output, num_tracks); if (!aencoder) break; aencoders[num_tracks] = aencoder; num_tracks++; } dstr_init_move_array(cmd, obs_module_file(FFMPEG_MUX)); dstr_insert_ch(cmd, 0, '\"'); dstr_cat(cmd, "\" \""); dstr_cat_dstr(cmd, &stream->path); dstr_catf(cmd, "\" %d %d ", vencoder ? 1 : 0, num_tracks); if (vencoder) add_video_encoder_params(stream, cmd, vencoder); if (num_tracks) { dstr_cat(cmd, "aac "); for (int i = 0; i < num_tracks; i++) { add_audio_encoder_params(cmd, aencoders[i]); } } }
/* returns %appdata%\[name] on windows */ char *os_get_config_path(const char *name) { char *ptr; wchar_t path_utf16[MAX_PATH]; struct dstr path; SHGetFolderPathW(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, path_utf16); os_wcs_to_utf8_ptr(path_utf16, 0, &ptr); dstr_init_move_array(&path, ptr); dstr_cat(&path, "\\"); dstr_cat(&path, name); return path.array; }
static char *os_get_path_ptr_internal(const char *name, int folder) { char *ptr; wchar_t path_utf16[MAX_PATH]; struct dstr path; SHGetFolderPathW(NULL, folder, NULL, SHGFP_TYPE_CURRENT, path_utf16); os_wcs_to_utf8_ptr(path_utf16, 0, &ptr); dstr_init_move_array(&path, ptr); dstr_cat(&path, "\\"); dstr_cat(&path, name); return path.array; }