ПредишенСледващото

Dspack - Мултимедия рамка за Делфи - DirectShow на Руски

Фиг. 13. Структурата на класовете на пакети DSPack

Разбира се, без добро познаване на DirectShow API е трудно да се направи оценка на качеството и полезността на обвивката на класа. Но ние все още се опитват да се справят с тези класове.

TFilterGraph

Този компонент - обвивката над мениджър DirectShow филтър графика и заема уникално място в DirectShow, както и в DSPack'e. Всяко приложение, което се занимава с DirectShow, със сигурност ще бъде на сделка и филтър за управление на графика. Той се използва за изграждане и графика за управление, както и да се контролира времето, нотификации събития и други аспекти на управлението на графика.

При използване на API DirectShow филтър графиката, за да се създаде програма за управление ще трябва да използвате обажда CoCreateInstance функция. както и прехвърлянето или CLSID CLSID_FilterGraph или CLSID_FilterGraphNoThread. CLSID_FilterGraph отговорен за създаването на филтър графика мениджър (MGF) в общ поток (очевидно, все още трябва да се даде представа за това, как да се използват потоците DirectShow) и CLSID_FilterGraphNoThread - за създаването на IFG на конец за кандидатстване.

приложения обикновено използват CLSID_FilterGraph. Но и двете CLSID_ използва за създаване на един и същ обект, но с помощта на различни модели на потока:

  • CLSID_FilterGraph MGF се използва за създаване на работния поток, който се споделя от всички случаи CLSID_FilterGraph в един процес. Feed dispetchereziruet съобщения, изпратени филтри и контролира целия жизнен цикъл на всички прозорци, създадени от филтрите.
  • CLSID_FilterGraphNoThread служи за създаване на поток от IFG на приложение. Ако използвате този този идентификатор, нишката, която нарича CoCreateInstance, трябва да има съобщение цикъл. В противен случай, може да се появи там различни видове заключване (безизходица). Преди затварянето на този поток също така трябва да се освободи (освобождаване) MGF и обектите графика (като например филтри, контакти, часовник, справки и т.н.).

Въз основа на изложеното по-горе изглежда, че няма конкретна причина да се използват при създаването на MGF CLSID_FilterGraphNoThread.

Въпреки това, TFilterGraph компонент използва CLSID_FilterGraphNoThread, така че ние няма да го споменавам повече.

IFG предоставя следните накратко описани интерфейси. Въпреки факта, че много от тях, аз не съм твърде мързеливи, за да ги напиша и аз ви съветваме да не се мързеливи и прочетете този знак. След това, ще стане много по-ясни права и задължения на филтър графика мениджър.

Този интерфейс осигурява методи pzvolyayuschie приложение за изграждане на филтър графика. Този интерфейс прилага MGF.Etot интерфейс наследява IFilterGraph (която осигурява основни операции - като добавянето на филтър графиката, или връзката между два контакта). и добавя методи за създаване на графика на частична информация.

IFG се използва в подкрепа на изграждането на динамична графика. Този интерфейс позволява на приложенията и филтри за преконфигуриране на графиката, която е в лошо състояние, без да се спира, и без загуба на данни.

Уведомява графика управителят на филтър за събития, които се провеждат на графиката. Филтри използват този интерфейс, за да докладва за събития. Заявленията не го използват.

Контроли стрийминг условие на филтъра. Всички DirectShow филтри приложат този интерфейс. Тя осигурява методи за превключване държави (стоп, пауза, започнете) за текущото състояние и да се определи референтен часовника. Заявленията не причиняват методи IMediaFilter. IFG осигурява този интерфейс. Заявленията могат да се обадят на методите на този интерфейс и SetSyncSource GetSyncSource за създаване и извличане на референтния часовника. Заявленията, които не трябва да се обадят на други методи на този интерфейс, а вместо това използват методите, наследени от IMediaControl.Sam IMediaFilter IPersist и IBaseFilter интерфейс наследява от своя страна от IMediaFilter.

