Ṣiṣawari ẹrọ Mediastreamer2 VoIP. Apa 11

Awọn ohun elo ti awọn article ti wa ni ya lati mi zen ikanni.

Ṣiṣawari ẹrọ Mediastreamer2 VoIP. Apa 11

Data ronu siseto

  • Dina data dblk_t
  • Ifiranṣẹ mblk_t
  • Awọn iṣẹ fun ṣiṣẹ pẹlu awọn ifiranṣẹ mblk_t
  • isinyi queue_t
  • Awọn iṣẹ fun ṣiṣẹ pẹlu awọn queues queue_t
  • Nsopọ Ajọ
  • Ojuami ifihan agbara ti data processing awonya
  • Lẹhin awọn iṣẹ iṣẹlẹ ti tika
  • Bufferizer (MSBufferizer)
  • Awọn iṣẹ fun ṣiṣẹ pẹlu MSBufferizer

Ni ikẹhin article a ti ni idagbasoke àlẹmọ tiwa. Nkan yii yoo dojukọ ẹrọ inu inu fun gbigbe data laarin awọn asẹ ṣiṣan media. Eyi yoo gba ọ laaye lati kọ awọn asẹ fafa pẹlu igbiyanju ti o dinku ni ọjọ iwaju.

Data ronu siseto

Gbigbe data ni ṣiṣan media jẹ ṣiṣe ni lilo awọn ila ti a ṣalaye nipasẹ eto naa isinyi_t. Awọn okun ti awọn ifiranṣẹ bi mblk_t, eyi ti ara wọn ko ni data ifihan agbara, ṣugbọn awọn ọna asopọ nikan si išaaju, ifiranṣẹ atẹle ati si Àkọsílẹ data. Ni afikun, Mo fẹ lati tẹnumọ paapaa pe aaye tun wa fun ọna asopọ si ifiranṣẹ ti iru kanna, eyiti o fun ọ laaye lati ṣeto atokọ ti awọn ifiranṣẹ ti o sopọ mọ ẹyọkan. A yoo pe ẹgbẹ kan ti awọn ifiranṣẹ iṣọkan nipasẹ iru atokọ kan ni tuple. Nitorinaa, eyikeyi nkan ti isinyi le jẹ ifiranṣẹ kan mblk_t, ati boya ori ifiranṣẹ tuple mblk_t. Ifiranṣẹ tuple kọọkan le ni bulọọki data ẹṣọ tirẹ. A yoo jiroro idi ti awọn tuples ṣe nilo diẹ diẹ nigbamii.

Gẹgẹbi a ti sọ loke, ifiranṣẹ naa funrararẹ ko ni bulọọki data ninu; dipo, o ni itọkasi nikan si agbegbe iranti nibiti a ti fipamọ bulọki naa. Ni apakan yii, aworan gbogbogbo ti iṣẹ ṣiṣan media jẹ iranti ti ile-itaja ẹnu-ọna ninu ere ere “Monsters, Inc.,” nibiti awọn ilẹkun (awọn ọna asopọ si data - awọn yara) n gbe ni iyara aṣiwere pẹlu awọn gbigbe oke, lakoko ti awọn yara funrararẹ. wà ailagbara.

Ni bayi, gbigbe pẹlu awọn logalomomoise lati isalẹ si oke, jẹ ki a ro ni apejuwe awọn ẹya ti a ṣe akojọ ti ẹrọ gbigbe data ni ṣiṣan media.

Àkọsílẹ data dblk_t

Àkọsílẹ data ni akọsori ati ifipamọ data kan. Akọsori jẹ apejuwe nipasẹ ọna atẹle,

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

Awọn aaye ti eto naa ni awọn itọka si ibẹrẹ ti ifipamọ, opin ifipamọ, ati iṣẹ fun piparẹ ifipamọ data. Ikẹhin ano ni akọsori db_ref - counter itọkasi, ti o ba de odo, eyi jẹ ifihan agbara lati pa ohun amorindun yii kuro ni iranti. Ti o ba ṣẹda Àkọsílẹ data nipasẹ iṣẹ naa datab_alloc() , lẹhinna ifipamọ data yoo wa ni gbe sinu iranti lẹsẹkẹsẹ lẹhin akọsori. Ni gbogbo awọn ọran miiran, ifipamọ le wa ni ibikan lọtọ. Ifipamọ data yoo ni awọn ayẹwo ifihan tabi data miiran ti a fẹ ṣe ilana pẹlu awọn asẹ.

