Eksplore motè VoIP Mediastreamer2 la. Pati 11

Materyèl atik la pran nan men mwen zen channel.

Eksplore motè VoIP Mediastreamer2 la. Pati 11

Mekanis mouvman done

  • Done blòk dblk_t
  • Mesaj mblk_t
  • Fonksyon pou travay ak mesaj mblk_t
  • File keue_t
  • Fonksyon pou travay ak keue_t
  • Konekte filtè yo
  • Pwen siyal nan graf pwosesis done
  • Dèyè aktivite yo nan ticker la
  • Tanpon (MSBufferizer)
  • Fonksyon pou travay ak MSBufferizer

Nan tan lontan an Atik nou devlope pwòp filtre pa nou. Atik sa a pral konsantre sou mekanis entèn pou deplase done ant filtè streamer medya yo. Sa a pral pèmèt ou ekri filtè sofistike ak mwens efò nan tan kap vini an.

Mekanis mouvman done

Mouvman done nan streamer medya a fèt lè l sèvi avèk ke moun kap kriye ki dekri nan estrikti a keue_t. Chaîne mesaj tankou mblk_t, ki tèt yo pa gen done siyal, men se sèlman lyen ki mennen nan mesaj anvan an, pwochen ak nan blòk la done. Anplis de sa, mwen vle espesyalman mete aksan sou ke gen tou yon jaden pou yon lyen nan yon mesaj nan menm kalite a, ki pèmèt ou òganize yon lis yon sèl lye nan mesaj. Nou pral rele yon gwoup mesaj ini pa yon lis konsa yon tiple. Kidonk, nenpòt eleman nan keu a kapab yon mesaj sèl mblk_t, e petèt tèt la nan yon tuple mesaj mblk_t. Chak mesaj tuple ka gen pwòp blòk done pawas li yo. Nou pral diskite sou poukisa tuple yo bezwen yon ti kras pita.

Kòm mansyone pi wo a, mesaj la li menm pa gen yon blòk nan done; olye de sa, li sèlman gen yon konsèy nan zòn nan memwa kote blòk la estoke. Nan pati sa a, foto an jeneral nan travay streamer medya a se okoumansman de depo pòt la nan desen ki pi ba "Monsters, Inc.," kote pòt (lyen ki mennen nan done - chanm) deplase nan yon vitès fou ansanm transporteurs anlè yo, pandan y ap chanm yo tèt yo. rete san mouvman.

Koulye a, k ap deplase sou yerachi a soti anba nan tèt, ann konsidere an detay antite yo ki nan lis nan mekanis transmisyon done nan streamer medya a.

Blòk done dblk_t

Blòk done a konsiste de yon header ak yon tanpon done. Tèt la dekri pa estrikti sa a,

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

Jaden yo nan estrikti a gen endikasyon nan kòmansman an nan tanpon an, nan fen tanpon an, ak fonksyon an pou efase tanpon done a. Dènye eleman nan header db_ref — kontwa referans, si li rive nan zewo, sa a sèvi kòm yon siyal pou efase blòk sa a nan memwa. Si blòk done a te kreye pa fonksyon an datab_alloc() , Lè sa a, tanpon done a pral mete nan memwa imedyatman apre header la. Nan tout lòt ka, tanpon an ka lokalize yon kote separeman. Tanpon done a pral genyen echantiyon siyal oswa lòt done ke nou vle trete ak filtè.

Yon nouvo egzanp yon blòk done kreye lè l sèvi avèk fonksyon an:

dblk_t *datab_alloc(int size);

Kòm yon paramèt opinyon, yo bay li gwosè a nan done yo ke blòk la pral estoke. Plis memwa atribye ba yo nan lòd yo mete yon header - estrikti - nan kòmansman an nan memwa atribye ba yo doneb. Men, lè w ap itilize lòt fonksyon, sa pa toujou rive; nan kèk ka, tanpon done a ka lokalize separeman ak tèt blòk done a. Lè w ap kreye yon estrikti, jaden yo se configuré pou ke jaden li yo db_base pwente nan kòmansman an nan zòn nan done, ak db_lim nan fen li. Konte lyen db_ref se mete nan yon sèl. Pointeur fonksyon done klè mete a zewo.

Mesaj mblk_t

Jan sa di, eleman keu yo se nan kalite mblk_t, li defini jan sa a:

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;

Estrikti mblk_t gen endikasyon nan kòmansman an b_prev, b_next, ki nesesè pou òganize yon lis double lye (ki se yon keu keue_t).

Lè sa a, vini konsèy la b_kont, ki itilize sèlman lè mesaj la fè pati yon tuple. Pou dènye mesaj nan tuple a, konsèy sa a rete nil.

Apre sa, nou wè yon konsèy sou yon blòk done b_datap, pou ki mesaj la egziste. Li swiv pa endikasyon nan zòn ki andedan tanpon done blòk la. Jaden b_rptr presize kote yo pral li done ki soti nan tanpon an. Jaden b_wptr endike kote yo pral fè ekriti nan tanpon an.

Jaden ki rete yo se nan yon nati sèvis epi yo pa gen rapò ak operasyon an nan mekanis transfè done yo.

Anba a se yon sèl mesaj ak non an m1 ak blòk done d1.
Eksplore motè VoIP Mediastreamer2 la. Pati 11
Figi sa a montre yon twa mesaj m1, m1_1, m1_2.
Eksplore motè VoIP Mediastreamer2 la. Pati 11

Fonksyon mesaj mblk_t

Yon nouvo mesaj mblk_t kreye pa fonksyon an:

mblk_t *allocb(int size, int pri); 

li mete yon nouvo mesaj nan memwa mblk_t ak yon blòk done nan gwosè a espesifye gwosè, dezyèm agiman - nan pa itilize nan vèsyon sa a nan bibliyotèk la. Li ta dwe rete zewo. Pandan fonksyon an fonksyone, yo pral resevwa memwa pou estrikti nouvo mesaj la epi yo pral rele fonksyon an mblk_init(), ki pral Reyajiste tout jaden nan egzanp ki te kreye nan estrikti a ak Lè sa a, lè l sèvi avèk mansyone anwo a datab_alloc(), pral kreye yon tanpon done. Apre sa, jaden yo nan estrikti a pral konfigirasyon:

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

Nan pwodiksyon an nou resevwa yon nouvo mesaj ak jaden inisyalize ak yon tanpon done vid. Pou ajoute done nan yon mesaj, ou bezwen kopye li nan tanpon nan blòk done:

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

kote done se yon konsèy sou sous done a, ak gwosè - gwosè yo.
Lè sa a, ou bezwen aktyalize konsèy la nan pwen an ekri pou li montre ankò nan kòmansman an nan zòn nan gratis nan tanpon an:

msg->b_wptr = msg->b_wptr + size

Si ou bezwen kreye yon mesaj ki soti nan yon tanpon ki deja egziste, san yo pa kopye, Lè sa a, sèvi ak fonksyon an:

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

Fonksyon an, apre yo fin kreye mesaj la ak estrikti blòk done a, pral configured endikasyon li yo nan done yo nan adrès la frote. Moun sa yo. nan ka sa a, tanpon done a pa sitiye apre jaden header nan blòk done a, menm jan sa te ka a lè kreye yon blòk done ak fonksyon an. datab_alloc(). Tanpon an ak done pase nan fonksyon an ap rete kote li te ye, men avèk èd nan endikasyon li pral tache ak header ki fèk kreye nan blòk la done, e ke, kòmsadwa, nan mesaj la.

Pou yon mesaj mblk_t Plizyè blòk done yo ka konkatenasyon an sekans. Sa a se fè pa fonksyon an:

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

mp — yon mesaj kote yo pral ajoute yon lòt blòk done;
done — pointeur nan blòk la, yon kopi ki pral ajoute nan mesaj la;
gwosè - gwosè done;
pad — yon drapo ke gwosè memwa atribye ba yo ta dwe aliyen sou yon fwontyè 4-octet (padding yo pral fè ak zewo).

Si gen ase espas nan tanpon done mesaj ki deja egziste a, Lè sa a, nouvo done yo pral kole dèyè done yo deja la. Si gen mwens espas gratis nan tanpon done mesaj la pase gwosè, Lè sa a, yo kreye yon nouvo mesaj ak yon gwosè tanpon ase epi done yo kopye nan tanpon li yo. Sa a se yon nouvo mesaj, lye ak youn orijinal la lè l sèvi avèk yon konsèy b_kont. Nan ka sa a, mesaj la vin tounen yon tuple.

