Ke ʻimi nei i ka ʻenekini Mediastreamer2 VoIP. Mahele 11

Lawe ʻia ka mea o ka ʻatikala mai kaʻu zen channel.

Ke ʻimi nei i ka ʻenekini Mediastreamer2 VoIP. Mahele 11

Mekani neʻe ʻikepili

  • Palena ʻikepili dblk_t
  • ʻŌlelo mblk_t
  • Nā hana no ka hana ʻana me nā memo mblk_t
  • Queue queue_t
  • Nā hana no ka hana ʻana me nā queue_t
  • Hoʻohui i nā kānana
  • Kuhikuhi hōʻailona o ka pakuhi hana ʻikepili
  • Ma hope o nā hana a ka ticker
  • Mea hoʻopaʻa (MSBufferizer)
  • Nā hana no ka hana pū me MSBufferizer

I ka hope loa 'ōlelo ua kūkulu mākou i kā mākou kānana ponoʻī. E kālele ana kēia ʻatikala i ka mīkini kūloko no ka neʻe ʻana i ka ʻikepili ma waena o nā kānana streamer media. E ʻae kēia iā ʻoe e kākau i nā kānana maʻalahi me ka hoʻoikaika liʻiliʻi i ka wā e hiki mai ana.

Mekani neʻe ʻikepili

Hana ʻia ka neʻe ʻana o ka ʻikepili i ka streamer media me ka hoʻohana ʻana i nā queues i wehewehe ʻia e ka hale queue_t. Nā kaula o nā memo like mblk_t, ʻaʻole i loaʻa iā lākou iho ka ʻikepili hōʻailona, ​​akā pili wale i ka memo mua a me ka ʻikepili aʻe. Eia kekahi, makemake au e hoʻokūpaʻa loa aia kekahi kahua no kahi loulou i kahi memo o ke ʻano like, e hiki ai iā ʻoe ke hoʻonohonoho i kahi papa inoa o nā memo. E kāhea mākou i kahi hui o nā memo i hui pū ʻia e kēlā papa inoa he tuple. No laila, hiki i kekahi mea o ka pila ke lilo i hoʻokahi memo mblk_t, a ke poʻo paha o kahi tuple memo mblk_t. Hiki i kēlā me kēia memo tuple ke loaʻa i kāna poloka ʻikepili ponoʻī. E kūkākūkā mākou i ke kumu e pono ai nā tuple ma hope iki.

E like me ka mea i ʻōlelo ʻia ma luna, ʻaʻole i loaʻa i ka memo kahi poloka o ka ʻikepili; akā, aia wale nō kahi kuhikuhi i ka wahi hoʻomanaʻo kahi i mālama ʻia ai ka poloka. Ma kēia ʻāpana, ʻo ke kiʻi holoʻokoʻa o ka hana a ka media streamer e hoʻomanaʻo nei i ka hale kūʻai puka ma ke kiʻi "Monsters, Inc.," kahi e neʻe ai nā puka (nā loulou i ka ʻikepili - lumi) me ka wikiwiki pupule ma luna o nā conveyors, ʻoiai nā lumi ponoʻī. noho me ka oni ole.

I kēia manawa, ke neʻe nei ma ka hierarchy mai lalo a luna, e noʻonoʻo pono i nā mea i helu ʻia o ka mīkini hoʻoili ʻikepili i ka streamer media.

Palena ʻikepili dblk_t

Aia ka poloka ʻikepili i kahi poʻomanaʻo a me kahi pale ʻikepili. Hōʻike ʻia ke poʻo e ke ʻano o lalo nei,

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

Aia nā kīhāpai o ka hale i nā kuhikuhi i ka hoʻomaka o ka buffer, ka hopena o ka buffer, a me ka hana no ka holoi ʻana i ka buffer data. ʻElemu hope ma ke poʻo db_ref — counter reference, inā hiki i ka zero, he hōʻailona kēia no ka holoi ʻana i kēia poloka mai ka hoʻomanaʻo. Inā ua hana ʻia ka poloka data e ka hana datab_alloc() , a laila e hoʻokomo ʻia ka waihona ʻikepili i ka hoʻomanaʻo ma hope koke o ke poʻo. I nā hihia ʻē aʻe a pau, hiki ke waiho ʻia ka buffer ma kahi kaʻawale. E loaʻa ana i ka waihona ʻikepili nā hōʻailona hōʻailona a i ʻole nā ​​​​ʻikepili ʻē aʻe a mākou e makemake ai e hana me nā kānana.

Hoʻokumu ʻia kahi mea hou o kahi poloka data me ka hoʻohana ʻana i ka hana:

dblk_t *datab_alloc(int size);

Ma ke ʻano he helu hoʻokomo, hāʻawi ʻia ka nui o ka ʻikepili e mālama ai ka poloka. Hāʻawi ʻia ka hoʻomanaʻo hou aʻe i mea e kau ai i kahi poʻomanaʻo - hale - ma ka hoʻomaka ʻana o ka hoʻomanaʻo i hāʻawi ʻia ʻikepilib. Akā i ka hoʻohana ʻana i nā hana ʻē aʻe, ʻaʻole e hana mau kēia; i kekahi mau hihia, hiki ke hoʻokaʻawale ʻia ka mea hoʻopaʻa ʻikepili mai ke poʻomanaʻo poloka data. I ka hana ʻana i kahi hoʻolālā, hoʻonohonoho ʻia nā māla i hiki i kāna kahua db_base kuhikuhi ʻia i ka hoʻomaka ʻana o ka ʻāpana ʻikepili, a db_lim i kona hopena. Ka helu loulou db_ref hoʻonoho ʻia i hoʻokahi. Hoʻonohonoho ʻia ka ʻike kikoʻī hana kikoʻī i ka ʻole.

memo mblk_t

E like me ka mea i ʻōlelo ʻia, ʻano ʻano nā mea queue mblk_t, ua hoakakaia penei:

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;

'ole mblk_t aia nā kuhikuhi ma ka hoʻomaka b_prev, b_next, pono e hoʻonohonoho i kahi papa inoa pili pālua (ʻo ia ka queue queue_t).

A laila hele mai ke kuhikuhi b_cont, ka mea i hoʻohana wale ʻia inā he ʻāpana ka memo o kahi tuple. No ka memo hope loa i loko o ka tuple, ʻaʻole paʻa kēia kuhikuhi.

A laila ʻike mākou i kahi kuhikuhi i kahi poloka data b_datap, nona ka memo. Hahai ʻia e nā kuhikuhi i ka wahi i loko o ka pale ʻikepili poloka. Kihapai b_rptr kuhikuhi i kahi e heluhelu ʻia ai ka ʻikepili mai ka buffer. Kihapai b_wptr hōʻike i kahi kahi e kākau ai i ka buffer e hana ʻia.

ʻO nā māla i koe he ʻano lawelawe a ʻaʻole pili i ka hana o ka mīkini hoʻoili ʻikepili.

Aia ma lalo kahi leka hoʻokahi me ka inoa m1 a me ka poloka ikepili d1.
Ke ʻimi nei i ka ʻenekini Mediastreamer2 VoIP. Mahele 11
Hōʻike kēia kiʻi i kahi tuple o ʻekolu mau leka m1, m1_1, m1_2.
Ke ʻimi nei i ka ʻenekini Mediastreamer2 VoIP. Mahele 11

Nā hana leka uila mblk_t

He memo hou mblk_t hana ʻia e ka hana:

mblk_t *allocb(int size, int pri); 

waiho ʻo ia i kahi leka hou i ka hoʻomanaʻo mblk_t me kahi poloka ikepili o ka nui i kuhikuhi ʻia ka nui, paio lua - pri ʻaʻole i hoʻohana ʻia ma kēia mana o ka waihona. Pono e noho ʻole. I ka wā o ka hana, e hoʻokaʻawale ʻia ka hoʻomanaʻo no ke ʻano o ka memo hou a kāhea ʻia ka hana mblk_init(), ka mea e hoʻonohonoho hou i nā kahua āpau o ka mea i hana ʻia o ka hale a laila, me ka hoʻohana ʻana i ka mea i ʻōlelo ʻia ma luna datab_alloc(), e hana i kahi pale data. Ma hope o ka hoʻonohonoho ʻana i nā kahua i loko o ka hale:

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

Ma ka hoʻopuka e loaʻa iā mākou kahi memo hou me nā kahua i hoʻomaka ʻia a me kahi pale ʻikepili ʻole. No ka hoʻohui ʻana i ka ʻikepili i kahi memo, pono ʻoe e kope iā ia i ka pale poloka data:

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

kahi ʻikepili he kuhikuhi i ke kumu ikepili, a ka nui - ko lākou nui.
a laila pono ʻoe e hōʻano hou i ka pointer i ke kiko kākau i kuhikuhi hou i ka hoʻomaka ʻana o ka wahi manuahi i ka buffer:

msg->b_wptr = msg->b_wptr + size

Inā pono ʻoe e hana i kahi memo mai kahi buffer i loaʻa, me ka ʻole kope ʻana, a laila e hoʻohana i ka hana:

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

ʻO ka hana, ma hope o ka hana ʻana i ka leka a me ke ʻano o ka poloka data, e hoʻonohonoho i kāna mau kuhikuhi i ka ʻikepili ma ka helu wahi ʻāpala. ʻO kēlā mau mea. i kēia hihia, ʻaʻole i loaʻa ka pale ʻikepili ma hope o nā kahua poʻomanaʻo o ka poloka data, e like me ke ʻano o ka hana ʻana i kahi poloka data me ka hana. datab_alloc(). ʻO ka pahu me ka ʻikepili i hāʻawi ʻia i ka hana e noho ma kahi o ia, akā me ke kōkua o nā kuhikuhi e hoʻopili ʻia i ke poʻomanaʻo hou i hana ʻia o ka poloka ʻikepili, a ʻo ia, e like me ka memo.

I kekahi memo mblk_t Hiki ke hoʻohui pū ʻia kekahi mau poloka ʻikepili. Hana ʻia kēia e ka hana:

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

mp - he memo kahi e hoʻohui ʻia ai kekahi poloka ʻikepili;
ʻikepili - kuhikuhi i ka poloka, kahi kope e hoʻohui ʻia i ka leka;
ka nui - ka nui o ka ʻikepili;
papa - he hae e hoʻolikelike ʻia ka nui o ka hoʻomanaʻo i hāʻawi ʻia ma kahi palena 4-byte (e hana ʻia ka padding me nā zeros).

Inā lawa ka hakahaka o ka ʻikepili memo i kēia manawa, a laila e hoʻopili ʻia ka ʻikepili hou ma hope o ka ʻikepili ma laila. Inā ʻaʻole liʻiliʻi ka hakahaka o ka ʻikepili memo ma mua o ka nui, a laila hoʻokumu ʻia kahi leka hou me ka nui buffer lawa a kope ʻia ka ʻikepili i kāna buffer. He leka hou kēia, i hoʻopili ʻia i ka memo mua me ka hoʻohana ʻana i kahi kuhikuhi b_cont. I kēia hihia, lilo ka memo i kahi tuple.

Inā pono ʻoe e hoʻohui i kahi poloka o ka ʻikepili i ka tuple, a laila pono ʻoe e hoʻohana i ka hana:

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

e loaʻa iā ia ka memo hope loa ma ka tuple (ua loaʻa iā ia b_cont e null) a e kāhea i ka hana no kēia memo appendb().

Hiki iā ʻoe ke ʻike i ka nui o ka ʻikepili i kahi leka a i ʻole tuple me ka hoʻohana ʻana i ka hana:

int msgdsize(const mblk_t *mp);

e hoʻopili ʻo ia i nā memo a pau i loko o ka tuple a hoʻihoʻi i ka nui o nā ʻikepili i loko o nā pale ʻikepili o kēlā mau memo. No kēlā me kēia memo, helu ʻia ka nui o ka ʻikepili penei:

 mp->b_wptr - mp->b_rptr

No ka hoʻohui ʻana i ʻelua tuple, e hoʻohana i ka hana:

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

hoʻopili ʻo ia i ka tuple newm i ka huelo o ka tuple mp a hoʻihoʻi i kahi kuhikuhi i ka memo hope loa o ka tuple hopena.

Inā pono, hiki ke hoʻololi i kahi tuple i hoʻokahi memo me hoʻokahi poloka o ka ʻikepili; hana ʻia kēia e ka hana:

void msgpullup(mblk_t *mp,int len);

ina hoopaapaa len ʻo ia ka -1, a laila hoʻoholo maʻalahi ka nui o ka buffer i hāʻawi ʻia. Ina len He helu maikaʻi, e hana ʻia kahi buffer o kēia nui a e kope ʻia ka ʻikepili memo tuple i loko. Inā pau ka pale, pau ke kope ʻana ma laila. E loaʻa i ka memo mua o ka tuple kahi pale nui hou me ka ʻikepili i kope ʻia. E holoi ʻia nā memo i koe a hoʻihoʻi ʻia ka hoʻomanaʻo i ka puʻu.

I ka holoi ʻana i kahi kūkulu mblk_t ʻO ka helu kuhikuhi o ka poloka ʻikepili i mālama ʻia inā, i ke kelepona ʻana manuahib() ua lilo ia i ʻole, a laila holoi ʻia ka waihona ʻikepili me ka laʻana mblk_t, e kuhikuhi ana iaia.

Ke hoʻomaka nei i nā kahua o kahi memo hou:

void mblk_init(mblk_t *mp);

Hoʻohui i kahi ʻāpana ʻikepili i ka memo:

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

Inā ʻaʻole i kūpono ka ʻikepili hou i loko o ka hakahaka o ka mea hoʻopaʻa ʻikepili memo, a laila ua hoʻopili ʻia kahi memo i hana ʻia me kahi buffer o ka nui i makemake ʻia i ka memo (kahi kuhikuhi i ka memo i hoʻohui ʻia i ka memo mua) a me ka lilo ka memo i tuple.

Hoʻohui i kahi ʻāpana ʻikepili i kahi tuple:

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

Kāhea ka hana i ka appendb() ma kahi loop.

Hoʻohui i ʻelua tuple i hoʻokahi:

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

memo newm e pili ana i mp.

Ke hana nei i kope o hoʻokahi memo:

mblk_t *copyb(const mblk_t *mp);

Hoʻopiha piha i kahi tuple me nā poloka ʻikepili āpau:

mblk_t *copymsg(const mblk_t *mp);

Hoʻopili ʻia nā mea o ka tuple e ka hana kopeb().

E hana i kope maʻalahi o ka memo mblk_t. I kēia hihia, ʻaʻole kope ʻia ka poloka ʻikepili, akā hoʻonui ʻia kāna helu kuhikuhi db_ref:

mblk_t *dupb(mblk_t *mp);

Ke hana ʻana i kope māmā o kahi tuple. ʻAʻole kope ʻia nā poloka ʻikepili, hoʻonui wale ʻia kā lākou mau helu kuhikuhi db_ref:

mblk_t *dupmsg(mblk_t* m);

Hoʻopili i nā memo a pau o kahi tuple i hoʻokahi memo:

void msgpullup(mblk_t *mp,size_t len);

Ina ka hoopaapaa len ʻo ia ka -1, a laila hoʻoholo maʻalahi ka nui o ka buffer i hāʻawi ʻia.

Ke holoi nei i kahi memo, tuple:

void freemsg(mblk_t *mp);

Hoʻemi ʻia ka helu kuhikuhi o ka poloka ʻikepili e hoʻokahi. Inā hiki i ka zero, holoi ʻia ka poloka ʻikepili.

Ka helu ʻana i ka nui o ka ʻikepili i loko o kahi memo a i ʻole tuple.

size_t msgdsize(const mblk_t *mp);

Ke kiʻi nei i kahi memo mai ka huelo o ka pila:

mblk_t *ms_queue_peek_last (q);

Ke kope ʻana i nā ʻike o nā māla i mālama ʻia o kekahi memo i kahi memo ʻē aʻe (ʻoiaʻiʻo, aia kēia mau māla i nā hae i hoʻohana ʻia e ka streamer media):

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

Queue queue_t

Hoʻokō ʻia ka pila memo ma ka streamer media ma ke ʻano he papa inoa pili pālua. Loaʻa i kēlā me kēia mea papa inoa kahi kuhikuhi i kahi poloka ʻikepili me nā hōʻailona hōʻailona. ʻIke ʻia ʻo nā kuhikuhi wale nō i ka poloka ʻikepili e neʻe i ka huli ʻana, ʻoiai ʻo ka ʻikepili ponoʻī e noho ʻole. ʻO kēlā mau. hoʻoneʻe wale ʻia nā loulou iā lākou.
Hoʻolālā e wehewehe ana i ka laina queue_t, hōʻike ʻia ma lalo nei:

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

Aia i loko o ka hale kahi kahua - he kuhikuhi _q_palekana ʻano *mblk_t, kuhikuhi i ka mea mua (memo) ma ka pila. ʻO ke kahua ʻelua o ka hale ka helu helu o nā memo ma ka pila.
Hōʻike ka kiʻi ma lalo nei i kahi pila i kapa ʻia q1 i loaʻa nā memo 4 m1, m2, m3, m4.
Ke ʻimi nei i ka ʻenekini Mediastreamer2 VoIP. Mahele 11
Hōʻike kēia kiʻi i kahi laina i kapa ʻia q1 i loaʻa nā memo 4 m1,m2,m3,m4. ʻO ka memo m2 ke poʻo o kahi tuple i loaʻa i ʻelua mau memo hou m2_1 a me m2_2.

Ke ʻimi nei i ka ʻenekini Mediastreamer2 VoIP. Mahele 11

Nā hana no ka hana ʻana me nā queue_t

Hoʻomaka ka pila:

void qinit(queue_t *q);

kahua _q_palekana (ma hope aku e kapa mākou iā ia he "stopper") i hoʻomaka ʻia e ka hana mblk_init(), ua hoʻoponopono ʻia kona ʻeleʻele mua a me ka mea kikoʻī aʻe e kuhikuhi iā ia iho. Hoʻihoʻi hou ʻia ka helu helu helu i ka ʻole.

Hoʻohui i kahi mea hou (mau memo):

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

Mea hou m ua hoʻohui ʻia i ka hope o ka papa inoa, hoʻoponopono ʻia nā mea kuhikuhi i mea e lilo ai ke pani i mea e hiki mai ana, a lilo ia i mea mua no ka pani. Hoʻonui ʻia ka helu helu helu.

Ke kiʻi nei i kahi mea mai ka pila:

mblk_t * getq(queue_t *q); 

Hoʻihoʻi ʻia ka memo e hiki mai ana ma hope o ka pani ʻana, a ua hoʻemi ʻia ka counter element. Inā ʻaʻohe mea i loko o ka pila koe wale ka pani, a laila hoʻihoʻi ʻia ka 0.

Ke hoʻokomo nei i kahi memo i loko o kahi pila:

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

ʻIke mp hoʻokomo ʻia ma mua o ka mea emp. ^ E Ha yM. Inā emp=0, a laila hoʻohui ʻia ka memo i ka huelo o ka queue.

Ke kiʻi nei i kahi memo mai ke poʻo o ka pila:

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

Hoʻemi ʻia ka counter element.

Heluhelu ʻana i kahi kuhikuhi i ka mea mua ma ka pila:

mblk_t * peekq(queue_t *q); 

Ke wehe nei i nā mea a pau mai ka pila me ka holoi ʻana i nā mea ponoʻī:

void flushq(queue_t *q, int how);

Hoopaapaa pehea ʻaʻole i hoʻohana ʻia. Hoʻonohonoho ʻia ka helu helu helu i ka ʻole.

Macro no ka heluhelu ʻana i kahi kuhikuhi i ka mea hope o ka pila:

mblk_t * qlast(queue_t *q);

I ka hana ʻana me nā queues memo, e makaʻala i ke kelepona ʻana ms_queue_put(q, m) me kahi kuhikuhi null i ka memo, ka puka hana. E maloʻo kāu polokalamu. hana like ms_queue_next(q, m).

Hoʻohui i nā kānana

