Dspack - cadru multimedia pentru delphi - directshow în limba rusă

Dspack - cadru multimedia pentru delphi - directshow în limba rusă

Fig. 13. Structura clasei de pachete DSPack

Desigur, fără o bună cunoaștere a API-ului DirectShow, este dificil să evaluezi calitatea și utilitatea pachetului de clasă. Dar încă încercăm să ne ocupăm de aceste clase.

TFilterGraph

Această componentă este o împachetare peste managerul graficului de filtre DirectShow și are un loc excepțional atât în ​​DirectShow, cât și în DSPack. Orice aplicație care se ocupă de DirectShow va trebui în mod necesar să se ocupe de managerul de grafic. Se utilizează pentru a construi și a gestiona grafice, precum și pentru a gestiona sincronizarea, notificările evenimentelor și alte aspecte ale controlului grafurilor.

Când utilizați API Graficul filtru DirectShow pentru a crea un manager trebuie să utilizați apelarea funcției CoCreateInstance. precum transferul sau CLSID CLSID_FilterGraph sau CLSID_FilterGraphNoThread. CLSID_FilterGraph responsabil pentru crearea unui manager de filtru grafic (MGF) pe un flux de lucru partajat (aparent, nu a fost încă pentru a da o idee despre cum se utilizează fluxurile DirectShow) și CLSID_FilterGraphNoThread - pentru crearea IFG pe firul de aplicare.

De obicei, aplicațiile utilizează CLSID_FilterGraph. Dar ambele CLSID_ sunt folosite pentru a crea același obiect, dar folosind diferite modele de streaming:

  • CLSID_FilterGraph servește pentru a crea un IGF pe fluxul de lucru care este partajat de toate instanțele de CLSID_FilterGraph într-un singur proces. Fișierul trimite mesaje care trimit filtre și controlează ciclul de viață al oricărui ferestre create de filtre.
  • CLSID_FilterGraphNoThread servește pentru a crea un IGF pe firul aplicației. Dacă utilizați acest CLSID, firul care solicită CoCreateInstance trebuie să aibă o buclă de mesaje. În caz contrar, pot exista diferite tipuri de impas. Înainte de sfârșitul acestui thread, este de asemenea necesar să eliberați MGF și toate obiectele de grafic (cum ar fi filtrele, contactele, ceasurile de referință etc.).

Pe baza celor de mai sus, nu pare să existe niciun motiv special pentru a utiliza CLSID_FilterGraphNoThread la crearea FGM.

Cu toate acestea, componenta TFilterGraph nu utilizează CLSID_FilterGraphNoThread, deci nu o vom mai menționa.

IGF oferă următoarele interfețe, descrise pe scurt. În ciuda faptului că există o mulțime de ele, nu voi fi leneș să le scrii pe toate, dar vă sfătuiesc să nu fiți leneși și să citiți această placă. După aceasta, veți deveni mult mai clară decât drepturile și responsabilitățile managerului de grafic.

