Tshawb xyuas lub cav Mediastreamer2 VoIP. Ntu 11

Cov ntaub ntawv ntawm tsab xov xwm yog muab los ntawm kuv zen channel.

Tshawb xyuas lub cav Mediastreamer2 VoIP. Ntu 11

Cov ntaub ntawv txav mechanism

  • Cov ntaub ntawv thaiv dblk_t
  • Message mblk_t
  • Kev ua haujlwm rau kev ua haujlwm nrog cov lus mblk_t
  • Queue_t
  • Kev ua haujlwm rau kev ua haujlwm nrog queues queue_t
  • Txuas cov ntxaij lim dej
  • Teeb liab taw tes ntawm cov ntaub ntawv ua graph
  • Hauv qab ntawm qhov kev ua ub no ntawm ticker
  • Bufferizer (MSBufferizer)
  • Muaj nuj nqi rau kev ua haujlwm nrog MSBufferizer

Thaum kawg Tshooj peb tau tsim peb tus kheej lim. Kab lus no yuav tsom mus rau cov txheej txheem sab hauv rau kev txav cov ntaub ntawv ntawm media streamer lim. Qhov no yuav tso cai rau koj sau cov ntxaij lim dej uas tsis tshua muaj siab nrog kev siv zog tsawg dua yav tom ntej.

Cov ntaub ntawv txav mechanism

Cov ntaub ntawv txav mus rau hauv media streamer yog ua los ntawm cov kab uas tau piav qhia los ntawm cov qauv kab_t. Cov hlua ntawm cov lus zoo li mblk_t, uas lawv tus kheej tsis muaj cov ntaub ntawv teeb liab, tab sis tsuas yog txuas mus rau yav dhau los, cov lus tom ntej thiab rau cov ntaub ntawv thaiv. Tsis tas li ntawd, kuv xav tshwj xeeb tshaj yog hais tias tseem muaj ib daim teb rau ib qhov txuas mus rau cov lus ntawm tib hom, uas tso cai rau koj los npaj ib tug singly linked npe ntawm cov lus. Peb yuav hu rau ib pawg ntawm cov lus sib koom ua ke los ntawm cov npe zoo li tuple. Yog li, txhua lub caij ntawm cov kab tuaj yeem yog ib qho lus mblk_t, thiab tej zaum lub taub hau ntawm cov lus tuple mblk_t. Txhua cov lus tuple tuaj yeem muaj nws tus kheej pawg ntseeg cov ntaub ntawv thaiv. Peb yuav tham txog vim li cas tuples xav tau me ntsis tom qab.

Raws li tau hais los saum toj no, cov lus nws tus kheej tsis muaj cov ntaub ntawv thaiv; hloov, nws tsuas yog muaj tus taw tes rau thaj chaw nco qhov chaw khaws cia. Hauv seem no, tag nrho cov duab ntawm cov xov xwm streamer txoj haujlwm yog nco txog lub qhov rooj warehouse nyob rau hauv lub tas luav "Monsters, Inc.," qhov twg lub qhov rooj (txuas mus rau cov ntaub ntawv - chav) txav ntawm ib tug insane ceev nrog overhead conveyors, thaum lub chav lawv tus kheej. nyob twj ywm motionless.

Tam sim no, txav mus raws hierarchy los ntawm hauv qab mus rau sab saum toj, cia peb xav txog hauv kev nthuav dav cov npe ntawm cov ntaub ntawv xa tawm mechanism hauv xov xwm streamer.

Cov ntaub ntawv thaiv dblk_t ib

Cov ntaub ntawv thaiv muaj ib lub header thiab cov ntaub ntawv tsis. Lub header tau piav qhia los ntawm cov qauv hauv qab no,

typedef struct datab
{
unsigned char *db_base; // Указатель на начало буфер данных.
unsigned char *db_lim;  // Указатель на конец буфер данных.
void (*db_freefn)(void*); // Функция освобождения памяти при удалении блока.
int db_ref; // Счетчик ссылок.
} dblk_t;

Cov teb ntawm cov qauv muaj cov taw qhia rau qhov pib ntawm qhov tsis, qhov kawg ntawm qhov tsis, thiab kev ua haujlwm rau kev tshem tawm cov ntaub ntawv tsis. Cov ntsiab lus kawg hauv header db_ref - cov ntaub ntawv pov thawj, yog tias nws nce mus txog xoom, qhov no yog lub teeb liab kom tshem tawm qhov thaiv ntawm lub cim xeeb. Yog tias cov ntaub ntawv thaiv tau tsim los ntawm kev ua haujlwm datab_alloc() , ces cov ntaub ntawv tsis yuav muab tso rau hauv lub cim xeeb tam sim ntawd tom qab lub header. Hauv lwm qhov xwm txheej, qhov tsis tuaj yeem nyob ib qho chaw sib cais. Cov ntaub ntawv tsis yuav muaj cov qauv teeb liab lossis lwm cov ntaub ntawv uas peb xav ua nrog cov ntxaij lim dej.

