Mikaroka ny motera Mediastreamer2 VoIP. Fizarana 11

Ny fitaovan'ny lahatsoratra dia nalaina avy amin'ny ahy fantsona zen.

Mikaroka ny motera Mediastreamer2 VoIP. Fizarana 11

Mekanisma hetsika data

  • Data block dblk_t
  • Hafatra mblk_t
  • Ny fiasa miasa amin'ny hafatra mblk_t
  • Filaharana_t
  • Ny fiasa miasa amin'ny filaharana queue_t
  • Mampifandray sivana
  • Toerana famantarana amin'ny grafika fanodinana angona
  • Ao ambadiky ny sehatra ny hetsika ny ticker
  • Bufferizer (MSBufferizer)
  • Asa miasa amin'ny MSBufferizer

Amin'ny farany lahatsoratra namolavola ny sivanay manokana izahay. Ity lahatsoratra ity dia hifantoka amin'ny rafitra anatiny amin'ny famindrana angon-drakitra eo anelanelan'ny sivana streamer media. Izany dia ahafahanao manoratra sivana be pitsiny miaraka amin'ny ezaka kely kokoa amin'ny ho avy.

Mekanisma hetsika data

Ny hetsika angon-drakitra ao amin'ny streamer media dia atao amin'ny alàlan'ny filaharana voafaritry ny rafitra filaharana_t. Andian'ny hafatra toy ny mblk_t, izay tsy ahitana angon-drakitra famantarana, fa rohy mankany amin'ny hafatra teo aloha sy manaraka ary amin'ny sakana data. Ho fanampin'izay, tiako ny hanamafisana manokana fa misy ihany koa ny saha ho an'ny rohy mankany amin'ny hafatra mitovy karazana, izay ahafahanao mandamina lisitry ny hafatra mifandray tokana. Hantsoinay hoe tuple ny vondrona misy hafatra mitambatra amin'ny lisitra toy izany. Noho izany, ny singa rehetra amin'ny filaharana dia mety ho hafatra tokana mblk_t, ary angamba ny lohan'ny hafatra tuple mblk_t. Ny hafatra tuple tsirairay dia afaka manana sakana angon-drakitra ao amin'ny paroasy manokana. Hodinihintsika ny antony ilana tuple ato aoriana kely.

Araka ny voalaza etsy ambony, ny hafatra dia tsy misy sakana angon-drakitra fa tsy misy afa-tsy tondro mankany amin'ny faritra fitadidiana misy ilay sakana. Amin'ity ampahany ity, ny sary ankapoben'ny asan'ny streamer media dia mampahatsiahy ny trano fitehirizam-baravarana ao amin'ny sariitatra "Monsters, Inc.," izay misy varavarana (rohy mankany amin'ny angona - efitrano) mihetsika amin'ny hafainganam-pandeha adala amin'ny alàlan'ny conveyors ambony, fa ny efitrano mihitsy. mijanona tsy mihetsika.

Ankehitriny, mandeha amin'ny ambaratonga ambany mankany ambony, andeha hodinihintsika amin'ny antsipiriany ireo singa voatanisa ao amin'ny rafitra fandefasana data ao amin'ny streamer media.

Data block dblk_t

Ny bloc data dia misy lohapejy sy buffer data. Ny lohapejy dia faritana amin'ny rafitra manaraka,

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

Ny sahan'ny rafitra dia misy tondro mankany amin'ny fiandohan'ny buffer, ny faran'ny buffer, ary ny fiasa hamafa ny buffer data. Singa farany amin'ny lohapejy db_ref — counter reference, raha mahatratra aotra izany, dia famantarana hamafa ity sakana ity amin'ny fitadidiana. Raha noforonin'ny asa ny sakana data datab_alloc() , dia hapetraka ao anaty fitadidiana ny data buffer avy hatrany aorian'ny lohateny. Amin'ny tranga hafa rehetra, ny buffer dia azo apetraka amin'ny toerana mitokana. Ny buffer data dia ahitana santionany famantarana na angona hafa tiantsika hokarakaraina amin'ny sivana.

Ohatra vaovao momba ny sakana data dia noforonina amin'ny fampiasana ny fiasa:

dblk_t *datab_alloc(int size);

Amin'ny maha mason-tsivana fampidirana azy dia omena ny haben'ny angon-drakitra izay hotehirizin'ilay sakana. Ny fitadidiana bebe kokoa dia omena mba hametrahana lohapejy - rafitra - eo am-piandohan'ny fahatsiarovana nomena datab. Saingy rehefa mampiasa fiasa hafa dia tsy mitranga foana izany; amin'ny tranga sasany, ny buffer data dia mety ho hita misaraka amin'ny lohatenin'ny data block. Rehefa mamorona rafitra dia amboarina ny saha ka ny sahany db_base nanondro ny fiandohan'ny faritra data, ary db_lim hatramin’ny farany. Isan'ny rohy db_ref dia napetraka ho iray. Ny tondro fampiasa mazava tsara dia apetraka amin'ny aotra.

hafatra mblk_t

Araka ny voalaza dia misy karazana ny singa filaharana mblk_t, dia nofaritana toy izao:

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;

rafitra mblk_t misy tondro eo am-piandohana b_prev, b_manaraka, izay ilaina mba handaminana lisitra mifamatotra indroa (izay filaharana filaharana_t).

Avy eo dia tonga ny tondro b_cont, izay ampiasaina raha tsy ao anatin'ny tuple ny hafatra. Ho an'ny hafatra farany ao amin'ny tuple dia mijanona ho tsy misy dikany io tondro io.

Avy eo isika dia mahita tondro mankany amin'ny sakana data b_datap, izay misy ny hafatra. Arahin'ny tondro mankany amin'ny faritra ao anatin'ny buffer data block izany. SaHa b_rptr dia mamaritra ny toerana izay hovakiana ny angona avy amin'ny buffer. SaHa b_wptr manondro ny toerana hanaovana ny fanoratana amin'ny buffer.

Ny sehatra sisa dia manana toetran'ny serivisy ary tsy misy ifandraisany amin'ny fiasan'ny rafitra famindrana angon-drakitra.

Ity ambany ity ny hafatra tokana misy ny anarana m1 ary ny data block d1.
Mikaroka ny motera Mediastreamer2 VoIP. Fizarana 11
Ity sary manaraka ity dia mampiseho tuple misy hafatra telo m1, m1_1, m1_2.
Mikaroka ny motera Mediastreamer2 VoIP. Fizarana 11

Fandefasana hafatra mblk_t

Hafatra vaovao mblk_t noforonin'ny asa:

mblk_t *allocb(int size, int pri); 

mametraka hafatra vaovao ho fahatsiarovana izy mblk_t miaraka amin'ny sakana data amin'ny habe voafaritra habe, hevitra faharoa - PRI tsy ampiasaina amin'ity dikan-tranon'ny tranomboky ity. Tokony hijanona aotra. Mandritra ny fampandehanan'ny asa dia hatokana ho an'ny firafitry ny hafatra vaovao ny fahatsiarovana ary hantsoina ilay asa mblk_init(), izay hamerina ny saha rehetra amin'ny ohatra noforonina amin'ny rafitra ary avy eo, amin'ny fampiasana ireo voalaza etsy ambony datab_alloc(), dia hamorona buffer data. Aorian'izay dia hamboarina ny saha ao amin'ny rafitra:

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

Amin'ny famoahana dia mahazo hafatra vaovao miaraka amin'ny saha natomboka sy buffer data foana isika. Raha te hampiditra data amin'ny hafatra ianao dia mila mandika izany amin'ny buffer sakana data:

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

izay tahirin-kevitra dia tondro mankany amin'ny loharanom-baovao, ary habe - ny habeny.
dia mila manavao ny pointer amin'ny teboka fanoratana ianao mba hanondro indray ny fiandohan'ny faritra malalaka ao amin'ny buffer:

msg->b_wptr = msg->b_wptr + size

Raha mila mamorona hafatra avy amin'ny buffer efa misy ianao, tsy misy kopia, dia ampiasao ny fiasa:

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

