Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

DirectShow 9.0 i problem prilikom capture graph buildinga ...

[es] :: 3D programiranje :: DirectShow 9.0 i problem prilikom capture graph buildinga ...

[ Pregleda: 3139 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

vlaiv
Vladimir Vlaisavljevic
Novi Sad

Član broj: 15993
Poruke: 352
*.neobee.net.



+1 Profil

icon DirectShow 9.0 i problem prilikom capture graph buildinga ...01.02.2005. u 21:48 - pre 234 meseci
Zapravo imam par pitanja:

Prilikom pregledanja video formata (AM_MEDIA_TYPE) capture pina na video capture device-u u VIDEO_STREAM_CONFIG_CAPS postoje polja koja opisuju moguce capture formate (velicina capture "prozora" odnosno dimenzije video zapisa). Ukoliko se pogleda DirectX implementacija (ne znam da li je do DirectX-a ili konkretno do drajvera) odnosno propertypages za dati pin, on nudi neke "standardne" formate dimenzija capture-a. Postoji mnogo vise kombinacija koje se mogu izvuci iz gore navedenog ... Kako oni odredjuju "standardne" velicine?

Ja sam se opredelio za formate koji su 4:3 i padaju u ovu oblast ... evo koda:

Code:
            int xmin = caps.MinOutputSize.cx;
            int ymin = caps.MinOutputSize.cy;
            int xmax = caps.MaxOutputSize.cx;
            int ymax = caps.MaxOutputSize.cy;
            int xstep = caps.OutputGranularityX;
            int ystep = caps.OutputGranularityY;

            int cnter = 0;
            int cbpos = -1;

            for(int i=xmin;i<=xmax;i+=xstep)
                if((i*3)%4==0){
                    int ytest = (i*3)/4;
                    if(((ytest-ymin)%ystep==0)&&(ytest>=ymin)&&(ytest<=ymax)){
                        ComboBox4->Items->Add(IntToStr(i)+" x "+IntToStr(ytest));
                        ComboBox4->Enabled = true;
                        Label4->Enabled = true;
                        if((xdef==i)&&(ydef==ytest))
                            cbpos = cnter;
                        cnter+=1;
                    }
                }


Ali se dalje desava sledece:
Ukoliko izaberem neki od formata koji su veci po dimenzijama od capture pin standardnog (352x288 ili tako nesto) bez problema mogu da ga setujem preko IAMMediaConfig -a ali kada rebildujem graph ako prvo renderujem preview pin na video renderer, javlja mi gresku da ne moze da izrenderuje capture pin na kompresor ... a ako prvo renderujem pri istom setovanju capture pin onda njega pusta ali mi posle javlja istu gresku za preview pin (oba postoje na capture device filteru).

Greska se ponavlja cak i ako stavim isti media format i za preview pin ...

Napominjem da sve rezolucije koje prave ovaj problem (cak i u GraphEditu - kada "prisluskuje" filter graph) nisu navedene u PropertyPages-ima za dati pin ...
(propertypages je isti u GraphEditu i u AMCap.exe koji dolazi kao demo uz DX9SDK).
Za "default" velicine nema problema ...

Jedini problem je zapravo bio u tome sto ja zelim da napravim sopstveni interface za setovanje capture-a a ne da koristim exposed property pages ....

Gde gresim? i u cemu je caka...
Kako da i ja dobijem te "standardne" velicine koje nudi DirectX? (neke su 4:3 neke 5:4, 11:9 pa cak i 22:17)???

P.S. proveravam sve greske i eventualne null pointere i ostalo i jedino mi vraca u datom slucaju gresku:No combination of intermediate filters could be found to make the connection.
 
Odgovor na temu

yooyo

Član broj: 4891
Poruke: 1101
*.nat-pool.bgd.sbb.co.yu.



Profil

icon Re: DirectShow 9.0 i problem prilikom capture graph buildinga ...02.02.2005. u 16:50 - pre 234 meseci
Evo ti nekoliko utility funkcija koje ti mozda mogu pomoci...
Code:

HRESULT DisplayPinProperties(CComPtr<IPin> pSrcPin, HWND hWnd = NULL)
{
    CComPtr<ISpecifyPropertyPages> pPages;
    
    HRESULT hr = pSrcPin->QueryInterface(IID_ISpecifyPropertyPages, (void**)&pPages);
    if (SUCCEEDED(hr))
    {
        PIN_INFO PinInfo;
        pSrcPin->QueryPinInfo(&PinInfo);
        
        CAUUID caGUID;
        pPages->GetPages(&caGUID);
        
        OleCreatePropertyFrame(
            hWnd,
            0,
            0,
            L"Property Sheet",
            1,
            (IUnknown **)&(pSrcPin.p),
            caGUID.cElems,
            caGUID.pElems,
            0,
            0,
            NULL);
        CoTaskMemFree(caGUID.pElems);
        PinInfo.pFilter->Release();
    }
    else return(hr);
    
    return(S_OK);
}

void DumpConfig(IPin *pPin)
{
    int iCount, iSize;
    VIDEO_STREAM_CONFIG_CAPS scc;
    AM_MEDIA_TYPE *pmt;
    HRESULT hr;

    IAMStreamConfig* pConfig;
    hr = pPin->QueryInterface(IID_IAMStreamConfig, (void **)&pConfig);
    if (FAILED(hr)) 
    {
        MessageBox(NULL, "DisplayConfig error. Pin don't have IID_IAMStreamConfig interface", NULL, MB_OK);
        return;
    }
    
    hr = pConfig->GetNumberOfCapabilities(&iCount, &iSize);
    ASSERT(sizeof(scc) <= iSize);  // Make sure the structure is big enough.
    
    int i;
    for (i=0; i<iCount; i++)
    {
        hr = pConfig->GetStreamCaps(i, &pmt, reinterpret_cast<BYTE*>(&scc));
        if (hr == S_OK)
        {
            if (pmt->formattype == FORMAT_VideoInfo)
            {
                VIDEOINFOHEADER *pVih = reinterpret_cast<VIDEOINFOHEADER*>(pmt->pbFormat);
                Log.AddLine(__FILE__, "cap %d. %d x %d x %d",    i, pVih->bmiHeader.biWidth , pVih->bmiHeader.biHeight, pVih->bmiHeader.biBitCount);
                Log.AddLine(__FILE__, "max = %d %d", scc.MaxOutputSize.cx, scc.MaxOutputSize.cy);
                DeleteMediaType(pmt);
            }
        }
    }
}

void Set720x576(IPin *pPin)
{
    int iCount, iSize;
    VIDEO_STREAM_CONFIG_CAPS scc;
    AM_MEDIA_TYPE *pmt;
    HRESULT hr;
    
    IAMStreamConfig* pConfig;
    hr = pPin->QueryInterface(IID_IAMStreamConfig, (void **)&pConfig);
    if (FAILED(hr)) 
    {
        MessageBox(NULL, "DisplayConfig error. Pin don't have IID_IAMStreamConfig interface", NULL, MB_OK);
        return;
    }
    
    hr = pConfig->GetNumberOfCapabilities(&iCount, &iSize);
    ASSERT(sizeof(scc) <= iSize);  // Make sure the structure is big enough.
    
    int i;
    for (i=0; i<iCount; i++)
    {
        hr = pConfig->GetStreamCaps(i, &pmt, reinterpret_cast<BYTE*>(&scc));
        if (hr == S_OK)
        {
            if ((pmt->formattype == FORMAT_VideoInfo) && (pmt->subtype == MEDIASUBTYPE_RGB24))
            {
                VIDEOINFOHEADER *pVih = reinterpret_cast<VIDEOINFOHEADER*>(pmt->pbFormat);
                Log.AddLine(__FILE__, "cap %d. %d x %d x %d",    i, pVih->bmiHeader.biWidth , pVih->bmiHeader.biHeight, pVih->bmiHeader.biBitCount);
                Log.AddLine(__FILE__, "max = %d %d", scc.MaxOutputSize.cx, scc.MaxOutputSize.cy);
                pVih->bmiHeader.biWidth = 720;
                pVih->bmiHeader.biHeight = 576;
                pmt->lSampleSize = pVih->bmiHeader.biSizeImage = 720*576*3;
                
                hr = pConfig->SetFormat(pmt);
                if (FAILED(hr))
                {
                    MessageBox(NULL, TEXT("SetFormat() Failed!\n"), NULL, MB_OK);
                }
                DeleteMediaType(pmt);
                return;
            }
        }
    }
}

DisplayPinProperties - otvara pin properties dialog
DumpConfig - ispisuje sve rezolucije datog pin-a
Set720x576 - primer setovanja 720x576 ( malo cudno, ali radi )


Ako sam dobro razumeo, ti zelis da imas jednu rezoluciju na preview pinu a drugu na capture? Mislim da to nece moci.... tj. obe rezolucije moraju biti iste.
Takodje, custom rezolucije nisu dozvoljene i moraju se koristiti samo one koje je capture pin prijavio da moze. To lepo pise u SDK:

Code:

The VIDEO_STREAM_CONFIG_CAPS structure gives the minimum and maximum width
and height that can be used for this media type. It also gives you the "step" size,
which defines the increments by which you can adjust the width or height. For
example, the device might return the following: 

MinOutputSize: 160 x 120 
MaxOutputSize: 320 x 240 
OutputGranularityX: 8 pixels (horizontal step size) 
OutputGranularityY: 8 pixels (vertical step size) 
Given these numbers, you could set the width to anything in the range (160, 168, 
176, ... 304, 312, 320) and the height to anything in the range (120, 128, 136, ... 
104, 112, 120).


yooyo
 
Odgovor na temu

vlaiv
Vladimir Vlaisavljevic
Novi Sad

Član broj: 15993
Poruke: 352
*.neobee.net.



+1 Profil

icon Re: DirectShow 9.0 i problem prilikom capture graph buildinga ...02.02.2005. u 17:06 - pre 234 meseci
Citat:

DisplayPinProperties - otvara pin properties dialog


-- Jedini problem je zapravo bio u tome sto ja zelim da napravim sopstveni interface za setovanje capture-a a ne da koristim exposed property pages ....

Citat:

DumpConfig - ispisuje sve rezolucije datog pin-a
Set720x576 - primer setovanja 720x576 ( malo cudno, ali radi )


Hvala na primeru, no i ja sam takvo nesto slicno odradio ...

Citat:

Ako sam dobro razumeo, ti zelis da imas jednu rezoluciju na preview pinu a drugu na capture? Mislim da to nece moci.... tj. obe rezolucije moraju biti iste.
Takodje, custom rezolucije takodje nisu dozvoljene i moraju se koristiti samo one koje je capture pin prijavio da moze.


-- Greska se ponavlja cak i ako stavim isti media format i za preview pin ...

E, pitanje ... koje je rezolucije capture pin prijavio da mogu?
Koliko sam ja shvatio iz DXSDK helpa,
rezolucije koje su "dozvoljene" su:

Sve one za koje postoji odgovarajuci medija tip (video/subtip 24bit, 15bit, razni FCC...) i za dati media tip sve rezolucije koje se nalaze izmedju MinOutputSize i MaxOutputSize i sa datim granularity po X odnosno po Y osi ...

DumpConfig izbacuje samo osnovnu velicinu i maksimalnu velicinu za listu media tipova ...

Cemu onda granularity i minimalne velicine (koje btw sasvim lepo rade ...)?

Znaci jos jednom:

Za formate vece od osnovnog (koji su 4:3), cak i kada selektujem isti media tip i format i za capture i preview pin, ako se jedan od ta dva pina prvi poveze sa ostatkom grapha, drugi prijavljuje gresku prilikom povezivanja ...
(znaci capture uspe - preview nece ili preview uspe, capture nece ...)
 
Odgovor na temu

yooyo

Član broj: 4891
Poruke: 1101
*.nat-pool.bgd.sbb.co.yu.



Profil

icon Re: DirectShow 9.0 i problem prilikom capture graph buildinga ...02.02.2005. u 17:24 - pre 234 meseci
Jedno pitanje... da li je ostatak grapha vec povezan?

Meni se desavalo da povezivanje nekog pina sa ostatkom grapha koji je vec povezan nece da radi jer su se svi downstream pinovi "navikli" na neku rezoluciju i nece da prihvate promene. Resenje je da sam u nekim situacijama morao da brisem filter iz grapha i da ga ponovo ubacim.

Igraj se malo sa graphedit-om. Ako ti graph u njemu proradi, onda mora da proradi i iz tvoje aplikacije.

Takodje, ako imas Inf-Tee splittter pin obavezno capture deo grapha ide na prvi output pin a preview na drugi. U suprotnom graph uopste nece da radi ili nece da se poveze.

yooyo

 
Odgovor na temu

vlaiv
Vladimir Vlaisavljevic
Novi Sad

Član broj: 15993
Poruke: 352
*.neobee.net.



+1 Profil

icon Re: DirectShow 9.0 i problem prilikom capture graph buildinga ...03.02.2005. u 13:11 - pre 234 meseci
U trenutku kada se konfigurisu pinovi, postoji samo deo grapha upstream od capture filtera ...

nakon konfigurisanja media type-a, odradjujem sledece:

Code:

    if(FAILED(pCGB->SetOutputFileName(&MEDIASUBTYPE_Avi,wfn,&pMux,NULL)))
        result = false;

    if(result)
        if(FAILED(pGB->AddFilter(pVCompress,L"Video compression filter")))
            result = false;
    if(result&&fUseAudio)
        if(FAILED(pGB->AddFilter(pACompress,L"Audio compression filter")))
            result = false;
    if(result){
        hr = pCGB->RenderStream(&PIN_CATEGORY_CAPTURE,
                 &MEDIATYPE_Video, pVCapture, pVCompress, pMux);
        if((hr!=S_OK))
            result = false;
    }
    if(result&&fUseAudio){
        hr = pCGB->RenderStream(&PIN_CATEGORY_CAPTURE,
             &MEDIATYPE_Audio, pACapture, pACompress, pMux);
        if((hr!=S_OK))
            result = false;
    }
    if(result){
        hr = pCGB->RenderStream(&PIN_CATEGORY_PREVIEW,
                 &MEDIATYPE_Video, pVCapture, NULL, NULL);
        if((hr!=S_OK)&&(hr != VFW_S_NOPREVIEWPIN)){
            char buf[1024];

            AMGetErrorText(hr,buf,1024);
            Application->MessageBoxA(buf,"Nece preview!");
            result = false;
        }
    }
    if(pMux!=NULL)
        pMux->Release();


Znaci ubacujem kopresione filtere (odabrane i kreirane ranije), setujem output fajl i AviMux i renderujem strimove (capture na mux a preview na null device - default video renderer) ...

Kada god treba da odradim konfigurisanje ... "Pocepam" graf od capture filtera nanize pa ga ponovo krpim ovako ...

Zgodna stvar ovo za Inf-Tee splitter, to nisam znao - znaci rendachim uvek prvo compress pa preview stream za slucaj da nema preview pin ...

Sto se tice GraphEdit-a i igranja, to sam obavio davno ...

Ma samo mi nije jasno zasto isti kod nekada radi a nekada ne ...
Odnosno nekada nece da da preview ... (a on mi je neophodan)
A nece da ga da u slucajevima kada je capture rezolucija veca od njegove default za dati media type a nije u opcijama koje nude property pages ...

 
Odgovor na temu

yooyo

Član broj: 4891
Poruke: 1101
*.nat-pool.bgd.sbb.co.yu.



Profil

icon Re: DirectShow 9.0 i problem prilikom capture graph buildinga ...03.02.2005. u 14:11 - pre 234 meseci
Hmm... Koji uredjaj koristis za capture? Ja sam uglavnom radio sa firewire kamerom i sa ASUS TV @nywhere.
Problem je izgleda u tome sto su se downstream filter "navikli" na prethodnu rezoluciju. Izgleda da kompresor filter nije korektno napisan. Probaj ffdshow i njega iskoristi za kompresiju. Ja sam imao grdnih problema sa XVID, DIVX i slicnim kompresorima. Jedino je ffdshow odradio posao.

yooyo
 
Odgovor na temu

vlaiv
Vladimir Vlaisavljevic
Novi Sad

Član broj: 15993
Poruke: 352
*.neobee.net.



+1 Profil

icon Re: DirectShow 9.0 i problem prilikom capture graph buildinga ...03.02.2005. u 22:42 - pre 234 meseci
:) Moram priznati da koristim neku skrnavu capture karticu za testiranje ...