Hoʻohana ʻia ka pila i hōʻike ʻia ma luna no ka hoʻouna ʻana i nā memo mai kahi kānana i kekahi a i ʻole mai kekahi i kekahi mau kānana. Hoʻokumu nā kānana a me ko lākou mau pili i ka pakuhi kuhikuhi. E kapa ʻia ka mea hoʻokomo a i ʻole ka puka o ka kānana i ka huaʻōlelo maʻamau "pin". No ka wehewehe ʻana i ke ʻano o ka hoʻopili ʻana o nā kānana i kekahi i kekahi, hoʻohana ka media streamer i ka manaʻo o kahi "hōʻailona hōʻailona". ʻO ke kiko hōʻailona ke kūkulu _MSCPoint, aia kahi kuhikuhi i ka kānana a me ka helu o kekahi o kāna mau pine, no laila, wehewehe ia i ka pilina o kekahi o nā mea hoʻokomo a i ʻole nā ​​​​hua o ka kānana.

Kuhikuhi hōʻailona o ka pakuhi hana ʻikepili

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

Ua helu ʻia nā pine kānana mai ka ʻole.

ʻO ka pilina o nā pine ʻelua e kahi queue memo e wehewehe ʻia e ka hale _MSQueue, aia i loko o kahi pila memo a me nā kuhikuhi i nā kiko hōʻailona ʻelua e hoʻopili ai:

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

E kapa mākou i kēia hale he loulou hōʻailona. Loaʻa i kēlā me kēia kānana streamer media kahi papa o nā loulou komo a me kahi papa o nā loulou puka (MSQueue). Hoʻonohonoho ʻia ka nui o nā papa i ka wā e hana ai i kahi kānana; ua hana mua mākou i kēia me ka hoʻohana ʻana i kahi ʻano hoʻololi i lawe ʻia MSFilterDesc, i ka wā i kūkulu ai mākou i kā mākou kānana ponoʻī. Aia ma lalo kahi hoʻolālā e wehewehe ana i kekahi kānana i loko o kahi streamer media, 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;

Ma hope o ka hoʻopili ʻana i nā kānana i ka papahana C e like me kā mākou hoʻolālā (akā ʻaʻole i hoʻopili i ka ticker), no laila ua hana mākou i kahi pakuhi kuhikuhi, ʻo nā nodes he mau manawa o ka hale. MSFilter, a ʻo nā ʻaoʻao nā hiʻohiʻona o nā loulou MSQueue.

Ma hope o nā hana a ka ticker

I koʻu haʻi ʻana iā ʻoe he kānana ka ticker no ke kumu o nā ticks, ʻaʻole ʻo ia ka ʻoiaʻiʻo holoʻokoʻa. ʻO ka ticker kahi mea e holo ana i nā hana ma ka uaki kaʻina hana() nā kānana a pau o ke kaapuni (graph) kahi i hoʻopili ʻia ai. Ke hoʻohui mākou i kahi māka i kahi kānana kiʻi i loko o kahi papahana C, hōʻike mākou i ka ticker i ka pakuhi e hoʻomalu ai ia mai kēia manawa a hiki i ka wā e hoʻopau ai. Ma hope o ka hoʻohui ʻana, hoʻomaka ka mākaʻi e nānā i ka pakuhi i hāʻawi ʻia iā ia e mālama, e hōʻuluʻulu ana i kahi papa inoa o nā kānana e komo pū me ia. I ʻole e "helu" i ka kānana like ʻelua, hōʻailona ia i nā kānana i ʻike ʻia ma ke kau ʻana i kahi pahu pahu i loko o lākou. ike. Hana ʻia ka ʻimi me ka hoʻohana ʻana i nā papa loulou i loaʻa i kēlā me kēia kānana.

I ka wā o kāna huakaʻi hoʻomaka ʻana i ka pakuhi, e nānā ka mākaʻikaʻi inā aia ma waena o nā kānana ma kahi liʻiliʻi e hana ma ke ʻano he kumu o nā poloka ʻikepili. Inā ʻaʻohe mea, a laila, manaʻo ʻia ʻaʻole i pololei ka pakuhi a hāʻule ka ticker.