Той съдържа методи за намиране на позиция в потока. IMediaSeeking интерфейс на базата на интерфейса. Приложения, написани на C / C ++, могат да се използват вместо inteerfeys IMediaSeeking IMediaPosition. Но IMediaSeeking съвместим с автоматизация, така написани приложения, например, Visual Basic трябва да използвате IMediaPosition.Etot интерфейс се предоставя като MGF и индивидуални филтри. Заявленията трябва да получат указател към интерфейса от IMediaPosition MGF, а не от филтъра. IFG разпространява метод, като се обадите на всички оказване на филтри. Fltry рендиране разпространява призив нагоре към източниците на филтри. Тази поредица от събития осигурява синхронизация на всички potokov.Esli един raspedelennyh разговор се установи грешка, първите грешки MGF получени от нея се връща. Някои от разговорите могат да се разпространяват и успешна. Ако, обаче, най-малко един от разпилян кол възвръщаемост не E_NOTIMPL, а след това се връща MGF E_NOTIMPL. Само ако всички разпространени разговори върнати E_NOTIMPL, MGF върне E_NOTIMPL.Zamechanie филтърни разработчици. Не е нужно да приложат този интерфейс. Вместо това, вие трябва да осъзнаете IMediaSeeking. Ако филтърът не подкрепя IMediaSeeking, IFG автоматично ще управлява IMediaPosition интерфейс.

Тя поставя екипът на опашка за преработката му в определено време. Заявлението може да го използва, за да преминете на контролните команди за графиката (?). Това методи интерфейс моделира метод IDispatch :: InvokeAt. Прилагането определя метода за интерфейс, интерфейс, параметрите на метода и референтната време. MGF поставя тази информация на опашка и след това призовава този метод в определено време. Необходими интерфейси трябва да наследяват от IDispatch и трябва да бъдат предоставени MGF. Примери за такива интерфейси имат IMediaControl, IMediaEventEx и IMediaPosition.Posle постановка екипи във всички MGF IDefferedCommand връща указател към интерфейса. Заявлението може да използва този интерфейс, за да отмени или modifkatsii екип.

Регистрира обект като услуга.

Този интерфейс е отговорен за разрешаване на конкуренцията за resursy.Filtry система може да използва този интерфейс да поискат ресурси, които могат да бъдат използвани от други обекти. Например, аудио рендиране (филтри, които възпроизвеждат аудио) използва този интерфейс за разрешаване на конфликти за аудио vyvoda.Prilozheniya устройство, обикновено, не използвайте този интерфейс.

Този интерфейс помощ за DirectShow не е описана.

Както можете да видите, много интерфейси. Поради тази причина, ние ще ги разгледаме по-подробно, само ако е необходимо.

Ще ни трябват още две интерфейси: IAMGraphBuilderCallback и IAMFilterGraphCallback. Първият от тях осигурява механизъм за обаждане в изграждането на графиката. За да го използвате трябва да се прилагат техники му в приложението или сайта на клиента. Попитайте за IFG в IObjectWithSize интерфейс и се обадете на метод IObjectWithSize :: SetSize, минавайки по изпълнението на този интерфейс показалка. IFG позовава методите на този интерфейс по време на изграждането на графиката, която (интерфейс) предоставя на клиента с цел модифициране на процеса на изграждане на графиката. Основната употреба на този интерфейс - Конфигуриране на филтъра VMR преди връзка. Може да се използва също за отказ използването на някои филтри (например, декодери). Spetsifichekie методи на този интерфейс - SelectedFilter (наречени когато MGF е кандидат филтър, но преди да създадете филтъра) и CreatedFilter (наречен след MGF създава филтър, но преди да се опитате да го свържете). Вторият интерфейс - IAMFilterGraphCallback, - също осигурява обаждане механизъм в изграждането на графиката. Ако изграждането на MGF на графика получава грешка при опит да се направи някои контакти, това е единственият метод, който UnableToRender интерфейс.

Така че, TFilterGraph клас е наследник на TComponent и IAMGraphBuilderCallback интерфейси, IAMFilterGraphCallback и IServiceProvider:

TFilterGraph = клас (TComponent, IAMGraphBuilderCallback, IAMFilterGraphCallback, IServiceProvider)

IFG може да работи в три режима - gmNormal, gmCapture и gmDVD. При използване на режим gmNormal създава COM-обект IGraphBuilder (FFilterGraph), като се използват gmCapture - създаване на COM-обекти ICaptureGraphBuilder2 (FCaptureGraph) и IGraphBuilder (FFilterGraph), като се използват gmDVD - COM-обект IDvdGraphBuilder (FDvdGraph). Нека първо да разгледаме тези интерфейси, и след това да продължат да изучават клас TFilterGraph.