Hvala za trud, mislim da cu jednostavno u baciti opciju "Nece sa preview u current settinzima, pa ako osh-osh, ako ne, menjaj ..." ...

Sve u svemu software je radjen da chupa codec-e iz sistema, pa kako kom korisniku zapadne ...

Ovo je sve do sada bilo za capture sa svideo, composite i TVTuner ulaza - standard capture sa crossbar-om ...

Pisacu poseban kod za DV capture ... valjda tamo nece biti takvih problema, a i pretpostavljam da ce vecina korisnika imati ozbiljniji hardware ...

Jos jednom hvala ...
 
Odgovor na temu

yooyo

Član broj: 4891
Poruke: 1101
*.nat-pool.bgd.sbb.co.yu.



Profil

icon Re: DirectShow 9.0 i problem prilikom capture graph buildinga ...04.02.2005. u 11:18 - pre 234 meseci
Ufff... firewire koliko je dobar, toliko je i los!!! :)
Kada budes radio sa DV-om i desava ti se da u fazi razvoja program puca i ostavlja filtere po memoriji, FW se toliko zaglupi da aplikaciju nemozes da "ubijes" 10 min i moraces ili da odjavis kontroler iz Device Managera pa da ga ponovo detektujes ili da rebootujes masinu.

yooyo
 
