BDA (Broadcast Driver Architecture) - czy ktoś próbował?

0

Witam :)

Chyba trafiłem na temat, którego jeszcze nikt nigdy na forum Delphi nie poruszał. Otóż mam sobie kartę DVB - taką satelitarną - do komputera. Mogę sobie oglądać kanały TV i wszystko byłoby spoko, ale żaden istniejący soft mnie nie satysfakcjonuje. W efekcie chciałbym napisać coś, co mogłoby gadać z moją kartą i było bardziej dopasowane do moich potrzeb.

Ktokolwiek z tu obecnych bawił się w tworzenie czegokolwiek pod BDA? Microsoft udostępnia dokumentację: http://msdn.microsoft.com/en-us/library/dd695086(v=VS.85).aspx#CommunityContent ale nie powiem, żeby jakoś rewelacyjna była - są braki (m.in. obsługa DiSEqC, podobno PBDA wprowadza presyłanie ich binarnie - RAW, ale słowem o tym nie pisnęli). Dodatkowo sam filtr odpowiadający za parsowanie strumienia DVB jest znany ze swojej kiepskości, wolnego działania i awaryjności, w efekcie wypadałoby napisać własny, choćby prosty parser dla podstawowych informacji (wyciąganie PID-ów/SID-ów etc.)

Czy mamy wśród nas programistów pod tego typu urządzenia? Ja jestem bardziej zorientowany w samym przekazie satelitarnym, programowanie słabiej. Może jakieś porady, jak zacząć - tj. stworzyć graf, dogadać się z kartą, jakieś propozycje od osób bardziej doświadczonych?

0

Nie jestem ekspertem, ale spotykałem się na różnych forach z opiniami i to osób bardziej
doświadczonych, że w Delphi da się napisac niemal wszystko, ale niestety nie sterowniki.
Lecz z BDA się nie spotkałem, może i można coś jednak przy pomocy tego coś wymodzić.

0

Nie chodzi o sam sterownik, tylko o program korzystający z tej architektury sterowników (tj. BDA) wprowadzonej przez Microsoft. Jest kilka projektów Open Source, ale w większości albo nie skończone, albo porzucone. Takim najbardziej rozwiniętym pod Delphi jest DC DVB Source: http://www.dsp-worx.de/?n=11

Niestety temat jest dla wąskiej grupy osób, bo nie dość, że trzeba mieć PC wyposażony w kartę DVB i dostęp do sygnału, to jeszcze jednocześnie wiedzę programistyczną - dlatego obawiam się, że nie jest za wiele takich projektów.

Ktoś się spotkał z podobnymi projektami?

0

Coś temat nie chwyta [???] Naprawdę nikt z forum nigdy nie próbował poeksperymentować z BDA? Brak sprzętu? Delphi pozwala na tworzenie tego typu programów - co najmniej dwa ze znanych aplikacji do współpracy z kartami DVB jest napisana w Delphi: AltDVB i DVB Dream.

Proszę pomóżcie coś :-( Może od innej strony - jak zabrać się za analizowanie skromnej dokumentacji ze stron Microsoftu? Tam kodzą w C#, C++ albo Visual Basicu - jak to przetłumaczyć do Delphi? Jak korzystać z tych skrawków, żeby poskładać do kupy coś działającego w Delphi? Tu: http://msdn.microsoft.com/en-us/library/dd693791(v=VS.85).aspx jest przykładowo opisany TuningSpace dla DVB-S, czyli telewizji satelitarnej, ale jak do tego dobrać się z poziomu Delphi - dodanie czegoś w uses to pewnie za mało?

Poprawiony link pod dokumentację MS - poprzednio ucięło kawałek, mam nadzieję, że teraz jak dam w tagach URL będzie ok...
http://msdn.microsoft.com/en-us/library/dd695086(v=VS.85).aspx#CommunityContent

0

Po pobieżnym zerknięciu na strony i trafieniu np. na ten fragment

The IEnumTuningSpaces interface is implemented on a standard COM collection of tuning space objects

wiec wygląda, że potrzebujesz do tego odpowiednie pliki IDL ewentualnie nagłówki .h

PS. Znalazłem dla Ciebie trochę kodów źródłowych
http://mheg2xmltv.googlecode.com/svn/trunk/dcdvbsource/Source/Shared/MPEG/

0

Dzięki za podpowiedź, kod to wspomniany wcześniej DC DVB Source - chyba jedyny taki projekt OS pod Delphi (a przynajmniej wujek Google nic w tej sprawie więcej nie mówi).

Wcześniej o tym nie wspomniałem, ale trochę bawiłem się kodem DC DVB, niestety autor porzucił ten projekt (życie - brak czasu na zabawę). Całość jest oparta na kilku zewnętrznych bibliotekach/komponentach:

  • FastMM
  • Delphi ZLib
  • XML Parser i TrayIcon z pakietu JEDI

Ostatnia wersja to 0.17, leży na CVS (o ile CVS działa, ja to ściągnąłem w całości jakieś 2 lata temu, od tego czasu na CVS nie było żadnych zmian). Nigdy nie udało mi się jej skompilować - wprowadzenie Unicode do Delphi kompletnie rozwaliło kod źródłowy, część jest do przepisania. Dodatkowo w kilku miejscach nowe wersje komponentów wymienionych wyżej poprzez zmiany takżę zaburzyła zgodność ze źródłami z CVS. Być może większe szanse na skompilowanie tego byłyby na Delphi 7 + szukając starszych wersji bibliotek użytych przez autora DC DVB.

Mimo wszystko dopadłem wersję skompilowaną w 2006 roku przez kogoś i... działa ona ze zmiennym szczęściem - mam dwa różne modele kart DVB od różnych producentów. Z jedną DC DVB działa, z drugą nie ;)