Această interfață oferă metode care permit unei aplicații să construiască un grafic de filtrare. Această interfață este implementată de IFG (interfața este moștenită de la IFilterGraph (care oferă operații de bază - cum ar fi adăugarea unui filtru la un grafic sau conectarea a două contacte). și adaugă metode care vă permit să creați un grafic cu informații parțiale.

MGF utilizat pentru a susține construcția dinamică a graficului. Această interfață permite aplicațiilor și filtrelor să reconfigureze un grafic aflat într-o stare defectă, fără a-l opri și fără a pierde date.

Notifică managerul graficului de filtrare al evenimentelor care apar pe grafic. Filtrele utilizează această interfață pentru a raporta evenimentele. Aplicațiile nu o folosesc.

Controlează starea de curgere a filtrului. Toate filtrele DirectShow implementează această interfață. Acesta oferă metode de stări de comutare (oprire, pauză, începe) pentru starea actuală și pentru a seta ceasul de referință. Aplicațiile nu apelează metodele IMediaFilter. MGF furnizează de asemenea această interfață. Aplicațiile pot apela metodele acestei interfețe și SetSyncSource GetSyncSource pentru stabilirea și recuperarea ceasului de referință. Aplicațiile nu ar trebui să pună alte metode pe această interfață, și în loc să utilizeze metodele moștenite de la IMediaControl.Sam IMediaFilter IPersist și interfața IBaseFilter moștenește, la rândul său, de la IMediaFilter.

Conține metode pentru a găsi o poziție într-un flux. Interfața IMediaSeeking se bazează pe această interfață. Aplicațiile scrise în C / C ++ pot folosi interfața IMediaSeeking în loc de IMediaPosition. Dar IMediaSeeking este incompatibil cu automatizarea, deci aplicațiile scrise, de exemplu, în Visual Basic, ar trebui să utilizeze IMediaPosition. Această interfață este furnizată atât de filtrele MGF cât și de filtrele individuale. Aplicațiile trebuie să primească un pointer la interfața IMediaPosition din FGM, nu din filtre. IGF distribuie metoda apelând toate filtrele de randare. Erupțiile de randare propagă apelul în amonte la filtrele sursă. Această secvență de evenimente garantează sincronizarea tuturor firelor. Dacă unul dintre apelurile distribuite returnează o eroare, FGM va returna prima eroare pe care a primit-o. Unele dintre apelurile distribuite pot avea succes. Dacă, totuși, cel puțin un apel distribuit nu este returnat de către E_NOTIMPL, atunci FGM nu va returna E_NOTIMPL. Numai dacă toate apelurile distribuite sunt returnate către E_NOTIMPL, FGM va returna E_NOTIMPL. Notă pentru dezvoltatorii de filtre. Nu aveți nevoie să implementați această interfață. În schimb, trebuie să implementați programul IMediaSeeking. Dacă filtrul dvs. acceptă IMediaSeeking, IGF va gestiona automat interfața IMediaPosition.

Pune comanda în coada de așteptare pentru procesare la un moment dat. Aplicația o poate folosi pentru a avansa comenzile de control pentru grafic (?). Metodele acestui model de interfață sunt metoda IDispatch :: InvokeAt. Aplicația specifică interfața, metoda interfeței, parametrii metodei și timpul de referință. IGF pune aceste informații în coadă și apoi numește această metodă la ora specificată. Interfața necesară trebuie să moștenească IDispatch și trebuie furnizată de IGF. Exemple de astfel de interfețe sunt IMediaControl, IMediaEventEx și IMediaPosition. După ce comanda este în coadă, MGF returnează un pointer la interfața IDefferedCommand. Aplicația poate utiliza această interfață pentru a anula sau modifica comanda.

Înregistrează un obiect ca serviciu.

Această interfață este responsabilă pentru permiterea concurenței pentru resursele sistemului. Filtrele pot utiliza această interfață pentru a interoga resursele care pot utiliza alte obiecte. De exemplu, redare audio (filtre care redă audio) utilizează această interfață pentru a rezolva conflictele pe un dispozitiv de ieșire audio. Aplicațiile de obicei nu utilizează această interfață.

Această interfață nu este descrisă în ajutorul DirectShow.

După cum puteți vedea, există multe interfețe. Din acest motiv, le vom examina în detaliu numai dacă este necesar.

Vom avea nevoie de mai mult de două interfețe: IAMGraphBuilderCallback și IAMFilterGraphCallback. Primul dintre acestea oferă un mecanism de apel invers atunci când construiește un grafic. Pentru al utiliza, trebuie să pună în aplicare tehnicile sale în aplicația sau site-ul clientului. Cere IFG în interfața IObjectWithSize și apelați metoda IObjectWithSize :: SetSize, trecând la punerea în aplicare a acestui indicator de interfață. IFG invocă metodele acestei interfețe în timpul construcției graficului, care (interfata) prevede un client în scopul modificării procesului de construire a graficului. Utilizarea principală a acestei interfețe - Configurarea filtrului VMR înainte de conectare. Acesta poate fi folosit, de asemenea, pentru refuzul utilizării anumitor filtre (de exemplu, decodoare). Metode Spetsifichekie acestei interfețe - SelectedFilter (numit atunci când MGF este un candidat de filtru, dar înainte de a crea filtru) și CreatedFilter (numit după MGF creează un filtru, dar înainte de a încerca să-l conecteze). A doua interfață - IAMFilterGraphCallback, - prevede, de asemenea, apel invers-mecanism în construcția graficului. În cazul în care construcția graficului primește o eroare MGF atunci când încearcă să facă unele contacte, este singura metoda care interfata UnableToRender.

Deci, clasa TFilterGraph este succesorul TComponent, precum și interfețele IAMGraphBuilderCallback, IAMFilterGraphCallback și IServiceProvider:

TFilterGraph = clasă (TComponent, IAMGraphBuilderCallback, IAMFilterGraphCallback, IServiceProvider)

IFG poate funcționa în trei moduri - gmNormal, gmCapture și gmDVD. Când se utilizează modul gmNormal creează COM-obiect IGraphBuilder (FFilterGraph), folosind gmCapture - crea COM obiecte ICaptureGraphBuilder2 (FCaptureGraph) și IGraphBuilder (FFilterGraph), folosind gmDVD - COM-obiect IDvdGraphBuilder (FDvdGraph). Să ne uităm mai întâi la aceste interfețe, și apoi să continue să studieze TFilterGraph de clasă.

După cum sa menționat deja (a se vedea interfețe de masă furnizate MGF.), IGraphBuilder moștenește de la IFilterGraph (care prevede operațiuni de bază - cum ar fi adăugarea graficului de filtrare sau legătura între două contacte). și adaugă metode pentru a crea un grafic de informații parțiale (singura metodă - Render - pentru a termina automat contorul pentru contactul de ieșire specificat).

COM-obiect „de captare Count Builder“ (Capture Graph Builder) implementează o singură interfață - ICaptureGraphBuilder2 (pentru mine a rămas originea neclară a numelui -, probabil, el a înlocuit și extins anterior utilizate pentru aceleași scopuri ICaptureGraphBuilder Interface), care prevede metode de construire grafice de captură și alte grafice de filtrare personalizate. În general, utilizarea unui obiect de susținere, care are propriile caracteristici, dar nu cred că trebuie să se oprească (ar fi frumos pentru a intelege cum functioneaza acest ajutor obiect și dacă este posibil să se facă fără ea).

În cele din urmă, IDvdGraphBuilder este folosit pentru a lucra cu, evident, dvd, dar acesta este un subiect pentru o conversație separată și voi încerca să nu mai vorbim de DVD-ul în viitor.

Marea majoritate a altor metode și proprietăți ale clasei TFilterGraph sunt legate de prelucrarea mesajelor primite de graficul de filtrare. Să aruncăm o privire mai atentă la cum se întâmplă acest lucru (cel puțin pentru a putea să o faceți singur dacă nu utilizați DSPack, ci DirectShow API direct). Deci, în secțiunea privată a clasei TFilterGraph, puteți găsi interfața IMediaEventEx (membră a FMediaEventEx). Când este activat managerul grafic al filtrului (în implementarea metodei TFilterGraph.SetActive), metoda QueryInterface este apelată pentru a obține interfața IMediaEventEx. Acum, locul este mai detaliat despre această interfață, dar să începem cu interfața IMediaEvent (IMediaEventEx moșteneste și extinde funcționalitatea acesteia). Deci, interfața IMediaEvent conține metode pentru returnarea notificărilor despre evenimente și pentru redefinirea administratorilor acestor notificări furnizate de standardul FGM. După cum sa menționat deja, această interfață este furnizată de FGM. Aplicația o poate folosi pentru a răspunde evenimentelor care apar în graficul de filtrare, cum ar fi sfârșitul fluxului sau o eroare în redare (redare). Filtrele trimit evenimente la graficul de filtrare utilizând interfața IMediaEventSink. Mai multe detalii despre evenimentele care apar în graficul de filtre, merită privit în secțiunile relevante ale ajutorului.

Interfața IMediaEvent oferă următoarele metode:

Returnează notificarea următorului eveniment din coada de mesaje.

Returnează tratare a evenimentelor pentru manualul-resetare (evenimentul manual-reset) (Dacă ați uitat sau nu știu ce este că, citit pe MSDN sau în Rihera), care rămâne ocupat (a semnalat), în timp ce coada conține notificări pentru evenimente. MGF deține un eveniment manual de resetare, care reflectă starea cozii de mesaje. În cazul în care coada conține notificări de evenimente, eveniment, manual de resetare este într-o stare ocupat. În cazul în care coada este gol, metoda IMediaEvent :: GetEvent resetează sobytie.Prilozhenie poate folosi acest eveniment pentru a determina starea cozii. În primul rând numita metodă GetEventHandle pentru a obține un mâner de evenimente. Apoi, trebuie să așteptați pentru eveniment va intra în stare de alarmă, folosind funcții cum ar fi WaitForSingleObject. Apoi, aveți nevoie pentru a obține seduyuschee notificare pentru un eveniment din coada de asteptare IMediaEvent :: GetEvent. MGF deține eveniment în stare semnalat până când coada este goală; apoi evenimentul este aruncată. Noi nu ar trebui să închidă mânerul în cazul în care este returnat prin această metodă, deoarece este utilizat într-un grafic filtru. Nu este nevoie să folosiți mânerul după după eliberarea de IFG, deoarece în acest caz mânerul nu este valid. (Pentru a evita această eroare, puteți duplica DuplicateHandle provocare mâner și de a folosi această copie în locul originalului După capătul unui mâner cu un duplicat al acestuia pentru a închide ..) Un alt mod de monitorizare a mesajului coada de aplicare - metoda IMediaEventEx apel :: SetNotifyWindow (va fi discutat mai jos).

Se așteaptă ca graficul de filtrare să proceseze toate datele disponibile.

Pentru a monitoriza mesajele au, cu toate acestea, mai mult va fi interfață IMediaEventEx interesată care moștenește interfață IMediaEvent și, în plus, are metode pentru revenirea la notificări de evenimente și imperative stivuitoare de mesaje oferite de MGF implicit. IMediaEventEx extinde metode de interfață IMediaEvent care permit ferestrei aplicației vor primi rapoarte despre evenimente din MGF. Lista completa a mesajelor specifice pot fi vizualizate aici. Ne întoarcem la metode noi IMediaEventEx. Există doar trei dintre ele:

Returnează un contact cu identificatorul specificat

Notifică filtrul că este legat de un grafic de filtru stânga (?). Când MGF adaugă un filtru la graficul de filtrare, acesta numește această metodă cu un pointer la sine. Numele instanței filtrului este legat de al doilea parametru. Când IGF înlătură filtrul din grafic, el numește această metodă, trecând valoarea zero ca indicator la grafic. Această metodă nu ar trebui să fie solicitată pentru aplicații. Pentru a adăuga un filtru la grafic, trebuie să apelați metoda AddFilter a interfeței IFilterGraph, obținută de la IGF

Returnează informații despre filtru

Returnează un șir care conține informații despre producător

Acest lucru, în general, și tot ce vroiam să spun despre interfața IBaseFilter și, în consecință, clasa TFilter, deoarece acesta din urmă implementează cele mai simple și mai evidente lucruri necesare pentru a fi numit vrapper al acestei interfețe. Dacă sunteți interesat de detaliile interfețelor de mai sus sau de metodele lor, consultați-le în MSDN.

TVideoWindow

IVideoWindow

În plus față de metodele moștenite de la IDispatch, interfața IVideoWindow oferă metodele descrise în următorul tabel:

După cum puteți vedea, interfața IVideoWindow are o mulțime de metode (detaliile pot fi găsite în aceeași MSDN'a), dintre care cele mai multe au un sens clar de cristal, și numai pentru unii (de exemplu, put_FullScreenMode), caracterizat prin nuanțe importante.

Mod VM fără ferestre

Aici - modul Windowless VMR

IVMR WindowlessControl9

IVMRWindowlessControl9, cu excepția metodelor moștenite de la IUnknown, oferă de asemenea următoarele:

VMR informează că cererea a primit un mesaj de WM_DISPLAYCHANGE.Prilozhenie ar trebui să numim această metodă ori de câte ori primește un mesaj de fereastra WM_DISPLAYCHANGE, dar numai în cazul în care VMR este într-un mod fără ferestre (fără ferestre)

Returnează raportul de aspect actual al modului de afișare

Returnează culoarea curentă a cadrului utilizat de VMR

Returnează o copie a imaginii curente afișate de VMR. Imaginea este returnată în formatul unui pachet Windows DIB. Această metodă poate fi apelată în orice moment, indiferent de starea în care se află filtrul. Apelantul este responsabil pentru eliberarea memoriei returnate apelând coTaskMemFree. Utilizarea acestei funcții încetinește redarea.

Setează raportul de aspect actual al modului de afișare

Filtru de redare video

Următorul tabel descrie proprietățile filtrului Renderer video:

Alte detalii legate de caracteristicile filtrului și suport pentru depanarea aplicațiilor quartz.dll, ar trebui să căutați în MSDN.

Filtru de amestec de mixare video 9

Proprietăți, metode și interfețe pentru TVideoWindow

Clasa TCustomContol este moștenitorul TWinControl, deci este clar că TVideoWindow oferă o oportunitate, printre altele, de a lucra cu acesta ca o fereastră. Vom presupune că cu acest strămoș totul este clar și se concentrează pe interfețele IFilter și IEvent. Ele sunt declarate ca

Luați în considerare și câteva interfețe suplimentare care sunt importante pentru înțelegerea procesului de cartografiere. Printre acestea - IVMRSurfaceAllocator, IVMRSurfaceAllocatorNotify, IVMRImagePresenter.

IVMRSurfaceAllocator

Interfața IVMRSurfaceAllocator este implementată de alocator-prezentator, care este implicit pentru filtrul VMR-7. Acesta ar trebui implementat de orice distribuitor-prezentator plug-in, pe care aplicația îl furnizează filtrului VMR-7. VMR-7 utilizează metode pe această interfață pentru extragerea, pregătirea și eliberarea suprafețelor DirectDraw. Aplicațiile nu utilizează această interfață. VMR-9 utilizează IVMRSurfaceAllocator9. Pe lângă metodele IUnknown, interfața IVMRSurfaceAllocator oferă următoarele metode: