Kuongorora iyo Mediastreamer2 VoIP injini. Chikamu 11

Zvinyorwa zvechinyorwa zvakatorwa kubva kwangu zen channel.

Kuongorora iyo Mediastreamer2 VoIP injini. Chikamu 11

Data movement mechanism

  • Data block dblk_t
  • Mharidzo mblk_t
  • Mabasa ekushanda nemameseji mblk_t
  • Queue queue_t
  • Mabasa ekushanda nemitsetse queue_t
  • Kubatanidza mafirita
  • Signal point yedata processing graph
  • Kuseri kwezviitiko zviitiko zveticker
  • Bufferizer (MSBufferizer)
  • Mabasa ekushanda neMSBufferizer

Pakupedzisira chinyorwa takagadzira sefa yedu. Ichi chinyorwa chinotarisa pane yemukati meshini yekufambisa data pakati pemedia streamer mafirita. Izvi zvinokutendera kuti unyore mafirita akaomesesa nekuedza kushoma mune ramangwana.

Data movement mechanism

Kufamba kwedata mu media streamer kunoitwa uchishandisa mitsetse inotsanangurwa nechimiro queue_t. Tambo dzemeseji dzakadai mblk_t, iyo pachayo isina data yechiratidzo, asi inongobatanidza kune yapfuura, inotevera meseji uye kune data block. Mukuwedzera, ndinoda kunyanya kusimbisa kuti kunewo nzvimbo yekubatanidza kune meseji yemhando imwechete, iyo inokubvumira kuronga runyoro rwakabatanidzwa rwemashoko. Tichadaidza boka remeseji rakabatanidzwa nerunyoro rwakadai tuple. Saka, chero chinhu chemutsetse chinogona kunge chiri meseji imwe chete mblk_t, uye pamwe musoro wemeseji tuple mblk_t. Imwe neimwe tuple meseji inogona kuve neyayo wadhi data block. Tichakurukura kuti nei tuples ichidikanwa zvishoma gare gare.

Sezvambotaurwa pamusoro, iyo meseji pachayo haina block yedata; pachinzvimbo, inongori neinongedzo kunzvimbo yekurangarira inochengeterwa block. Muchikamu chino, mufananidzo wakazara webasa remedia streamer unoyeuchidza imba yekuchengetera mikova mune katuni "Monsters, Inc.," apo magonhi (manongedzo kumakamuri - edhata) anofamba nekumhanya kunopenga pamwe chete nemafambisi epamusoro, nepo makamuri pachawo. ramba ukanyarara.

Zvino, tichifamba nehumambo kubva pasi kusvika kumusoro, ngatitarisei zvakadzama masangano akanyorwa edhisheni yekufambisa data mune media streamer.

Data block dblk_t

Iyo data block ine musoro uye data buffer. Musoro unotsanangurwa nechimiro chinotevera,

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

Iyo minda yechimiro ine zvinongedzo zvekutanga kwebhafa, kumagumo kwebhafa, uye basa rekudzima data buffer. Chekupedzisira mumusoro db_ref - referensi counter, kana ikasvika zero, izvi zvinoshanda sechiratidzo chekudzima iyi block kubva mundangariro. Kana iyo data block yakagadzirwa nebasa datab_alloc() , ipapo iyo data buffer ichaiswa mundangariro pakarepo mushure memusoro. Mune zvimwe zviitiko zvese, iyo buffer inogona kuwanikwa kumwe kwakasiyana. Iyo data buffer ichange iine masignal samples kana imwe data yatinoda kugadzirisa nemafirita.

Muenzaniso mutsva we data block inogadzirwa uchishandisa basa:

dblk_t *datab_alloc(int size);

Seyekupinza parameter, inopiwa saizi yedata iyo block ichachengeta. Imwe ndangariro yakagoverwa kuitira kuisa musoro - chimiro - pakutanga kweiyo yakagoverwa ndangariro datab. Asi kana uchishandisa mamwe mabasa, izvi hazviwanzo kuitika; mune dzimwe nguva, iyo data buffer inogona kuwanikwa yakaparadzana kubva kune data block musoro. Paunenge uchigadzira chimiro, minda inogadziriswa kuitira kuti munda wayo db_base yakaratidza kutanga kwenzvimbo yedata, uye db_lim kusvika pakuguma kwayo. Link count db_ref yakaiswa kune imwe. Iyo data clear function pointer yakaiswa kune zero.

