Lawe ʻia ka mea o ka ʻatikala mai kaʻu
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
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.
Hōʻike kēia kiʻi i kahi tuple o ʻekolu mau leka m1, m1_1, m1_2.
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.
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.
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:
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