int guiEx_config::save_x264guiEx_conf(const CONF_GUIEX *conf, const char *stg_file) { CONF_GUIEX save_conf; memcpy(&save_conf, conf, sizeof(CONF_GUIEX)); ZeroMemory(&save_conf.block_count, sizeof(save_conf.block_count)); //展開したコマンドライン char cmd_all[MAX_CMD_LEN] = { 0 }; build_cmd_from_conf(cmd_all, sizeof(cmd_all), &conf->x264, &conf->vid, TRUE); DWORD cmd_all_len = strlen(cmd_all) + 1; //設定ファイルのブロックごとの大きさを書き込み sprintf_s(save_conf.conf_name, sizeof(save_conf.conf_name), CONF_NAME); save_conf.size_all = sizeof(CONF_GUIEX) + cmd_all_len; save_conf.head_size = CONF_HEAD_SIZE; save_conf.block_count = CONF_BLOCK_COUNT; for (int i = 0; i < CONF_BLOCK_COUNT; ++i) { save_conf.block_size[i] = conf_block_data[i]; save_conf.block_head_p[i] = conf_block_pointer[i]; } //最後に展開したコマンドラインを追加する save_conf.block_size[CONF_BLOCK_COUNT] = cmd_all_len; save_conf.block_head_p[CONF_BLOCK_COUNT] = sizeof(CONF_GUIEX); //ファイルへ書きこみ FILE *fp = NULL; if (fopen_s(&fp, stg_file, "wb") != NULL) return CONF_ERROR_FILE_OPEN; fwrite(&save_conf, sizeof(CONF_GUIEX), 1, fp); fwrite(cmd_all, cmd_all_len, 1, fp); fclose(fp); return 0; }
static void build_full_cmd(char *cmd, size_t nSize, const CONF_GUIEX *conf, const OUTPUT_INFO *oip, const PRM_ENC *pe, const SYSTEM_DATA *sys_dat, const char *input) { CONF_GUIEX prm; //パラメータをコピー memcpy(&prm, conf, sizeof(CONF_GUIEX)); //共通置換を実行 cmd_replace(prm.vid.cmdex, sizeof(prm.vid.cmdex), pe, sys_dat, conf, oip); cmd_replace(prm.vid.stats, sizeof(prm.vid.stats), pe, sys_dat, conf, oip); cmd_replace(prm.vid.tcfile_in, sizeof(prm.vid.tcfile_in), pe, sys_dat, conf, oip); cmd_replace(prm.vid.cqmfile, sizeof(prm.vid.cqmfile), pe, sys_dat, conf, oip); if (!prm.oth.disable_guicmd) { //cliモードでない //自動設定の適用 apply_guiEx_auto_settings(&prm.x264, oip->w, oip->h, oip->rate, oip->scale, sys_dat->exstg->s_local.auto_ref_limit_by_level); //GUI部のコマンドライン生成 build_cmd_from_conf(cmd, nSize, &prm.x264, &prm.vid, FALSE); } //cmdexのうち、読み取られなかったコマンドを追加する if (str_has_char(prm.vid.cmdex)) append_cmdex(cmd, nSize, prm.vid.cmdex, prm.oth.disable_guicmd, conf); //メッセージの発行 if ((conf->x264.vbv_bufsize != 0 || conf->x264.vbv_maxrate != 0) && prm.vid.afs) write_log_auo_line(LOG_INFO, "自動フィールドシフト使用時はvbv設定は正確に反映されません。"); //キーフレーム検出を行い、そのQPファイルが存在し、かつ--qpfileの指定がなければ、それをqpfileで読み込む char auoqpfile[MAX_PATH_LEN]; apply_appendix(auoqpfile, _countof(auoqpfile), pe->temp_filename, pe->append.qp); BOOL disable_keyframe_afs = conf->vid.afs && !sys_dat->exstg->s_local.set_keyframe_as_afs_24fps; if (prm.vid.check_keyframe && !disable_keyframe_afs && PathFileExists(auoqpfile) && strstr(cmd, "--qpfile") == NULL) sprintf_s(cmd + strlen(cmd), nSize - strlen(cmd), " --qpfile \"%s\"", auoqpfile); //1pass目でafsでない、--framesがなければ--framesを指定 if ((!prm.vid.afs || pe->current_x264_pass > 1) && strstr(cmd, "--frames") == NULL) sprintf_s(cmd + strlen(cmd), nSize - strlen(cmd), " --frames %d", oip->n - pe->drop_count + pe->delay_cut_additional_vframe); //解像度情報追加(--input-res) if (strcmp(input, PIPE_FN) == NULL) sprintf_s(cmd + strlen(cmd), nSize - strlen(cmd), " --input-res %dx%d", oip->w, oip->h); //rawの形式情報追加 sprintf_s(cmd + strlen(cmd), nSize - strlen(cmd), " --input-csp %s", specify_input_csp(prm.x264.output_csp)); //fps//tcfile-inが指定されていた場合、fpsの自動付加を停止] if (!prm.x264.use_tcfilein && strstr(cmd, "--tcfile-in") == NULL) { int gcd = get_gcd(oip->rate, oip->scale); sprintf_s(cmd + strlen(cmd), nSize - strlen(cmd), " --fps %d/%d", oip->rate / gcd, oip->scale / gcd); } //出力ファイル const char * const outfile = (prm.x264.nul_out) ? "nul" : pe->temp_filename; sprintf_s(cmd + strlen(cmd), nSize - strlen(cmd), " -o \"%s\"", outfile); //入力 sprintf_s(cmd + strlen(cmd), nSize - strlen(cmd), " \"%s\"", input); }