Ny fiasa, aorian'ny famoronana ny hafatra sy ny firafitry ny sakana data, dia hanitsy ny tondrony amin'ny angona amin'ny adiresy buff. Ireo. Amin'ity tranga ity, ny buffer data dia tsy hita aorian'ny sahan'ny lohatenin'ny sakana data, toy ny tamin'ny famoronana sakana data miaraka amin'ny fiasa. datab_alloc(). Ny buffer miaraka amin'ny angon-drakitra alefa amin'ny fiasa dia hijanona eo amin'ny toerana misy azy, fa miaraka amin'ny fanampian'ny fanondro dia hafatotra amin'ny lohapejy vao noforonina ny sakana data, ary izany, araka izany, amin'ny hafatra.

Amin'ny hafatra iray mblk_t Ny sakana data maromaro dia azo ampifandraisina misesy. Izany dia atao amin'ny alalan'ny asa:

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

mp - hafatra izay hampiana sakana data hafa;
tahirin-kevitra — fanondro ny sakana, ny dika mitovy amin'izany dia ampiana amin'ny hafatra;
habe - haben'ny angona;
pad - saina iray izay tsy maintsy ampifanitsiana amin'ny sisin-tany 4-byte ny haben'ny fitadidiana natokana ho an'ny (ny padding dia atao amin'ny aotra).

Raha ampy ny toerana ao amin'ny buffer data misy hafatra, dia hapetaka ao ambadiky ny data efa misy ny angona vaovao. Raha kely kokoa ny toerana malalaka ao amin'ny buffer data hafatra noho ny habe, dia misy hafatra vaovao noforonina miaraka amin'ny haben'ny buffer ampy ary ny angona dia adika amin'ny buffer. Hafatra vaovao ity, mifamatotra amin'ilay voalohany amin'ny fampiasana tondro b_cont. Amin'ity tranga ity, ny hafatra dia mivadika ho tuple.

Raha mila manampy sakana angon-drakitra hafa amin'ny tuple ianao dia mila mampiasa ny fiasa:

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

hahita ny hafatra farany ao amin'ny tuple izy (manana b_cont dia ho null) ary hiantso ny fiasa ho an'ity hafatra ity appendb().

Azonao atao ny mahita ny haben'ny data amin'ny hafatra na tuple amin'ny fampiasana ny fiasa:

int msgdsize(const mblk_t *mp);

Izy io dia hivezivezy amin'ny hafatra rehetra ao amin'ny tuple ary hamerina ny totalin'ny angona ao amin'ny buffer data amin'ireo hafatra ireo. Isaky ny hafatra dia kajy toy izao manaraka izao ny isan'ny angona:

 mp->b_wptr - mp->b_rptr

Mba hanambatra tuple roa, ampiasao ny fiasa:

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

ampiany ny tuple newm amin'ny rambon'ny tuple mp ary mamerina tondro mankany amin'ny hafatra farany amin'ny tuple vokarina.

Raha ilaina, ny tuple dia azo avadika ho hafatra iray miaraka amin'ny sakana iray misy angona; izany dia atao amin'ny alàlan'ny asa:

void msgpullup(mblk_t *mp,int len);

raha argument Len dia -1, dia voafaritra ho azy ny haben'ny buffer natokana. RAHA Len dia isa tsara, hatsangana ny buffer amin'io habe io ary hadika ao aminy ny angon-drakitra hafatra tuple. Raha lany ny buffer dia hijanona eo ny kopia. Ny hafatra voalohany amin'ny tuple dia hahazo buffer habe vaovao miaraka amin'ny angona voadika. Ny hafatra sisa dia ho voafafa ary ny fahatsiarovana haverina ao amin'ny antontan-taratasy.

Rehefa mamafa rafitra mblk_t ny isa fanondroana ny sakana data dia raisina raha toa ka, rehefa miantso freeb() dia hita fa aotra, dia voafafa ny buffer data miaraka amin'ny ohatra mblk_t, izay manondro azy.

Fanombohana ny sahan'ny hafatra vaovao:

void mblk_init(mblk_t *mp);

Manampy sombin-drakitra hafa amin'ny hafatra:

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

Raha toa ka tsy mifanaraka amin'ny habaka malalaka amin'ny buffer data ny angon-drakitra vaovao, dia misy hafatra noforonina misaraka miaraka amin'ny buffer amin'ny habe ilaina apetaka amin'ny hafatra (manondro ny hafatra fanampiny dia napetraka ao amin'ny hafatra voalohany) ary ny mivadika ho tuple ny hafatra.