mashoko mblk_t

Sezvakataurwa, zvinhu zvemutsetse ndezvemhando mblk_t, inotsanangurwa sezvizvi:

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;

mamiriro mblk_t ine zvinongedzo pakutanga b_prev, b_inotevera, izvo zvinodiwa kuronga rondedzero yakabatanidzwa kaviri (inova mutsara queue_t).

Ipapo kunouya chinongedzo b_cont, iyo inoshandiswa chete kana meseji iri chikamu chetuple. Kune meseji yekupedzisira mune tuple, ino pointer inoramba isina chinhu.

Tevere tinoona chinongedzo kune data block b_datap, iro shoko riripo. Inoteverwa nemanongedzo kunzvimbo iri mukati me block data buffer. Munda b_rptr inotsanangura nzvimbo iyo data kubva kubhafa ichaverengwa. Munda b_wptr inoratidza nzvimbo kubva painonyorera kune buffer ichaitwa.

Minda yakasara ndeyemhando yebasa uye haina hukama nekushanda kweiyo data transfer mechanism.

Pazasi pane meseji imwechete ine zita m1 uye data block d1.
Kuongorora iyo Mediastreamer2 VoIP injini. Chikamu 11
Mufananidzo unotevera unoratidza rutatu rwemashoko matatu m1, m1_1, m1_2.
Kuongorora iyo Mediastreamer2 VoIP injini. Chikamu 11

Mabasa ekutumira mameseji mblk_t

Mharidzo itsva mblk_t yakagadzirwa nebasa:

mblk_t *allocb(int size, int pri); 

anoisa meseji nyowani mundangariro mblk_t ine data block yehukuru hwakatarwa zera, nharo yechipiri - pri isingashandiswe mushanduro iyi yeraibhurari. Inofanira kuramba iri zero. Panguva yekushanda kwebasa, chiyeuchidzo chichagoverwa kune chimiro chemashoko matsva uye basa racho richadanwa mblk_init(), iyo ichagadzirisa minda yese yemuenzaniso wakasikwa wechimiro uyezve, uchishandisa zvataurwa pamusoro apa datab_alloc(), ichagadzira data buffer. Mushure meizvozvo minda muchimiro ichagadziriswa:

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

Pazvinobuda tinogashira meseji nyowani ine minda yekutanga uye isina chinhu data buffer. Kuti uwedzere data kune meseji, unofanirwa kuikopa kune data block buffer:

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

apo dhata inongedzo kune iyo data sosi, uye zera - saizi yavo.
ipapo iwe unofanirwa kuvandudza chinongedzo kunzvimbo yekunyora kuitira kuti inongedze zvakare pakutanga kwenzvimbo yemahara mubuffer:

msg->b_wptr = msg->b_wptr + size

Kana iwe uchida kugadzira meseji kubva kune iripo buffer, pasina kukopa, wobva washandisa basa racho:

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

Basa racho, mushure mekugadzira meseji uye chimiro che data block, inogadzirisa mapoinzi ayo kune data kukero. buff. Avo. mune iyi kesi, iyo data buffer haina kuwanikwa mushure memusoro minda yedata block, sezvazvaive zvakaita pakugadzira dhata data ine basa. datab_alloc(). Iyo buffer ine data yakapfuudzwa kune basa icharamba iripo, asi nerubatsiro rweanongedza iyo inosungirirwa kune ichangobva kugadzirwa musoro weiyo data block, uye izvo, zvinoenderana, kune meseji.

Kune imwe meseji mblk_t akati wandei data blocks anogona kubatanidzwa sequentially. Izvi zvinoitwa nekushanda:

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

mp - meseji iyo imwe data block ichawedzerwa;
dhata - pointer kune block, kopi yayo ichawedzerwa kune meseji;
zera - saizi yedata;
pad - mureza kuti saizi yendangariro yakagoverwa inofanirwa kuenderana ne4-byte muganhu (padding ichaitwa ne zero).

Kana paine nzvimbo yakakwana mune iripo meseji data buffer, ipapo iyo data nyowani ichanamirwa kuseri kweiyo data yatovepo. Kana paine nzvimbo shoma yemahara mumeseji data buffer pane zera, ipapo meseji nyowani inogadzirwa ine saizi yakakwana yebhafa uye data inokopwa kubhafa yayo. Iyi meseji nyowani, yakabatana neyekutanga uchishandisa chinongedzo b_cont. Muchiitiko ichi, meseji inoshanduka kuita tuple.