Ib qho piv txwv tshiab ntawm cov ntaub ntawv thaiv yog tsim los ntawm kev ua haujlwm:

dblk_t *datab_alloc(int size);

Raws li kev nkag siab parameter, nws tau muab qhov loj ntawm cov ntaub ntawv uas lub thaiv yuav khaws cia. Ntau lub cim xeeb raug faib nyob rau hauv thiaj li yuav tso lub header - qauv - thaum pib ntawm lub cim xeeb faib datab. Tab sis thaum siv lwm txoj haujlwm, qhov no tsis tas yuav tshwm sim; qee zaum, cov ntaub ntawv tsis tuaj yeem nyob sib cais los ntawm cov ntaub ntawv thaiv header. Thaum tsim cov qauv, cov teb tau teeb tsa kom nws daim teb db_base ua taw tes rau qhov pib ntawm cov ntaub ntawv cheeb tsam, thiab db_lim mus txog qhov kawg. Txuas suav db_ref yog teem rau ib. Cov ntaub ntawv ntshiab muaj nuj nqi pointer yog teem rau xoom.

lus mblk_t

Raws li tau hais tseg, cov ntsiab lus kab yog hom mblk_t, nws yog txhais raws li nram no:

typedef struct msgb
{
  struct msgb *b_prev;   // Указатель на предыдущий элемент списка.
  struct msgb *b_next;   // Указатель на следующий элемент списка.
  struct msgb *b_cont;   // Указатель для подклейки к сообщению других сообщений, для создания кортежа сообщений.
  struct datab *b_datap; // Указатель на структуру блока данных.
  unsigned char *b_rptr; // Указатель на начало области данных для чтения данных буфера b_datap.
  unsigned char *b_wptr; // Указатель на начало области данных для записи данных буфера b_datap.
  uint32_t reserved1;    // Зарезервированное поле1, медиастример помещает туда служебную информацию. 
  uint32_t reserved2;    // Зарезервированное поле2, медиастример помещает туда служебную информацию.
  #if defined(ORTP_TIMESTAMP)
  struct timeval timestamp;
  #endif
  ortp_recv_addr_t recv_addr;
} mblk_t;

Qauv mblk_t muaj cov taw qhia thaum pib b_prev, b_ tom ntej, uas yog tsim nyog los npaj ib daim ntawv txuas ob npaug (uas yog ib kab kab_t).

Ces los tus pointer b_cont, uas tsuas yog siv thaum cov lus yog ib feem ntawm tuple. Rau cov lus kawg hauv tuple, tus pointer no tseem tsis tau.

Tom ntej no peb pom tus taw tes rau cov ntaub ntawv thaiv b_datap ib, uas cov lus muaj nyob. Nws yog ua raws los ntawm taw tes rau thaj tsam hauv cov ntaub ntawv thaiv cov ntaub ntawv tsis. Teb b_rptr ua qhia qhov chaw los ntawm cov ntaub ntawv los ntawm qhov tsis yuav nyeem. Teb b_wptr qhia qhov chaw uas sau rau qhov tsis yuav ua.

Cov chaw seem yog cov kev pabcuam xwm txheej thiab tsis cuam tshuam nrog kev ua haujlwm ntawm cov ntaub ntawv hloov chaw.

Hauv qab no yog ib lo lus nrog lub npe m1 thiab cov ntaub ntawv thaiv d1.
Tshawb xyuas lub cav Mediastreamer2 VoIP. Ntu 11
Daim duab hauv qab no qhia tau hais tias ib tuple ntawm peb cov lus m1, m1 1, m1 2.
Tshawb xyuas lub cav Mediastreamer2 VoIP. Ntu 11

Kev xa xov muaj nuj nqi mblk_t

Xov xwm tshiab mblk_t tsim los ntawm kev ua haujlwm:

mblk_t *allocb(int size, int pri); 

nws muab cov lus tshiab hauv nco mblk_t nrog cov ntaub ntawv thaiv ntawm qhov loj me loj, thib ob sib cav - pri tsis siv nyob rau hauv no version ntawm lub tsev qiv ntawv. Nws yuav tsum nyob zero. Thaum lub sijhawm ua haujlwm, lub cim xeeb yuav raug faib rau cov qauv ntawm cov lus tshiab thiab cov haujlwm yuav raug hu mblk_init(), uas yuav rov pib dua txhua qhov chaw ntawm qhov tsim piv txwv ntawm cov qauv thiab tom qab ntawd, siv cov lus hais saum toj no datab_alloc(), yuav tsim cov ntaub ntawv tsis. Tom qab ntawd cov teb hauv cov qauv yuav raug teeb tsa:

mp->b_datap=datab;
mp->b_rptr=mp->b_wptr=datab->db_base;
mp->b_next=mp->b_prev=mp->b_cont=NULL;

Ntawm qhov tso zis peb tau txais cov lus tshiab nrog cov teb pib thiab cov ntaub ntawv tsis muaj khoob. Txhawm rau ntxiv cov ntaub ntawv rau cov lus, koj yuav tsum luam nws mus rau cov ntaub ntawv thaiv tsis pub:

memcpy(msg->b_rptr, data, size);

qhov twg cov ntaub ntawv yog tus taw tes rau cov ntaub ntawv qhov chaw, thiab loj - lawv qhov loj me.
Tom qab ntawd koj yuav tsum hloov kho tus pointer mus rau qhov chaw sau ntawv kom nws rov qab mus rau qhov pib ntawm thaj chaw dawb hauv qhov tsis:

msg->b_wptr = msg->b_wptr + size

Yog tias koj xav tsim cov lus los ntawm qhov tsis muaj tam sim no, tsis tas luam, ces siv cov haujlwm:

mblk_t *esballoc(uint8_t *buf, int size, int pri, void (*freefn)(void*)); 

Kev ua haujlwm, tom qab tsim cov lus thiab cov qauv ntawm cov ntaub ntawv thaiv, yuav teeb tsa nws cov taw qhia rau cov ntaub ntawv ntawm qhov chaw nyob buf ua. Cov. Nyob rau hauv cov ntaub ntawv no, cov ntaub ntawv tsis yog nyob tom qab lub header teb ntawm cov ntaub ntawv thaiv, raws li tau zoo raws li cov ntaub ntawv thaum tsim ib cov ntaub ntawv thaiv nrog lub functionality. datab_alloc(). Qhov tsis nrog cov ntaub ntawv dhau mus rau qhov muaj nuj nqi yuav nyob qhov twg nws nyob, tab sis nrog kev pab los ntawm cov pointers nws yuav txuas mus rau lub tshiab tsim header ntawm cov ntaub ntawv thaiv, thiab hais tias, raws li, rau cov lus.

Rau ib qho lus mblk_t Ntau cov ntaub ntawv thaiv tuaj yeem sib txuas ua ke. Qhov no yog ua los ntawm kev ua haujlwm:

mblk_t * appendb(mblk_t *mp, const char *data, int size, bool_t pad); 

mp - cov lus uas lwm cov ntaub ntawv thaiv yuav raug ntxiv;
cov ntaub ntawv - taw tes rau qhov thaiv, ib daim qauv uas yuav muab ntxiv rau cov lus;
loj - cov ntaub ntawv loj;
ncoo - tus chij uas qhov luaj li cas ntawm lub cim xeeb faib yuav tsum tau ua raws li 4-byte ciam teb (padding yuav ua tiav nrog xoom).

Yog hais tias muaj qhov chaw txaus nyob rau hauv cov ntaub ntawv uas twb muaj lawm tsis, ces cov ntaub ntawv tshiab yuav muab pasted qab cov ntaub ntawv twb muaj. Yog hais tias muaj tsawg qhov chaw dawb nyob rau hauv cov lus cov ntaub ntawv tsis tshaj loj, ces cov lus tshiab yog tsim nrog ib tug txaus buffer loj thiab cov ntaub ntawv yog theej rau nws tsis. Qhov no yog cov lus tshiab, txuas mus rau qhov qub uas siv lub pointer b_cont. Hauv qhov no, cov lus hloov mus ua ib tug tuple.

Yog tias koj xav tau ntxiv lwm qhov thaiv cov ntaub ntawv rau tuple, ces koj yuav tsum siv cov haujlwm:

void msgappend(mblk_t *mp, const char *data, int size, bool_t pad);

nws yuav pom cov lus kawg hauv tuple (nws muaj b_cont yuav null) thiab yuav hu rau lub luag haujlwm rau cov lus no appendb().

Koj tuaj yeem pom qhov loj ntawm cov ntaub ntawv hauv cov lus lossis tuple siv cov haujlwm:

int msgdsize(const mblk_t *mp);

nws yuav voj los ntawm tag nrho cov lus nyob rau hauv lub tuple thiab xa tag nrho cov ntaub ntawv nyob rau hauv cov ntaub ntawv buffers ntawm cov lus. Rau txhua cov lus, tus nqi ntawm cov ntaub ntawv yog xam raws li hauv qab no:

 mp->b_wptr - mp->b_rptr

Txhawm rau muab ob lub tuples, siv cov haujlwm:

mblk_t *concatb(mblk_t *mp, mblk_t *newm);

nws appends lub tuple tshiab mus rau tus Tsov tus tw mp thiab rov qab ib tus taw tes rau cov lus kawg ntawm qhov tshwm sim tuple.

Yog tias tsim nyog, tuple tuaj yeem hloov mus rau hauv ib qho lus nrog ib qho thaiv ntawm cov ntaub ntawv; qhov no yog ua los ntawm kev ua haujlwm:

void msgpullup(mblk_t *mp,int len);

yog hais lus len yog -1, ces qhov luaj li cas ntawm cov faib tsis yog txiav txim siab. Yog len yog tus lej zoo, tsis muaj qhov loj me no yuav raug tsim thiab cov ntaub ntawv tuple yuav raug theej rau hauv nws. Yog hais tias qhov tsis pub dhau, kev luam tawm yuav tsum nres. Thawj cov lus ntawm tuple yuav tau txais qhov loj me me nrog cov ntaub ntawv theej. Cov lus uas tseem tshuav yuav raug muab tshem tawm thiab lub cim xeeb rov qab mus rau lub heap.

Thaum rho tawm cov qauv mblk_t kev suav suav ntawm cov ntaub ntawv thaiv yog muab rau hauv tus account yog tias, thaum hu dawb ( ) nws hloov tawm mus rau xoom, ces cov ntaub ntawv tsis yog deleted nrog rau cov piv txwv mblk_t, uas taw tes rau nws.

Pib lub teb ntawm cov lus tshiab:

void mblk_init(mblk_t *mp);

Ntxiv lwm daim ntaub ntawv rau cov lus:

mblk_t * appendb(mblk_t *mp, const char *data, size_t size, bool_t pad);

Yog hais tias cov ntaub ntawv tshiab tsis haum rau hauv qhov chaw dawb ntawm cov ntaub ntawv xov xwm tsis, ces cov lus sib cais tsim nrog ib qho tsis ntawm qhov xav tau loj yog txuas rau cov lus (tus taw tes rau cov lus ntxiv yog teeb tsa hauv thawj cov lus) thiab lus hloov mus ua ib tug tuple.

Ntxiv ib daim ntawv rau ib tuple:

void msgappend(mblk_t *mp, const char *data, size_t size, bool_t pad); 

Lub luag haujlwm hu appendb() hauv ib lub voj.

Muab ob tuples rau hauv ib qho:

mblk_t *concatb(mblk_t *mp, mblk_t *newm);

lus tshiab yuav txuas rau mp.

Ua ib daim qauv ntawm ib qho lus:

mblk_t *copyb(const mblk_t *mp);

Ua kom tiav kev luam ntawm tuple nrog tag nrho cov ntaub ntawv thaiv:

mblk_t *copymsg(const mblk_t *mp);

Cov ntsiab lus ntawm tuple yog theej los ntawm kev ua haujlwm copyb().

Tsim ib qho yooj yim luam ntawm cov lus mblk_t. Hauv qhov no, cov ntaub ntawv thaiv tsis tau theej, tab sis nws cov ntaub ntawv siv tau nce ntxiv db_ref:

mblk_t *dupb(mblk_t *mp);

Ua ib daim qauv ntawm ib tug tuple. Cov ntaub ntawv thaiv tsis tau theej, tsuas yog lawv cov ntaub ntawv siv tau nce ntxiv db_ref:

mblk_t *dupmsg(mblk_t* m);

Gluing tag nrho cov lus ntawm ib tug tuple rau hauv ib qho lus:

void msgpullup(mblk_t *mp,size_t len);

Yog qhov kev sib cav len yog -1, ces qhov luaj li cas ntawm cov faib tsis yog txiav txim siab.

Rho tawm cov lus, tuple:

void freemsg(mblk_t *mp);

Cov ntaub ntawv thaiv cov ntaub ntawv siv suav yog decremented los ntawm ib qho. Yog tias nws ncav cuag xoom, cov ntaub ntawv thaiv kuj tseem raug tshem tawm.

Kev suav ntawm tag nrho cov ntaub ntawv hauv cov lus lossis tuple.

size_t msgdsize(const mblk_t *mp);

Retrieving lus los ntawm tus Tsov tus tw ntawm lub queue:

mblk_t *ms_queue_peek_last (q);

Luam cov ntsiab lus ntawm cov chaw khaws tseg ntawm ib cov lus mus rau lwm cov lus (qhov tseeb, cov teb no muaj cov chij uas siv los ntawm cov xov xwm streamer):

mblk_meta_copy(const mblk_t *source, mblk *dest);

Ntse kab_t

