Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Windows'taki video yakalama yığını, DMFT biçiminde bir kullanıcı modu uzantısını destekler. Bu, IHV'lerin sağladığı cihaz başına uzantı bileşenidir ve yakalama işlem hattı, yakalama sonrası ilk dönüşüm olarak eklenir. DMFT, cihazdan son işleme tabi tutulmuş kareleri alır. Çerçeveler üzerinde daha fazla son işlem operasyonu DMFT içinde gerçekleştirilebilir. DMFT, cihazın tüm akışlarından çerçeve alabilir ve gereksinime göre herhangi bir sayıda çıkış akışını kullanıma açabilir.
Bu makalede, tüm akışlarda ortak işlem sonrası gerçekleştirmek için kullanılabilecek, kullanıcı modunda çalışan cihaz genelindeki bir uzantının tasarımı özetlenmiştir.
Terminoloji
| Süre | Açıklama |
|---|---|
| KS | Kernel Streaming sürücüsü |
| AVStream | Ses ve Video Akışı Sürücü Modeli |
| Filtre | Cihaz örneğini temsil eden nesne |
| Cihaz MFT | IHV'ler tarafından sağlanan kullanıcı modu yakalama sürücüsü uzantısı |
| Devproxy | MF <-> AVStream sıralayıcısı |
| DTM | Devproxy ve Device MFT'yi yöneten Device Transform Manager. MF işlem hattındaki cihazı temsil eder. |
Tasarım hedefleri
Cihaz Filtresi ile aynı yaşam süresine sahip cihaz filtresi genelinde kullanıcı modu uzantısı
Cihazdan gelen herhangi bir sayıda girişi destekler
Herhangi bir sayıda çıkışı destekler (mevcut gereksinim üç farklı akıştır: önizleme, kayıt ve fotoğraf)
Tüm cihaz denetimlerini Cihaz MFT'sine yönlendirir (isteğe bağlı olarak Cihaz MFT'si bunu işler veya cihaza aktarır)
Yakalanan akışın paralel sonrası işleme
Kare hızından bağımsız olarak 3A işlenmesine izin ver
Bir akıştan alınan meta verilerin diğer akışlar arasında paylaşılmasına izin ver
GPU kaynaklarına erişim
MF MMCSS İş Kuyruklarına Erişim
MF Dağıtıcıya Erişim
Basit arabirim (MFT'ye benzer)
IHV/OEM genişletilebilirliği için esnek iç mimari
Tasarım kısıtlamaları
Yakalama API'sinin yüzeyinde değişiklik yok
Geriye dönük uyumluluğu tamamlayın. Örneğin, eski uygulamalar ve senaryolarla çalışırken regresyon olmaz.
Yakalama yığını mimarisi
Bu makalede, yakalama sürücüsüne filtre genelinde kullanıcı modu uzantısı desteği açıklanmaktadır. Bu bileşenin MF API'lerine, iş parçacığı havuzlarına, GPU'ya ve ISS kaynaklarına erişimi vardır. Genişletilmiş filtre uzantısı, kendisi ile cihazın Ks filtresi arasında herhangi bir sayıda akışa sahip olma esnekliği sağlar. Bu esneklik, ayrılmış meta veriler ve 3A işleme akışları için kullanılabilen kullanıcı modu uzantısı ve sürücü arasında bant dışı sorunsuz iletişim sağlar.
Cihaz Dönüştürme Yöneticisi (DTM)
Yakalama yığını, sistem tarafından sağlanan yeni bir bileşen olan Cihaz Dönüşüm Yöneticisi'ni (DTM) tanıtır. Bu, DeviceSource'ta bulunur ve Devproxy MFT ile Cihaz MFT'lerini yönetir. DTM MediaType anlaşması, örnek yayma ve tüm MFT olay işleme işlemlerini yapar. Ayrıca, DEVICESource ve DeviceSource'un cihaz akışlarını yönetmek için ihtiyaç duyduğu diğer gerekli özel arabirimler için IMFTransform arabirimini kullanıma sunar. Bu bileşen Devproxy ve Device MFT'yi işlem hattından soyutlar. İşlem hattı, DTM'yi cihaz olarak görür ve DTM'den gelen akışları cihaz akışları olarak kabul eder.
Devproxy
Devproxy, AVStream kamera sürücüsü ile Media Foundation arasındaki komutlar ve video karelerini düzenleyen zaman uyumsuz bir MFT'dir. Bu, Windows tarafından sağlanır ve kamera sürücüsünden gelen n sayıda çıkışı destekler. Ayrıca, cihaz tarafından kullanıma sunulan tüm pinlerin ayırıcılarını bu yönetir.
Cihaz MFT
Cihaz MFT, yakalama sürücüsünün kullanıcı modu uzantısıdır. Bu, m x n boyutunda bir zaman uyumsuz MFT'dir. Yakalama sürücüsüne sahip sistemde yüklüdür ve yakalama sürücüsü satıcısı tarafından sağlanır.
Cihaz MFT'sinin giriş akışlarının sayısı, cihaz tarafından kullanıma sunulan Ks pin sayısıyla aynı olmalıdır. Cihaz MFT'sinin giriş akışları tarafından desteklenen medya türleri, KS pinleri tarafından sunulan medya türleriyle aynı olmalıdır.
Device MFT tarafından kullanıma sunulan çıkış akışlarının sayısı, DeviceSource, yakalama yığını, yakalama API'si ve uygulamalar tarafından görülen akışlar olup bir, iki veya üç akış olabilir. Cihaz MFT'sinin giriş ve çıkış akışı sayılarının aynı olması gerekmez. Ayrıca, giriş ve çıkış akışlarının aynı medya türlerine sahip olması gerekmez ve genellikle farklı medya türleri vardır. Medya türlerinin sayısı da eşleşmez.
Devproxy'nin çıkış akışı tarafından kullanıcı modunda temsil edilen ilk Ks Pini, Cihaz MFT'sinin ilk giriş akışıyla, Devproxy'nin çıkış akışı tarafından kullanıcı modunda temsil edilen ikinci Ks Pini ile cihaz MFT'sinin ikinci giriş akışıyla vb. ilişkilendirilir.
Cihaz MFT'ye, Devproxy, DX cihazı ve MF WorkQueue Kimliği için bir işaretçi verilir. Cihazdan çıkan çerçeveler doğrudan ilgili Cihaz MFT'sinin girişine MF Örnekleri olarak aktarılır. Tüm bunlar sayesinde, Cihaz MFT yakalanan örnekleri son işleme tabi tutabilir ve örnekleri önizleme, kayıt ve fotoğraf pinlerine sağlayabilir.
Cihaza giden tüm komutlar ve denetimler Cihaz MFT'sine yeniden yönlendirilir. Cihaz MFT kontrolleri işler veya Devproxy aracılığıyla sürücüye yönlendirir. Bu, yakalama sürücüsü yığını tarafından komut işlemeyi kolaylaştırır.
İşlevsel genel bakış
Yakalama işlem hattının başlatılmasında, cihaz için bir Cihaz MFT'si varsa, DeviceSource DTM örneği oluşturur. Cihazı temsil eden devproxy örneğini DTM'nin başlatma yordamına geçirir. DTM, Cihaz MFT'sini birlikte oluşturur ve temel doğrulamalar gerçekleştirir, örneğin Devproxy'nin çıkış pinlerinin sayısının Cihaz MFT'sinin giriş pin sayısıyla aynı olduğunu, zorunlu arabirimler için destek vb. olduğunu doğrular.
DeviceSource desteklenen çıktı medya türlerini almak için DTM'yi sorgular. DTM bunu Cihaz MFT'lerinin çıkış pinlerinden alır. DeviceSource, bu bilgilere dayalı olarak Sunu Tanımlayıcısı ve Akış Tanımlayıcısı'nı yakalama işlem hattında kullanıma sunar.
SourceReader, DeviceSource'un kullanıma sunulan medya türlerini kullanır ve her akışta varsayılan medya türlerini ayarlar. DeviceSource da DTM'nin çıkış akışlarında varsayılan medya türlerini ayarlar. DTM, SetOutputStreamState yöntemini kullanarak Cihaz MFT'sinin çıkış akışında medya türünü ayarlar.
SetOutputStreamState çağrıldığında, Cihaz MFT, giriş akışının medya türünü seçili çıkış medya türüne göre değiştirmek için DTM'ye bir ileti gönderir ve bekler. Bu iletiye yanıt olarak DTM, GetPreferredInputStreamState kullanarak Cihaz MFT'sinin giriş akışı için tercih edilen giriş medya türünü sorgular. Bu, ortam türünü Devproxy'nin ilgili çıkış akışında ayarlar. Bu başarılı olursa, DTM aynı medya türünü SetInputStreamState kullanarak Cihaz MFT'sinin giriş akışına ayarlar. Bu çağrıyı aldıktan sonra Cihaz MFT'si SetOutputStreamState'i tamamlar.
CaptureEngine, DeviceSource'ta belirli akışları etkinleştirerek tek tek akışları seçer. Bu, SetOutputStreamState çağrısı aracılığıyla DTM tarafından Cihaz MFT'sine yayılır. Cihaz MFT belirli çıkış akışlarını istenen duruma getirir. Yukarıda belirtildiği gibi, Cihaz MFT ayrıca etkinleştirilmesi gereken gerekli giriş akışlarını DTM'ye bildirir. Bu, DTM'nin akış seçimini Devproxy'ye yaymasıyla sonuçlanıyor. Bu işlemin sonunda, Devproxy ve Device MFT'de gerekli tüm akışlar akışa hazır olur.
CaptureEngine ReadSample'i çağırdığında SourceReader DeviceSource'u başlatır. Buna karşılık, DeviceSource işlem hattının başlangıcını belirten MFT_MESSAGE_NOTIFY_BEGIN_STREAMING ve MFT_MESSAGE_NOTIFY_START_OF_STREAM iletileri göndererek DTM'yi başlatır. DTM, MFT_MESSAGE_NOTIFY_BEGIN_STREAMING ve MFT_MESSAGE_NOTIFY_START_OF_STREAM iletileri yayarak Devproxy ve Cihaz MFT'lerini başlatır.
Uyarı
Akış başlatıldığında, Cihaz MFT'sinin başlatılması yerine gerekli kaynakları ayırın.
DTM, Akış durumu parametresiyle Cihaz MFT'sinin çıkışlarında SetOutputStreamState'i çağırır. Cihaz MFT bu çıkış akışlarında yayına başlar. DTM, geçerli medya türü kümesine sahip Devproxy çıkış akışlarında akışı başlatır. Devproxy örnekleri ayırır ve cihazdan getirir. Bu örnekler ilgili giriş pininde Cihaz MFT'sine aktarılır. Cihaz MFT bu örnekleri işler ve çıkışı DeviceSource'a verir. DeviceSource'tan örnekler SourceReader üzerinden CaptureEngine'e akar.
CaptureEngine, DeviceSource'ta bir iç arabirim aracılığıyla tek tek akışları devre dışı bırakarak tek tek akışları durdurur. Bu, SetOutputStreamState aracılığıyla Cihaz MFT'sinde devre dışı bırakılan belirli bir çıkış akışına çevrilir. Cihaz MFT de METransformInputStreamStateChanged olayı aracılığıyla belirli giriş akışlarını devre dışı bırakma isteğinde bulunabilir. DTM bunu ilgili Devproxy akışlarına yayar.
Cihaz MFT'sinin kendisi akış durumunda olduğu sürece, herhangi bir giriş akışının geçerli DeviceStreamState'in herhangi birine geçişini isteyebilir. Örneğin, diğer akışları etkilemeden DeviceStreamState_Stop, DeviceStreamState_Run veya DeviceStreamState_Pause gibi durumlara ve benzerlerine göndermek mümkündür.
Ancak, çıkış akışının geçişi yakalama işlem hattı tarafından denetlenir. Örneğin, önizleme, kayıt ve fotoğraf akışları yakalama işlem hattı tarafından etkinleştirilir veya devre dışı bırakılır. Çıkışlar devre dışı bırakıldığında bile, Cihaz MFT'sinin kendisi akış durumunda olduğu sürece bir giriş akışı yine de akışta olabilir.
MFT cihazının ömrü
KS Filtresi oluşturulduktan sonra cihazın MFT'si yüklenir. KS Filtresi kapatılmadan önce boşaltılır.
İşlem hattı açısından bakıldığında DeviceSource oluşturulduğunda Cihaz MFT'si oluşturulur ve DeviceSource kapatıldığında Cihaz MFT'si zaman uyumlu bir şekilde kapatılır.
Kapatmayı desteklemek için Cihaz MFT'sinin IMFShutdown arabirimini desteklemesi gerekir. Cihaz MFT-Shutdown> çağrıldıktan sonra, Cihaz MFT'sine yapılan diğer arabirim çağrıları MF_E_SHUTDOWN hatası döndürmelidir.
Bellek türü
Çerçeveler, kamera sürücüsünün tercihine göre sistem bellek tamponlarına veya DX bellek tamponlarına yakalanabilir. Kamera sürücüsünden çıkan arabellek, daha fazla işlem için doğrudan Cihaz MFT'sine beslenir.
Devproxy, arabellekleri sürücünün tercihlerine göre ayırır. Cihaz MFT'sinin yerinde olmayan dönüşümler için çıkış pinleri için gereken örnekleri ayırmak amacıyla MF ayırıcı API'lerinden faydalanmasını istiyoruz.
Akış sırasında medya türü değişikliği
SourceReader istemcileri, Cihaz MFT'sinin çıkış akışları tarafından kullanıma sunulan medya türlerini yerel olarak desteklenen medya türleri olarak görebilir. Yerel medya türü değiştirildiğinde SourceReader, DeviceSource aracılığıyla Cihaz MFT'sine mediatype bildirim çağrıları gönderir. Bu akışın kuyruğundaki bekleyen tüm örnekleri temizlemek ve bu akıştaki yeni medya türüne zamanında geçiş yapmak, Cihaz Medya Akışı Dönüştürücüsü'nün (MFT) sorumluluğundadır. Giriş medya türünü değiştirmek için bir gereklilik varsa, mevcut giriş medya türünü o yeni türle değiştirmelidir. DTM, Cihaz MFT'sinin giriş akışından geçerli medya türünü alır ve her yerel medya türü değişikliğinden sonra Devproxy'nin çıkış akışlarında ve Cihaz MFT'sinin girişinde ayarlar.
Cihaz MFT'sinde Giriş Medya türü değişikliği
Bu bir m x n MFT olduğundan, çıkış akış pin'inin medya türleri veya durumu değiştiğinde giriş akış pin'inin medya türlerinde ve durum değişikliğinde yansımalar olabilir. Özellikle aşağıdaki değişiklikler gerçekleştiğinde:
Çıktı Medya Türü değişiklikleri
Bir uygulama yerel medya türünü değiştirdiğinde, bu değişiklik yakalama yığını üzerinden Cihaz MFT'ye kadar çıkış pini medya türü değişimi olarak zincirleme yayılır.
Çıktı medya türü değiştiğinde, bir giriş medya türü değişikliği tetikleyebilir. Örneğin, tüm çıkış pinlerinin 720p'de akış yapmakta olduğunu varsayalım. Bu, kameradan 720p'de akış yapılmasına yol açtı. Ardından, kayıt akışının yerel medya türünü 1080p'ye değiştirdiğini varsayın. Bu durumda, kayıt akışına veri getiren Cihaz MFT giriş akışlarından birinin medya türünü değiştirmesi gerekir.
Çıkış pini devre dışı bırakıldı
- Bir uygulama, aynı giriş birden fazla çıkış tarafından paylaşıldığında Cihaz MFT'sinin çıkışlarından birini devre dışı bırakırsa, iyileştirme için girişin medya türünü değiştirmesi gerekebilir. Örneğin, 1080p çıkış akışı durursa ve bir girişi paylaşan diğer tüm akışlar 720p'de akış halindeyse, giriş akışı güç tasarrufu yapmak ve performansı geliştirmek için medya türünü 720p olarak değiştirmelidir.
DTM, bu koşullar altında Cihaz MFT girişi ve Devproxy çıkışındaki medya türünü ve durumunu değiştirmek için Cihaz MFT'sinden METransformInputStreamStateChanged bildirimlerini işler.
Cihaz MFT'sinin tercih edilen çıktı medya türleri
Cihaz MFT'sinin NV12 biçimini kullanarak çıkış medyası türleri oluşturmasını öneririz. YUY2 bir sonraki en iyi alternatiftir. MJPEG ve RGB medya türleri önerilmez.
Cihaz MFT'lerini Temizleme
Cihaz MFT'si yönetilirken iki tür temizleme gerekir:
Genel temizleme
Cihaz bazlı MFT genelinde temizleme işlemi. Bu durum genellikle DTM, Cihaz MFT'sine akış durdurma iletisi göndermek üzere olduğunda gerçekleşir.
Cihaz MFT'nin giriş ve çıkış kuyruklarından tüm örnekleri atması ve senkronize olarak dönmesi beklenir.
Cihazın MFT'si yeni giriş istememeli veya mevcut çıkış için bildirim göndermemelidir.
Yerel temizleme
- Çıkış pinine özgü boşaltma. Bu genellikle bir akış durdurulduğunda gerçekleşir.
Temizlemeden önce gönderilen tüm olaylar Cihaz MFT Yöneticisi tarafından silinir. Temizleme işleminden sonra Cihaz MFT'si iç METransformHaveOutput izleme sayısını sıfırlar.
Cihaz MFT'sinin Boşaltın
Cihaz MFT, canlı yakalama kaynağında drenaja gerek olmadığından ayrı bir drenaj iletisi almasına gerek yoktur.
Fotoğraf tetikleyicisi
Bu modelde, fotoğraf tetikleyicisini ve fotoğraf dizisi başlatma ve durdurma tetikleyicilerini doğrudan sürücüye göndermek yerine Cihaz MFT'sine yönlendirilirler. Cihazın MFT'i tetikleme sinyalini işler veya gerektiğinde kamera sürücüsüne iletir.
Sıcak başlangıç
DeviceSource, belirli bir çıkış akışını "warm start" yapmaya çalışırken akışı duraklatma durumuna geçirir. Buna karşılık DTM, belirli bir çıkış akışını duraklatma durumuna geçmek için Cihaz MFT'sindeki IMFDeviceTransform::SetOutputStreamState yöntemini çağırır. Bu, karşılık gelen giriş akışının duraklatılmasıyla sonuçlanabilir. Bu, Cihaz MFT'sinin DTM'ye METransformInputStreamStateChanged isteğinde bulunarak ve IMFDeviceTransform::SetInputStreamState yöntemini işleyerek elde edilir.
Değişken fotoğraf dizisi
Bu mimariyle fotoğraf dizisi kamera cihazı sürücüsü ve Cihaz MFT'siyle uygulanarak kamera cihaz sürücüsünün karmaşıklığını büyük ölçüde azaltır. Başlatma ve durdurma fotoğraf dizisi tetikleyicileri, Device MFT'ye gönderilir ve fotoğraf dizisini daha kolay yönetir.
Fotoğraf onayı
Cihaz MFT,IMFCapturePhotoConfirmation arabirimi aracılığıyla fotoğraf onayını destekler. İşlem hattı bu arabirimi IMFGetService::GetService yöntemi aracılığıyla alır.
Meta veriler
Devproxy, meta veri arabelleği boyutu için sürücüyü sorgular ve meta veriler için belleği ayırır. Te sürücüsünden gelen meta veriler örnekte Devproxy tarafından ayarlanır. Cihaz MFT, örneğin meta verilerini tüketir. Meta veriler, çıktı akışı aracılığıyla veri örneği ile aktarılabilir ya da son işlem için kullanılabilir.
Cihaz MFT'sinin herhangi bir sayıda girişi desteklemesiyle, ayrılmış bir giriş pini yalnızca meta veriler veya bant dışı meta veriler için kullanılabilir. Bu pinin medya türü özeldir ve arabelleklerin boyutuna ve sayısına sürücü karar verir.
Bu meta veri akışı DTM'nin ötesinde kullanıma sunulur. Cihaz MFT akışı başladığında akış akış durumuna geçirilebilir. Örneğin, akış için çıkış akışları seçildiğinde, Device MFT , METransformInputStreamStateChanged olayını kullanarak DTM'den bir veya daha fazla video akışı başlatmasını ve meta veri akışını da isteyebilir.
Not: Giriş pinlerinin sayısının bu modeldeki çıkış pinlerinin sayısıyla eşleşmesi gerekmez. Meta veriler veya 3A için ayrılmış ayrı bir pin olabilir.
Cihaz Dönüştürme Yöneticisi (DTM) olay işleme
Cihaz Dönüştürme Yöneticisi olayları aşağıdaki başvuru makalelerinde tanımlanmıştır:
IMFDeviceTransform arabirimi
IMFDeviceTransform arabirimi, Cihaz MFT'siyle etkileşime geçmek için tanımlanır. Bu arabirim m giriş ve n çıkış Cihaz MFT'sinin yönetimini kolaylaştırır. Diğer arabirimlerle birlikte Cihaz MFT'sinde de bu arabirimin uygulanması gerekir.
Genel olay iletimi
Devproxy'de (veya cihazın içinde) bir olay oluştuğunda, bunu Cihaz MFT'sine ve DeviceSource'a yaymalıyız.
Cihaz MFT gereksinimleri
Arabirim gereksinimleri
Cihaz MFT'lerinin aşağıdaki arabirimleri desteklemesi gerekir:
-
Bu, tüm ksproperties, olaylar ve yöntemlerin Device MFT’den geçmesine olanak tanır. Bu, Cihaz MFT'sinin bu işlev çağrılarını Cihaz MFT'si içinde işlemesini veya yalnızca sürücüye iletmesini sağlar. KsEvent yöntemlerini işlemesi durumunda, Cihaz MFT'sinin aşağıdaki adımları yapması gerekir:
Cihaz MFT herhangi bir KSEVENT_TYPE_ONESHOT olayını işlerse, KSEVENT_TYPE_ENABLE aldığında tanıtıcıyı yineler.
Olayı ayarladığında veya tetiklediğinde, çoğaltılmış tanıtıcıda CloseHandle'ı çağırır.
Cihaz MFT'si KSEVENT_TYPE_ONESHOT olmayan olayları işlerse, ks olayı devre dışı bırakıldığında KSEVENT_TYPE_ENABLE aldığında tanıtıcıyı yinelemeli ve ilk parametre (ks olay kimliği) ve ikinci parametre (olay uzunluğu) sıfır olarak ayarlanmış KsEvent işlevini çağırarak yinelenen tanıtıcıda CloseHandle çağrısı yapmalıdır. Olay verileri ve uzunluğu geçerlidir. Olay verileri belirli bir ks olayını benzersiz olarak tanımlar.
Cihaz MFT KSEVENT_TYPE_ONESHOT olmayan olayları işlerse, KSEVENT_TYPE_ENABLE aldığında tanıtıcıyı yinelemeli ve tüm parametreler sıfır olarak ayarlanmış KsEvent işlevini çağırarak Ks olayları devre dışı bırakıldığında yinelenen tanıtıcılarda CloseHandle çağrısı yapmalıdır.
Bildirim gereksinimleri
Cihaz MFT'leri örneklerin kullanılabilirliği, herhangi bir giriş akışı durumu değişikliği vb. hakkında DTM'ye bilgi vermek için aşağıdaki iletileri kullanmalıdır.
İş parçacığı gereksinimleri
Cihaz MFT kendi iş parçacıklarını oluşturmamalıdır. Bunun yerine, IMFRealTimeClientEx arabirimi aracılığıyla DMFT'ye geçirilen kimlik temelinde ayrılan Media Foundation çalışma kuyruklarını kullanmalıdır. Bu, Cihaz MFT'sinde çalışan tüm iş parçacıklarının, yakalama işlem hattının çalıştığı doğru önceliğe sahip olmasını sağlamak ve iş parçacığı öncelik tersine dönüşlerini önlemektir.
InputStream gereksinimleri
Akış sayısı
- Cihaz MFT'sindeki giriş akışlarının sayısı, sürücü tarafından desteklenen akış sayısıyla aynı olmalıdır.
MediaTypes
Ortam türleri sayısı ve Cihaz MFT'si girişinin desteklediği gerçek medya türleri, sürücünün desteklediği ortam türleri ve bunların sayısıyla eşleşmelidir.
Sayı yalnızca Cihaz MFT'sinin girişi tarafından desteklenen medya türleri, sürücü tarafından desteklenen medya türlerinin bir alt kümesiyse farklı olabilir.
Cihaz MFT'sinin sürücüsü ve girişi tarafından desteklenen medya türleri standart veya özel medya türleri olabilir.
Cihaz MFT'sini kaydetme
Kamera cihazı INF'sinin, Cihaz MFT'sinin CoClass'ının CLSID'sini belirten aşağıdaki cihaz arabirimi girdisine sahip olması gerekir.
[CaptureAvstrm.Device.NTarm.Interfaces]
AddInterface = %KSCATEGORY_VIDEO_CAMERA%, %Capture.FilterDescBack%, Capture.FilterBack
[Capture.FilterBack]
AddReg = Capture.FilterBack.AddReg, PinNames.AddReg
[Capture.FilterBack.AddReg]
HKR,,FriendlyName,,%Capture.FilterDescBack%
HKR,,CameraDeviceMftClsid,,%CameraDeviceMFT.Clsid%
Bu INF girdileri aşağıdaki kayıt defteri anahtarlarının girilmiş olmasına neden oldu:
Uyarı
Bu yalnızca bir örnektir (gerçek kayıt defteri anahtarı değildir)
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceClasses\{E5323777-F976-4f5b-9B55-B94699C46E44}\##?#USB#VID_045E&PID_075D&MI_00#8&23C3DB65&0&0000#{E5323777-F976-4f5b-9B55-B94699C46E44}\#GLOBAL\Device Parameters]
"CLSID"="{17CCA71B-ECD7-11D0-B908-00A0C9223196}"
"FriendlyName"="USB Video Device"
"CameraDeviceMftClsid"="{3456A71B-ECD7-11D0-B908-00A0C9223196}"<<< Device MFT CoClass ID >>>
Cihaz MFT zincirleme
Cihaz MFT, Windows'ta kamera işlevselliğini genişletmek için IHV'ler ve OEM'ler için önerilen kullanıcı modu eklenti mekanizmasıdır.
Windows 10, sürüm 1703'e geçmeden önce kamera işlem hattı yalnızca bir DMFT uzantısı eklentisini destekliyor.
Windows 10, sürüm 1703'ten itibaren, Windows kamera işlem hattı, en fazla iki DMFT'yi içerebilen isteğe bağlı bir DMFT zincirini destekler.
Windows 11, sürüm 22H2 itibarıyla, Windows kamera veri hattı, en fazla dört DMFT içerebilen opsiyonel bir DMFT zincirini destekler.
Bu, OEM'ler ve IHV'ler için, işlem sonrası kamera akışları biçiminde değer katma olanağı sağlamak için daha fazla esneklik sağlar. Örneğin, bir cihaz IHV DMFT ve OEM DMFT ile birlikte PDMFT kullanabilir.
Aşağıdaki şekilde, bir DMFT zinciri içeren mimari gösterilmektedir.
Kamera sürücüsünden DevProxy'ye giden örnekleri yakalayın, ardından DMFT zincirlerini inceleyin. Zincirdeki her DMFT örneği işleme şansına sahiptir. DMFT örneği işlemek istemiyorsa, aktarım görevi görerek örneği doğrudan sonraki DMFT'ye geçirebilir.
KsProperty gibi denetimler için çağrı akışa geçer; zincirdeki son DMFT çağrıyı önce alır. Çağrı burada işlenebilir veya zincirdeki önceki DMFT'ye geçirilebilir.
Hatalar DMFT'den DTM'ye ve ardından uygulamalara yayılır. IHV/OEM DMFT'leri için DMFT'lerden herhangi biri örnek oluşturamıyorsa, DTM için önemli bir hatadır.
DMFT'ler için gereksinimler:
DMFT'nin giriş pin sayısı, önceki DMFT'nin çıkış pin sayısıyla eşleşmelidir. Aksi takdirde DTM başlatma sırasında başarısız olur. Ancak, aynı DMFT'nin giriş ve çıkış pini sayılarının eşleşmesi gerekmez.
DMFT'nin arabirimleri desteklemesi gerekiyor - IMFDeviceTransform, IMFShutdown, IMFRealTimeClientEx, IKsControl ve IMFMediaEventGenerator; Yapılandırılmış MFT0 varsa veya zincirdeki bir sonraki DMFT için IMFTransform desteği gerekiyorsa IMFTransform'un desteklenmesi gerekebilir.
Çerçeve Sunucusu kullanmayan 64 bit sistemlerde hem 32 bit hem de 64 bit DMFT'ler kaydedilmelidir. Bir USB kamerasının rastgele bir sisteme takılabileceği göz önüne alındığında, "harici" (veya sistemle birlikte gelmeyen) USB kameralar için, USB kamera satıcısının hem 32 bit hem de 64 bit DMF'ler sağlaması gerekir.
DMFT zincirini yapılandırma
Kamera cihazı isteğe bağlı olarak gelen kutusu USBVideo.INF'nin bölümlerini kullanan özel bir INF dosyası kullanarak DLL'de bir DMFT COM nesnesi sağlayabilir.
Özel .INF dosyasının "Interface AddReg" bölümünde, aşağıdaki kayıt defteri girdisini ekleyerek DMFT CLSID'lerini belirtin.
CameraDeviceMftCLSIDChain (REG_MULTI_SZ) %Dmft0.CLSID%,%Dmft.CLSID%,%Dmft2.CLSID%
Aşağıdaki örnek INF ayarlarında gösterildiği gibi (%Dmft0.CLSID% ve % Dmft1.CLSID% DMFTs'leriniz için kullandığınız gerçek CLSID dizeleriyle değiştirin), Windows 10'da izin verilen en fazla 2 CLSID vardır, sürüm 1703 ve ilki DevProxy'ye en yakın olan ve sonuncusu zincirdeki son DMFT'dir.
Platform DMFT CLSID: {3D096DDE-8971-4AD5-98F9-C74F56492630}.
Bazı örnek CameraDeviceMftCLSIDChain ayarları:
IHV/OEM DMFT veya Platform DMFT yok
- CameraDeviceMftCLSIDChain = "" (veya bu kayıt defteri girdisini belirtmeniz gerekmez)
IHV/OEM DMFT
- CameraDeviceMftCLSIDChain = %Dmft. CLSID%
Platform DMFT <-> IHV/OEM DMFT
CameraDeviceMftCLSIDChain = "{3D096DDE-8971-4AD5-98F9-C74F56492630}",%Dmft. CLSID%
İşte bir Platform DMFT ve zincirdeki bir DMFT (GUID {D671BE6C-FDB8-424F-81D7-03F5B1CE2CC7} ile) içeren bir USB kamera için sonuç kayıt anahtarının ekran görüntüsü.
IHV/OEM DMFT0 <-> IHV/OEM DMFT1
- CameraDeviceMftCLSIDChain = %Dmft0.CLSID%,%Dmft1.CLSID%,
Uyarı
CameraDeviceMftCLSIDChain en fazla 2 CLSID'ye sahip olabilir.
CameraDeviceMftCLSIDChain yapılandırılırsa, eski CameraDeviceMftCLSID ayarları DTM tarafından atlanır.
CameraDeviceMftCLSIDChain yapılandırılmadıysa ve eski CameraDeviceMftCLSID yapılandırıldıysa, ardından zincir (USB kamerasıysa ve Platform DMFT tarafından destekleniyorsa ve Platform DMFT etkinse) DevProxy <–> Platform DMFT <–> OEM/IHV DMFT veya (kamera Platform DMFT tarafından desteklenmiyorsa veya Platform DMFT etkin değilse) DevProxy <-> OEM/IHV DMFT gibi görünür.
Örnek INF dosyası ayarları:
[USBVideo.Interface.AddReg]
HKR,,CLSID,,%ProxyVCap.CLSID%
HKR,,FriendlyName,,%USBVideo.DeviceDesc%
HKR,,RTCFlags,0x00010001,0x00000010
HKR,,EnablePlatformDmft,0x00010001,0x00000001
HKR,,DisablePlatformDmftFeatures,0x00010001,0x00000001
HKR,,CameraDeviceMftCLSIDChain, 0x00010000,%Dmft0.CLSID%,%Dmft1.CLSID%
Cihaz MFT'lerinin COM nesnesi ve MFT kaydı
Sürücü COM nesnesini genel olarak kaydetmek yerine, sürücü COM nesnesi cihaz anahtarı altında kaydedilir. Bu, MFT COM kaydının kapsayıcının içinden yapılmasını sağlar ve genel kayıt defteri anahtarlarının oluşturulmasını önler ve böylece sürücü paketi yalıtımını korur. MFT'ler cihaz anahtarı altında da benzer nedenlerle kaydedilir.
Sürücü INF'sinde yapılan değişiklikler
Cihaz sürücüsü yüklemesi sonrasında, INF artık cihaz anahtarı altında tüm COM nesnesi ve MFT kayıtlarını yapmalıdır. MFT ve COM kayıtları burada gösterildiği gibi değiştirilmelidir:
MFT kayıtları
| Önce | Sonra |
|---|---|
| INF AddReg: HKCR, MediaFoundation\Transforms\{clsid}\... |
Per-Instance cihaz yazılımı INF AddReg: HKR, MediaFoundation\Transforms\{clsid}\... |
| Kayıt Defteri Konumu: HKLM\SOFTWARE\Classes\MediaFoundation\Transforms\{clsid}\... |
Kayıt Defteri Konumları: yazılım anahtarı\MediaFoundation\Transforms\{clsid}\... |
COM kayıtları
Windows 26100 ve sonraki sürümlerde, Cihaz MFT'leri için tüm COM kayıtları INF'de AddComServer/AddComClass yönergelerini kullanmalıdır. Burada bir söz dizimi örneği gösterilmiştir:
[AvsCamera.COM]
AddComServer = AvsCameraMFT,,AvsCamera.COMInstall
[AvsCamera.COMInstall]
ServerType = 1; in-proc
ServerBinary = %13%\AvsCameraDMFT.dll
AddComClass = %DMFT.CLSID%,, AvsCamera.COMClassInstall
[AvsCamera.COMClassInstall]
ThreadingModel = Both
Description = %AvsCamera.ComServerDescription%
Device MFT COM Kaydı'nın önceki sürümleri, COM sınıfını el ile yüklemek için AddReg kullanıyordu.
| Önce | Sonra |
|---|---|
| INF AddReg: HKLM,Software\Classes\CLSID\{clsid}\... HKCR,CLSID\{clsid}\... HKCR,Wow6432Node\CLSID\{clsid}\... HKCR,WowAA32Node\CLSID\{clsid}\... |
Per-Instance cihaz yazılımı INF AddReg: HKR,Classes\CLSID\{clsid}\... HKR,Classes\CLSID\{clsid}\... HKR,Classes\Wow6432Node\CLSID\{clsid}\... HKR,Classes\WowAA32Node\CLSID\{clsid}\... |
İşletim sistemi sürümüne göre ayırmaya yönelik INF söz dizimi , platform uzantılarını işletim sistemi sürümleriyle birleştirme bölümünde bulunabilir. Windows 11 25300'den başlayarak, INF'nin bu yeni kayıt defteri anahtarlarıyla uyumlu olması gerekir. Eski işletim sistemi sürümleri, uyumluluk için geleneksel kayıt defteri anahtarlarını kullanır. INF'nin bu kayıt defteri anahtarlarını eski işletim sistemi derlemelerinde eski konumda ayarlaması ve yeni işletim sistemi derlemeleri için yeni konumlarında yeni anahtarları oluşturması gerekir. Örneğin, daha eski bir derlemedeki MFT kaydı için INF, anahtarı aşağıdaki kayıt defteri girdisi altında oluşturur:
HKLM\SOFTWARE\Classes\MediaFoundation\Transforms\{clsid}\
Yeni bir derlemede MFT kaydı için INF, anahtarı aşağıdaki kayıt defteri girdisi altında oluşturur:
**software key**\MediaFoundation\Transforms\{clsid}\
Bu giriş , yazılım anahtarının bir cihazın yazılım anahtarını temsil ettiği yeri tanımlar.
Daha fazla bilgi için bkz. Cihazın yazılım anahtarını açma.
Farklı işletim sistemi sürümlerini hedeflemeye ilişkin söz dizimi örneği burada gösterilmiştir:
[Manufacturer]
%Msft% = Msft, NTamd64,NTamd64.10.0...25300
; -------------- ;
; Models Section ;
; -------------- ;
; Targets old builds
[Msft.NTamd64]
%DeviceDesc% = ExampleDDInstall_Old, ExampleHardwareId
[ExampleDDInstall_Old]
AddReg = MFT_Registration_Old
[MFT_Registration_Old]
; INF work for older build here
; Windows 10 build with build number equal to or greater than 25300
[msft.ntamd64.10.0...25300]
%DeviceDesc% = ExampleDDInstall_New, ExampleHardwareId
[ExampleDDInstall_new]
AddReg = MFT_Registration_new
[MFT_Registration_new]
; INF work for newer build here