Kana iwe uchida kuwedzera imwe block yedata kune tuple, saka unofanirwa kushandisa basa:

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

iye achawana meseji yekupedzisira mune tuple (iye ane b_cont ichave isina) uye ichadaidza basa remeseji iyi appendb().

Iwe unogona kuwana saizi yedata mune meseji kana tuple uchishandisa basa:

int msgdsize(const mblk_t *mp);

iyo inotenderera mukati mese meseji mu tuple uye inodzosera iyo yakazara huwandu hwe data mu data buffers emameseji iwayo. Pameseji yega yega, huwandu hwe data hunoverengerwa sezvizvi:

 mp->b_wptr - mp->b_rptr

Kubatanidza matuples maviri, shandisa basa:

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

anowedzera tuple newm kumuswe wetuple mp uye inodzosera chinongedzo kune yekupedzisira meseji yezvabuda tuple.

Kana zvichidikanwa, tuple inogona kushandurwa kuita meseji imwe chete ine block data; izvi zvinoitwa nebasa:

void msgpullup(mblk_t *mp,int len);

kana nharo len iri -1, saka saizi yebhafa yakagoverwa inotemwa otomatiki. Kana len inhamba yakanaka, buffer yehukuru uhu ichagadzirwa uye iyo tuple meseji data ichakopwa mairi. Kana iyo buffer ikapera, kukopa kunomira ipapo. Meseji yekutanga yetuple inogashira saizi itsva buffer ine data rakakopwa. Iwo mameseji asara achadzimwa uye ndangariro dzodzoserwa kumurwi.

Pakubvisa chimiro mblk_t iyo referensi kuverenga kweiyo data block inotariswa kana, pakufona freeb() inozoita zero, ipapo iyo data buffer inobviswa pamwe chete nemuenzaniso mblk_t, iyo inonongedzera kwairi.

Kutanga minda yemeseji nyowani:

void mblk_init(mblk_t *mp);

Kuwedzera chimwe chidimbu che data kune meseji:

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

Kana iyo data nyowani isingakwane munzvimbo yemahara yemeseji data buffer, saka meseji yakagadzirwa zvakasiyana ine buffer yehukuru hunodiwa inonamirwa kune meseji (inongedzo kune meseji yakawedzerwa yakaiswa mumeseji yekutanga) uye iyo meseji inoshanduka kuita tuple.

Kuwedzera chidimbu che data kune tuple:

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

Basa racho rinodaidza appendb () muchiuno.

Kubatanidza matuples kuita rimwe chete:

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

mashoko newm ichabatanidzwa mp.

Kuita kopi yemeseji imwe chete:

mblk_t *copyb(const mblk_t *mp);

Zadzisa kukopa tuple ine ese mabhuroki data:

mblk_t *copymsg(const mblk_t *mp);

Izvo zvinhu zve tuple zvinoteedzerwa nebasa copyb().

Gadzira kopi iri nyore yemeseji mblk_t. Muchiitiko ichi, data block haina kunyorwa, asi iyo counter counter inowedzerwa db_ref:

mblk_t *dupb(mblk_t *mp);

Kugadzira kopi isina kuremerwa yetuple. Mabhuroki edata haakodzwe, mareferenzi avo chete ndiwo anowedzerwa db_ref:

mblk_t *dupmsg(mblk_t* m);

Kuisa mameseji ese etuple mune imwe meseji:

void msgpullup(mblk_t *mp,size_t len);

Kana nharo len iri -1, saka saizi yebhafa yakagoverwa inotemwa otomatiki.

Kudzima meseji, tuple:

void freemsg(mblk_t *mp);

Iyo data block's referensi count inodzikiswa neimwe. Kana ikasvika zero, iyo data block inobviswa zvakare.

Kuverengera kwehuwandu hwe data mune meseji kana tuple.

size_t msgdsize(const mblk_t *mp);

Kutora meseji kubva kumutsara wemutsara:

mblk_t *ms_queue_peek_last (q);

Kukopa zviri mukati mezvikamu zvakachengetwa zveimwe meseji kune imwe meseji (chaizvoizvo, minda iyi ine mireza inoshandiswa nemedia streamer):

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

Queue queue_t