Cov lus kab nyob rau hauv xov xwm streamer yog siv raws li ib daim ntawv txuas ob npaug. Txhua daim ntawv teev npe muaj tus taw tes rau cov ntaub ntawv thaiv nrog cov qauv teeb liab. Nws hloov tawm tias tsuas yog taw tes rau cov ntaub ntawv thaiv txav mus, thaum cov ntaub ntawv nws tus kheej tseem nyob twj ywm. Cov. tsuas yog txuas mus rau lawv tau tsiv mus.
Cov qauv piav qhia txog kab kab_t, qhia hauv qab no:

typedef struct _queue
{
   mblk_t _q_stopper; /* "Холостой" элемент очереди, не указывает на данные, используется только для управления очередью. При инициализации очереди (qinit()) его указатели настраиваются так, чтобы они указывали на него самого. */
   int q_mcount;        // Количество элементов в очереди.
} queue_t;

Cov qauv muaj ib daim teb - ib tug pointer _q_sib ntaus * mblk_t, nws taw qhia rau thawj lub ntsiab lus (lus) hauv kab. Qhov chaw thib ob ntawm cov qauv yog lub txee ntawm cov lus hauv kab.
Daim duab hauv qab no qhia cov kab npe hu ua q1 muaj 4 cov lus m1, m2, m3, m4.
Tshawb xyuas lub cav Mediastreamer2 VoIP. Ntu 11
Cov duab hauv qab no qhia txog kab npe q1 muaj 4 cov lus m1,m2,m3,m4. Lus m2 yog lub taub hau ntawm ib tug tuple uas muaj ob tug ntxiv lus m2_1 thiab m2_2.

Tshawb xyuas lub cav Mediastreamer2 VoIP. Ntu 11

Kev ua haujlwm rau kev ua haujlwm nrog queues queue_t

Queue pib:

void qinit(queue_t *q);

teb _q_sib (tom qab no peb yuav hu nws "stopper") yog pib los ntawm kev ua haujlwm mblk_init(), nws lub ntsiab lus dhau los thiab lub ntsiab lus tom ntej no tau hloov kho kom taw tes rau nws tus kheej. Cov khoom txee rau kab rov pib dua rau xoom.

Ntxiv cov ntsiab lus tshiab (cov lus):

void putq(queue_t *q, mblk_t *m);

Tshiab keeb m yog ntxiv rau qhov kawg ntawm daim ntawv teev npe, cov ntsiab lus taw qhia tau hloov kho kom lub stopper dhau los ua cov khoom txuas ntxiv rau nws, thiab nws dhau los ua lub caij dhau los rau lub stopper. Tus nqi ntawm cov khoom txee yog nce ntxiv.

Retrieving ib feem ntawm lub queue:

mblk_t * getq(queue_t *q); 

Cov lus uas tuaj tom qab lub stopper yog retrieved, thiab lub ntsiab counter yog decremented. Yog tias tsis muaj cov ntsiab lus hauv cov kab tshwj tsis yog tus nres, ces 0 rov qab.

Ntxig cov lus rau hauv ib kab:

void insq(queue_t *q, mblk_t *emp, mblk_t *mp); 

Khoom mp ntxig ua ntej lub caij Emp. yog hais tias Emp= 0, ces cov lus ntxiv rau tus Tsov tus tw ntawm kab.

Retrieving ib cov lus los ntawm lub taub hau ntawm lub queue:

void remq(queue_t *q, mblk_t *mp); 

Lub ntsiab counter yog decremented.

Nyeem ib tus pointer rau thawj lub ntsiab lus hauv kab:

mblk_t * peekq(queue_t *q); 

Tshem tawm tag nrho cov ntsiab lus los ntawm cov kab thaum tshem cov ntsiab lus lawv tus kheej:

void flushq(queue_t *q, int how);

sib cav yuav ua li cas tsis siv. Lub txee cov khoom txee yog teem rau xoom.

Macro rau kev nyeem tus taw tes rau qhov kawg ntawm kab:

mblk_t * qlast(queue_t *q);

Thaum ua haujlwm nrog cov kab lus, nco ntsoov tias thaum koj hu ms_queue_put(q, m) nrog ib tug null pointer rau cov lus, muaj nuj nqi loops. Koj qhov program yuav khov. coj zoo sib xws ms_queue_next(q, m).

Txuas cov ntxaij lim dej