Si ou bezwen ajoute yon lòt blòk done nan tuple a, Lè sa a, ou bezwen sèvi ak fonksyon an:

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

li pral jwenn dènye mesaj la nan tuple la (li genyen b_kont pral nil) epi yo pral rele fonksyon an pou mesaj sa a appendb ().

Ou ka jwenn gwosè a nan done nan yon mesaj oswa tuple lè l sèvi avèk fonksyon an:

int msgdsize(const mblk_t *mp);

li pral bouk nan tout mesaj yo nan tuple a epi retounen kantite total done nan tanpon done mesaj sa yo. Pou chak mesaj, kantite done yo kalkile jan sa a:

 mp->b_wptr - mp->b_rptr

Pou konbine de tuple, sèvi ak fonksyon an:

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

li ajoute tuple la nouvom nan ke a nan tuple la mp epi li retounen yon konsèy sou dènye mesaj tuple ki te lakòz.

Si sa nesesè, yon tuple ka tounen yon sèl mesaj ak yon sèl blòk done; sa a se fè pa fonksyon an:

void msgpullup(mblk_t *mp,int len);

si agiman Len se -1, Lè sa a, gwosè a tanpon atribye ba yo detèmine otomatikman. Si Len se yon nimewo pozitif, Lè sa a, yon tanpon nan gwosè sa a pral kreye epi done yo mesaj tuple yo pral kopye nan li. Si tanpon an fini, kopye ap sispann la. Premye mesaj tuple a pral resevwa yon nouvo tanpon gwosè ak done yo kopye. Mesaj ki rete yo pral efase epi memwa a retounen nan pil la.

Lè w ap efase yon estrikti mblk_t se konte a referans nan blòk la done pran an kont si, lè w ap rele freeb() li vire soti nan zewo, Lè sa a, tanpon done a efase ansanm ak egzanp lan mblk_t, ki montre li.

Inisyalize jaden yo nan yon nouvo mesaj:

void mblk_init(mblk_t *mp);

Ajoute yon lòt moso done nan mesaj la:

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

Si nouvo done yo pa anfòm nan espas lib la nan tanpon done mesaj la, Lè sa a, yon mesaj ki kreye separeman ak yon tanpon nan gwosè yo mande yo tache ak mesaj la (yon konsèy sou mesaj la ajoute yo mete nan premye mesaj la) mesaj vin tounen yon tuple.

Ajoute yon moso done nan yon tuple:

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

Fonksyon an rele appendb() nan yon bouk.

Konbine de tuple nan yon sèl:

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

Mesaj nouvom pral tache ak mp.

Fè yon kopi yon sèl mesaj:

mblk_t *copyb(const mblk_t *mp);

Konplete kopye yon tuple ak tout blòk done:

mblk_t *copymsg(const mblk_t *mp);

Eleman yo nan tuple la yo kopye pa fonksyon an kopib().

Kreye yon kopi fasil yon mesaj mblk_t. Nan ka sa a, blòk done a pa kopye, men kontwa referans li yo ogmante db_ref:

mblk_t *dupb(mblk_t *mp);

Fè yon kopi ki lejè nan yon tuple. Blòk done yo pa kopye, se sèlman kontè referans yo ogmante db_ref:

mblk_t *dupmsg(mblk_t* m);

Kole tout mesaj yon tuple nan yon sèl mesaj:

void msgpullup(mblk_t *mp,size_t len);

Si agiman an Len se -1, Lè sa a, gwosè a tanpon atribye ba yo detèmine otomatikman.

Efase yon mesaj, tuple:

void freemsg(mblk_t *mp);

Konte referans blòk done a diminye pa youn. Si li rive nan zewo, blòk done a tou efase.

Kalkil kantite total done nan yon mesaj oswa tuple.

size_t msgdsize(const mblk_t *mp);

Rekipere yon mesaj ki soti nan keu la:

mblk_t *ms_queue_peek_last (q);