Inā "pololei" ka pakuhi, no kēlā me kēia kānana i loaʻa, kāhea ʻia ka hana no ka hoʻomaka ʻana hana mua (). I ka hiki ʻana mai o ka manawa no ke kaʻina hana aʻe (i kēlā me kēia 10 milliseconds ma ke ʻano maʻamau), kāhea ka ticker i ka hana. kaʻina hana() no nā kānana kumu i ʻike mua ʻia, a laila no nā kānana i koe ma ka papa inoa. Inā loaʻa i ka kānana nā loulou hoʻokomo, a laila holo i ka hana kaʻina hana() e hana hou ana a hiki i ka nele o na laina laina hookomo. Ma hope o kēia, neʻe ʻo ia i ka kānana aʻe i ka papa inoa a "paʻi" iā ia a hiki i ka pau ʻole o nā loulou i nā memo. Ke neʻe nei ka māka mai kānana a kānana a hiki i ka pau ʻana o ka papa inoa. Hoʻopau kēia i ka hana o ka pōʻai.

I kēia manawa e hoʻi mākou i nā tuples a kamaʻilio e pili ana i ke kumu i hoʻohui ʻia ai kēlā ʻano hui i ka streamer media. Ma keʻano laulā, ʻaʻole kū like ka nui o ka ʻikepili i koi ʻia e ka algorithm e hana ana i loko o ka kānana a ʻaʻole ia he nui o ka nui o nā pale data i loaʻa ma ka hoʻokomo. No ka laʻana, ke kākau nei mākou i kahi kānana e hana ana i ka hoʻololi Fourier wikiwiki, a ma ka wehewehe ʻana hiki ke hana wale i nā poloka ʻikepili nona ka nui he mana ʻelua. E 512 helu. Inā hoʻokumu ʻia ka ʻikepili e kahi ala kelepona, a laila ʻo ka pale ʻikepili o kēlā me kēia memo ma ka hoʻokomo e lawe mai iā mākou i nā hōʻailona hōʻailona 160. He mea hoʻowalewale ʻaʻole e hōʻiliʻili i ka ʻikepili mai ka hoʻokomo a hiki i ka nui o ka ʻikepili i koi ʻia ma laila. Akā i kēia hihia, e kū mai kahi hui me ka ticker, kahi e hoʻāʻo ʻole e ʻōwili i ka kānana a hiki i ka nele o ka loulou hoʻokomo. Ma mua, ua koho mākou i kēia lula e like me ke kolu o ke kumu o ka kānana. Ma muli o kēia kumumanaʻo, pono e lawe ka hana a ka kānana () i nā ʻikepili a pau mai nā queues hoʻokomo.

Eia kekahi, ʻaʻole hiki ke lawe wale i 512 mau laʻana mai ka hoʻokomo, no ka mea hiki iā ʻoe ke lawe wale i nā poloka holoʻokoʻa, i.e. e lawe ka kānana i 640 mau laʻana a hoʻohana i 512 o lākou, ʻo ke koena ma mua o ka hōʻiliʻili ʻana i kahi ʻāpana hou o ka ʻikepili. No laila, ʻo kā mākou kānana, ma waho aʻe o kāna hana nui, pono e hāʻawi i nā hana kōkua no ka mālama waena o ka ʻikepili hoʻokomo. Ua hoʻomohala nā mea hoʻomohala o ka streamer media a me ka hoʻonā i kēia pilikia maʻamau i kahi mea kūikawā - MSBufferizer (bufferer), e hoʻonā i kēia pilikia me ka hoʻohana ʻana i nā tuples.

Mea hoʻopaʻa (MSBufferizer)

He mea kēia e hōʻiliʻili i ka ʻikepili hoʻokomo i loko o ka kānana a hoʻomaka i ka waiho ʻana no ka hana ʻana i ka wā e lawa ai ka nui o ka ʻike e holo i ka algorithm kānana. ʻOiai e hōʻiliʻili ana ka buffer i ka ʻikepili, e hana ka kānana ma ke ʻano hana ʻole, me ka hoʻohana ʻole i ka mana hana o ka mea hana. Akā, i ka manawa e hoʻihoʻi ai ka hana heluhelu mai ka bufferer i kahi waiwai ʻē aʻe ma mua o ka zero, hoʻomaka ke kaʻina () hana o ka kānana e lawe a hana i ka ʻikepili mai ka bufferer i nā ʻāpana o ka nui i makemake ʻia, a hiki i ka pau ʻana.
Aia ka ʻikepili i koi ʻole ʻia i loko o ka buffer ma ke ʻano he mea mua o ka tuple, kahi i hoʻopili ʻia ai nā poloka o ka ʻikepili hoʻokomo.