Apeere tuntun ti bulọọki data ni a ṣẹda nipa lilo iṣẹ naa:

dblk_t *datab_alloc(int size);

Gẹgẹbi paramita titẹ sii, a fun ni iwọn data ti bulọọki yoo fipamọ. Iranti diẹ sii ti wa ni ipin lati le gbe akọsori kan - eto - ni ibẹrẹ ti iranti ti a pin datab. Ṣugbọn nigba lilo awọn iṣẹ miiran, eyi kii ṣe nigbagbogbo; ni awọn igba miiran, ifipamọ data le wa ni lọtọ lati akọsori Àkọsílẹ data. Nigbati o ba ṣẹda eto kan, awọn aaye ti wa ni tunto ki aaye rẹ db_base tọka si ibẹrẹ ti agbegbe data, ati db_lim si opin rẹ. Iwọn ọna asopọ db_ref ti ṣeto si ọkan. Itọkasi iṣẹ ti ko o data ti ṣeto si odo.

Ifiranṣẹ mblk_t

Gẹgẹbi a ti sọ, awọn eroja ti isinyi jẹ iru mblk_t, o ti wa ni asọye bi wọnyi:

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;

Ilana mblk_t ni awọn itọka ni ibẹrẹ b_tẹlẹ, b_tókàn, eyiti o jẹ pataki lati ṣeto atokọ ti o sopọ mọ ilọpo meji (eyiti o jẹ isinyi isinyi_t).

Lẹhinna itọka wa b_tẹsiwaju, eyi ti o ti lo nikan nigbati ifiranṣẹ jẹ apakan ti tuple kan. Fun ifiranṣẹ ti o kẹhin ninu tuple, ijuboluwole yii jẹ asan.

Nigbamii ti a rii itọka si bulọki data kan b_datap, fun eyiti ifiranṣẹ naa wa. O ti wa ni atẹle nipa awọn itọka si agbegbe inu awọn Àkọsílẹ data saarin. Aaye b_rptr pato ipo lati eyiti data lati inu ifipamọ yoo ka. Aaye b_wpr tọkasi ipo lati eyiti o kọwe si ifipamọ yoo ṣee ṣe.

Awọn aaye to ku jẹ ti iseda iṣẹ ati pe ko ṣe ibatan si iṣẹ ti ẹrọ gbigbe data.

Ni isalẹ ni ifiranṣẹ kan pẹlu orukọ m1 ati Àkọsílẹ data d1.
Ṣiṣawari ẹrọ Mediastreamer2 VoIP. Apa 11
Nọmba ti o tẹle n ṣe afihan tuple ti awọn ifiranṣẹ mẹta m1, m1_1, m1_2.
Ṣiṣawari ẹrọ Mediastreamer2 VoIP. Apa 11

Awọn iṣẹ fifiranṣẹ mblk_t

Ifiranṣẹ titun kan mblk_t ṣẹda nipasẹ iṣẹ:

mblk_t *allocb(int size, int pri); 

o gbe ifiranṣẹ titun si iranti mblk_t pẹlu kan data Àkọsílẹ ti awọn pàtó kan iwọn iwọn, keji ariyanjiyan - nọmba ko lo ni yi ti ikede ti awọn ìkàwé. O yẹ ki o wa ni odo. Lakoko iṣẹ iṣẹ naa, iranti yoo pin fun eto ti ifiranṣẹ tuntun ati pe iṣẹ naa yoo pe mblk_init(), eyi ti yoo tun gbogbo awọn aaye ti apẹẹrẹ ti a ṣẹda ti iṣeto ati lẹhinna, ni lilo awọn ti a darukọ loke datab_alloc(), yoo ṣẹda ifipamọ data. Lẹhin eyiti awọn aaye ninu eto yoo tunto:

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

Ni iṣẹjade a gba ifiranṣẹ tuntun pẹlu awọn aaye ibẹrẹ ati ifipamọ data ṣofo. Lati ṣafikun data si ifiranṣẹ, o nilo lati daakọ si ifipamọ idina data:

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

nibi ti data ni a ijuboluwole si awọn data orisun, ati iwọn - wọn iwọn.
lẹhinna o nilo lati ṣe imudojuiwọn itọka si aaye kikọ ki o tun tọka si ibẹrẹ ti agbegbe ọfẹ ni ifipamọ:

msg->b_wptr = msg->b_wptr + size

Ti o ba nilo lati ṣẹda ifiranṣẹ kan lati inu ifipamọ ti o wa, laisi didakọ, lẹhinna lo iṣẹ naa:

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

Iṣẹ naa, lẹhin ṣiṣẹda ifiranṣẹ ati eto ti bulọọki data, yoo tunto awọn itọka rẹ si data ni adirẹsi naa. buff. Awon. ninu ọran yii, ifipamọ data ko wa lẹhin awọn aaye akọsori ti bulọọki data, bi o ti jẹ ọran nigbati ṣiṣẹda bulọọki data pẹlu iṣẹ naa. datab_alloc(). Ifipamọ pẹlu data ti o kọja si iṣẹ naa yoo wa nibiti o wa, ṣugbọn pẹlu iranlọwọ ti awọn itọka yoo so mọ akọsori tuntun ti a ṣẹda ti bulọọki data, ati pe, ni ibamu, si ifiranṣẹ naa.

Si ifiranṣẹ kan mblk_t Ọpọlọpọ awọn bulọọki data le ni idapọ ni ọkọọkan. Eyi ni a ṣe nipasẹ iṣẹ:

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

mp - ifiranṣẹ kan si eyiti bulọọki data miiran yoo ṣafikun;
data - ijuboluwole si bulọọki, ẹda ti eyiti yoo ṣafikun ifiranṣẹ naa;
iwọn - data iwọn;
paadi - Flag kan ti iwọn iranti ti a sọtọ gbọdọ wa ni ibamu pẹlu aala 4-baiti (padding yoo ṣee ṣe pẹlu awọn odo).

Ti aaye to ba wa ninu ifipamọ data ifiranṣẹ ti o wa, lẹhinna data tuntun yoo lẹẹmọ lẹhin data ti o wa tẹlẹ. Ti aaye ọfẹ ba wa ninu ifipamọ data ifiranṣẹ ju iwọn, lẹhinna a ṣẹda ifiranṣẹ titun pẹlu iwọn ifipamọ to ati pe a daakọ data naa si ifipamọ rẹ. Eyi jẹ ifiranṣẹ titun kan, ti o sopọ mọ atilẹba ọkan nipa lilo itọka kan b_tẹsiwaju. Ni idi eyi, ifiranṣẹ naa yipada si tuple kan.

Ti o ba nilo lati ṣafikun bulọọki data miiran si tuple, lẹhinna o nilo lati lo iṣẹ naa:

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

yoo wa ifiranṣẹ ti o kẹhin ninu tuple (o ni b_tẹsiwaju yoo jẹ asan) ati pe yoo pe iṣẹ naa fun ifiranṣẹ yii appendb().

O le wa iwọn data ninu ifiranṣẹ tabi tuple nipa lilo iṣẹ naa:

int msgdsize(const mblk_t *mp);

yoo lupu nipasẹ gbogbo awọn ifiranṣẹ ti o wa ninu tuple ki o pada lapapọ iye data ninu awọn buffers data ti awọn ifiranṣẹ yẹn. Fun ifiranṣẹ kọọkan, iye data jẹ iṣiro bi atẹle:

 mp->b_wptr - mp->b_rptr

Lati darapọ awọn tuples meji, lo iṣẹ naa:

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

o appends awọn tuple tuntun si iru ti tuple mp ati ki o pada a ijuboluwole si awọn ti o kẹhin ifiranṣẹ ti tuple Abajade.