Manampy sombin-drakitra amin'ny tuple:

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

Ny fiasa dia miantso appendb() ao anaty loop.

Manambatra ny tuple roa ho iray:

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

hafatra newm dia hifamatotra amin'ny mp.

Manao dika mitovy amin'ny hafatra tokana:

mblk_t *copyb(const mblk_t *mp);

Fanaovana kopia feno ny tuple miaraka amin'ny sakana data rehetra:

mblk_t *copymsg(const mblk_t *mp);

Ny singa ao amin'ny tuple dia adika amin'ny asa copyb().

Mamorona dika mitovy mora amin'ny hafatra mblk_t. Amin'ity tranga ity, tsy adika ny sakana data, fa ampitomboina ny kaonterany db_ref:

mblk_t *dupb(mblk_t *mp);

Manao dika mitovy maivana amin'ny tuple. Tsy adika ny sakana angona fa ny kaontera fanondrony ihany no ampitomboina db_ref:

mblk_t *dupmsg(mblk_t* m);

Ampifandraiso amin'ny hafatra iray ny hafatra rehetra amin'ny tuple:

void msgpullup(mblk_t *mp,size_t len);

Raha ny argument Len dia -1, dia voafaritra ho azy ny haben'ny buffer natokana.

Famafana hafatra, tuple:

void freemsg(mblk_t *mp);

Ahena iray ny isan'ny fanondroan'ny sakana data. Raha mahatratra aotra izany dia voafafa ihany koa ny sakana data.

Kajy ny totalin'ny angona ao anaty hafatra na tuple.

size_t msgdsize(const mblk_t *mp);

Maka hafatra avy amin'ny rambon'ny filaharana:

mblk_t *ms_queue_peek_last (q);

Fandikana ny votoatin'ny saha voatokana amin'ny hafatra iray mankany amin'ny hafatra iray hafa (raha ny marina dia misy sainam-pirenena ampiasain'ny mpandefa haino aman-jery ireto saha ireto):

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

Filaharana filaharana_t

Ny filaharana hafatra ao amin'ny streamer haino aman-jery dia ampiharina amin'ny endrika boribory mifamatotra indroa. Ny singa lisitra tsirairay dia misy tondro mankany amin'ny sakana angona misy santionany famantarana. Hita fa ny tondro mankany amin'ny sakana data ihany no mihetsika mifandimby, fa ny angon-drakitra mihitsy no tsy mihetsika. Ireo. rohy mankany amin'izy ireo ihany no afindra.
Rafitra mamaritra ny filaharana filaharana_t, aseho eto ambany:

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

Ny rafitra dia misy saha - tondro _q_stopper type *mblk_t, manondro ny singa voalohany (hafatra) ao amin'ny filaharana. Ny sehatra faharoa amin'ny rafitra dia ny kaonteran'ny hafatra ao amin'ny filaharana.
Ny sary etsy ambany dia mampiseho filaharana antsoina hoe q1 misy hafatra 4 m1, m2, m3, m4.
Mikaroka ny motera Mediastreamer2 VoIP. Fizarana 11
Ity sary manaraka ity dia mampiseho filaharana antsoina hoe q1 misy hafatra 4 m1,m2,m3,m4. Ny hafatra m2 dia lohan'ny tuple izay misy hafatra roa hafa m2_1 sy m2_2.

Mikaroka ny motera Mediastreamer2 VoIP. Fizarana 11

Ny fiasa miasa amin'ny filaharana queue_t

Filaharana fanombohana:

void qinit(queue_t *q);

saha _q_stopper (avy eo dia hiantso azy io hoe "stopper") dia natomboka tamin'ny asa mblk_init(), ny singa teo aloha sy ny fanondro singa manaraka dia amboarina mba hanondro ny tenany. Ny kaontera singa filaharana dia averina amin'ny aotra.

Manampy singa vaovao (hafatra):

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

Singa vaovao m dia ampiana amin'ny faran'ny lisitra, ny tondro singa dia amboarina mba ho lasa singa manaraka ho azy ny fanakanana, ary lasa singa teo aloha ho an'ny mpisakana. Ampitomboina ny kaontin'ny singa filaharana.