Както вече беше посочено (виж таблица интерфейси предвидени MGF.), IGraphBuilder наследява от IFilterGraph (която осигурява основни операции - като добавянето на филтър графиката, или връзката между два контакта). и добавя методи за създаване на графика на частична информация (единственият метод - Render - да завърши автоматично за зададения изходящ контакт).

COM-обект "Строител граф улавяне" (Capture Graph Builder) прилага единен интерфейс - ICaptureGraphBuilder2 (за мен това остава неясен произход на името - може би той е заменил и разширена по-рано се използва за същите цели ICaptureGraphBuilder Interface), който осигурява методи за конструиране граф улавяне и други потребителски филтър графики. Като цяло, използването на поддържаща обект, който има свои собствени характеристики, но аз не мисля, че те трябва да се спре (би било хубаво да се разбере как това помощник-обект работи и дали е възможно да се направи без него).

И накрая, IDvdGraphBuilder използва, за да работи с, очевидно, DVD, но това е тема за друг разговор, и аз ще се опитам в бъдеще на DVD-то не се споменава изобщо.

По-голямата част от другите методи и съоръжения свойства TFilterGraph са свързани с обработката на съобщенията, получени от филтър графиката. Нека разгледаме как това се случи (най-малко, за да бъде в състояние да го правят сами, в случай на не DSPack, но директно DirectShow API). Така че, TFilterGraph клас частни сечения могат да бъдат намерени IMediaEventEx интерфейс (член FMediaEventEx). Ако активен филтър графика за управление (по метода на прилагане TFilterGraph.SetActive) метод QueryInterface се извиква за IMediaEventEx интерфейс. Сега е по-подробен интерфейс го докосване, но нека да започнем с IMediaEvent интерфейс (IMediaEventEx наследява и разширява своята функционалност). Така че, IMediaEvent интерфейс съдържа методи за връщане на уведомление от събития и манипулатори да заместват тези нотификации, предвидени по подразбиране MGF. Както вече бе споменато, интерфейсът е предоставена от IFG. Прилагането може да се използва за реакцията на събития, настъпили в колона филтър, като в края на поток или по грешка картографиране (изобразяване). Филтри събития се изпращат на филтър графиката използване IMediaEventSink интерфейс. За повече информация за събития, настъпили през филтър графиката е на стойност един поглед в съответните секции на помощта.

IMediaEvent интерфейс предоставя следните методи:

Връща уведомлението следващото събитие от опашката на съобщенията.

Връща събитието манипулатор за ръчно нулиране (ръчно нулиране събитието) (Ако сте забравили или не знаете какво е това, прочетете по MSDN или в Rihera), който остава зает (сигнализира), а на опашката съдържа известия за събития. MGF държи събитие ръчно нулиране, която отразява състоянието на опашката на съобщенията. Ако опашката съдържа известия за събития, събитие, ръчно нулиране е в оживен състояние. Ако опашката е празна, IMediaEvent на метод :: GetEvent нулира sobytie.Prilozhenie може да използва този случай, за да се определи състоянието на опашката. Първо, наречен метод GetEventHandle да се справя събития. След това е необходимо да се изчака за събитието ще влезе в алармено състояние, като се използват функции като WaitForSingleObject. След това е необходимо, за да получите известие seduyuschee събитие от опашката, като се обадите на IMediaEvent :: GetEvent. MGF държи събитие в сигнализира състояние, докато опашката е празна; след случай се изхвърля. Ние не трябва да се затвори дръжката, за да случай, че се връща по този метод, защото се използва в рамките на филтър графика. Не е необходимо да използвате дръжката след след освобождаването на IFG, защото в този случай тя дръжката не е валиден. (За да избегнете тази грешка, можете да дублирате DuplicateHandle предизвикателството на дръжката и да използвате това копие вместо оригинала След края на дръжка с дубликат на това да се затвори ..) Друг начин за наблюдение на опашката за прилагане съобщение - метод повикване IMediaEventEx :: SetNotifyWindow (това ще бъде обсъдено по-долу).

В очакване на филтър графиката обработва всички налични данни.