Ti o ba jẹ dandan, tuple kan le yipada si ifiranṣẹ kan pẹlu bulọọki data kan; eyi ni a ṣe nipasẹ iṣẹ naa:

void msgpullup(mblk_t *mp,int len);

ti o ba ti ariyanjiyan lẹnsi jẹ -1, lẹhinna iwọn ifipamọ ti a pin ni ipinnu laifọwọyi. Ti o ba jẹ lẹnsi jẹ nọmba rere, ifipamọ ti iwọn yii yoo ṣẹda ati pe data ifiranṣẹ tuple yoo daakọ sinu rẹ. Ti ifipamọ ba pari, didakọ yoo da duro nibẹ. Ifiranṣẹ akọkọ ti tuple yoo gba ifipamọ iwọn tuntun pẹlu data ti a daakọ. Awọn ifiranṣẹ ti o ku yoo paarẹ ati iranti pada si okiti.

Nigba piparẹ eto kan mblk_t awọn itọkasi kika ti awọn data Àkọsílẹ ti wa ni ya sinu iroyin ti o ba ti, nigba pipe freeb() o wa ni jade lati jẹ odo, lẹhinna ifipamọ data ti paarẹ pẹlu apẹẹrẹ mblk_t, eyiti o tọka si.

Bibẹrẹ awọn aaye ti ifiranṣẹ titun kan:

void mblk_init(mblk_t *mp);

Nfi nkan data miiran kun si ifiranṣẹ naa:

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

Ti data tuntun ko ba ni ibamu si aaye ọfẹ ti ifipamọ data ifiranṣẹ, lẹhinna ifiranṣẹ ti o ṣẹda lọtọ pẹlu ifipamọ ti iwọn ti o nilo ni a so mọ ifiranṣẹ naa (itọkasi si ifiranṣẹ ti a ṣafikun ti ṣeto ni ifiranṣẹ akọkọ) ati ifiranṣẹ yi pada sinu kan tuple.

Ṣafikun nkan ti data si tuple kan:

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

Iṣẹ naa n pe appendb () ni lupu kan.

Darapọ awọn tuples meji si ọkan:

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

Ifiranṣẹ tuntun yoo so si mp.

Ṣiṣe ẹda kan ti ifiranṣẹ kan:

mblk_t *copyb(const mblk_t *mp);

Didaakọ pipe ti tuple pẹlu gbogbo awọn bulọọki data:

mblk_t *copymsg(const mblk_t *mp);

Awọn eroja ti tuple ni a daakọ nipasẹ iṣẹ naa copyb().

Ṣẹda ẹda ti o rọrun ti ifiranṣẹ kan mblk_t. Ni idi eyi, bulọọki data ko daakọ, ṣugbọn iṣiro itọkasi rẹ pọ si db_ref:

mblk_t *dupb(mblk_t *mp);

Ṣiṣe ẹda iwuwo fẹẹrẹ kan ti tuple kan. Awọn bulọọki data ko ṣe daakọ, awọn iṣiro itọkasi wọn nikan ni o pọ si db_ref:

mblk_t *dupmsg(mblk_t* m);

Lilọ gbogbo awọn ifiranṣẹ ti tuple sinu ifiranṣẹ kan:

void msgpullup(mblk_t *mp,size_t len);

Ti o ba ti ariyanjiyan lẹnsi jẹ -1, lẹhinna iwọn ifipamọ ti a pin ni ipinnu laifọwọyi.

Npa ifiranṣẹ rẹ kuro, tuple:

void freemsg(mblk_t *mp);

Iwọn itọkasi Àkọsílẹ data ti dinku nipasẹ ọkan. Ti o ba de odo, bulọọki data naa jẹ paarẹ.

Iṣiro ti lapapọ iye ti data ninu ifiranṣẹ kan tabi tuple.

size_t msgdsize(const mblk_t *mp);

Gbigba ifiranṣẹ pada lati iru ti isinyi:

mblk_t *ms_queue_peek_last (q);

Ṣiṣedaakọ awọn akoonu ti awọn aaye ifipamọ ti ifiranṣẹ kan sinu ifiranṣẹ miiran (ni otitọ, awọn aaye wọnyi ni awọn asia ti o nlo nipasẹ media ṣiṣan):

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

Ipele isinyi_t

Ti isinyi ifiranṣẹ ni media ṣiṣan ti wa ni imuse bi ipin kan ti a ti sopọ mọ ilọpo meji. Ẹya atokọ kọọkan ni itọka si bulọki data pẹlu awọn ayẹwo ifihan agbara. O wa ni pe awọn itọka nikan si bulọọki data n gbe ni titan, lakoko ti data funrararẹ wa laisi iṣipopada. Awon. awọn ọna asopọ si wọn nikan ni a gbe.
Be apejuwe awọn ti isinyi isinyi_t, han ni isalẹ:

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

Awọn be ni a aaye - a ijuboluwole _q_iduro iru * mblk_t, o ntokasi si akọkọ ano (ifiranṣẹ) ninu awọn ti isinyi. Awọn keji aaye ti awọn be ni awọn counter ti awọn ifiranṣẹ ninu awọn ti isinyi.
Nọmba ti o wa ni isalẹ fihan isinyi ti a npè ni q1 ti o ni awọn ifiranṣẹ 4 ninu m1, m2, m3, m4.
Ṣiṣawari ẹrọ Mediastreamer2 VoIP. Apa 11
Nọmba ti o tẹle yii fihan isinyin ti a npè ni q1 ti o ni awọn ifiranṣẹ 4 ninu m1, m2, m3, m4. Ifiranṣẹ m2 jẹ ori tuple kan ti o ni awọn ifiranṣẹ meji diẹ sii m2_1 ati m2_2 ninu.

Ṣiṣawari ẹrọ Mediastreamer2 VoIP. Apa 11

Awọn iṣẹ fun ṣiṣẹ pẹlu awọn queues queue_t

Ipilẹṣẹ isinyi:

void qinit(queue_t *q);

Aaye _q_iduro (lẹhinna a yoo pe ni "stopper") ti wa ni ipilẹṣẹ nipasẹ iṣẹ naa mblk_init(), eroja ti tẹlẹ ati itọka ano atẹle ti wa ni titunse lati tọka si ara rẹ. Atunto eroja ti isinyi si odo.

Nfi eroja tuntun kun (awọn ifiranṣẹ):

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

Ẹya tuntun m ti wa ni afikun si awọn opin ti awọn akojọ, awọn itọka ano ti wa ni titunse ki awọn stopper di nigbamii ti ano fun o, ati awọn ti o di ti tẹlẹ ano fun awọn stopper. Awọn ti isinyi ano counter ti wa ni pọ.

Ngba ohun elo kan pada lati isinyi:

mblk_t * getq(queue_t *q); 

Ifiranṣẹ ti o wa lẹhin ti idaduro ti gba pada, ati pe counter ano ti dinku. Ti ko ba si awọn eroja ninu isinyi ayafi iduro, lẹhinna 0 ti pada.

Fi ifiranṣẹ sii sinu isinyi:

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

Ano mp fi sii ṣaaju ki ano emp... Ti o ba ti a emp=0, lẹhinna ifiranṣẹ naa ti wa ni afikun si iru ti isinyi.

Gbigba ifiranṣẹ pada lati ori ti isinyi:

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

Awọn eroja counter ti wa ni idinku.

Kika itọka si ipin akọkọ ninu isinyi:

mblk_t * peekq(queue_t *q); 

Yiyọ gbogbo awọn eroja kuro ni isinyi lakoko piparẹ awọn eroja funrararẹ:

void flushq(queue_t *q, int how);

Ariyanjiyan bi o ko lo. Ounka eroja ti isinyi ti ṣeto si odo.

Makiro fun kika itọka si ipin ti o kẹhin ti isinyi:

mblk_t * qlast(queue_t *q);

Nigbati o ba n ṣiṣẹ pẹlu awọn isinyi ifiranṣẹ, ṣe akiyesi pe nigba ti o ba pe ms_queue_put(q, m) pẹlu itọka asan si ifiranṣẹ, awọn losiwajulosehin iṣẹ. Eto rẹ yoo di. huwa bakanna ms_queue_tókàn(q, m).

