void TpresetsPage::onReadFromFile(void) { int i=lvGetSelItem(IDC_LV_PRESETS); char_t presetFlnm[MAX_PATH]; _splitpath_s((*parent->localPresets)[i]->presetName, NULL, 0, NULL, 0, presetFlnm, countof(presetFlnm), NULL, 0); if (dlgGetFile(false,m_hwnd,_(-IDD_PRESETS,_l("Load ffdshow preset")),presetfilter,presetext,presetFlnm,_l("."),0)) { char_t presetName[MAX_PATH]; ff_strncpy(presetName,(*parent->localPresets)[i]->presetName,MAX_PATH); (*parent->localPresets)[i]->loadFile(presetFlnm); ff_strncpy((*parent->localPresets)[i]->presetName, presetName, countof((*parent->localPresets)[i]->presetName)); parent->selectPreset(presetName); cfg2dlg(); parent->setChange(); } }
const char_t* TinfoDec::TinfoValueDec::getVal0(bool &wasChange, bool &splitline) { switch (item->type) { case IDFF_OSDtype_encoderInfo: if (olds[0] == '\0') { char_t encoder[100] = _l("unknown"); deciD->getEncoderInfo(encoder, 100); tsnprintf_s(s, countof(s), _TRUNCATE, _l("%s"), encoder); wasChange = true; } return s; case IDFF_OSDtype_shortInfo: deciD->getShortDescription(s, 512); wasChange = strcmp(s, olds) != 0; splitline = true; return s; case IDFF_OSDtype_movieSource: ff_strncpy(s, deciD->getDecoderName(), countof(s)); wasChange = strcmp(s, olds) != 0; return s; case IDFF_OSDtype_bps: { int bps = deciD->getInputBitrate2(); tsprintf(s, bps == -1 ? _l("N/A") : _l("%i kbps"), bps); wasChange = true; return s; } case IDFF_OSDtype_activePresetName: { deciD->getActivePresetName(s, countof(s)); wasChange = strcmp(s, olds) != 0; return s; } default: return TinfoValueBase::getVal0(wasChange, splitline); } }
const char_t* TinfoBase::TinfoValueBase::getVal(bool &wasChange, bool &splitline) { splitline = false; const char_t *s = getVal0(wasChange, splitline); ff_strncpy(olds, s, countof(olds)); return s; }
bool TffdshowPageBase::translateTV() { if (page && tr->translateMode) { HTREEITEM hti = TreeView_GetDropHilight(htv); if (!hti) { hti = TreeView_GetSelection(htv); } ThtiPage *pages = hti2htiPage(hti); char_t newtrans[1024] = _l(""); for (TconfPages::const_iterator page = pages->begin(); page != pages->end(); page++) { const char_t *oldtrans = tr->translate((*page)->dialogId); if (oldtrans) { if (newtrans[0] == '\0') { ff_strncpy(newtrans, oldtrans, countof(newtrans)); if (!inputString(_l("Translate"), oldtrans, newtrans, 1024)) { break; } } tr->newTranslation((*page)->dialogId, 0, newtrans); } } translate(); return true; } return false; }
void Tpresets::savePreset(Tpreset *preset,const char_t *presetName) { if (presetName) { ff_strncpy(preset->presetName, presetName, countof(preset->presetName)); } preset->saveReg(); storePreset(preset); }
LRESULT TwindowWidget::onContextMenu(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { Twindow *self=window; if (self->tr->translateMode) { int id=(hwnd==self->m_hwnd)?-self->dialogId:Twindow::getId(hwnd); if (id!=-1) { const char_t *oldtrans=self->tr->translate(self->m_hwnd,self->dialogId,id,NULL); Twindow::TtranslateCbxs::const_iterator translateCbx=self->translateCbxs.find(id); int mode=-1; if (oldtrans && translateCbx!=self->translateCbxs.end()) { HMENU hmn=LoadMenu(self->hi,MAKEINTRESOURCE(IDR_MENU_TRANSLATE)),hmn2=GetSubMenu(hmn,0); RECT r; GetWindowRect(hwnd,&r); int cmd=TrackPopupMenu(hmn2,TPM_LEFTALIGN|TPM_TOPALIGN|TPM_RETURNCMD,r.left-1,r.bottom,0,hwnd,0); DestroyMenu(hmn); switch (cmd) { case ID_TRANSLATE_CONTROLCAPTION: mode=0; break; case ID_TRANSLATE_ASSOCIATEDSTRINGS: mode=1; break; } } else if (oldtrans) { mode=0; } else if (translateCbx!=self->translateCbxs.end()) { mode=1; } switch (mode) { case 0: { char_t newtrans[1024]; ff_strncpy(newtrans, Ttranslate::eolnString2file(oldtrans).c_str(), countof(newtrans)); if (self->inputString(_l("Translate"),oldtrans,newtrans,1024)) { self->tr->newTranslation(self->dialogId,id,Ttranslate::eolnFile2string(newtrans)); SetWindowText(hwnd,newtrans); } return TRUE; } case 1: { TdlgPropsEdit::TstringProps props; for (strings::const_iterator s=translateCbx->second.begin(); s!=translateCbx->second.end(); s++) { props.push_back(std::make_pair(Ttranslate::eolnString2file(*s),Ttranslate::eolnString2file(self->_(0,s->c_str(),false)))); } TdlgPropsEdit dlgProps(props,self->deci); if (dlgProps.execute(self->m_hwnd)) { for (TdlgPropsEdit::TstringProps::const_iterator p=props.begin(); p!=props.end(); p++) if (p->first!=p->second) { self->tr->newTranslation(Ttranslate::eolnFile2string(p->first),Ttranslate::eolnFile2string(p->second)); } self->translate(); } return TRUE; } } } } return Twidget::onContextMenu(hwnd,uMsg,wParam,lParam); }
TmuxerFile::TmuxerFile(IffdshowBase *Ideci): Tmuxer(Ideci) { const char_t *storeExtFlnm = deci->getParamStr2(IDFF_enc_storeExtFlnm); if (strchr(storeExtFlnm, '%')) { ff_strncpy(flnmmask, storeExtFlnm, countof(flnmmask)); f = NULL; } else { f = fopen(storeExtFlnm, _l("wb")); flnmmask[0] = '\0'; } }
HRESULT TimgFilterLogoaway::process(TfilterQueue::iterator it,TffPict &pict,const TfilterSettingsVideo *cfg0) { if (is(pict,cfg0)) { const TlogoawaySettings *cfg=(const TlogoawaySettings*)cfg0; init(pict,cfg->full,cfg->half); bool cspChanged; if (cfg->lumaonly) { cspChanged=getCurNext(FF_CSPS_MASK_YUV_PLANAR,pict,cfg->full,COPYMODE_DEF,&plane[0].dst,NULL,NULL,NULL); } else { cspChanged=getCurNext(FF_CSPS_MASK_YUV_PLANAR,pict,cfg->full,COPYMODE_DEF,&plane[0].dst,&plane[1].dst,&plane[2].dst,NULL); } if (cspChanged || logotemp.rectFull.dx!=(unsigned int)cfg->dx || logotemp.rectFull.dy!=(unsigned int)cfg->dy || !plane[0] || oldLumaOnly!=cfg->lumaonly || oldBlur!=cfg->blur || oldMode!=cfg->mode || stricmp(oldparambitmap,cfg->parambitmap)!=0) { oldLumaOnly=cfg->lumaonly; oldBlur=cfg->blur; oldMode=cfg->mode; ff_strncpy(oldparambitmap, cfg->parambitmap, countof(oldparambitmap)); done(); if (cfg->mode==TlogoawaySettings::MODE_SHAPEXY || cfg->mode==TlogoawaySettings::MODE_SHAPEUGLARM) { parambitmap=new TffPict(csp2,cfg->parambitmap,parambitmapbuf,deci); if (parambitmap->rectFull.dx!=(unsigned int)cfg->dx || parambitmap->rectFull.dy!=(unsigned int)cfg->dy) { delete parambitmap; parambitmap=NULL; } } for (int i=0; i<(cfg->lumaonly?1:3); i++) { plane[i].shiftX=pict.cspInfo.shiftX[i]; plane[i].shiftY=pict.cspInfo.shiftY[i]; plane[i].w=cfg->dx>>plane[i].shiftX; plane[i].h=cfg->dy>>plane[i].shiftY; if (parambitmap) { plane[i].parambitmapdata=parambitmap->data[i]; plane[i].parambitmapstride=parambitmap->stride[i]; } else { plane[i].parambitmapdata=NULL; plane[i].parambitmapstride=0; } plane[i].init(cfg); } } Trect tempR(cfg->x,cfg->y,cfg->dx,cfg->dy); logotemp.copyFrom(pict,logotempbuf,&tempR); YUVcolor yuv(cfg->solidcolor); for (int i=0; i<(cfg->lumaonly?1:3); i++) { plane[i].stride2=stride2[i]; plane[i].logotempdata=logotemp.data[i]; plane[i].logotempstride=logotemp.stride[i]; plane[i].solidcolor=(i==0?yuv.Y:(i==1?yuv.V+128:yuv.U+128)); plane[i].process(cfg); } }
void TffdshowPageDec::onApplyChanges(void) { deciD->saveKeysSettings(); deciD->saveRemoteSettings(); if (localPresets) { deciD->setPresets(localPresets); deciD->savePresets(); const wchar_t *src = cbxGetCurText(IDC_CBX_PRESETS); if (src) { ff_strncpy(oldActivePresetName, src, countof(oldActivePresetName)); } } }
STDMETHODIMP TffdshowEnc::getOutCodecString(char_t *buf, size_t buflen) { if (!buf) { return E_POINTER; } if (!enc) { return E_UNEXPECTED; } ff_strncpy(buf, enc->getName(), buflen); buf[buflen - 1] = '\0'; return S_OK; }
void Tpresets::nextUniqueName(char_t *presetName, size_t buflen) { iterator i=findPreset(presetName); if (i==end()) { return; } for (int ii=1;; ii++) { char_t pomS[MAX_PATH]; tsnprintf_s(pomS, countof(pomS), _TRUNCATE, _l("%s %i"),presetName,ii); if (findPreset(pomS)==end()) { ff_strncpy(presetName, pomS, buflen); return; } } }
const char_t* TffdshowVideoInputPin::findAutoSubflnm(IcheckSubtitle *checkSubtitle, const char_t *searchDir, const char_t *searchExt, bool heuristic) { if (IsConnected() == FALSE) { return _l(""); } const char_t *AVIname = getFileSourceName(); if (AVIname[0] == '\0') { return _l(""); } if (autosubflnm[0] == '\0' || oldSubHeuristic != heuristic || stricmp(oldSubSearchDir, searchDir) != 0) { oldSubHeuristic = heuristic; ff_strncpy(oldSubSearchDir, searchDir, countof(oldSubSearchDir)); TsubtitlesFile::findSubtitlesFile(AVIname, searchDir, searchExt, autosubflnm, MAX_PATH, heuristic, checkSubtitle); } return autosubflnm; }
//============================== Twinamp2 ==================================== Twinamp2::Twinamp2(const char_t *Iwinampdir) { ff_strncpy(winampdir, Iwinampdir, countof(winampdir)); strings files; char_t mask[MAX_PATH]; _makepath_s(mask, MAX_PATH, NULL, winampdir, _l("plugins\\dsp*"), _l("dll")); findFiles(mask, files); for (strings::const_iterator flnm = files.begin(); flnm != files.end(); flnm++) { DPRINTF(_l("Loading Winamp DSP plugin %s"), flnm->c_str()); Twinamp2dspDll *dsp = new Twinamp2dspDll(*flnm); if (!dsp->filters.empty()) { dsps.push_back(dsp); } else { delete dsp; } } }
void TffdshowPageBase::onHelp(void) { if (!page || !page->helpURL) { return; } char_t fullflnm[MAX_PATH]; bool internet = false; if (strlen(page->helpURL) > 6 && strncmp(page->helpURL, _l("http"), 4) == 0) { internet = true; const char_t *translatedURL = _(-1, page->helpURL); ff_strncpy(fullflnm, translatedURL, countof(fullflnm)); } else { _makepath_s(fullflnm, MAX_PATH, NULL, config->pth, _l("help\\"), NULL); strncat_s(fullflnm, countof(fullflnm), page->helpURL, _TRUNCATE); } if (internet || fileexists(fullflnm)) { ShellExecute(m_hwnd, _l("open"), fullflnm, NULL, _l("."), SW_SHOWNORMAL); } }
HMENU Twindow::_(HMENU hmn) { if (hmn) { int cnt=GetMenuItemCount(hmn); for (int i=0; i<cnt; i++) { MENUITEMINFO mii; memset(&mii,0,sizeof(mii)); mii.cbSize=sizeof(mii); mii.fMask=MIIM_STRING; char_t capt[256]; mii.dwTypeData=capt; mii.cch=255; GetMenuItemInfo(hmn,i,TRUE,&mii); ff_strncpy(mii.dwTypeData, _(-dialogId,mii.dwTypeData), countof(capt)); SetMenuItemInfo(hmn,i,TRUE,&mii); } } return hmn; }
const char_t* TinfoDecAudio::TinfoValueDecAudio::getVal0(bool &wasChange, bool &splitline) { switch (item->type) { case IDFF_OSDtype_outSpeakersConfig: deciA->getOutSpeakersDescr(s, 512, true); wasChange = strcmp(s, olds) != 0; return s; case IDFF_OSDtype_audioSampleFormat: { int sf; const char_t *sampleFormat = SUCCEEDED(deciA->currentSampleFormat(NULL, NULL, &sf)) ? TsampleFormat::descriptionPCM(sf) : _l("unknown"); ff_strncpy(s, sampleFormat, countof(s)); wasChange = oldSampleFormat != sampleFormat; oldSampleFormat = sampleFormat; return s; } case IDFF_OSDtype_sampleFrequency: { unsigned int freq; if (FAILED(deciA->currentSampleFormat(NULL, &freq, NULL))) { freq = 0; } wasChange = oldfreq != freq; oldfreq = freq; return _itoa(freq, s, 10); } case IDFF_OSDtype_nchannels: { unsigned int nchannels; if (FAILED(deciA->currentSampleFormat(&nchannels, NULL, NULL))) { nchannels = 0; } wasChange = oldnchannels != nchannels; oldnchannels = nchannels; return _itoa(nchannels, s, 10); } case IDFF_OSDtype_audioJitter: tsprintf(s, _l("%5i ms"), deciA->getJitter()); wasChange = true; return s; default: return TinfoValueDec::getVal0(wasChange, splitline); } }
bool TsubtitlesSettings::getTip(unsigned int pageId, char_t *buf, size_t len) { if (pageId == 1) { char_t tipS[256]; char_t horiz[256], vert[256]; getPosHoriz(posX, horiz, NULL, 0, countof(horiz)); getPosVert(posY, vert, NULL, 0, countof(vert)); tsnprintf_s(tipS, countof(tipS), _TRUNCATE, _l("%s, %s"), horiz, vert); if (delay != delayDef) { strncatf(tipS, countof(tipS), _l("\nDelay: %i ms"), delay); } if (speed != speedDef || speed2 != speedDef) { strncatf(tipS, countof(tipS), _l("\nSpeed: %i/%i"), speed, speed2); } ff_strncpy(buf, tipS, len); buf[len - 1] = '\0'; } else if (pageId == 2) { font.getTip(buf, len); } return true; }
Tpreset& Tpreset::operator =(const Tpreset &src) { if(this!=&src) { min_order=src.min_order; reg_child=src.reg_child; ff_strncpy(presetName, src.presetName, countof(presetName)); autoLoadedFromFile=src.autoLoadedFromFile; autoloadExtsNeedFix=src.autoloadExtsNeedFix; autoPresetItems=src.autoPresetItems; autoLoadLogic=src.autoLoadLogic; autoloadScreenSize=src.autoloadScreenSize; autoloadScreenSizeXmin=src.autoloadScreenSizeXmin; autoloadScreenSizeXmax=src.autoloadScreenSizeXmax; autoloadScreenSizeCond=src.autoloadScreenSizeCond; autoloadScreenSizeYmin=src.autoloadScreenSizeYmin; autoloadScreenSizeYmax=src.autoloadScreenSizeYmax; filters->copy(src.filters); } return *this; }
//================================ Tpreset ================================ Tpreset::Tpreset(const char_t *Ireg_child, const char_t *IpresetName, int Imin_order, int Ifiltermode): Toptions(options=new TintStrColl), reg_child(Ireg_child), min_order(Imin_order), filtermode(Ifiltermode), filters(new TfilterIDFFs(Imin_order)) { memset(presetName,0,sizeof(presetName)); ff_strncpy(presetName, IpresetName, countof(presetName)); autoLoadedFromFile=0; autoLoadLogic=0; static const TautoPresetItemDef autoPresetItems[]= { { _l("on movie file name match with preset name"),NULL, _l("autoloadFlnm"),0, NULL,NULL, &TautoPresetProps::presetNameMatch, &TautoPresetProps::getPresetName, }, { _l("on movie file name match (with wildcards)"),NULL, _l("autoloadExt"),0, _l("autoloadExts"),_l(""), &TautoPresetProps::wildcardmatch, &TautoPresetProps::getSourceNameExt }, { _l("on application exe file name match"),NULL, _l("autoloadExe"),0, _l("autoloadExes"),_l(""), &TautoPresetProps::wildcardmatch, &TautoPresetProps::getExeflnm, &TautoPresetProps::getExeItem, }, { _l("on volume name match"),NULL, _l("autoloadVolumeName"),0, _l("autoloadVolumeNames"),_l(""), &TautoPresetProps::wildcardmatch, &TautoPresetProps::getVolumeName, }, { _l("on volume serial match"),_l("Format: XXXX-YYYY"), _l("autoloadVolumeSerial"),0, _l("autoloadVolumeSerials"),_l(""), &TautoPresetProps::stricoll, &TautoPresetProps::getVolumeSerial, }, { _l("on decoder match"),NULL, _l("autoloadDecoder"),0, _l("autoloadDecoders"),_l(""), &TautoPresetProps::stricoll, &TautoPresetProps::getDecoder, &TautoPresetProps::getDecoderItem, }, { _l("on a DirectShow filter presence"),_l("Names of DirectShow filters, wildcard allowed"), _l("autoloadDSfilter"),0, _l("autoloadDSfilters"),_l(""), &TautoPresetProps::dsfilterMatch, &TautoPresetProps::getDSfilterName }, NULL }; addAutoPresetItems(autoPresetItems); static const TintOptionT<Tpreset> iopts[]= { IDFF_presetAutoloadLogic ,&Tpreset::autoLoadLogic ,0,0,_l(""),0, _l("autoLoadLogic"),0, IDFF_autoLoadedFromFile ,&Tpreset::autoLoadedFromFile ,0,0,_l(""),0, NULL,0, IDFF_presetAutoloadScreenSize ,&Tpreset::autoloadScreenSize ,0,0,_l(""),0, _l("autoloadScreenSize"),0, IDFF_presetAutoloadScreenSizeXmin,&Tpreset::autoloadScreenSizeXmin ,16,16384,_l(""),0, _l("autoloadScreenSizeXmin"),16, IDFF_presetAutoloadScreenSizeXmax,&Tpreset::autoloadScreenSizeXmax ,16,16384,_l(""),0, _l("autoloadScreenSizeXmax"),4096, IDFF_presetAutoloadScreenSizeCond,&Tpreset::autoloadScreenSizeCond ,0,1,_l(""),0, _l("autoloadScreenSizeCond"),1, IDFF_presetAutoloadScreenSizeYmin,&Tpreset::autoloadScreenSizeYmin ,16,16384,_l(""),0, _l("autoloadScreenSizeYmin"),16, IDFF_presetAutoloadScreenSizeYmax,&Tpreset::autoloadScreenSizeYmax ,16,16384,_l(""),0, _l("autoloadScreenSizeYmax"),4096, 0 }; addOptions(iopts); }
const char_t* TinfoDecVideo::TinfoValueDecVideo::getVal0(bool &wasChange, bool &splitline) { int percent; switch (item->type) { #ifdef OSDTIMETABALE case IDFF_OSDtype_timetable: tsprintf(s, _l("%3.2fms"), deciV->getOSDtime() / 10000.0); wasChange = true; return s; #endif case IDFF_OSDtype_TimeOnffdshow: percent = deciV->get_time_on_ffdshow_percent(); if (percent < 0 || percent > 300) { tsprintf(s, _l("%3dms (N/A )"), deciV->get_time_on_ffdshow()); } else { tsprintf(s, _l("%3dms (%3d%%)"), deciV->get_time_on_ffdshow(), percent); } wasChange = true; return s; case IDFF_OSDtype_inputSize: return getInputSize(s, wasChange); case IDFF_OSDtype_inputAspect: return getInputAspect(s, wasChange, countof(s)); case IDFF_OSDtype_inputSizeAspect: { bool wasChangeSize = false; getInputSize(sizeStr, wasChangeSize); bool wasChangeAspect = false; getInputAspect(aspectStr, wasChangeAspect, countof(aspectStr)); if (wasChange = (wasChangeSize || wasChangeAspect)) { tsnprintf_s(s, countof(s), _TRUNCATE, _l("%s, %s"), sizeStr, aspectStr); } return s; } case IDFF_OSDtype_meanQuant: { char_t news[60]; float q; if (deciV->calcMeanQuant(&q) == S_OK && q > 0) { tsprintf(news, _l("%-5.2f"), q); } else { ff_strncpy(news, _l("not available"), countof(news)); } if (strcmp(news, olds) != 0) { ff_strncpy(s, news, countof(s)); wasChange = true; } return s; } case IDFF_OSDtype_outputFOURCC: deciV->getOutputFourcc(s, 50); wasChange = strcmp(s, olds) != 0; return s; case IDFF_OSDtype_currentFrameTime: { int val; if (SUCCEEDED(deciV->getCurrentFrameTime((unsigned int*)&val))) { tsprintf(s, _l("%02i:%02i:%02i"), val / 3600, (val / 60) % 60, val % 60); wasChange = true; } else { strcpy(s, _l("failed")); wasChange = false; } return s; } case IDFF_OSDtype_remainingFrameTime: { int val; if (SUCCEEDED(deciV->getRemainingFrameTime((unsigned int*)&val))) { tsprintf(s, _l("%02i:%02i:%02i"), val / 3600, (val / 60) % 60, val % 60); wasChange = true; } else { strcpy(s, _l("failed")); wasChange = false; } return s; } case IDFF_OSDtype_accurDeblock: if (olds[0] == '\0') { tsprintf(s, deciV->quantsAvailable() == S_OK ? _l("yes") : _l("no")); wasChange = true; } return s; case IDFF_OSDtype_inputFPS: { unsigned int fps1000; if (deciV->getAVIfps(&fps1000) != S_OK) { s[0] = '\0'; } else { tsprintf(s, _l("%-7.3f"), float(fps1000 / 1000.0)); } wasChange = strcmp(s, olds) != 0; return s; } case IDFF_OSDtype_inputFOURCC: { fourcc2str(deciV->getMovieFOURCC(), s, countof(s)); wasChange = strcmp(s, olds) != 0; return s; } case IDFF_OSDtype_QueueCount: { int val = deciV->getQueuedCount(); wasChange = true; if (val >= 0) { tsprintf(s, _l("%2d"), val); } else { val = -1 * val; switch (val) { case IDD_QUEUEMSG_1: case IDD_QUEUEMSG_2: case IDD_QUEUEMSG_3: case IDD_QUEUEMSG_4: case IDD_QUEUEMSG_5: case IDD_QUEUEMSG_6: case IDD_QUEUEMSG_7: ff_strncpy(s, trans->translate(val), countof(s)); break; case IDD_QUEUEMSG_8: { int late = (int)((-1) * deciV->getLate() / 10000); tsnprintf_s(s, countof(s), _TRUNCATE, _l("%s %4dms"), trans->translate(val), late > 0 ? late : 0); } } } return s; } case IDFF_OSDtype_Late: { int late = (int)deciV->getLate() / 10000; tsprintf(s, _l("%7dms"), late > 0 ? late : 0); wasChange = true; return s; } case IDFF_OSDtype_idct: { const char *idct0 = deciV->get_current_idct(); if (idct0) { text<char_t> idct(idct0); ff_strncpy(s, (const char_t*)idct, countof(s)); } else { tsprintf(s, _l("unknown")); } return s; } case IDFF_OSDtype_AviSynth_Info: { const char *info0 = deciV->getAviSynthInfo(); if (info0) { text<char_t> info(info0); ff_strncpy(s, (const char_t*)info, countof(s)); } else { tsprintf(s, _l("unavailable")); } wasChange = true; return s; } default: return TinfoValueDec::getVal0(wasChange, splitline); } }
void TaudioCodecLibDTS::getInputDescr1(char_t *buf, size_t buflen) const { ff_strncpy(buf, _l("DTS"), buflen); buf[buflen - 1] = '\0'; }
void TsubtitlesFile::findSubtitlesFile(const char_t *aviFlnm, const char_t *sdir, const char_t *sext, char_t *subFlnm, size_t buflen, int heuristic, IcheckSubtitle *checkSubtitle) { if (!subFlnm) { return; } if (heuristic) { char_t aviDsk[MAX_PATH], aviDir[MAX_PATH], aviName[MAX_PATH]; _splitpath_s(aviFlnm, aviDsk, countof(aviDsk), aviDir, countof(aviDir), aviName, countof(aviName), NULL, 0); char_t aviDskDirName[MAX_PATH]; _makepath_s(aviDskDirName, countof(aviDskDirName), aviDsk, aviDir, aviName, NULL); strings subfiles; findPossibleSubtitles(aviFlnm, sdir, subfiles); int mindist = INT_MAX; EditDistance dist; strings::const_iterator s = subfiles.end(); typedef std::vector< std::pair<int, ffstring> > TsubsDists; TsubsDists subdists; for (strings::const_iterator sf = subfiles.begin(); sf != subfiles.end(); sf++) { char_t sfDsk[MAX_PATH], sfDir[MAX_PATH], sfName[MAX_PATH]; _splitpath_s(sf->c_str(), sfDsk, countof(sfDsk), sfDir, countof(sfDir), sfName, countof(sfName), NULL, 0); char_t sfDskDirName[MAX_PATH]; _makepath_s(sfDskDirName, countof(sfDskDirName), sfDsk, sfDir, sfName, NULL); int newdist = dist.CalEditDistance(aviDskDirName, sfDskDirName, 2 * MAX_PATH); if (!checkSubtitle) { if (newdist < mindist) { s = sf; mindist = newdist; if (mindist == 0) { break; } } } else { subdists.push_back(std::make_pair(newdist, *sf)); } } if (!checkSubtitle) { if (s != subfiles.end()) { ff_strncpy(subFlnm, s->c_str(), buflen); return; } } else { std::stable_sort(subdists.begin(), subdists.end()); for (TsubsDists::const_iterator sd = subdists.begin(); sd != subdists.end(); sd++) if (checkSubtitle->checkSubtitle(sd->second.c_str())) { ff_strncpy(subFlnm, sd->second.c_str(), buflen); return; } } } else { char_t dsk[MAX_PATH], dir[MAX_PATH], name[MAX_PATH], ext[MAX_PATH]; _splitpath_s(aviFlnm, dsk, countof(dsk), dir, countof(dir), name, countof(name), ext, countof(ext)); char_t fname[MAX_PATH]; _makepath_s(fname, countof(fname), NULL, NULL, name, ext); //fname - movie file name with extension (without path) if (name[0]) { char_t path[MAX_PATH]; _makepath_s(path, countof(path), dsk, dir, NULL, NULL); //path - directory where movie is stored strings dirs; strtok(sdir, _l(";"), dirs); fixRelativePaths(dirs, path); //exact match (only extension differs) for (strings::const_iterator d = dirs.begin(); d != dirs.end(); d++) { if (d->empty()) { continue; } char_t subFlnm0[MAX_PATH]; //sub_extsfind(d->c_str(),name,subFlnm0); strings etensions; strtok(sext, _l(";"), etensions); for (strings::const_iterator e = etensions.begin(); e != etensions.end(); e++) { _makepath_s(subFlnm0, countof(subFlnm0), NULL, d->c_str(), name, e->c_str()); if (fileexists(subFlnm0) && (!checkSubtitle || checkSubtitle->checkSubtitle(subFlnm0))) { ff_strncpy(subFlnm, subFlnm0, buflen); return; } } } //movie.avi -> movie en.txt, movie.en.sub,.... for (strings::const_iterator d = dirs.begin(); d != dirs.end(); d++) { _makepath_s(fname, MAX_PATH, NULL, d->c_str(), name, NULL); strncat_s(fname, countof(fname), _l("*"), _TRUNCATE); //fname - c:\movies\movie*.* strings files; findFiles(fname, files); for (strings::const_iterator f = files.begin(); f != files.end(); f++) { ffstring ext; extractfileext(f->c_str(), ext); ext.ConvertToLowerCase(); strings etensions; strtok(sext, _l(";"), etensions); for (strings::const_iterator e = etensions.begin(); e != etensions.end(); e++) if (ext == *e && (!checkSubtitle || checkSubtitle->checkSubtitle(f->c_str()))) { ff_strncpy(subFlnm, f->c_str(), buflen); subFlnm[buflen - 1] = '\0'; return; } } } } } subFlnm[0] = '\0'; }
bool TsubtitlesFile::init(const TsubtitlesSettings *cfg, const char_t *IsubFlnm, double Ifps, bool watch, int checkOnly) { if (!cfg->is || !cfg->isSubFiles) { DPRINTF(_l("TsubtitlesFile::init subtitles files disabled is(%d), isSubFiles(%d)"), cfg->is, cfg->isSubFiles); return false; } if (!IsubFlnm || (checkOnly == 2 || stricmp(subFlnm, IsubFlnm) != 0)) { ff_strncpy(subFlnm, IsubFlnm ? IsubFlnm : _l(""), countof(subFlnm)); } if (checkOnly < 2) { fps = Ifps; done(); } if (subFlnm[0] == '\0') { return false; } if (f != NULL) { fclose(f); f = NULL; } f = fopen(subFlnm, _l("rb")); if (!f) { return false; } fs = TstreamFile(f, TfontSettings::GDI_charset_to_code_page(deci->getParam2(IDFF_fontCharset))); sub_format = Tsubreader::sub_autodetect(fs, ffcfg); if (sub_format != Tsubreader::SUB_INVALID && checkOnly != 2) { fs.rewind(); if ((sub_format & Tsubreader::SUB_FORMATMASK) == Tsubreader::SUB_PGS) { if (!cfg->pgs) { DPRINTF(_l("TsubtitlesFile::init Blu-Ray subtitles detected but disabled by user")); return false; } DPRINTF(_l("TsubtitlesFile::init Blu-Ray subtitles detected")); subs = new TsubreaderPGS(deci, fs, fps, cfg, ffcfg); } else if ((sub_format & Tsubreader::SUB_FORMATMASK) == Tsubreader::SUB_VOBSUB) { if (cfg->vobsub) { subs = new TsubreaderVobsub(fs,subFlnm,deci); int deflang = subs->findlang(cfg->deflang); if (deflang == 0) { deflang = subs->findlang(cfg->deflang2); } subs->setLang(deflang); } } else { if ((sub_format & Tsubreader::SUB_FORMATMASK) == Tsubreader::SUB_SSA && !deci->getParam2(IDFF_subSSA)) { DPRINTF(_l("TsubtitlesFile::init SSA subtitles detected but disabled by user")); return false; } if (((sub_format & Tsubreader::SUB_FORMATMASK) == Tsubreader::SUB_SUBVIEWER || (sub_format & Tsubreader::SUB_FORMATMASK) == Tsubreader::SUB_SUBVIEWER2) && !cfg->isSubText) { DPRINTF(_l("TsubtitlesFile::init text subtitles detected but disabled by user")); return false; } DPRINTF(_l("TsubtitlesFile::init text subtitles detected")); subs = new TsubreaderMplayer(fs, sub_format, fps, cfg, ffcfg, false); } } // Keep the file descriptor opened if SUB_KEEP_FILE_OPENED flag is present if ((sub_format & Tsubreader::SUB_KEEP_FILE_OPENED) == 0) { fclose(f); f = NULL; } if (checkOnly == 2) { return sub_format != Tsubreader::SUB_INVALID; } // We can have empty subtitles if the file is read progressively if (!subs || (subs->empty() && ((sub_format & Tsubreader::SUB_KEEP_FILE_OPENED) == 0))) { if (subs) { delete subs; } subs = NULL; subFlnm[0] = '\0'; return false; } if (!checkOnly) { //subs->adjust_subs_time(6.0); Tsubtitles::init(); ffstring subPath; extractfilepath(subFlnm, subPath); if (watch) { hwatch = FindFirstChangeNotification(subPath.c_str(), FALSE, FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_SIZE); lastwritetime = fileLastWriteTime(subFlnm); } } return true; }
//============================= TinfoBase::TinfoValueBase ============================= const char_t* TinfoBase::TinfoValueBase::getVal0(bool &wasChange, bool &splitline) { switch (item->type) { case IDFF_OSDtype_cpuUsage: { int usage = deci->getCpuUsage2(); if (usage < 0) { usage = 0; } tsprintf(s, _l("%i%%"), usage); wasChange = true; return s; } case IDFF_OSDtype_systemTime: { char_t news[50]; char_t t[20]; tsnprintf_s(news, countof(news), _TRUNCATE, _l("%s"), _strtime(t)); if (strcmp(news, s) != 0) { ff_strncpy(s, news, countof(s)); wasChange = true; } return s; } case IDFF_OSDtype_movieTime: { int val = deci->getParam2(IDFF_movieDuration); char_t news[256]; tsprintf(news, _l("%02i:%02i:%02i"), val / 3600, (val / 60) % 60, val % 60); if (strcmp(news, s) != 0) { ff_strncpy(s, news, countof(s)); wasChange = true; } return s; } case IDFF_OSDtype_sourceFlnm: { ff_strncpy(s, deci->getSourceName(), countof(s)); wasChange = strcmp(s, olds) != 0; return s; } case IDFF_OSDtype_sourceFlnmWOpath: { const char_t *flnm = deci->getSourceName(); const char_t *pathend = strrchr(flnm, _l('\\')); if (!pathend) { pathend = strrchr(flnm, _l('/')); } ff_strncpy(s, pathend ? pathend + 1 : flnm, countof(s)); wasChange = strcmp(s, olds) != 0; return s; } case IDFF_OSDtype_inCodecString: { deci->getInCodecString(s, countof(s)); wasChange = strcmp(s, olds) != 0; return s; } case IDFF_OSDtype_outCodecString: { deci->getOutCodecString(s, countof(s)); wasChange = strcmp(s, olds) != 0; return s; } case IDFF_OSDtype_exeflnm: { ff_strncpy(s, deci->getExeflnm(), countof(s)); wasChange = strcmp(s, olds) != 0; return s; } default: { int val; HRESULT res = deci->getParam(item->type, &val); if (res == S_OK && (olds[0] == '\0' || val != oldVal)) { oldVal = val; switch (item->type) { case IDFF_decodingFps: tsprintf(s, _l("%5.2f"), float(val / 1000.0)); break; // case IDFF_AVIcolorspace: // csp_getName(val,s,countof(s)); // break; default: tsnprintf_s(s, countof(s), _TRUNCATE, _l("%i"), val); } wasChange = true; } return s; } } }
void Tpreset::loadDefault(void) { ff_strncpy(presetName, FFPRESET_DEFAULT, countof(presetName)); loadReg(); }
INT_PTR TffdshowPageDec::msgProc(UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_CBX_PRESETS: if (HIWORD(wParam) == CBN_SELCHANGE) { char_t presetName[256], actPresetName[256]; GetDlgItemText(m_hwnd, IDC_CBX_PRESETS, presetName, 255); deciD->getActivePresetName(actPresetName, 255); if (stricmp(presetName, actPresetName) != 0) { selectPreset(presetName); } return TRUE; } break; } break; case WM_FFONNEWFILTERS: { for (ThtiPages::const_iterator hp = filterPages.begin(); hp != filterPages.end(); hp++) for (TconfPages::const_iterator i = (*hp)->begin(); i != (*hp)->end(); i++) { ((TconfPageDec*)(*i))->onNewFilter(); } return TRUE; } case WM_NOTIFY: { NMHDR *nmhdr = LPNMHDR(lParam); if (nmhdr->hwndFrom == htv && nmhdr->idFrom == IDC_TV_TREE) switch (nmhdr->code) { case TVN_GETINFOTIP: { if (!cfgGet(IDFF_showHints)) { return FALSE; } NMTVGETINFOTIP *nmtvit = LPNMTVGETINFOTIP(lParam); TconfPageBase *page = hti2page(nmtvit->hItem); char_t tipS[1024] = _l(""); if (deciD->getFilterTipEx(page->filterID, page->filterPageID, tipS, 1023) != S_OK) { page->getTip(tipS, 1023); } if (tipS[0] == '\0') { return FALSE; } memset(nmtvit->pszText, 0, nmtvit->cchTextMax); ff_strncpy(nmtvit->pszText, tipS, nmtvit->cchTextMax - 1); return TRUE; } case NM_CUSTOMDRAW: { NMTVCUSTOMDRAW *tvcd = LPNMTVCUSTOMDRAW(lParam); int rcDy = tvcd->nmcd.rc.bottom - tvcd->nmcd.rc.top; if (tvcd->nmcd.dwDrawStage == CDDS_PREPAINT) { setDlgResult(CDRF_NOTIFYITEMDRAW); return TRUE; } else if (tvcd->nmcd.dwDrawStage == CDDS_ITEMPREPAINT) { TconfPageBase *page = ((ThtiPage*)tvcd->nmcd.lItemlParam)->getPage(); if (page->getInter() == -1 && page->getOrder() == -1) { return FALSE; } setDlgResult(CDRF_NOTIFYPOSTPAINT); return TRUE; } else if (tvcd->nmcd.dwDrawStage == CDDS_ITEMPOSTPAINT) { RECT &tr = tvcd->nmcd.rc; if (tr.right > tr.left && tr.bottom > tr.top) { RECT rr; TreeView_GetItemRect(htv, HTREEITEM(tvcd->nmcd.dwItemSpec), &rr, true); rr.left -= 24; TconfPageBase *page = ((ThtiPage*)tvcd->nmcd.lItemlParam)->getPage(); if (page->getInter() != -1) { ImageList_Draw(hil, page->getInter() ? ilChecked : ilClear, tvcd->nmcd.hdc, tr.left + 8 + rr.left, tr.top + (rcDy - 16) / 2, ILD_TRANSPARENT); } if (isIn(page->getOrder(), deciD->getMinOrder2(), deciD->getMaxOrder2()) && (tvcd->nmcd.uItemState & CDIS_SELECTED)) { int img; HTREEITEM hti = page->hti; HTREEITEM htiPrev = TreeView_GetPrevVisible(htv, hti), htiNext = TreeView_GetNextVisible(htv, hti); int order = page->getOrder(), orderPrev = hti2page(htiPrev)->getOrder(), orderNext = hti2page(htiNext)->getOrder(); if (order == deciD->getMinOrder2()) { img = ilArrowD; } else if (order == deciD->getMaxOrder2()) { img = ilArrowU; } else { img = ilArrowUD; } ImageList_DrawEx(hil, img, tvcd->nmcd.hdc, tr.left + 2 + rr.left, tr.top + (rcDy - 16) / 2, 5, 16, CLR_DEFAULT, CLR_DEFAULT, ILD_TRANSPARENT); } } return TRUE; } return FALSE; } case NM_CLICK: { POINT ps; GetCursorPos(&ps); ScreenToClient(htv, &ps); TVHITTESTINFO tvhti; tvhti.pt = ps; HTREEITEM hti = TreeView_HitTest(htv, &tvhti); if (!hti) { return FALSE; } RECT rr; TreeView_GetItemRect(htv, hti, &rr, TRUE); RECT r; TreeView_GetItemRect(htv, hti, &r, FALSE); ps.x -= rr.left - 24; int iconTop = ((r.bottom - r.top) - 16) / 2; ps.y -= r.top; if (ps.x >= 8 && ps.x <= 16 + 8 && ps.y >= iconTop + 2 && ps.y <= iconTop + 13) { if (invInter(hti2page(hti), &r)) { return TRUE; } } else if (ps.x >= 2 && ps.x <= 7 && TreeView_GetSelection(htv) == tvhti.hItem) { int center = (r.bottom - r.top) / 2; if (ps.y > center - 6 && ps.y < center - 1 && page->getOrder() > deciD->getMinOrder2()) { swap(-1); return TRUE; } else if (ps.y > center + 1 && ps.y < center + 6 && page->getOrder() < deciD->getMaxOrder2()) { swap(1); return TRUE; } } return FALSE; } case TVN_BEGINDRAG: { NMTREEVIEW *nmtv = LPNMTREEVIEW(lParam); dragpage = hti2page(nmtv->itemNew.hItem); int order = dragpage->getOrder(); TreeView_SelectItem(htv, nmtv->itemNew.hItem); if (isIn(order, deciD->getMinOrder2(), deciD->getMaxOrder2())) { SetCapture(m_hwnd); } else { dragpage = NULL; } break; } } break; } case WM_MOUSEMOVE: if (dragpage) { TVHITTESTINFO tvhti; tvhti.pt.x = LOWORD(lParam) - tvx; tvhti.pt.y = HIWORD(lParam) - tvy; if (HTREEITEM htiTarget = TreeView_HitTest(htv, &tvhti)) { //TreeView_SelectDropTarget(htv,htiTarget); TconfPageBase *targetpage = hti2page(htiTarget); if (isIn(targetpage->getOrder(), deciD->getMinOrder2(), deciD->getMaxOrder2())) { swap(dragpage, targetpage); } } return TRUE; } break; case WM_LBUTTONUP: if (dragpage) { dragpage = NULL; ReleaseCapture(); return TRUE; } break; } return TffdshowPageBase::msgProc(uMsg, wParam, lParam); }
const char_t* TconfPageBase::dialogName(void) { const char_t *name=tr->translate(dialogId); ff_strncpy(dialogNameRes, name, countof(dialogNameRes)); return dialogNameRes; }
INT_PTR TcodecsPage::msgProc(UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_DESTROY: cfgSet(IDFF_lvCodecsWidth0,ListView_GetColumnWidth(hlv,0)); cfgSet(IDFF_lvCodecsWidth1,ListView_GetColumnWidth(hlv,1)); cfgSet(IDFF_lvCodecsWidth2,ListView_GetColumnWidth(hlv,2)); cfgSet(IDFF_lvCodecsSelected,lvGetSelItem(IDC_LV_INCODECS)); break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_CBX_INCODECS: if (HIWORD(wParam)==CBN_SELCHANGE && IsWindowVisible(hcbx)) { int ii=lvGetSelItem(IDC_LV_INCODECS); int idff=formats[ii].idff; cfgSet(idff,(int)cbxGetCurItemData(IDC_CBX_INCODECS)); options2dlg(ii); return TRUE; } break; case IDC_CHB_CODEC_OPT1: case IDC_CHB_CODEC_OPT2: case IDC_CHB_CODEC_OPT3: case IDC_CHB_CODEC_OPT4: dlg2options(LOWORD(wParam)); return TRUE; } break; case WM_NOTIFY: { NMHDR *nmhdr=LPNMHDR(lParam); if (nmhdr->hwndFrom==hlv && nmhdr->idFrom==IDC_LV_INCODECS) switch (nmhdr->code) { case LVN_GETDISPINFO: { NMLVDISPINFO *nmdi=(NMLVDISPINFO*)lParam; int i=nmdi->item.iItem; if (i==-1) { break; } if (nmdi->item.mask&LVIF_TEXT) switch (nmdi->item.iSubItem) { case 0: strcpy(nmdi->item.pszText,_(IDC_LV_INCODECS,formats[i].descr)); break; case 1: strcpy(nmdi->item.pszText,_(IDC_LV_INCODECS,formats[i].getDecoderName(cfgGet(formats[i].idff)))); break; case 2: strcpy(nmdi->item.pszText,_(IDC_LV_INCODECS,formats[i].hint)); break; } return TRUE; } case LVN_GETINFOTIP: { NMLVGETINFOTIP *nmit=(NMLVGETINFOTIP*)lParam; if (nmit->iItem!=-1 && nmit->iSubItem==0) { ff_strncpy(nmit->pszText,formats[nmit->iItem].hint,nmit->cchTextMax); } return TRUE; } case LVN_ITEMCHANGED: { NMLISTVIEW *nmlv=LPNMLISTVIEW(lParam); if (nmlv->iItem!=curitem) { curitem=-1; show(false,IDC_CBX_INCODECS); options2dlg(nmlv->iItem); } return TRUE; } case NM_CLICK: { NMITEMACTIVATE *nmia=LPNMITEMACTIVATE(lParam); if (nmia->iItem!=-1 && nmia->iSubItem==1) { beginCodecChange(nmia->iItem); } else { show(false,IDC_CBX_INCODECS); } return TRUE; } } break; } } return TconfPageBase::msgProc(uMsg,wParam,lParam); }