Maka singa iray avy amin'ny filaharana:

mblk_t * getq(queue_t *q); 

Ny hafatra tonga aorian'ny fiatoana dia alaina, ary ny kaontera singa dia mihena. Raha tsy misy singa ao amin'ny filaharana afa-tsy ny fanakanana, dia averina ny 0.

Mampiditra hafatra ao anaty filaharana:

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

singa mp ampidirina alohan'ny singa emp. raha emp=0, dia ampidirina amin'ny rambon'ny filaharana ny hafatra.

Maka hafatra avy amin'ny lohan'ny filaharana:

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

Mihena ny kaontera singa.

Famakiana tondro mankany amin'ny singa voalohany amin'ny filaharana:

mblk_t * peekq(queue_t *q); 

Esory ny singa rehetra amin'ny filaharana rehefa mamafa ny singa:

void flushq(queue_t *q, int how);

fandresen-dahatra Ahoana no tsy ampiasaina. Ny kaontera singa filaharana dia napetraka ho aotra.

Makro amin'ny famakiana tondro mankany amin'ny singa farany amin'ny filaharana:

mblk_t * qlast(queue_t *q);

Rehefa miasa miaraka amin'ny filaharana hafatra dia tandremo fa rehefa miantso ianao ms_queue_put(q, m) miaraka amin'ny tondro tsy misy dikany amin'ny hafatra, dia mihodina ny fiasa. Hivaingana ny programanao. mitondra tena mitovy ms_queue_next(q, m).

Mampifandray sivana

Ny filaharana voalaza etsy ambony dia ampiasaina handefasana hafatra avy amin'ny sivana iray mankany amin'ny iray hafa na avy amin'ny sivana iray mankany amin'ny maromaro. Ny sivana sy ny fifandraisan'izy ireo dia mamorona grafika mivantana. Ny fidirana na ny fivoahan'ny sivana dia hantsoina hoe "pin" ankapobeny. Mba hamaritana ny filaharan'ny sivana mifandray amin'ny tsirairay, ny streamer media dia mampiasa ny foto-kevitry ny "tondro famantarana". Ny teboka famantarana dia rafitra _MSCPoint, izay misy tondro mankany amin'ny sivana sy ny laharan'ny iray amin'ireo tsimatrany, araka izany, dia mamaritra ny fifandraisan'ny iray amin'ireo fidirana na fivoahana amin'ny sivana.

Toerana famantarana amin'ny grafika fanodinana angona

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

Ny pin sivana dia isaina manomboka amin'ny aotra.

Ny fampifandraisana ny pin roa amin'ny filaharana hafatra dia faritan'ny rafitra _MSQueue, izay misy filaharana hafatra sy tondro mankany amin'ireo teboka famantarana roa mampifandray azy:

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

Hantsoinay hoe rohy famantarana ity rafitra ity. Ny sivana media streamer tsirairay dia misy tabilao misy rohy fampidirana sy tabilao misy rohy mivoaka (MSQueue). Ny haben'ny latabatra dia napetraka rehefa mamorona sivana; efa nanao izany izahay tamin'ny fampiasana karazana varimbazaha naondrana MSFilterDesc, rehefa namorona sivana manokana izahay. Ity ambany ity ny rafitra iray mamaritra ny sivana rehetra ao amin'ny 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;

Rehefa avy nampifandray ny sivana tao amin'ny programa C mifanaraka amin'ny drafitray izahay (fa tsy nampifandray ny ticker), dia namorona grafika mivantana izahay, izay ny nodes dia ohatra amin'ny rafitra. MSFilter, ary ny sisiny dia ohatra amin'ny rohy MSQueue.

Ao ambadiky ny sehatra ny hetsika ny ticker

Rehefa nolazaiko taminao fa sivana ny loharanon'ny kitika ny ticker dia tsy ny marina rehetra momba izany. Ny ticker dia zavatra iray izay miasa amin'ny famantaranandro dingana () ny sivana rehetra amin'ny fizaran-tany (grafika) mifandray aminy. Rehefa ampifandraisina amin'ny sivana grafika amin'ny programa C isika, dia asehontsika amin'ny mpitsikilo ny grafika izay hofeheziny manomboka izao mandra-pamonoana azy. Aorian'ny fampifandraisana dia manomboka mandinika ny grafika nankinina amin'ny fikarakarana azy ilay mpitsikilo, nanangona lisitr'ireo sivana misy azy. Mba tsy "hanisa" indroa ny sivana mitovy, dia manamarika ireo sivana hita izany amin'ny fametrahana boaty fisavana ao anatiny. hita. Ny fikarohana dia atao amin'ny alàlan'ny tabilao rohy misy ny sivana tsirairay.