Nsopọ Ajọ

Awọn ti isinyi ti salaye loke ti wa ni lo lati fi awọn ifiranṣẹ lati kan àlẹmọ si miiran tabi lati ọkan si orisirisi awọn Ajọ. Ajọ ati awọn asopọ wọn ṣe apẹrẹ ti o darí. Iṣagbewọle tabi iṣẹjade àlẹmọ yoo pe ni ọrọ gbogbogbo “pin”. Lati ṣe apejuwe aṣẹ ti awọn asẹ ti wa ni asopọ si ara wọn, ṣiṣan media nlo ero ti "ojuami ifihan agbara". Ojuami ifihan agbara ni be _MSCPikun, eyiti o ni itọka si àlẹmọ ati nọmba ọkan ninu awọn pinni rẹ; ni ibamu, o ṣe apejuwe asopọ ti ọkan ninu awọn igbewọle tabi awọn abajade ti àlẹmọ.

Ojuami ifihan agbara ti data processing awonya

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

Awọn pinni àlẹmọ jẹ nọmba ti o bẹrẹ lati odo.

Asopọ ti awọn pinni meji nipasẹ isinyi ifiranṣẹ jẹ apejuwe nipasẹ eto naa _MSQueue, eyiti o ni isinyi ifiranṣẹ ati awọn itọka si awọn aaye ifihan agbara meji ti o so pọ:

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

A yoo pe eto yii ni ọna asopọ ifihan agbara. Ajọ ṣiṣan ṣiṣan media kọọkan ni tabili ti awọn ọna asopọ titẹ sii ati tabili awọn ọna asopọ iṣelọpọ (MSQueue). Iwọn awọn tabili ti ṣeto nigbati o ṣẹda àlẹmọ; a ti ṣe eyi tẹlẹ nipa lilo oniyipada ti okeere ti iru MSFilterDesc, nigba ti a ni idagbasoke àlẹmọ tiwa. Ni isalẹ ni eto ti o ṣe apejuwe eyikeyi àlẹmọ ninu ṣiṣan media kan, 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;

Lẹhin ti a ti sopọ awọn asẹ ninu eto C ni ibamu pẹlu ero wa (ṣugbọn ko so ami si), nitorinaa a ṣẹda ayaworan ti o ni itọsọna, awọn apa eyiti o jẹ apẹẹrẹ ti eto naa. MSFilter, ati awọn egbegbe jẹ awọn apẹẹrẹ ti awọn ọna asopọ MSQueue.

Lẹhin awọn iṣẹ iṣẹlẹ ti tika

Nigbati mo sọ fun ọ pe tika jẹ àlẹmọ fun orisun awọn ami-ami, kii ṣe gbogbo otitọ nipa rẹ. Tika jẹ ohun kan ti o nṣiṣẹ awọn iṣẹ lori aago ilana() gbogbo Ajọ ti awọn Circuit (aya) si eyi ti o ti wa ni ti sopọ. Nigba ti a ba so ami kan pọ mọ àlẹmọ awọnyaya ninu eto C kan, a fihan tika tika naa ti yoo ṣakoso lati isisiyi lọ titi ti a fi pa a. Lẹhin ti o ti sopọ, tika naa bẹrẹ lati ṣayẹwo awọn aworan ti a fi si itọju rẹ, ti n ṣajọ akojọ awọn asẹ ti o pẹlu rẹ. Ni ibere ki o má ba “ka” àlẹmọ kanna lẹẹmeji, o samisi awọn asẹ ti a rii nipa gbigbe apoti kan sinu wọn. ri. Wiwa naa ni a ṣe ni lilo awọn tabili ọna asopọ ti àlẹmọ kọọkan ni.

Lakoko irin-ajo ifọrọwerọ rẹ ti iwọn, ami ami si ṣayẹwo boya laarin awọn asẹ wa o kere ju ọkan ti o ṣiṣẹ bi orisun awọn bulọọki data. Ti ko ba si, lẹhinna aworan naa ni a ka pe ko tọ ati pe ami kọlu.