Kopye sa ki nan jaden rezève yo nan yon mesaj nan yon lòt mesaj (an reyalite, jaden sa yo gen drapo ke yo itilize pa streamer medya a):

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

Keu keue_t

Se keu mesaj la nan streamer medya a aplike kòm yon lis sikilè doublman lye. Chak eleman lis gen yon konsèy sou yon blòk done ak echantiyon siyal. Li sanble ke sèlman endikasyon nan blòk la done deplase nan vire, pandan y ap done nan tèt li rete san mouvman. Moun sa yo. sèlman lyen yo deplase.
Estrikti ki dekri keu a keue_t, montre anba a:

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

Estrikti a gen yon jaden - yon konsèy _q_bouchon tape *mblk_t, li montre premye eleman (mesaj) nan keu a. Dezyèm jaden an nan estrikti a se kontwa mesaj yo nan keu la.
Figi ki anba a montre yon keu ki rele q1 ki genyen 4 mesaj m1, m2, m3, m4.
Eksplore motè VoIP Mediastreamer2 la. Pati 11
Figi sa a montre yon keu ki rele q1 ki genyen 4 mesaj m1,m2,m3,m4. Mesaj m2 se tèt yon tuple ki gen de lòt mesaj m2_1 ak m2_2.

Eksplore motè VoIP Mediastreamer2 la. Pati 11

Fonksyon pou travay ak keue_t

Inisyalizasyon keu:

void qinit(queue_t *q);

Jaden _q_bouchon (apwe sa nou pral rele li "bouchon") se inisyalize pa fonksyon an mblk_init(), eleman anvan li yo ak pwochen pwent eleman yo ajiste pou lonje dwèt sou tèt li. Kontwa eleman keu la reset a zewo.

Ajoute yon nouvo eleman (mesaj):

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

Nouvo eleman m se ajoute nan fen lis la, pwent eleman yo ajiste pou bouchon an vin pwochen eleman pou li, epi li vin eleman anvan an pou bouchon an. Kontwa eleman keu la ogmante.

Rekipere yon eleman nan keu la:

mblk_t * getq(queue_t *q); 

Mesaj ki vini apre bouchon an rekipere, epi kontwa eleman an diminye. Si pa gen okenn eleman nan keu a eksepte bouchon an, Lè sa a, 0 retounen.

Mete yon mesaj nan yon keu:

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

Atik mp mete anvan eleman an EMP. Si EMP=0, Lè sa a, mesaj la ajoute nan ke keu la.

Rekipere yon mesaj nan tèt keu a:

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

Kontwa eleman an diminye.

Lekti yon konsèy sou premye eleman nan keu la:

mblk_t * peekq(queue_t *q); 

Retire tout eleman nan keu a pandan y ap efase eleman yo tèt yo:

void flushq(queue_t *q, int how);

Agiman kouman pa itilize. Kontwa eleman keu la mete sou zewo.

Makro pou li yon konsèy sou dènye eleman keu la:

mblk_t * qlast(queue_t *q);

Lè w ap travay ak moun kap kriye mesaj, ou dwe konnen lè w rele ms_queue_put(q, m) ak yon konsèy nil nan mesaj la, fonksyon an bouk. Pwogram ou an pral friz. konpòte menm jan an ms_queue_next(q, m).

Konekte filtè yo

Yo itilize keu ki dekri pi wo a pou pase mesaj soti nan yon filtè nan yon lòt oswa soti nan youn nan plizyè filtè. Filtè ak koneksyon yo fòme yon graf dirije. Antre oswa pwodiksyon filtè a pral rele mo jeneral "pin". Pou dekri lòd nan ki filtè yo konekte youn ak lòt, streamer medya a sèvi ak konsèp nan yon "pwen siyal". Pwen siyal se estrikti _MSCPoint, ki gen yon pwent nan filtè a ak nimewo a nan youn nan broch li yo; kòmsadwa, li dekri koneksyon an nan youn nan antre yo oswa soti nan filtè a.

Pwen siyal nan graf pwosesis done

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

Broch filtre yo nimewote apati zewo.

Koneksyon an nan de broch pa yon keu mesaj se dekri pa estrikti a _MSQueue, ki gen yon keu mesaj ak konsèy sou de pwen siyal li konekte yo:

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