Samo DC DVB ma dość rozbudowany kod źródłowy, a do tego wymaga wielu przeróbek, poprawek i rozbudowy, ale przypuszczalnie nie pozostanie mi nic innego, jak powoli analizować tamten kod, jednocześnie z dokumentacją od M$... Jako że temat raczej nie chwycił przypuszczam, że nikt z tu obecnych się za coś takiego nie zabierał [???]

W sumie nawet być może byłbym skłonny załatwić komuś chętnemu kartę DVB na testy, pod warunkiem, że ma dostęp do anteny satelitarnej, ma jakieś blade pojęcie o TV Sat, dużo wolnego czasu, wystarczającą wiedzę (czyli ktoś z dużym doświadczeniem/stażem tu na forum) i chęć do zmierzenia się z problemem, pomocy w temacie. Ale to nie dział ogłoszeń [wstyd]

Póki co jakby ktoś wpadł na ślad jakiegoś kodziku, tudzież źródełek programu komunikującego się z satelitarną kartą telewizyjną, to proszę się śmiało dzielić. Jak dokopę się na HDD, mogę też podzielić się tym zrzutem z CVS ostatniej (niekompilowalnej już) wersji DC DVB ;)

0

Mam tuner (SkyStar2) tylko zastanawiam się czego nie ma np. w takim ProgDVB a co chciałbyś sam napisać?

0

Moim ideałem jest AltDVB, ale jego autor przepadł 3 lata temu bez wieści. Sam AltDVB jest (był) pisany w Delphi, kod źródłowy niestety zamknięty. Czas mija i program powoli odstaje od obecnych czasów, pomijając szereg drobnych błędów (ciągłe Error in DVBEngine_Free) choćby nie wspiera dźwięku AAC.

Testowałem całe tony oprogramowania, od DVB Dream przez DVBViewer, MyTheatre, ProgDVB, SmartDVB, SkyView i kilka pomniejszych i nie znalazłem nic, co by było bliskie możliwościom i wygodzie AltDVB (a poza tym, gdyby mieć nad tym pieczę, to możnaby dodać wiele nowych fajnych ficzerów ;) ). Mój ideał to program, który służy do oglądania, ale jednocześnie pozwala na mocno techniczne podejście, wyświetla wiele dodatkowych informacji ze strumienia DVB + ma w miarę intuicyjny UI.

Jeśli czegoś nie ma, to trzeba to zrobić ;) Póki co mierzę siły, szukam przykładów, ale z tymi przykładami to słabo. Orientuję się ogólnie w Delphi i w C#, ale w obydwu na poziomie hobbystycznym (szczególnie specjalizuję się w rozbudowanych if-ach o dużym poziomie skomplikowania i wielu poziomach, co owocuje dużym wskaźnikiem WTF/min jak znajomi programiści przeglądają moje "dzieła" [rotfl] ).