Odgovor na temu

vlaiv
Vladimir Vlaisavljevic
Novi Sad

Član broj: 15993
Poruke: 352
*.neobee.net.



+1 Profil

icon Re: DirectShow 9.0 i problem prilikom capture graph buildinga ...05.02.2005. u 13:59 - pre 234 meseci
Ozbiljno?

Koliko ja vidim iz dokumentacije, cinilo mi se da je bas jednostavno ...

ima onaj Micro$oftow filter za DV pa splitter pa ...

Bas cu da se "pozabavim" dok to budem radio, sve mi se cini ... :))

Anyway ako mi bude jos sta trebalo konsultovacu te ... :))
 
Odgovor na temu

yooyo

Član broj: 4891
Poruke: 1101
*.nat-pool.bgd.sbb.co.yu.



Profil

icon Re: DirectShow 9.0 i problem prilikom capture graph buildinga ...07.02.2005. u 14:48 - pre 234 meseci
Jeste jednostavno.. ali driver se slogira iz nepoznatog razloga...

yooyo
 
Odgovor na temu

vlaiv
Vladimir Vlaisavljevic
Novi Sad

Član broj: 15993
Poruke: 352
*.neobee.net.



+1 Profil

icon Re: DirectShow 9.0 i problem prilikom capture graph buildinga ...12.02.2005. u 14:58 - pre 233 meseci
Eh, izgleda da sam dosao do nekog kakvog takvog zakljucka sto se tice ovog pitanja ...