Ti aworan naa ba jade lati jẹ “ti o tọ”, fun àlẹmọ kọọkan ti a rii, iṣẹ naa ni a pe fun ipilẹṣẹ ilana (). Ni kete ti akoko naa ba de fun ọna ṣiṣe atẹle (gbogbo 10 milliseconds nipasẹ aiyipada), tika naa pe iṣẹ naa ilana() fun gbogbo awọn asẹ orisun ti a ti rii tẹlẹ, ati lẹhinna fun awọn asẹ to ku ninu atokọ naa. Ti àlẹmọ ba ni awọn ọna asopọ titẹ sii, lẹhinna nṣiṣẹ iṣẹ naa ilana() tun titi ti awọn isinyi ọna asopọ titẹ sii ṣofo. Lẹhin eyi, o tẹsiwaju si àlẹmọ atẹle ninu atokọ naa ati “yi lọ” rẹ titi awọn ọna asopọ titẹ sii ni ofe awọn ifiranṣẹ. Tika n gbe lati àlẹmọ lati ṣe àlẹmọ titi ti atokọ yoo fi pari. Eleyi pari awọn processing ti awọn ọmọ.

Bayi a yoo pada si awọn tuples ati sọrọ nipa idi ti iru nkan kan ṣe fi kun si ṣiṣan media. Ni gbogbogbo, iye data ti a beere nipasẹ algoridimu ti n ṣiṣẹ inu àlẹmọ ko ṣe deede ati pe kii ṣe ọpọ iwọn ti awọn ifipamọ data ti o gba ni titẹ sii. Fun apẹẹrẹ, a n kọ àlẹmọ kan ti o ṣe iyipada Fourier yiyara, eyiti nipasẹ asọye le ṣe ilana awọn bulọọki data nikan ti iwọn rẹ jẹ agbara ti meji. Jẹ ki o jẹ awọn iṣiro 512. Ti data naa ba jẹ ipilẹṣẹ nipasẹ ikanni tẹlifoonu, lẹhinna ifipamọ data ti ifiranṣẹ kọọkan ni titẹ sii yoo mu awọn apẹẹrẹ ifihan agbara 160 wa. O jẹ idanwo lati ma gba data lati titẹ sii titi iye data ti a beere yoo wa nibẹ. Ṣugbọn ninu ọran yii, ikọlu yoo waye pẹlu ami tika, eyiti yoo gbiyanju laiṣe aṣeyọri lati yi àlẹmọ naa titi ọna asopọ titẹ sii yoo ṣofo. Ni iṣaaju, a yan ofin yii gẹgẹbi ipilẹ kẹta ti àlẹmọ. Ni ibamu si yi opo, awọn àlẹmọ ká ilana () iṣẹ gbọdọ gba gbogbo data lati input awọn isinyi.

Ni afikun, kii yoo ṣee ṣe lati mu awọn ayẹwo 512 nikan lati inu titẹ sii, nitori o le gba gbogbo awọn bulọọki nikan, ie. àlẹmọ yoo ni lati mu awọn ayẹwo 640 ati lo 512 ninu wọn, iyoku ṣaaju kikojọpọ ipin tuntun ti data. Nitorinaa, àlẹmọ wa, ni afikun si iṣẹ akọkọ rẹ, gbọdọ pese awọn iṣe iranlọwọ fun ibi ipamọ agbedemeji ti data igbewọle. Awọn olupilẹṣẹ ti ṣiṣan media ati ojutu si iṣoro gbogbogbo yii ti ṣe agbekalẹ ohun pataki kan - MSBufferizer (bufferer), eyiti o yanju iṣoro yii nipa lilo awọn tuples.

Bufferizer (MSBufferizer)

