|
From: Vaclav S. <vac...@ma...> - 2002-06-08 22:33:55
|
Cau,
nejak jsem na to pozapomnel... :(
Trida reprezentujici jeden snimek:
----------------------------------
// podporovane formaty obrazu:
enum VideoFormat
{
FORMAT_RGB24, // tenhle musi umet kazdy filtr
FORMAT_UV12 // tenhle by mely umet taky, ale nemusi
};
interface IVideoFrame
{
// Vytvori prazdny snimek. Pokud uz objekt nejaka data obsahoval,
// zahodi je
void Create(width, height, format);
// Rozmery snimku
unsigned GetWidth(), GetHeight();
// or-kombinace formatu obrazu, ktere jsou momentalne k dispozici
// - pouzivat prednoste ty, ktere to vrati!
int GetFormats();
// Vrati read-only obrazovy buffer (tj. odkaz na pole pixelu) ve
// vyzadanem formatu. Pokud neni jeden z GetFormats(), provede
// konverzi
const byte* GetData(VideoFormat format);
// Vraci pointer na *zapisovatelny* buffer pixelu. Muze vratit
// NULL, pokud neni zapis povolen. @see GetWCopy
byte* GetWData(VideoFormat format);
// Zamykani/odemykani snimku. Do zamknuteho snimku nelze zapisovat
// (GetWData vraci NULL)
void Lock();
void Unlock();
// Vrati zapisovatelnou instanci snimku. Pokud je objekt odemceny,
// vrati sebe sama, jinak udela kopii.
// Pouziti:
// void DoSomething(IVideoFrame *img) {
// IVideoFrame *i =3D img->GetWCopy(FORMAT_RGB24);
// byte* buffer =3D i->GetWData(FORMAT_RGB24);
// buffer[0] =3D buffer[1] =3D buffer[2] =3D 0xFF; // whatever...
// }
IVideoFrame* GetWCopy(VideoFormat format);
};
Rozhrani pro *jednoduche* filtry a prechody:
--------------------------------------------
(toto je zaklad pro implementace filtru behem prazdnin)
class SimpleFilter
{
IVideoFrame *DoProcess(IVideoFrame *in) =3D 0;
};
class SimpleTransition
{
IVideoFrame *DoProcess(IVideoFrame *a, IVideoFrame *b,=20
unsigned pos, unsigned length) =3D 0;
};
Reprezentace vstupnich kanalu modulu:
-------------------------------------
(aspon takhle jsem to pochopil...)
Vstup je reprez. portem, port je maly objekt s informacemi o=20
charakteristikach prislusneho hrany v grafu toku dat (obsahuje=20
vlastne metadata k datum tekoucim tou hranou - pocet snimku, FPS,=20
=2E..). Jak to funguje:
1. pri inicializaci modul vytvori porty: (pseudokod)
in_ports[0] =3D create_video_port()
in_ports[1] =3D create_video_port()
in_ports[2] =3D create_audio_port()
Nenastavuje jim zadne parametry...
2. pote planovac (resp. nejaka vnejsi cast OpenVIP jadra, ktera se
stara o vybudovani site) naplni tem portum metadata podle toho,
k cemu jsou v grafu toku dat pripojeny:
m2.in_ports[0].setFramesCnt(module1.out_ports[0].getFramesCnt())
m2.in_ports[0].setFPS(module1.out_ports[0].getFPS())
...
Tj. o tohle se modul nemusi vubec starat, mame pozadovany stav kdy
modul nevi nic o okolni siti
3. Kdyz modul potrebuje zjistit na jake FPS je vstup nebo jak je
dlouhy, zepta se portu (getFPS(), ...) a ten vrati hodnoty, ktere
se mu predaly v predchozim kroku
Tj. port je vlastne jenom hloupy vec na zapamatovani si par hodnot...
|