Evo o cemu bi se moglo raditi: Kada se uzme veca rezolucija na capture pinu, kod nekih uredjaja se automatski otkazuje preview pin i mislim da je to do drajvera zato sto su u pitanju PCI kartice i postoji simultani protok capture i preview stream-a preko PCI magistrale (a to pri velikim rezolucijama moze da je zagusi)

Resenje u ovim slucajevima je da se ubaci SmartTee na capture pin i onda ostalo zavisi od snage procesora i brzine memorije, dok preko PCI magistrale ide samo jedan stream ....

No radeci sa Pinnacle-ovim externim uredjajem za capture (koji se vezuje preko USB-a) naisao sam na sledeci problem:

Kada se doda Capture device u Graph, automatski se downstream doda odgovarajuci CrossBar koji poveze analog video na video input pin capture device-a a analog audio na audio input pin capture device-a i onda nadalje imam problem da video capture skidam na XVid jer media format verovatno nije cist video (moguce da prisustvo na audio ulazu pravi problem).

Da bih isprobao tu stvar napisao sam sledeci kod koji bi trebalo da otkaci vezu izmedju crossbar analog audia i audio in-a na capture device-u :
Code:

void __fastcall TCapture::UnconnectAudio(IBaseFilter *pf)
{
    IEnumPins * pEnumPins;
    IPin * ppin;
    PIN_DIRECTION pDir;

    if(SUCCEEDED(pf->EnumPins(&pEnumPins))){
        while(pEnumPins->Next(1,&ppin,NULL)==S_OK){
            ppin->QueryDirection(&pDir);
            if(pDir==PINDIR_INPUT){
                AM_MEDIA_TYPE* pmt;
                if(ppin->ConnectionMediaType(pmt)==S_OK){
                    if(pmt->majortype==MEDIATYPE_AnalogAudio){
                        ppin->Disconnect();
                    }
                    UtilDeleteMediaType(pmt);
                }
            }
            ppin->Release();
        }
        pEnumPins->Release();
    }
}