ʻO ke ʻano e wehewehe ana i ka buffer:

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

Nā hana no ka hana pū me MSBufferizer

Ke hana ʻana i kahi laʻana buffer hou:

MSBufferizer * ms_bufferizer_new(void);

Hoʻokaʻawale ʻia ka hoʻomanaʻo, hoʻomaka ʻia ma ms_bufferizer_init() a hoʻihoʻi ʻia kahi kuhikuhi.

Hana hoʻomaka:

void ms_bufferizer_init(MSBufferizer *obj); 

Ke hoʻomaka nei ka pila q, kahua ka nui ua hoʻonohonoho ʻia i ka ʻole.

Ke hoʻohui nei i kahi memo:

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

Hoʻokomo ʻia ka memo m i ka pila. Hoʻohui ʻia ka nui i helu ʻia o nā poloka ʻikepili ka nui.

Ka hoʻoili ʻana i nā memo a pau mai ka pila ʻikepili loulou i ka pale q:

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

Ke hoʻoili ʻana i nā memo mai kahi loulou q i ka buffer e hana ʻia me ka hoʻohana ʻana i ka hana ms_bufferizer_put().

Heluhelu mai ka buffer:

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

Inā liʻiliʻi ka nui o ka ʻikepili i hōʻiliʻili ʻia ma ka buffer ma mua o ka mea i noi ʻia (datalen), a laila hoʻihoʻi ka hana i ka zero, ʻaʻole kope ʻia ka ʻikepili i ka ʻikepili. A i ʻole, hana ʻia ke kope ʻana o ka ʻikepili mai nā tuple i loko o ka buffer. Ma hope o ke kope ʻana, holoi ʻia ka tuple a hoʻokuʻu ʻia ka hoʻomanaʻo. Pau ke kope ʻana i ka manawa e kope ʻia ai nā byte datalen. Inā pau ka hakahaka ma waena o kahi poloka ʻikepili, a laila ma kēia memo, e hoʻemi ʻia ka poloka ʻikepili i ke koena i kope ʻole ʻia. ʻO ka manawa aʻe āu e kelepona ai, e hoʻomau ke kope ʻana mai kēia wahi.

Heluhelu i ka nui o ka ʻikepili i loaʻa i kēia manawa ma ka buffer:

int ms_bufferizer_get_avail(MSBufferizer *obj); 

Hoʻihoʻi i ke kahua ka nui mea pale.

E hoolei ana i kekahi hapa o ka ikepili ma ka buffer:

void ms_bufferizer_skip_bytes(MSBufferizer *obj, int bytes);

Hoʻihoʻi ʻia a hoʻolei ʻia ka helu o nā bytes o ka ʻikepili. Hoʻolei ʻia ka ʻikepili kahiko.

Ke holoi nei i nā memo a pau i loko o ka buffer:

void ms_bufferizer_flush(MSBufferizer *obj); 

Hoʻihoʻi hou ʻia ka helu helu ʻikepili i ka ʻole.

Ke holoi nei i nā memo a pau i loko o ka buffer:

void ms_bufferizer_uninit(MSBufferizer *obj); 

ʻAʻole hoʻonohonoho hou ʻia ka counter.

Wehe i ka pale a hoʻokuʻu i ka hoʻomanaʻo:

void ms_bufferizer_destroy(MSBufferizer *obj);  

Hiki ke loaʻa nā hiʻohiʻona o ka hoʻohana ʻana i ka bufferer ma ke code kumu o nā kānana streamer media. No ka laʻana, i loko o ka kānana MS_L16_ENC, nāna e hoʻonohonoho hou i nā byte i nā laʻana mai ke kauoha pūnaewele a i ke kauoha hoʻokipa: l16.c

Ma ka ʻatikala aʻe, e nānā mākou i ka pilikia o ka hoʻohālikelike ʻana i ka ukana ma kahi ticker a me nā ala e hakakā ai i ka hoʻouka ʻana i ka nui o ka hoʻopili ʻana ma kahi streamer media.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka