Beispiel #1
0
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();
    }
}
Beispiel #2
0
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);
    }
}
Beispiel #3
0
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;
}
Beispiel #4
0
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;
}
Beispiel #5
0
void Tpresets::savePreset(Tpreset *preset,const char_t *presetName)
{
    if (presetName) {
        ff_strncpy(preset->presetName, presetName, countof(preset->presetName));
    }
    preset->saveReg();
    storePreset(preset);
}
Beispiel #6
0
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);
}
Beispiel #7
0
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);
        }
    }
Beispiel #9
0
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));
        }
    }
}
Beispiel #10
0
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;
}
Beispiel #11
0
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;
}
Beispiel #13
0
//============================== 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;
        }
    }
}
Beispiel #14
0
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);
    }
}
Beispiel #15
0
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;
}
Beispiel #16
0
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);
    }
}
Beispiel #17
0
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);
}
Beispiel #20
0
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);
    }
}
Beispiel #21
0
void TaudioCodecLibDTS::getInputDescr1(char_t *buf, size_t buflen) const
{
    ff_strncpy(buf, _l("DTS"), buflen);
    buf[buflen - 1] = '\0';
}
Beispiel #22
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';
}
Beispiel #23
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;
}
Beispiel #24
0
//============================= 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();
}
Beispiel #26
0
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;
}
Beispiel #28
0
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);
}