Mandritra ny fitsidiham-pidirana amin'ny grafika, ny mpitsikilo dia manamarina raha toa ka misy iray fara-fahakeliny miasa ho loharanon'ny sakana angona ao anatin'ireo sivana. Raha tsy misy dia heverina ho diso ny kisary ary mianjera ny ticker.

Raha toa ka "marina" ny sary, ho an'ny sivana tsirairay hita, dia antsoina ho fanombohana ny asa mialoha (). Raha vantany vao tonga ny fotoana ho an'ny tsingerin'ny fanodinana manaraka (isaky ny 10 millisegondra amin'ny alàlan'ny default), ny mpitsikilo dia miantso ny fiasa dingana () ho an'ny sivana loharano hita teo aloha, ary avy eo ho an'ny sivana sisa ao anaty lisitra. Raha manana rohy fampidirana ny sivana, dia mandehana ny asa dingana () miverimberina mandra-pahafoana ny filaharana rohy fampidirana. Aorian'izany dia mandroso mankany amin'ny sivana manaraka ao amin'ny lisitra izy ary "horona" mandra-pahafahan'ny rohy fampidirana. Mifindra avy amin'ny sivana mankany amin'ny sivana ny ticker mandra-pahatapitry ny lisitra. Izany dia mamarana ny fanodinana ny tsingerina.

Ankehitriny dia hiverina amin'ny tuple isika ary hiresaka momba ny antony nampidirana ny sampan-draharaha toy izany tao amin'ny streamer media. Amin'ny ankapobeny, ny habetsaky ny angon-drakitra takian'ny algorithm miasa ao anatin'ny sivana dia tsy mifanandrify ary tsy isa maromaro amin'ny haben'ny buffer data voaray amin'ny fampidirana. Ohatra, manoratra sivana izay manao fiovàna Fourier haingana izahay, izay amin'ny famaritana dia tsy afaka manodina sakana angon-drakitra izay manana hery roa ihany ny habeny. Aoka ho 512 isa. Raha ny angon-drakitra dia vokarina amin'ny alalan'ny telefaonina fantsona, ny angon-drakitra buffer isaky ny hafatra amin'ny fampidirana dia hitondra antsika 160 famantarana famantarana. Maka fanahy ny tsy manangona angona avy amin'ny fampidirana mandra-pahatongan'ny habetsaky ny angona ilaina. Saingy amin'ity tranga ity dia hisy fifandonana amin'ny ticker, izay tsy hahomby amin'ny fiezahana hanodina ny sivana mandra-pahafoana ny rohy fampidirana. Talohan'izay dia nosokajinay ho fitsipika fahatelo amin'ny sivana io fitsipika io. Araka io fitsipika io, ny fiasan'ny sivana () dia tsy maintsy maka ny angona rehetra avy amin'ny filaharana fidirana.

Ankoatr'izay, tsy azo atao ny maka santionany 512 fotsiny amin'ny fampidirana, satria azonao atao ny maka blocs manontolo, i.e. ny sivana dia tsy maintsy maka santionany 640 ary mampiasa 512 amin'izy ireo, ny ambiny alohan'ny hanangonana ampahany vaovao amin'ny angona. Noho izany, ny sivanantsika, ankoatry ny asany lehibe, dia tsy maintsy manome hetsika fanampiny ho an'ny fitehirizana antonony ny angona fidirana. Ny mpandrindra ny media streamer sy ny vahaolana amin'ity olana ankapobeny ity dia namolavola zavatra manokana - MSBufferizer (bufferer), izay mamaha ity olana ity amin'ny fampiasana tuples.

Bufferizer (MSBufferizer)