Eyi jẹ ohun kan ti yoo ṣajọ data igbewọle inu àlẹmọ naa ki o bẹrẹ fifisilẹ fun sisẹ ni kete ti iye alaye ti to lati ṣiṣẹ algorithm àlẹmọ. Lakoko ti ifipamọ n ṣajọpọ data, àlẹmọ yoo ṣiṣẹ ni ipo aiṣiṣẹ, laisi lilo agbara sisẹ ti ero isise naa. Ṣugbọn ni kete ti iṣẹ kika lati bufferer ba pada iye miiran ju odo, iṣẹ ilana () ti àlẹmọ bẹrẹ lati mu ati ilana data lati inu ifipamọ ni awọn ipin ti iwọn ti o nilo, titi ti o fi rẹwẹsi.
Data ti a ko ti beere sibẹsibẹ wa ninu ifipamọ bi ipin akọkọ ti tuple, eyiti a so mọ awọn bulọọki ti o tẹle ti data igbewọle.

Ilana ti o ṣe apejuwe ifipamọ:

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

Awọn iṣẹ fun ṣiṣẹ pẹlu MSBufferizer

Ṣiṣẹda apẹẹrẹ ifipamọ tuntun:

MSBufferizer * ms_bufferizer_new(void);

Iranti ti wa ni sọtọ, initialized ni ms_bufferizer_init() ati ijuboluwole ti wa ni pada.

Iṣẹ ibẹrẹ:

void ms_bufferizer_init(MSBufferizer *obj); 

Ti isinyi ti wa ni initializing q, aaye iwọn ti ṣeto si odo.

Fifi ifiranṣẹ kan kun:

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

Ifiranṣẹ m ti wa ni afikun si isinyi. Iwọn iṣiro ti awọn bulọọki data ti wa ni afikun si iwọn.

Gbigbe gbogbo awọn ifiranṣẹ lati isinyi data ọna asopọ si ifipamọ q:

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

Gbigbe awọn ifiranṣẹ lati ọna asopọ kan q ni ifipamọ ti wa ni ošišẹ ti lilo awọn iṣẹ ms_bufferizer_put().

Kika lati inu ifipamọ:

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

Ti iwọn data ti a kojọpọ ninu ifipamọ ba kere si eyiti o beere (datalen), lẹhinna iṣẹ naa pada odo, data ko daakọ si data. Bibẹẹkọ, didakọ data lẹsẹsẹ lati awọn tuples ti o wa ninu ifipamọ ni a ṣe. Lẹhin didaakọ, tuple ti paarẹ ati iranti ti ni ominira. Didaakọ dopin ni akoko nigbati awọn baiti datalen ti daakọ. Ti aaye ba jade ni arin Àkọsílẹ data, lẹhinna ninu ifiranṣẹ yii, idinamọ data yoo dinku si apakan ti a ko daakọ. Nigbamii ti o ba pe, didaakọ yoo tẹsiwaju lati aaye yii.

Kika iye data ti o wa lọwọlọwọ ninu ifipamọ:

int ms_bufferizer_get_avail(MSBufferizer *obj); 

Pada aaye naa iwọn bufferer.

Yiyọ apakan ti data ni ifipamọ:

void ms_bufferizer_skip_bytes(MSBufferizer *obj, int bytes);

Nọmba pato ti awọn baiti ti data ti wa ni gbigba ati sisọnu. Atijọ data ti wa ni asonu.

Npa gbogbo awọn ifiranṣẹ rẹ kuro ninu ifipamọ:

void ms_bufferizer_flush(MSBufferizer *obj); 

Atunto counter data si odo.

Npa gbogbo awọn ifiranṣẹ rẹ kuro ninu ifipamọ:

void ms_bufferizer_uninit(MSBufferizer *obj); 

Awọn counter ni ko tun.

Yiyọ ifipamọ kuro ati iranti ọfẹ:

void ms_bufferizer_destroy(MSBufferizer *obj);  

Awọn apẹẹrẹ ti lilo bufferer ni a le rii ni koodu orisun ti ọpọlọpọ awọn asẹ ṣiṣan media. Fun apẹẹrẹ, ninu MS_L16_ENC àlẹmọ, eyi ti o satunto awọn baiti ninu awọn ayẹwo lati awọn nẹtiwọki ibere lati ogun ibere: l16.c

Ninu nkan ti o tẹle, a yoo wo ọran ti iṣiro idiyele lori ami ami kan ati awọn ọna lati koju ẹru iširo ti o pọju ni ṣiṣan media kan.

orisun: www.habr.com

Fi ọrọìwòye kun