Nou pral rele estrikti sa a yon lyen siyal. Chak filtè medya streamer gen yon tablo lyen antre ak yon tablo lyen pwodiksyon (MSQueue). Gwosè tab yo fikse lè w ap kreye yon filtè; nou te deja fè sa lè l sèvi avèk yon kalite varyab ekspòte MSFilterDesc, lè nou devlope pwòp filtè nou an. Anba a se yon estrikti ki dekri nenpòt filtè nan yon streamer medya, 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;

Apre nou te konekte filtè yo nan pwogram C a an akò ak plan nou an (men nou pa t konekte ticker la), nou te kreye yon graf dirije, nœuds yo ki se egzanp estrikti a. MSFilter, ak bor yo se egzanp lyen MSQueue.

Dèyè aktivite yo nan ticker la

Lè m 'te di ou ke ticker la se yon filtè pou sous la nan tik, li pa t' tout verite a sou li. Yon ticker se yon objè ki fonksyone sou revèy la pwosesis () tout filtè sikwi a (graf) kote li konekte. Lè nou konekte yon ticker ak yon filtè graf nan yon pwogram C, nou montre ticker la graf la ke li pral kontwole depi kounye a jiskaske nou fèmen li. Apre konekte, ticker la kòmanse egzamine graf ki reskonsab swen li yo, konpile yon lis filtè ki gen ladan li. Pou pa "konte" menm filtè a de fwa, li make filtè yo detekte lè li mete yon kaz nan yo. . Rechèch la fèt lè l sèvi avèk tab lyen ke chak filtre genyen.

Pandan toune entwodiksyon li yo nan graf la, ticker la tcheke si pami filtè yo gen omwen youn ki aji kòm yon sous blòk done. Si pa gen okenn, Lè sa a, graf la konsidere kòm kòrèk epi ticker la aksidan.

Si graf la vin "kòrèk", pou chak filtè yo jwenn, yo rele fonksyon an pou inisyalizasyon prepwosesis (). Le pli vit ke moman an rive pou pwochen sik pwosesis la (chak 10 milisgond pa default), ticker la rele fonksyon an. pwosesis () pou tout filtè sous yo te jwenn deja, ak Lè sa a, pou filtè ki rete yo nan lis la. Si filtè a gen lyen opinyon, Lè sa a, kouri fonksyon an pwosesis () repete jiskaske ke moun kap kriye lyen antre yo vid. Apre sa, li deplase sou filtè kap vini an nan lis la ak "scrolls" li jiskaske lyen yo opinyon yo gratis nan mesaj. Ticker la deplase soti nan filtre nan filtre jiskaske lis la fini. Sa a konplete pwosesis la nan sik la.

Koulye a, nou pral retounen nan tuples epi pale sou poukisa yo te ajoute yon antite konsa nan streamer medya a. An jeneral, kantite done ki nesesè nan algorithm opere andedan filtè a pa kowenside epi li pa yon miltip nan gwosè tanpon done yo resevwa nan opinyon an. Pou egzanp, nou ap ekri yon filtè ki fè yon transfòmasyon Fourier rapid, ki pa definisyon ka sèlman trete blòk done ki gen gwosè se yon pouvwa de de. Se pou li 512 konte. Si done yo pwodwi pa yon chanèl telefòn, Lè sa a, tanpon done nan chak mesaj nan opinyon an pral pote nou 160 echantiyon siyal. Li se tante pa kolekte done ki soti nan opinyon jiskaske kantite lajan ki nesesè nan done yo la. Men, nan ka sa a, yon kolizyon pral rive ak ticker la, ki pral san siksè eseye defile filtè a jiskaske lyen an antre vid. Précédemment, nou te deziyen règ sa a kòm twazyèm prensip filtè a. Dapre prensip sa a, fonksyon filtè a pwosesis() dwe pran tout done ki soti nan ke moun kap kriye yo antre.