Mutsara wemeseji mune media streamer unoitwa seyedenderedzwa yakapetwa kaviri runyorwa. Chimwe nechimwe chinyorwa chine chinongedzo kune data block ine masaini masampuli. Zvinoitika kuti zvinongedzo chete kune iyo data block inofamba ichichinjana, nepo iyo data pachayo inoramba isingafambi. Avo. zvinongedzo kwavari chete zvinofambiswa.
Chimiro chinotsanangura mutsara queue_t, inoratidzwa pazasi:

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

Chimiro chine munda - chinongedzo _q_stopper nyora *mblk_t, inonongedza kune chekutanga chinhu (meseji) mumutsetse. Chikamu chechipiri chechimiro icounter yemashoko ari mumutsetse.
Mufananidzo uri pazasi unoratidza mutsara unonzi q1 une mameseji mana m4, m1, m2, m3.
Kuongorora iyo Mediastreamer2 VoIP injini. Chikamu 11
Mufananidzo unotevera unoratidza mutsetse unonzi q1 une mameseji mana m4,m1,m2,m3. Mharidzo m4 ndiwo musoro wetuple ine mamwe mameseji maviri m2_2 uye m1_2.

Kuongorora iyo Mediastreamer2 VoIP injini. Chikamu 11

Mabasa ekushanda nemitsetse queue_t

Kutanga kwemutsara:

void qinit(queue_t *q);

munda _q_stopper (pano tichaidana kuti "chimisa") inotangwa nebasa mblk_init(), chinhu chayo chekare uye chinotevera chinongedzo chechinhu chinogadziridzwa kuti chinongedza pachezvacho. The queue element counter is reset to zero.

Kuwedzera chinhu chitsva (meseji):

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

Chinhu chitsva m inowedzerwa kumagumo echinyorwa, izvo zvinongedzo zvinogadziriswa kuitira kuti chinomisa chive chinhu chinotevera chayo, uye chinova chinhu chekare cheanomira. The queue element counter is incremented.

Kutora chinhu kubva pamutsetse:

mblk_t * getq(queue_t *q); 

Iyo meseji inouya mushure mekunge chivharo chadzoserwa, uye iyo element counter inodzikiswa. Kana pasina maelementi mumutsara kunze kwekumisa, ipapo 0 inodzoserwa.

Kuisa meseji mumutsara:

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

Element mp yakaiswa pamberi pechinhu emp. kana emp= 0, ipapo meseji inowedzerwa kumuswe wemutsara.

Kutora meseji kubva kumukuru wemutsetse:

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

Iyo element counter yakaderedzwa.

Kuverenga chinongedzo chechinhu chekutanga mumutsetse:

mblk_t * peekq(queue_t *q); 

Kubvisa zvinhu zvese kubva pamutsetse uchibvisa iwo maelement pachawo:

void flushq(queue_t *q, int how);

Kupokana sei isina kushandiswa. The queue element counter is set to zero.

Macro yekuverenga chinongedzo kune yekupedzisira chinhu chemutsetse:

mblk_t * qlast(queue_t *q);

Paunenge uchishanda nemitsara yemameseji, ziva kuti paunofona ms_queue_put(q, m) iine null pointer kune meseji, basa rakapetwa. Purogiramu yako ichaoma. kuita zvakafanana ms_queue_inotevera(q, m).

Kubatanidza mafirita

Mutsetse watsanangurwa pamusoro unoshandiswa kupfuudza mameseji kubva kune imwe sefa kuenda kune imwe kana kubva kune imwe kuenda kune akati wandei. Mafirita nekubatanidza kwawo anoumba girafu rakananga. Kupinza kana kubuda kwesefa kuchadaidzwa kuti izwi rekuti "pini". Kutsanangura marongero ayo mafirita akabatanidzwa kune mumwe nemumwe, iyo midhiya inoyerera inoshandisa pfungwa ye "chiratidzo chechiratidzo". Chiratidzo chechiratidzo chimiro _MSCPoint, iyo ine chinongedzo kune sefa uye nhamba yeimwe yepini yayo; saizvozvo, inotsanangura kubatana kweimwe yezvipo kana zvinobuda zvesefa.

Signal point yedata processing graph

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

Pini dzemasefa dzine nhamba kubva pazero.

Kubatanidzwa kwepini mbiri nemutsara wemharidzo kunotsanangurwa nechimiro _MSQueue, iyo ine mutsara wemeseji uye anonongedzera kune maviri masaini mapoinzi ainobatanidza:

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