E, onda se dogadja nesto cudno!
Prvi poziv bilo kojeg metoda IPin interface-a (bilo da je QueryDirection, ConnectionMediaType, ili Release) normalno prolazi, dok ako vezem bilo koja dva (npr. pozovem QueryDirection pa zatim Release), prvi prodje bez problema dok sledeci podize Exception van mog programa (verovatno u Com server modulu)????

Imam parce koda koje radi gotovo slicnu stvar (svi elementi enumeracije pinova i poziva IPin interface metoda su tu) i tamo radi bez problema???

Vec se pocinjem pribojavati za svoje mentalno zdravlje ....
Ima li neko neku ideju?
 
Odgovor na temu

yooyo

Član broj: 4891
Poruke: 1101
195.252.86.*



Profil

icon Re: DirectShow 9.0 i problem prilikom capture graph buildinga ...13.02.2005. u 11:27 - pre 233 meseci
Nije to problem..nego XVID. Makni sve XVID i DIVX codece koje imas i instaliraj ffdshow (mislim da je zadnja verzija 4.2.2005). Koristi ffdshow kao kompresor a u njemu izaberi codec koji zelis.

Ja sam pisao programcic koji slusa neki port na mrezi i pokrece video capture sa zakacene DV kamere i sve to pakuje u XVID. Program je pucao sve dok nisam zamenio XVID codec sa ffdshow-om. Takodje imao sam problema i sa mp3 codecom pa sam na kraju koristio WindowsMedia Audio 2 (ili nesto slicno.. nisam siguran za ime) codec.