Cov kab uas tau piav saum toj no yog siv los hla cov lus ntawm ib lim mus rau lwm qhov lossis los ntawm ib mus rau ntau lub lim. Lim thiab lawv cov kev sib txuas ua ib daim duab qhia. Lub tswv yim lossis cov zis ntawm lub lim yuav raug hu ua lo lus dav dav "pin". Txhawm rau piav qhia txog qhov kev txiav txim uas cov ntxaij lim dej txuas nrog rau ib leeg, cov xov xwm streamer siv lub tswv yim ntawm "lub teeb liab taw tes". Teeb liab taw tes yog cov qauv _MSCPPoint, uas muaj tus taw tes rau lub lim thiab tus naj npawb ntawm ib qho ntawm nws cov pins; raws li, nws piav qhia txog kev sib txuas ntawm ib qho ntawm cov inputs lossis outputs ntawm lub lim.

Teeb liab taw tes ntawm cov ntaub ntawv ua graph

typedef struct _MSCPoint{
struct _MSFilter *filter; // Указатель на фильтр медиастримера.
int pin;                        // Номер одного из входов или выходов фильтра, т.е. пин.
} MSCPoint;

Filter pins yog suav txij li xoom.

Kev sib txuas ntawm ob tus pins los ntawm cov lus kab lus tau piav qhia los ntawm tus qauv _MSQueue, uas muaj cov kab lus thiab taw tes rau ob lub teeb liab taw qhia nws txuas:

typedef struct _MSQueue
{
queue_t q;
MSCPoint prev;
MSCPoint next;
}MSQueue;

Peb yuav hu cov qauv no yog lub teeb liab txuas. Txhua qhov xov xwm streamer lim muaj ib lub rooj sib txuas lus thiab ib lub rooj ntawm cov khoom sib txuas (MSQueue). Qhov luaj li cas ntawm cov ntxhuav yog teem thaum tsim lub lim; peb twb ua qhov no siv ib qho txawv txawv txawv ntawm hom MSFilterDesc, thaum peb tsim peb tus kheej lim. Hauv qab no yog cov qauv uas piav qhia txog cov lim dej hauv xov xwm streamer, MSFilter:


struct _MSFilter{
    MSFilterDesc *desc;    /* Указатель на дескриптор фильтра. */
    /* Защищенные атрибуты, их нельзя сдвигать или убирать иначе будет нарушена работа с плагинами. */
    ms_mutex_t lock;      /* Семафор. */
    MSQueue **inputs;     /* Таблица входных линков. */
    MSQueue **outputs;    /* Таблица выходных линков. */
    struct _MSFactory *factory; /* Указатель на фабрику, которая создала данный экземпляр фильтра. */
    void *padding;              /* Не используется, будет задействован если добавятся защищенные поля. */
    void *data;                 /* Указатель на произвольную структуру для хранения данных внутреннего состояния фильтра и промежуточных вычислений. */
    struct _MSTicker *ticker;   /* Указатель на объект тикера, который не должен быть нулевым когда вызывается функция process(). */
    /*private attributes, they can be moved and changed at any time*/
    MSList *notify_callbacks; /* Список обратных вызовов, используемых для обработки событий фильтра. */
    uint32_t last_tick;       /* Номер последнего такта, когда выполнялся вызов process(). */ 
    MSFilterStats *stats;     /* Статистика работы фильтра.*/
    int postponed_task; /*Количество отложенных задач. Некоторые фильтры могут откладывать обработку данных (вызов process()) на несколько тактов.*/
    bool_t seen;  /* Флаг, который использует тикер, чтобы помечать что этот экземпляр фильтра он уже обслужил на данном такте.*/
};
typedef struct _MSFilter MSFilter;

Tom qab peb txuas cov ntxaij lim dej hauv C qhov kev pab cuam raws li peb txoj kev npaj (tab sis tsis txuas lub ticker), peb thiaj li tsim cov duab qhia, cov nodes uas yog piv txwv ntawm cov qauv. MSFilter, thiab ntug yog piv txwv ntawm kev sib txuas MSQueue.

Hauv qab ntawm qhov kev ua ub no ntawm ticker

Thaum kuv hais rau koj tias tus ticker yog lim rau qhov chaw ntawm zuam, nws tsis yog qhov tseeb tag nrho txog nws. Lub ticker yog ib yam khoom uas ua haujlwm ntawm lub moos txheej txheem ( ) tag nrho cov ntxaij lim dej ntawm Circuit Court (graph) uas nws txuas nrog. Thaum peb txuas tus ticker mus rau lub teeb lim hauv C program, peb qhia tus ticker daim duab uas nws yuav tswj tau los ntawm tam sim no mus txog rau thaum peb tig tawm. Tom qab kev sib txuas, tus ticker pib tshuaj xyuas daim duab tso siab rau nws txoj kev saib xyuas, sau cov npe ntawm cov ntxaij lim dej uas suav nrog nws. Txhawm rau kom tsis txhob "suav" tib lub lim ob zaug, nws cim cov lim pom los ntawm kev tso lub checkbox rau hauv lawv. pom. Kev tshawb nrhiav yog ua tiav siv cov kab txuas txuas uas txhua lub lim dej muaj.