Tichadaidza chimiro ichi chiratidzo chechiratidzo. Imwe neimwe midhiya streamer sefa ine tafura yekupinza link uye tafura yezvinobuda zvinongedzo (MSQueue) Saizi yematafura inoiswa pakugadzira sefa; isu takatoita izvi tichishandisa shanduko yemhando inotengeswa kunze kwenyika MSFilterDesc, patakagadzira sefa yedu. Pazasi pane chimiro chinotsanangura chero sefa mune media streamer, MSFilter:


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

Mushure mekunge tabatanidza mafirita ari muchirongwa cheC zvinoenderana nehurongwa hwedu (asi hatina kubatanidza ticker), isu takabva tagadzira girafu rakananga, node dzayo dziri zviitiko zvechimiro. MSFilter, uye mipendero mienzaniso yezvibatanidza MSQueue.

Kuseri kwezviitiko zviitiko zveticker

Pandakakuudza kuti chikwekwe chisefa chekwakabva zvikwekwe chaive chisiri chokwadi chese pazviri. Chiratidzo (ticker) chinhu chinoita mabasa pawachi process() ese mafirita edunhu (girafu) kwaakabatanidzwa. Kana isu tikabatanidza ticker kune girafu sefa muchirongwa cheC, tinoratidza ticker iyo girafu iyo ichadzora kubva zvino zvichienda mberi kusvika tadzima. Mushure mekubatanidza, ticker inotanga kuongorora girafu rakapihwa kutarisirwa kwayo, ichinyora runyoro rwemafirita anosanganisira iyo. Kuti urege "kuverenga" sefa imwechete kaviri, inotaridza mafirita akaonekwa nekuisa bhokisi rekutarisa mazviri. ndaona. Kutsvaga kunoitwa pachishandiswa matafura ekubatanidza ane sefa yega yega.

Munguva yekushanya kwayo kwegirafu, iyo ticker inotarisa kana pakati pemasefa paine imwe inoita sesosi yezvivharo zvedata. Kana pasina, ipapo girafu inoonekwa seisina kunaka uye ticker inoputsika.

Kana iyo girafu ikava "chaiyo", kune yega yega yakawanikwa sefa, basa rinodaidzwa kuti ritange preprocess(). Pangosvika nguva yekutevera kutenderera kutenderera (zvese gumi milliseconds nekukasira), iyo ticker inodaidza basa racho. process() kune ese akambowanikwa masefa, uyezve kune asara mafirita murunyorwa. Kana iyo sefa iine zvinongedzo zvinongedzo, zvino mhanyisa basa process() inodzokorora kusvika mitsetse yekubatanidza isisina chinhu. Mushure meizvi, inoenda kune inotevera sefa mune iyo rondedzero uye "inopepeta" iyo kusvika iyo yekuisa link isina meseji. Ticker inofamba kubva pasefa ichienda kusefa kusvika rondedzero yapera. Izvi zvinopedzisa kugadziridzwa kwekutenderera.

Zvino isu tichadzokera kune tuples uye totaura nezvekuti nei chakadai chakawedzerwa kune media streamer. Kazhinji, huwandu hwe data hunodiwa neiyo algorithm inoshanda mukati mesefa haienderane uye haisi kuwanda kwehukuru hwe data buffers inogamuchirwa pane yekuisa. Semuenzaniso, tiri kunyora sefa inoita shanduko inokurumidza yeFourier, iyo netsanangudzo inogona chete kugadzirisa mabhuroki edata ane saizi isimba rembiri. Ngaive 512 kuverenga. Kana iyo data ikagadzirwa nechiteshi cherunhare, ipapo iyo data buffer yemeseji yega yega pane yekuisa ichatiunzira 160 chiratidzo masampuli. Zviri kuyedza kuti usatore data kubva kune yekuisa kusvika iyo inodiwa huwandu hwe data iripo. Asi mune iyi nyaya, kudhumhana kuchaitika neticker, iyo isingabudiriri kuedza kupuruzira sefa kusvika iyo link yekuisa isina chinhu. Kare, takasarudza mutemo uyu seyechitatu musimboti wesefa. Zvinoenderana nemusimboti uyu, iyo sefa's process() basa rinofanira kutora data rese kubva mumitsetse yekuisa.