За да следите съобщенията трябва, обаче, повече ще се интересуват IMediaEventEx интерфейс, който наследява IMediaEvent интерфейс и, в допълнение, има методи за връщане на известия за събития и за първостепенни товарачи съобщения, предвидени по подразбиране MGF. IMediaEventEx разширява методи IMediaEvent интерфейс, които позволяват на прозореца на приложението ще получи доклади за събития в MGF. Пълен списък на конкретни системни съобщения може да бъде видяна тук. Ние се обръщаме към нови методи на IMediaEventEx. Има само три:

Връща контакт с идентификатор

Той уведомява филтър, който е свързан или наляво (?) Брой filtrov.Kogda MGF добавя филтър с филтър графиката, го нарича този метод с указател към себе си. филтър например е свързан с втория параметър. Когато MGF премахва филтъра от графиката, го нарича този метод, минавайки през указател към стойността на броя на нула. Приложения, този метод не трябва да се наричат. в графиката, за да добави филтър необходимо да наречем метод AddFilter интерфейс IFilterGraph, в резултат на IFG

Връща информация за филтъра

Връща низ, съдържащ информация за производителя

Това е, като цяло, и всичко, което исках да кажа за IBaseFilter интерфейс и, съответно, TFilter клас, тъй като последната реализира прости и очевидни неща, които трябваше да се нарича обвивка на този интерфейс. Ако се интересувате от подробностите на интерфейсите, посочени по-горе, или на техните методи, да ги гледате на MSDN.

TVideoWindow

IVideoWindow

В допълнение към методите, наследени от IDispatch, IVideoWindow интерфейс осигурява методите, описани в daleeiduschey плоча:

Както можете да видите, IVideoWindow интерфейс има много методи (координатите им, могат да бъдат намерени в една и съща MSDN'a), повечето от които са с кристално ясен смисъл, а само за някои (например, put_FullScreenMode) се характеризира с важни нюанси.

VMR прозорци Mode

Ето - VMR прозорци Mode

IVMR WindowlessControl9

IVMRWindowlessControl9 допълнение към методи, които са наследени от IUnknown, и също така осигурява следното:

VMR информира, че заявлението е получил съобщение за WM_DISPLAYCHANGE.Prilozhenie трябва да се обадите на този метод, когато получи съобщение прозорец на WM_DISPLAYCHANGE, но само в режим, ако VMR е в прозорци (без прозорци)

Връща режим съотношение на дисплея текущата аспект

Връща текущия цвят на границата използва VMR'om

Връща копие от настоящата картина показва VMR'om. Изображението се връща в препълнения Windows DIB формат. Този метод може да се нарече по всяко време, независимо от състоянието на филтъра. Отсрещната страна е отговорен за освобождаването на върнати памет чрез coTaskMemFree повикване. Използването на тази функция забавя възпроизвеждането

Задава режим съотношение дисплей текущата аспект

Видео Renderer Филтър

Таблицата по-долу описва свойствата на филтър за видео рендиране на:

Повече подробности, свързани с характеристиките на работата на филтъра и отстраняване на грешки подкрепа приложения quartz.dll трябва да изглежда в MSDN.

Видео Смесване Renderer Филтър 9

Имоти, методи и интерфейси за TVideoWindow

Клас TCustomContol има наследник TWinControl, така че е разбираемо, че TVideoWindow прави възможно, наред с други неща, да работи с него както с прозорец. Ние приемаме, че прародител на всичко това е ясно, и ще се фокусира върху интерфейси и IFilter IEvent. Те обявен за

Ние също така разглежда някои допълнителни интерфейси, които са важни за разбирането на процеса на дисплея. Сред тях - IVMRSurfaceAllocator, IVMRSurfaceAllocatorNotify, IVMRImagePresenter.

IVMRSurfaceAllocator

Интерфейсът се прилага IVMRSurfaceAllocator разпределител-водещ (разпределител-водещ), посочете филтъра по подразбиране VMR-7. Тя трябва да се изпълнява от всеки плъгин разпределител-водещ, че приложението осигурява филтър VMR-7. VMR-7 използва методи на този интерфейс за изолиране, получаването и освобождаване DirectDraw повърхност. Заявленията не използват този интерфейс. За VMR-9 се използва IVMRSurfaceAllocator9. В допълнение към методите за IUnknown, IVMRSurfaceAllocator интерфейс предоставя следните методи:

Подкрепете проекта - споделете линка, благодаря!