Anplis de sa, li pa pral posib yo pran sèlman 512 echantiyon nan opinyon an, depi ou ka sèlman pran blòk antye, i.e. filtè a pral oblije pran 640 echantiyon epi sèvi ak 512 nan yo, rès la anvan akimile yon nouvo pòsyon nan done. Se konsa, filtè nou an, anplis travay prensipal li yo, dwe bay aksyon oksilyè pou depo entèmedyè nan done opinyon. Devlopè yo nan streamer medya a ak solisyon a pwoblèm jeneral sa a te devlope yon objè espesyal - MSBufferizer (tanpon), ki rezoud pwoblèm sa a lè l sèvi avèk tuple.

Tanpon (MSBufferizer)

Sa a se yon objè ki pral akimile done opinyon andedan filtè a epi kòmanse soumèt li pou trete le pli vit ke kantite enfòmasyon an ase pou kouri algorithm filtre a. Pandan tanpon an ap akimile done, filtè a pral opere nan mòd san fè anyen konsa, san yo pa itilize pouvwa pwosesis la nan processeur a. Men, le pli vit ke fonksyon lekti ki soti nan tanpon an retounen yon valè ki pa zewo, fonksyon pwosesis () nan filtè a kòmanse pran ak trete done ki soti nan tanpon an nan pòsyon nan gwosè ki nesesè yo, jiskaske li fin itilize.
Done ki poko obligatwa rete nan tanpon an kòm premye eleman nan tuple a, ak blòk ki vin apre nan done opinyon yo tache.

Estrikti ki dekri tanpon an:

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

Fonksyon pou travay ak MSBufferizer

Kreye yon nouvo egzanp tanpon:

MSBufferizer * ms_bufferizer_new(void);

Se memwa atribye ba, inisyalize nan ms_bufferizer_init() epi yo retounen yon konsèy.

Fonksyon inisyalizasyon:

void ms_bufferizer_init(MSBufferizer *obj); 

Nat la ap inisyalize q, jaden gwosè se mete a zewo.

Ajoute yon mesaj:

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

Mesaj m ajoute nan keu a. Yo ajoute gwosè a kalkile nan blòk done yo gwosè.

Transfere tout mesaj ki soti nan keu done lyen nan tanpon an q:

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

Transfere mesaj ki soti nan yon lyen q nan tanpon an fèt lè l sèvi avèk fonksyon an ms_bufferizer_put().

Lekti nan tanpon an:

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

Si gwosè done yo akimile nan tanpon an pi piti pase sa yo mande a (datalen), Lè sa a, fonksyon an retounen zewo, done yo pa kopye nan done. Sinon, se sekans kopi done ki soti nan tuple ki sitiye nan tanpon an fèt. Apre kopye, tuple a efase epi memwa a libere. Kopi fini nan moman sa a lè bytes done yo kopye. Si espas kouri soti nan mitan yon blòk done, Lè sa a, nan mesaj sa a, blòk done a ap redwi nan pati ki rete a ki pa kopye. Pwochen fwa ou rele, kopye ap kontinye soti nan pwen sa a.

Li kantite done ki disponib kounye a nan tanpon an:

int ms_bufferizer_get_avail(MSBufferizer *obj); 

Retounen jaden an gwosè tanpon.

Jete yon pati nan done yo nan tanpon an:

void ms_bufferizer_skip_bytes(MSBufferizer *obj, int bytes);

Yo jwenn kantite done ki espesifye epi yo jete yo. Done ki pi ansyen yo jete.

Efase tout mesaj nan tanpon an:

void ms_bufferizer_flush(MSBufferizer *obj); 

Kontwa done a reset a zewo.

Efase tout mesaj nan tanpon an:

void ms_bufferizer_uninit(MSBufferizer *obj); 

Kontwa a pa reset.

Retire tanpon an ak libere memwa:

void ms_bufferizer_destroy(MSBufferizer *obj);  

Egzanp itilize tanpon an ka jwenn nan kòd sous plizyè filtè streamer medya yo. Pou egzanp, nan MS_L16_ENC filtè a, ki reyranje bytes yo nan echantiyon yo soti nan lòd rezo a nan lòd lame a: l16.c

Nan pwochen atik la, nou pral gade sou pwoblèm nan estimasyon chaj ticker ak ki jan fè fas ak twòp chaj enfòmatik nan streamer medya a.

Sous: www.habr.com

Add nouvo kòmantè