Thaum nws pib ncig ntawm daim duab, tus ticker xyuas seb ntawm cov lim dej puas muaj tsawg kawg yog ib qho uas ua raws li cov ntaub ntawv thaiv. Yog tias tsis muaj, ces daim duab suav hais tias tsis raug thiab cov ticker tsoo.

Yog tias daim duab hloov mus ua "yog", rau txhua qhov pom pom, cov haujlwm raug hu rau kev pib ua ntej ( ). Thaum lub sijhawm tuaj txog rau lub voj voog ua haujlwm tom ntej (txhua 10 milliseconds los ntawm lub neej ntawd), tus ticker hu ua haujlwm txheej txheem ( ) rau tag nrho cov yav dhau los pom cov lim dej, thiab tom qab ntawd rau cov lim dej ntxiv hauv cov npe. Yog hais tias lub lim muaj cov kev sib txuas lus, ces khiav cov haujlwm txheej txheem ( ) rov ua dua kom txog rau thaum cov kab ntawv txuas nkag tau khoob. Tom qab ntawd, nws txav mus rau lub lim tom ntej hauv daim ntawv thiab "scrolls" nws kom txog rau thaum cov ntawv txuas nkag tsis muaj lus. Tus ticker txav los ntawm lim mus lim kom txog thaum cov npe xaus. Qhov no ua tiav cov txheej txheem ntawm lub voj voog.

Tam sim no peb yuav rov qab mus rau tuples thiab tham txog vim li cas qhov chaw no tau ntxiv rau hauv xov xwm streamer. Feem ntau, tus nqi ntawm cov ntaub ntawv xav tau los ntawm algorithm ua haujlwm hauv lub lim tsis sib haum thiab tsis yog ntau qhov loj ntawm cov ntaub ntawv buffers tau txais ntawm cov tswv yim. Piv txwv li, peb tab tom sau cov lim uas ua rau Fourier hloov pauv sai, uas los ntawm kev txhais tau tsuas yog cov ntaub ntawv thaiv uas nws qhov loj yog ob lub zog. Cia nws yog 512 suav. Yog hais tias cov ntaub ntawv yog tsim los ntawm ib tug xov tooj channel, ces cov ntaub ntawv tsis ntawm txhua cov lus ntawm lub tswv yim yuav coj peb 160 cov qauv teeb liab. Nws yog ntxias kom tsis txhob sau cov ntaub ntawv los ntawm cov tswv yim kom txog thaum cov ntaub ntawv xav tau muaj nyob ntawd. Tab sis nyob rau hauv cov ntaub ntawv no, kev sib tsoo yuav tshwm sim nrog lub ticker, uas yuav unsuccessfully sim scroll lub lim kom txog rau thaum lub input txuas yog khoob. Yav dhau los, peb tau xaiv txoj cai no raws li lub hauv paus ntsiab lus thib peb ntawm cov lim. Raws li lub hauv paus ntsiab lus no, lub lim cov txheej txheem () ua haujlwm yuav tsum nqa tag nrho cov ntaub ntawv los ntawm cov khoom nkag.

Tsis tas li ntawd, nws yuav tsis tuaj yeem nqa tsuas yog 512 cov qauv ntawm cov tswv yim, txij li koj tuaj yeem nqa tag nrho cov blocks, piv txwv li. lub lim yuav tsum tau coj 640 cov qauv thiab siv 512 ntawm lawv, qhov seem ua ntej accumulating ib feem tshiab ntawm cov ntaub ntawv. Yog li, peb cov lim dej, ntxiv rau nws txoj haujlwm tseem ceeb, yuav tsum muab cov kev pabcuam pabcuam rau nruab nrab ntawm cov ntaub ntawv nkag. Cov neeg tsim tawm ntawm cov xov xwm streamer thiab kev daws teeb meem rau qhov teeb meem dav dav no tau tsim cov khoom tshwj xeeb - MSBufferizer (bufferer), uas daws qhov teeb meem no siv tuples.

Bufferizer (MSBufferizer)

Qhov no yog ib yam khoom uas yuav khaws cov ntaub ntawv nkag mus rau hauv lub lim thiab pib xa mus rau kev ua tiav sai li sai tau raws li cov ntaub ntawv txaus los khiav lub lim algorithm. Thaum lub tsis muaj cov ntaub ntawv khaws tseg, lub lim yuav ua haujlwm nyob rau hauv hom tsis siv, tsis tas siv lub zog ua haujlwm ntawm lub processor. Tab sis sai li sai tau raws li kev nyeem ntawv muaj nuj nqi los ntawm bufferer rov qab ib qho nqi uas tsis yog xoom, cov txheej txheem () kev ua haujlwm ntawm lub lim pib coj thiab ua cov ntaub ntawv los ntawm cov bufferer nyob rau hauv feem ntawm qhov xav tau loj, kom txog rau thaum nws tag.
Cov ntaub ntawv uas tseem tsis tau xav tau tseem nyob hauv qhov tsis yog thawj lub hauv paus ntawm tuple, uas txuas ntxiv cov blocks ntawm cov ntaub ntawv nkag.