Uye zvakare, hazvizogone kutora chete 512 samples kubva kune yekuisa, nekuti iwe unogona chete kutora mabhuroki akazara, i.e. iyo sefa ichafanirwa kutora 640 samples uye kushandisa 512 awo, asara asati aunganidza chikamu chitsva che data. Nokudaro, sefa yedu, kuwedzera kune basa rayo guru, inofanira kupa zviito zvekubatsira zvekuchengetedza kwepakati data yekupinza. Vagadziri ve media streamer uye mhinduro kudambudziko iri rakawanda vakagadzira chinhu chakakosha - MSBufferizer (bufferer), inogadzirisa dambudziko iri uchishandisa tuples.

Bufferizer (MSBufferizer)

Ichi chinhu chinounganidza data rekuisa mukati mesefa uye wotanga kuendesa kuti rigadziriswe nekukurumidza kana huwandu hweruzivo hwakwana kumhanyisa sefa algorithm. Ipo iyo buffer iri kuunganidza data, iyo sefa ichashanda isina basa modhi, pasina kushandisa kumusoro kwekugadzirisa simba re processor. Asi panongoita basa rekuverenga kubva kune bufferer rinodzosa kukosha kunze kwe zero, iyo process() basa resefa rinotanga kutora nekugadzirisa data kubva kune bufferer muzvikamu zvehukuru hunodiwa, kusvika yapera.
Iyo data isati yave kudiwa inoramba iri mubuffer sechinhu chekutanga chetuple, iyo inozotevera mabhuraki e data rekuisa akasungirirwa.

Chimiro chinotsanangura buffer:

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

Mabasa ekushanda neMSBufferizer

Kugadzira imwe buffer muenzaniso:

MSBufferizer * ms_bufferizer_new(void);

Memory inopihwa, inotangwa mukati ms_bufferizer_init() uye chinongedzo chinodzoserwa.

Initialization basa:

void ms_bufferizer_init(MSBufferizer *obj); 

Mutsara uri kutanga q, munda zera yakaiswa ku zero.

Kuwedzera meseji:

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

Message m inowedzerwa pamutsetse. Iyo yakaverengerwa saizi ye data block inowedzerwa kune zera.

Kuendesa mameseji ese kubva kumutsara wedata rekubatanidza kuenda kune buffer q:

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

Kutamisa mameseji kubva pane chinongedzo q mu buffer inoitwa uchishandisa basa ms_bufferizer_put().

Kuverenga kubva kubhafa:

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

Kana saizi yedata yakaunganidzwa mubuffer iri shoma pane yakakumbirwa (datalen), ipapo basa rinodzorera zero, data haina kukopa kune data. Zvikasadaro, kuteedzana kutevedzera data kubva kune tuples ari mubuffer kunoitwa. Mushure mekukopa, iyo tuple inodzimwa uye ndangariro inosunungurwa. Kukopa kunopera panguva iyo datalen byte inokopwa. Kana nzvimbo ikapera pakati pe data block, zvino mune iyi meseji, iyo data block ichaderedzwa kusvika yasara isina kunyorwa chikamu. Nguva inotevera yaunofona, kukopa kunoenderera kubva panguva ino.

Kuverenga huwandu hwe data iripo parizvino mubuffer:

int ms_bufferizer_get_avail(MSBufferizer *obj); 

Inodzosera munda zera bufferer.

Kurasa chikamu che data mu buffer:

void ms_bufferizer_skip_bytes(MSBufferizer *obj, int bytes);

Nhamba yakatarwa yemabytes e data inodzoserwa uye kuraswa. Mashoko ekare anoraswa.

Kudzima meseji yese mubuffer:

void ms_bufferizer_flush(MSBufferizer *obj); 

Iyo data counter inoiswa patsva kusvika zero.

Kudzima meseji yese mubuffer:

void ms_bufferizer_uninit(MSBufferizer *obj); 

Kaunda haina kugadzikiswa patsva.

Kubvisa buffer uye kusunungura ndangariro:

void ms_bufferizer_destroy(MSBufferizer *obj);  

Mienzaniso yekushandisa bufferer inogona kuwanikwa mune kodhi kodhi ye akati wandei midhiya streamer mafirita. Semuenzaniso, mune MS_L16_ENC sefa, iyo inorongazve mabheti mumasampuli kubva kunetiweki kurongeka kune iyo host order: l16.c

Muchinyorwa chinotevera, isu tichatarisa nyaya yeticker mutoro fungidziro uye maitiro ekuita neakawandisa komputa mutoro mune media streamer.

Source: www.habr.com

Voeg