/** * \brief Sets the controller configuration data supplied by ConfigFile. * \param[in] ConfigFile, is SCONTROLLER_DETAILS structure * \param[in] Length , is INT * \return S_OK for success */ HRESULT CDIL_CAN_MHS::CAN_SetConfigData(PCHAR ConfigFile, INT Length) { (void)Length; SCONTROLLER_DETAILS* cntrl; char *str; //VALIDATE_VALUE_RETURN_VAL(sg_bCurrState, STATE_HW_INTERFACE_SELECTED, ERR_IMPROPER_STATE); cntrl = (SCONTROLLER_DETAILS*)ConfigFile; if (!str_has_char(cntrl[0].m_omStrBaudrate)) { sg_MhsCanCfg.CanSpeed = _tcstol(cntrl[0].m_omStrBaudrate, &str, 0); sg_MhsCanCfg.CanBtrValue = 0; } else { sg_MhsCanCfg.CanSpeed = 0; sg_MhsCanCfg.CanBtrValue = _tcstol(cntrl[0].m_omStrBTR0, &str, 0); } _tcscpy(sg_MhsCanCfg.CanSnrStr, cntrl[0].m_omHardwareDesc); // **** Übertragungsgeschwindigkeit einstellen if (sg_MhsCanCfg.CanSpeed) { if (CanSetSpeed(0, (uint16_t)sg_MhsCanCfg.CanSpeed) < 0) return(S_FALSE); } else { if (CanSetSpeedUser(0, sg_MhsCanCfg.CanBtrValue) < 0) return(S_FALSE); } return(S_OK); }
/** * \brief connects to the channels and initiates read thread. * \param void * \return S_OK for success, S_FALSE for failure */ HRESULT CDIL_CAN_MHS::CAN_StartHardware(void) { USES_CONVERSION; HRESULT hResult; char str[100]; //VALIDATE_VALUE_RETURN_VAL(sg_bCurrState, STATE_HW_INTERFACE_SELECTED, ERR_IMPROPER_STATE); if (!str_has_char(sg_MhsCanCfg.CanSnrStr)) sprintf(str, "Snr=%s", sg_MhsCanCfg.CanSnrStr); else str[0]='\0'; if (!CanDeviceOpen(0, str)) { (void)CanSetOptions("CanTxAckEnable=1"); // **** CAN Bus Start if (CanSetMode(0, OP_CAN_START, CAN_CMD_FIFOS_ERROR_CLEAR) >= 0) hResult = S_OK; else { hResult = S_FALSE; sg_pIlog->vLogAMessage(A2T(__FILE__), __LINE__, _T("could not start the controller in running mode")); } sg_bCurrState = STATE_CONNECTED; } else { //log the error for open port failure sg_pIlog->vLogAMessage(A2T(__FILE__), __LINE__, _T("error opening \"Tiny-CAN\" interface")); hResult = ERR_LOAD_HW_INTERFACE; } return(hResult); }
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); }
char *ft_strremove(char *s, char *rem_chars) { int i; int flag; if (!s) return (NULL); if (!rem_chars || !rem_chars[0]) return (s); i = 0; flag = 0; while (s[i + flag]) { while (s[i + flag] && str_has_char(rem_chars, s[i + flag])) ++flag; if ((s[i] = s[i + flag])) ++i; } s[i] = '\0'; return (s); }
/** * \brief Displays the controller configuration dialog. * \param[out] InitData, is SCONTROLLER_DETAILS structure * \param[out] Length , is INT * \return S_OK for success */ HRESULT CDIL_CAN_MHS::CAN_DisplayConfigDlg(PCHAR& InitData, INT& Length) { (void)Length; HRESULT result; struct TMhsCanCfg cfg; SCONTROLLER_DETAILS* cntrl; char *str; result = WARN_INITDAT_NCONFIRM; cntrl = (SCONTROLLER_DETAILS*)InitData; if (!str_has_char(cntrl[0].m_omStrBaudrate)) { cfg.CanSpeed = _tcstol(cntrl[0].m_omStrBaudrate, &str, 0); cfg.CanBtrValue = 0; } else { cfg.CanSpeed = 0; cfg.CanBtrValue = _tcstol(cntrl[0].m_omStrBTR0, &str, 0); } _tcscpy(cfg.CanSnrStr, cntrl[0].m_omHardwareDesc); if (ShowCanSetup(sg_hOwnerWnd, &cfg)) { _tcscpy(cntrl[0].m_omHardwareDesc, cfg.CanSnrStr); if (cfg.CanBtrValue) { cntrl[0].m_omStrBaudrate[0] = '\0'; _stprintf(cntrl[0].m_omStrBTR0, _T("%d"), cfg.CanBtrValue); } else { _stprintf(cntrl[0].m_omStrBaudrate, _T("%d"), cfg.CanSpeed); cntrl[0].m_omStrBTR0[0] = '\0'; } if ((result = CAN_SetConfigData(InitData, 1)) == S_OK) result = INFO_INITDAT_CONFIRM_CONFIG; } return(result); }
static AUO_RESULT set_keyframe_from_chapter(std::vector<int> *keyframe_list, const CONF_GUIEX *conf, const OUTPUT_INFO *oip, const PRM_ENC *pe, const SYSTEM_DATA *sys_dat) { AUO_RESULT ret = AUO_RESULT_SUCCESS; //mux設定がなければスキップ if (pe->muxer_to_be_used == MUXER_DISABLED) { //スキップ write_log_auo_line(LOG_INFO, "使用するmuxerが設定されていないため、チャプターからのキーフレーム検出は行いません。"); } else { //チャプターファイル名作成 char chap_file[MAX_PATH_LEN] = { 0 }; const MUXER_SETTINGS *mux_stg = &sys_dat->exstg->s_mux[(pe->muxer_to_be_used == MUXER_TC2MP4) ? MUXER_MP4 : pe->muxer_to_be_used]; const MUXER_CMD_EX *muxer_mode = &mux_stg->ex_cmd[get_mux_excmd_mode(conf, pe)]; strcpy_s(chap_file, _countof(chap_file), muxer_mode->chap_file); cmd_replace(chap_file, _countof(chap_file), pe, sys_dat, conf, oip); chapter_file chapter; if (!str_has_char(chap_file) || !PathFileExists(chap_file)) { write_log_auo_line(LOG_INFO, "チャプターファイルが存在しません。"); //チャプターリストを取得 } else if (AUO_CHAP_ERR_NONE != chapter.read_file(chap_file, CODE_PAGE_UNSET, 0.0)) { ret |= AUO_RESULT_ERROR; write_log_auo_line(LOG_WARNING, "チャプターファイルからチャプター設定を読み取れませんでした。"); //チャプターがない場合 } else if (0 == chapter.chapters.size()) { write_log_auo_line(LOG_WARNING, "チャプターファイルからチャプター設定を読み取れませんでした。"); } else { const double fps = oip->rate / (double)oip->scale; //QPファイルを出力 for (const auto& chap : chapter.chapters) { double chap_time_s = chap->get_ms() / 1000.0; int i_frame = (int)(chap_time_s * fps + 0.5); keyframe_list->push_back(i_frame); } write_log_auo_line_fmt(LOG_INFO, "チャプターファイルから %d箇所 キーフレーム設定を行いました。", chapter.chapters.size()); } } return ret; }
static AUO_RESULT check_amp(CONF_GUIEX *conf, const OUTPUT_INFO *oip, PRM_ENC *pe, const SYSTEM_DATA *sys_dat) { if (!(conf->x264.use_auto_npass && conf->x264.rc_mode == X264_RC_BITRATE) || !conf->vid.amp_check) return AUO_RESULT_SUCCESS; //上限確認付きcrfはここで抜ける //音声ファイルサイズ取得 double aud_bitrate = 0.0; const double duration = get_duration(conf, sys_dat, pe, oip); UINT64 aud_filesize = 0; if (oip->flag & OUTPUT_INFO_FLAG_AUDIO) { if (!str_has_char(pe->append.aud[0])) { //音声エンコがまだ終了していない info_amp_do_aud_enc_first(conf->vid.amp_check); return AUO_RESULT_ABORT; //音声エンコを先にやるべく、動画エンコを終了する } for (int i_aud = 0; i_aud < pe->aud_count; i_aud++) { char aud_file[MAX_PATH_LEN]; apply_appendix(aud_file, _countof(aud_file), pe->temp_filename, pe->append.aud[i_aud]); if (!PathFileExists(aud_file)) { error_no_aud_file(); return AUO_RESULT_ERROR; } UINT64 filesize_tmp = 0; if (!GetFileSizeUInt64(aud_file, &filesize_tmp)) { warning_failed_get_aud_size(); warning_amp_failed(); return AUO_RESULT_ERROR; } aud_filesize += filesize_tmp; } if ((conf->vid.amp_check & AMPLIMIT_FILE_SIZE) && aud_filesize >= conf->vid.amp_limit_file_size * 1024 * 1024) { error_amp_aud_too_big(AMPLIMIT_FILE_SIZE); return AUO_RESULT_ERROR; } aud_bitrate = aud_filesize * 8.0 / 1000.0 / duration; if ((conf->vid.amp_check & AMPLIMIT_BITRATE_UPPER) && aud_bitrate >= conf->vid.amp_limit_bitrate_upper) { error_amp_aud_too_big(AMPLIMIT_BITRATE_UPPER); return AUO_RESULT_ERROR; } } //目標ビットレートの計算 DWORD target_limit = NULL; //上限ファイルサイズと上限ビットレートどちらによる制限か double required_file_bitrate = DBL_MAX; //上限ファイルサイズのチェック if (conf->vid.amp_check & AMPLIMIT_FILE_SIZE) { required_file_bitrate = conf->vid.amp_limit_file_size*1024*1024 * 8.0/1000.0 / duration; //動画に割り振ることのできる最大ビットレート target_limit = AMPLIMIT_FILE_SIZE; } //上限ビットレートのチェック if ((conf->vid.amp_check & AMPLIMIT_BITRATE_UPPER) && required_file_bitrate > conf->vid.amp_limit_bitrate_upper) { required_file_bitrate = conf->vid.amp_limit_bitrate_upper; target_limit = AMPLIMIT_BITRATE_UPPER; } //下限ビットレートのチェック //上限設定と矛盾した場合は、上限設定を優先させる if ((conf->vid.amp_check & AMPLIMIT_BITRATE_LOWER) && required_file_bitrate < conf->vid.amp_limit_bitrate_lower) { warning_amp_bitrate_confliction((int)conf->vid.amp_limit_bitrate_lower, (int)required_file_bitrate); conf->vid.amp_check &= ~AMPLIMIT_BITRATE_LOWER; } const double required_vid_bitrate_upper = get_amp_margin_bitrate(required_file_bitrate - aud_bitrate, sys_dat->exstg->s_local.amp_bitrate_margin_multi); //あまりにも計算したビットレートが小さすぎたらエラーを出す if (required_vid_bitrate_upper <= 1.0) { error_amp_target_bitrate_too_small(target_limit); return AUO_RESULT_ERROR; } const int bitrate_vid_old = conf->x264.bitrate; //まず上限のほうをチェック、下限設定よりも優先させる //計算されたビットレートが目標ビットレートを上回っていたら、目標ビットレートを変更する //conf->x264.bitrate = -1は自動であるが、 //これをDWORDとして扱うことでUINT_MAX扱いとし、自動的に反映する if (required_vid_bitrate_upper < (double)((DWORD)conf->x264.bitrate)) { //下限のほうもぎりぎり超えないよう確認 const double limit_bitrate_lower = (conf->vid.amp_check & AMPLIMIT_BITRATE_LOWER) ? conf->vid.amp_limit_bitrate_lower - aud_bitrate : 0.0; conf->x264.bitrate = (int)((std::max)(required_vid_bitrate_upper, limit_bitrate_lower) + 0.5); } else { //あとから下限のほうもチェック const double required_vid_bitrate_lower = get_amp_margin_bitrate(conf->vid.amp_limit_bitrate_lower - aud_bitrate, (std::max)(-0.2, -4.0 * sys_dat->exstg->s_local.amp_bitrate_margin_multi)); if ((conf->vid.amp_check & AMPLIMIT_BITRATE_LOWER) && conf->x264.bitrate < required_vid_bitrate_lower) { //上限のほうもぎりぎり超えないよう確認 const double limit_bitrate_upper = (target_limit) ? required_file_bitrate - aud_bitrate : DBL_MAX; conf->x264.bitrate = (int)((std::min)(required_vid_bitrate_lower, limit_bitrate_upper) + 0.5); } } //ビットレートを変更したらメッセージ if (bitrate_vid_old != conf->x264.bitrate) { warning_amp_change_bitrate(bitrate_vid_old, conf->x264.bitrate, target_limit); } return AUO_RESULT_SUCCESS; }