<offtop>W C# dokopałem się do dwóch przyzwoitych przykładów, wprawdzie żaden z nich nie działa w 100% jak powinien, ale daje mi ogląd na sytuację w C# - DirectShow.Net Lib mocno ułatwia tam sytuację, jeden z przykładów jest dostarczany razem z tą biblioteką</offtop>

Każda podpowiedź mile widziana, dzięki za podchwycenie tematu ;)

0

tu masz bdatest w delphi:

http://rapidshare.com/files/399394233/BdaTest.zip

(potrzebny dspack, ale to pewnie posiadasz).

0

O! Genialny sample - prosty i jasny, generalnie wszystko tam rozumiem (łącznie z obecnością parametrów 4fun.tv i VIVY Polska ;-) ), ale trochę za późno teraz na zabawę - chcę tylko bardzo podziękować - już widzę, że to mi sporo pomoże [browar] Ogromny skok do przodu! W ciągu dnia pomieszam tym i zobaczę co mi się uda wymodzić ;-)

Jeszcze raz dzięki!

0

HA! To znowu ja, ale w wersji zarejestrowanej :-P

Chcę podzielić się doświadczeniami z innymi userami w kwestii powyższego sample - aby poszerzać wiedzę ;)

Siedzę na Delphi 2009, w związku z czym DSPack należy zdobyć stąd: http://www.songbeamer.com/delphi/
Ma on zmienioną nazwę jednego unitu - DSUtil na DSUtils. To bardzo ważne, bo w samplu wyżej w uses jest DSUtil - bez zmiany na DSUtils się pod D2009/2010 nie skompiluje.

Siedzę na Windows 7, od Vista SP1 zaszły zmiany w MPEG-2 Demultiplexerze, w efekcie ma on inny układ PIN-ów i nie będzie obrazu/dźwięku. Póki co ja zrobiłem tak:

  • dorobiłem sobie rozpoznanie wersji OS, dla ułatwienia póki co olałem Vistę i jeśli jest wersja inna niż 6.1 (czyli nie Windows 7), to robię po staremu, na XP działa, chociaż coś o tym napiszę dalej, a na Windows 7 dokonałem zmian.

Zamiast:

put_NetworkType(GUIDToString(CLSID_DVBSNetworkProvider));

Wywołuję:

put_NetworkType('B2F3A67C-29DA-4c78-8831-091ED509A475');

Wyjaśnienie: DVBSNetworkProvider został porzucony przez MS, niby działa, ale więcej problemów z MPEG-2 Demultiplexerem jest później, dla ułatwienia więc stosuję CLSID Microsoft Network Provider, wpisany ręcznie (pewnie można go dodać do DSUtils, ale po co się męczyć :-P )

Zamiast:

  Log('Render Video', fGraph.Render(GetOutPin(fDemultiplexer, 1)));
  Log('Render Audio', fGraph.Render(GetOutPin(fDemultiplexer, 2)));

Wywołuję:

  Log('Render Video', fGraph.Render(GetOutPin(fDemultiplexer, 2)));
  Log('Render Audio', fGraph.Render(GetOutPin(fDemultiplexer, 3)));

Wyjaśnienie: Z tego co dokopałem się w sieci za obraz i dźwięk odpowiadają w nowym MPEG-2 Demultiplexerze PIN-y 3 i 4 (czyli 2 i 3 licząc od zera). W sumie nie wnikałem w to, na pierwszym ustawieniu nie miałem nic, a na drugim ruszyło, więc zakładam, że trafiłem dobrze :-P

Zamiast:

   _UnmapPIDs(1); // video
   _UnmapPIDs(2); // audio

Wywołuję:

   _UnmapPIDs(2); // video
   _UnmapPIDs(3); // audio

Wyjaśnienie: bo to powoduje, że cokolwiek się Unmapuje przy zmianie kanału i nie sypie błędem, co znaczy, że pewnie trafiłem :-P Możliwe, że ma być po prostu to samo, co wyżej.

Zamiast:

   _MapPID(1, VideoPID); // video
   _MapPID(2, AudioPID); // audio

Wywołuję:

   _MapPID(2, VideoPID); // video
   _MapPID(3, AudioPID); // audio

Wyjaśnienie: działa, widać tak ma być :-P

Uwaga dodatkowa: w zależności od modelu karty może być wymagane przesyłanie dodatkowych danych, póki co przy wysyłaniu Tune Request do karty leci: częstotliwość, SR, modulacja i polaryzacja, ale idę o browara, że przykładowo produkty Hauppauge będą chcieć też FEC, w zależności od potrzeb można więc dorzucić:

    Log('Put Inner FEC',                IDVBSLocator(fLocator).put_InnerFEC(BDA_BCC_RATE_3_4));
    Log('Put Inner FEC Rate',           IDVBSLocator(fLocator).put_InnerFECRate(BDA_BCC_RATE_3_4));
    Log('Put Outer FEC',                IDVBSLocator(fLocator).put_OuterFEC(BDA_BCC_RATE_3_4));
    Log('Put Outer FEC Rate',           IDVBSLocator(fLocator).put_OuterFECRate(BDA_BCC_RATE_3_4));

(tu ustawia siłowo na FEC = 3/4, aby to było po bożemu - należałoby zrobić combobox z FEC, mi w każdym razie to potrzebne nie było - tylko rzucam jak to miałoby wyglądać, możliwe też dodanie innych parametrów, nie tylko FEC)

Póki co mam drobne problemy - obserwuję, że mapuje u mnie dodatkowo jakieś PID-y hugon wie skąd wytrzaśnięte. O ile na Windows 7 to się nie objawia niczym, poza dodatkowym wpisem w UnmapPIDs w logu (dodatkowy Video i Audio, od innego kanału z tej częstotliwości), o tyle w Windows XP demultiplexer działa wyraźnie wolniej i w efekcie przy pierwszym mapowaniu po starcie na chwilę wyświetla to co trzeba, ale później przerzuca się na inny kanał z tej samej częstotliwości i trzeba jeszcze raz go wywołać. Nie wiem skąd te PID-y dla starcie się biorą, możliwe, że wprowadzone przeze mnie zmiany to spowodowały, szukam rozwiązania we własnym zakresie (ale jakby ktoś przypuszczał co zwaliłem, to podpowiedź mile widziana :-) ).

Przy poszukiwaniach w sieci natrafiłem na sporo narzekań na MPEG-2 Demultiplexer i TIF (BDA MPEG2 Transport Information Filter) od Microsoftu - że słabo opisane i wolne. Działanie TIF sprowadza się do parsowania danych z karty DVB jak rozumiem. Mam skromne doświadczenie w parsowaniu danych binarnych z pliku i dobrze znam normę DVB. Być może powinienem najpierw sam próbować "pogadać" z tunerem w komputerze? Rozważam to, bo trzeba przyznać, że AltDVB posiada bardzo dobry, ale własny parser i widać, że jest on napisany bardzo profesjonalnie, bo jest odporny na sytuację, gdy jest przykładowo bardzo słaby sygnał. Większość aplikacji (jak DVB Dream) w takiej sytuacji olewa strumień danych, a AltDVB mieli go do timeoutu, wyciągając maksymalnie tyle danych, ile da się odczytać z uszkodzonego strumienia. Obawiam się, że Microsoftowy TIF jest napisany "olewczo", unikając problematycznych sytuacji, a wolałbym jednak, żeby "mój" TIF umiał sobie z tym poradzić, dlatego rozważam samodzielną analizę tematu na początku - myślę, że to sensowna droga ;-) Jak sobie nie poradzę - zawsze jest Microsoftowy TIF :)

Zerkałem też sporo na sample z C# i chyba w tamtym dziale założę podobny temat - zbierający dostępne kody źródłowe i komentujący znaleziska. Może to się komuś przydać przy okazji oprócz mnie ;)

0

a można by prosić ten bdatest.zip wrzucić na jakiś inny serwer (rs wyrzuca, że chce premium)? z góry dzięki.

0

Przy poszukiwaniach w sieci natrafiłem na sporo narzekań na MPEG-2 Demultiplexer i TIF (BDA MPEG2 Transport Information Filter) od Microsoftu - że słabo opisane i wolne.

Zgadza się, mikrosoftowy MPEG-2 Demultiplexer nie nadaje się do kanałów jakości HD.
(Kanały gdzie audio jest czasowo przesunięte względem video, przycinają.)

W celu otrzymania płynnego obrazu musisz wykonać własny demultiplexer.
Niestety nie znalazłem w sieci kodu parsera TS->PES pod Delphi, tylko C lub C++.

Dużo konkretów znajdziesz w SVN do aplikacji mediaportal.
http://www.team-mediaportal.com/

1 użytkowników online, w tym zalogowanych: 0, gości: 1