Cov qauv uas piav txog qhov tsis muaj:

struct _MSBufferizer{
queue_t q; /* Очередь сообщений. */
int size; /* Суммарный размер данных находящихся в буферизаторе в данный момент. */
};
typedef struct _MSBufferizer MSBufferizer;

Muaj nuj nqi rau kev ua haujlwm nrog MSBufferizer

Tsim ib qho piv txwv buffer tshiab:

MSBufferizer * ms_bufferizer_new(void);

Nco tau faib, pib hauv ms_bufferizer_init() thiab tus pointer rov qab los.

Initialization muaj nuj nqi:

void ms_bufferizer_init(MSBufferizer *obj); 

Lub queue tab tom pib q, teb loj yog teem rau xoom.

Ntxiv cov lus:

void ms_bufferizer_put(MSBufferizer *obj, mblk_t *m); 

Cov lus m yog ntxiv rau cov kab. Tus lej suav loj ntawm cov ntaub ntawv thaiv tau ntxiv rau loj.

Hloov tag nrho cov lus los ntawm qhov txuas cov ntaub ntawv kab mus rau qhov tsis q:

void ms_bufferizer_put_from_queue(MSBufferizer *obj, MSQueue *q);   

Hloov cov lus los ntawm qhov txuas q hauv qhov tsis yog ua los ntawm kev ua haujlwm ms_bufferizer_put().

Nyeem los ntawm qhov tsis:

int ms_bufferizer_read(MSBufferizer *obj, uint8_t *data, int datalen); 

Yog tias qhov loj ntawm cov ntaub ntawv khaws cia hauv qhov tsis yog tsawg dua li qhov tau thov (datalen), ces cov nuj nqi rov xoom, cov ntaub ntawv tsis tau theej rau cov ntaub ntawv. Txwv tsis pub, kev luam cov ntaub ntawv los ntawm tuples nyob rau hauv qhov tsis yog ua. Tom qab luam, lub tuple yog deleted thiab lub cim xeeb yog freed. Kev luam ntawv xaus rau lub sijhawm thaum datalen bytes tau theej. Yog tias qhov chaw khiav tawm hauv nruab nrab ntawm cov ntaub ntawv thaiv, tom qab ntawd hauv cov lus no, cov ntaub ntawv thaiv yuav raug txo qis rau qhov seem uas tsis tau theej. Lwm zaus koj hu, luam tawm yuav txuas ntxiv los ntawm qhov no.

Nyeem tus nqi ntawm cov ntaub ntawv uas tam sim no muaj nyob rau hauv qhov tsis:

int ms_bufferizer_get_avail(MSBufferizer *obj); 

Rov qab teb loj tsis pub.

Muab pov tseg ib feem ntawm cov ntaub ntawv hauv qhov tsis:

void ms_bufferizer_skip_bytes(MSBufferizer *obj, int bytes);

Tus naj npawb ntawm bytes ntawm cov ntaub ntawv raug muab rov qab thiab muab pov tseg. Cov ntaub ntawv qub tshaj yog muab pov tseg.

Rho tawm tag nrho cov lus nyob rau hauv lub buffer:

void ms_bufferizer_flush(MSBufferizer *obj); 

Cov ntaub ntawv suav rov pib dua rau xoom.

Rho tawm tag nrho cov lus nyob rau hauv lub buffer:

void ms_bufferizer_uninit(MSBufferizer *obj); 

Lub txee tsis rov pib dua.

Tshem tawm qhov tsis thiab tso lub cim xeeb:

void ms_bufferizer_destroy(MSBufferizer *obj);  

Piv txwv ntawm kev siv lub buffer tuaj yeem pom nyob rau hauv qhov chaws ntawm ntau lub xov xwm streamer lim. Piv txwv li, hauv MS_L16_ENC lim, uas rov kho cov bytes hauv cov qauv los ntawm kev txiav txim hauv lub network mus rau tus tswv xaj: l16.c ua

Nyob rau hauv tsab xov xwm tom ntej no, peb yuav saib qhov teeb meem ntawm kev kwv yees lub load ntawm ib tug ticker thiab txoj kev los tawm tsam ntau heev xam load nyob rau hauv ib tug xov xwm streamer.

Tau qhov twg los: www.hab.com

Ntxiv ib saib