yooyo
 
Odgovor na temu

yooyo

Član broj: 4891
Poruke: 1101
195.252.86.*



Profil

icon Re: DirectShow 9.0 i problem prilikom capture graph buildinga ...13.02.2005. u 11:29 - pre 233 meseci
Nije to problem..nego XVID. Makni sve XVID i DIVX codece koje imas i instaliraj ffdshow (mislim da je zadnja verzija 4.2.2005). Koristi ffdshow kao kompresor a u njemu izaberi codec koji zelis.

Ja sam pisao programcic koji slusa neki port na mrezi i pokrece video capture sa zakacene DV kamere i sve to pakuje u XVID. Program je pucao sve dok nisam zamenio XVID codec sa ffdshow-om. Takodje imao sam problema i sa mp3 codecom pa sam na kraju koristio WindowsMedia Audio 2 (ili nesto slicno.. nisam siguran za ime) codec.

yooyo
 
Odgovor na temu

yooyo

Član broj: 4891
Poruke: 1101
195.252.86.*



Profil

icon Re: DirectShow 9.0 i problem prilikom capture graph buildinga ...13.02.2005. u 11:32 - pre 233 meseci
Nije to problem..nego XVID. Makni sve XVID i DIVX codece koje imas i instaliraj ffdshow (mislim da je zadnja verzija 4.2.2005). Koristi ffdshow kao kompresor a u njemu izaberi codec koji zelis.

Ja sam pisao programcic koji slusa neki port na mrezi i pokrece video capture sa zakacene DV kamere i sve to pakuje u XVID. Program je pucao sve dok nisam zamenio XVID codec sa ffdshow-om. Takodje imao sam problema i sa mp3 codecom pa sam na kraju koristio WindowsMedia Audio 2 (ili nesto slicno.. nisam siguran za ime) codec.

yooyo
 
Odgovor na temu

[es] :: 3D programiranje :: DirectShow 9.0 i problem prilikom capture graph buildinga ...

[ Pregleda: 3139 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.