Ity dia zavatra iray izay hanangona angona fidirana ao anatin'ny sivana ary hanomboka handefa izany ho an'ny fanodinana raha vantany vao ampy ny habetsaky ny fampahalalana hampandehanana ny algorithm sivana. Raha manangona angon-drakitra ny buffer, dia hiasa amin'ny fomba tsy miasa ny sivana, tsy mampiasa ny herin'ny processeur. Fa raha vantany vao mamerina sanda hafa ankoatry ny aotra ny famakian-teny avy amin'ny bufferer, dia manomboka maka sy manodina ny angona avy amin'ny bufferer amin'ny ampahany amin'ny habeny ilaina ny process() fiasan'ny sivana, mandra-pahalevona azy.
Ny angon-drakitra mbola tsy ilaina dia mijanona ao amin'ny buffer ho singa voalohany amin'ny tuple, izay ampifandraisina amin'ireo sakana misy angona fampidirana.

Ny rafitra izay mamaritra ny buffer:

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

Asa miasa amin'ny MSBufferizer

Mamorona ohatra buffer vaovao:

MSBufferizer * ms_bufferizer_new(void);

Ny fitadidiana dia natokana, natomboka tamin'ny ms_bufferizer_init() ary misy tondro averina.

Asa fanombohana:

void ms_bufferizer_init(MSBufferizer *obj); 

Manomboka ny filaharana q, saha habe dia atao aotra.

Manampy hafatra:

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

Ny hafatra m dia ampiana amin'ny filaharana. Ny haben'ny kajy amin'ny sakana data dia ampiana habe.

Mamindra ny hafatra rehetra avy amin'ny filaharana angona rohy mankany amin'ny buffer q:

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

Famindrana hafatra avy amina rohy q ao amin'ny buffer dia atao amin'ny fampiasana ny fiasa ms_bufferizer_put().

Famakiana avy amin'ny buffer:

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

Raha kely noho ny nangatahana ny haben'ny angona voaangona ao amin'ny buffer (datalen), dia miverina aotra ny asa, tsy adika amin'ny angona ny angona. Raha tsy izany, dia atao ny dika mitovy ny angon-drakitra avy amin'ny tuple hita ao amin'ny buffer. Aorian'ny kopia dia voafafa ny tuple ary afaka ny fahatsiarovana. Mifarana ny fanaovana kopia amin'ny fotoana anaovana kopia ny bytes datalen. Raha lany ny habaka eo afovoan'ny sakana data, dia amin'ity hafatra ity, ny sakana data dia hahena ho amin'ny ampahany sisa tsy voadika. Amin'ny fotoana hiantsoanao manaraka dia hitohy ny fanaovana kopia manomboka amin'io fotoana io.

Mamaky ny habetsaky ny angona izay hita amin'izao fotoana izao ao amin'ny buffer:

int ms_bufferizer_get_avail(MSBufferizer *obj); 

Mamerina ny saha habe bufferer.

Manary ampahany amin'ny angona ao amin'ny buffer:

void ms_bufferizer_skip_bytes(MSBufferizer *obj, int bytes);

Ny isa voatondro amin'ny angon-drakitra dia alaina ary ariana. Ny angona tranainy indrindra dia nariana.

Famafana ny hafatra rehetra ao amin'ny buffer:

void ms_bufferizer_flush(MSBufferizer *obj); 

Averina amin'ny zero ny counter data.

Famafana ny hafatra rehetra ao amin'ny buffer:

void ms_bufferizer_uninit(MSBufferizer *obj); 

Tsy averina ny kaontera.

Esory ny buffer sy manafaka fahatsiarovana:

void ms_bufferizer_destroy(MSBufferizer *obj);  

Ohatra amin'ny fampiasana ny bufferer dia hita ao amin'ny kaody loharanon'ny sivana streamer media maromaro. Ohatra, ao amin'ny sivana MS_L16_ENC, izay mamerina ny bytes ao amin'ny santionany avy amin'ny baikon'ny tambajotra mankany amin'ny baikon'ny mpampiantrano: l16.c

Ao amin'ny lahatsoratra manaraka dia hojerentsika ny olan'ny fanombanana ny enta-mavesatra amin'ny ticker sy ny fomba hiadiana amin'ny enta-mavesatry ny informatika be loatra amin'ny streamer media.

Source: www.habr.com

Add a comment