Омӯзиши муҳаррики Mediastreamer2 VoIP. Қисми 11

Материали макола аз ман гирифта шудааст канали zen.

Омӯзиши муҳаррики Mediastreamer2 VoIP. Қисми 11

Механизми интиқоли маълумот

  • Блоки маълумот dblk_t
  • Паём mblk_t
  • Функсияҳо барои кор бо паёмҳо mblk_t
  • Навбат queue_t
  • Функсияҳо барои кор бо навбатҳо queue_t
  • Пайваст кардани филтрҳо
  • Нуқтаи сигнали графикии коркарди маълумот
  • Дар паси парда фаъолияти тикер
  • Буферизатор (MSBufferizer)
  • Функсияҳо барои кор бо MSBufferizer

Дар охир мақола мо филтри худро таҳия кардем. Ин мақола ба механизми дохилии интиқоли маълумот байни филтрҳои стримерҳои медиа тамаркуз хоҳад кард. Ин ба шумо имкон медиҳад, ки дар оянда филтрҳои мураккабро бо кӯшиши камтар нависед.

Механизми интиқоли маълумот

Ҳаракати маълумот дар стримери медиа бо истифода аз навбатҳои аз ҷониби сохтор тавсифшуда иҷро карда мешавад навбат_т. Сатрҳои паёмҳо ба монанди mblk_t, ки худашон маълумоти сигнал надоранд, балки танҳо ба паёми қаблӣ, навбатӣ ва блоки додаҳо истинод мекунанд. Илова бар ин, ман мехоҳам махсусан таъкид намоям, ки майдони истинод ба паёми як намуд мавҷуд аст, ки ба шумо имкон медиҳад, ки рӯйхати ягонаи паёмҳоро ташкил кунед. Мо як гурӯҳи паёмҳоеро, ки бо чунин рӯйхат муттаҳид шудаанд, tuple меномем. Ҳамин тариқ, ҳама гуна унсури навбат метавонад як паём бошад mblk_t, ва шояд сари як tuple паём mblk_t. Ҳар як паёми навор метавонад блоки додаҳои шӯъбаи худро дошта бошад. Мо каме дертар муҳокима хоҳем кард, ки чаро лампаҳо лозиманд.

Тавре ки дар боло зикр гардид, худи паём блоки маълумотро дар бар намегирад, ба ҷои он, он танҳо як ишоракунакро ба минтақаи хотира, ки блок нигоҳ дошта мешавад, дар бар мегирад. Дар ин бахш тасвири умумии кори стримери медиа анбори дари мультфильми "Monsters, Inc."-ро ба хотир меорад, ки дарҳо (пайвандҳо ба маълумот - утоқҳо) бо суръати девонавор дар баробари конвейерҳои болои ҳаракат мекунанд, дар ҳоле ки худи утоқҳо бе ҳаракат мондан.

Акнун, дар баробари иерархия аз поён ба боло ҳаракат карда, биёед объектҳои номбаршудаи механизми интиқоли маълумотро дар стримери медиа ба таври муфассал баррасӣ кунем.

Блоки маълумот dblk_t

Блоки додаҳо аз сарлавҳа ва буфери додаҳо иборат аст. Сарлавҳа бо сохтори зерин тавсиф карда мешавад,

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

Майдонҳои сохтор ишоракунакҳоро ба оғози буфер, охири буфер ва функсия барои нест кардани буфери додаҳо дарбар мегиранд. Унсури охирин дар сарлавҳа db_ref — ҳисобкунаки истинод, агар он ба сифр расад, ин ҳамчун сигнал барои нест кардани ин блок аз хотира хизмат мекунад. Агар блоки маълумот аз ҷониби функсия сохта шуда бошад datab_alloc() , пас буфери маълумот фавран пас аз сарлавҳа дар хотира ҷойгир карда мешавад. Дар ҳама ҳолатҳои дигар, буферро дар ҷои алоҳида ҷойгир кардан мумкин аст. Буфери додаҳо намунаҳои сигнал ё дигар маълумотро дар бар мегирад, ки мо мехоҳем бо филтрҳо коркард кунем.

Намунаи нави блоки додаҳо бо истифода аз функсия сохта мешавад:

dblk_t *datab_alloc(int size);

Ҳамчун параметри вуруд ба он андозаи маълумоте дода мешавад, ки блок нигоҳ медорад. Барои ҷойгир кардани сарлавҳа - сохтор - дар оғози хотираи ҷудошуда хотираи бештар ҷудо карда мешавад додаҳо. Аммо ҳангоми истифодаи дигар функсияҳо ин на ҳамеша рӯй медиҳад; дар баъзе мавридҳо буфери маълумот метавонад аз сарлавҳаи блоки додаҳо алоҳида ҷойгир бошад. Ҳангоми сохтани сохтор майдонҳо тавре танзим карда мешаванд, ки майдони он db_base ба ибтидои майдони маълумот ишора кард, ва db_lim то охири он. Шумораи пайвандҳо db_ref ба як таъин карда мешавад. Нишондиҳандаи функсияи тозакунии маълумот ба сифр муқаррар карда шудааст.

хабар mblk_t

Тавре ки зикр гардид, унсурҳои навбат як намуд доранд mblk_t, ба таври зайл муайян карда мешавад:

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;

сохтори mblk_t дар ибтидо ишораҳоро дар бар мегирад b_prev, б_оянда, ки барои ташкили рӯйхати дукарата алоқаманд заруранд (ки навбат аст навбат_т).

Пас аз он ишоракунанда меояд б_давом, ки танҳо вақте истифода мешавад, ки паём як қисми tuple бошад. Барои паёми охирини навор, ин нишоннамо нул боқӣ мемонад.

Баъдан мо ишоракунакро ба блоки маълумот мебинем b_datap, ки барои он паём мавҷуд аст. Пас аз он ишоракунандагон ба майдони дохили буфери додаҳои блок ҷойгир мешаванд. Майдон b_rptr маконеро, ки маълумот аз буфер хонда мешавад, муайян мекунад. Майдон b_wptr ҷойеро нишон медиҳад, ки аз он навиштан ба буфер иҷро мешавад.

Майдонҳои боқимонда характери хидматӣ доранд ва ба кори механизми интиқоли маълумот марбут нестанд.

Дар зер як паём бо ном аст m1 ва блоки маълумот d1.
Омӯзиши муҳаррики Mediastreamer2 VoIP. Қисми 11
Дар расми зерин маҷмӯи се паём нишон дода шудааст m1, м1_1, м1_2.
Омӯзиши муҳаррики Mediastreamer2 VoIP. Қисми 11

Функсияҳои паёмнависӣ mblk_t

Паёми нав mblk_t аз ҷониби функсия сохта шудааст:

mblk_t *allocb(int size, int pri); 

вай дар хотира паёми нав мегузорад mblk_t бо блоки додаҳои андозаи муайяншуда андоза, далели дуюм - ПешӣБаъдӣ дар ин версияи китобхона истифода намешавад. Он бояд сифр боқӣ монад. Ҳангоми кори функсия хотира барои сохтори паёми нав ҷудо карда мешавад ва функсия даъват карда мешавад mblk_init(), ки ҳамаи майдонҳои намунаи сохташудаи сохторро барқарор мекунад ва сипас бо истифода аз чизҳои дар боло зикршуда datab_alloc(), буфери маълумотро эҷод мекунад. Пас аз он майдонҳо дар сохтор танзим карда мешаванд:

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

Дар баромад мо паёми навро бо майдонҳои оғозшуда ва буфери холии маълумот мегирем. Барои илова кардани маълумот ба паём, шумо бояд онро ба буфери блоки додаҳо нусхабардорӣ кунед:

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

ки маълумот ишора ба манбаи маълумот аст, ва андоза - андозаи онҳо.
пас шумо бояд нишоннаморо ба нуқтаи навиштан навсозӣ кунед, то он дубора ба оғози минтақаи озоди буфер ишора кунад:

msg->b_wptr = msg->b_wptr + size

Агар ба шумо лозим аст, ки паёмро аз буфери мавҷуда бидуни нусхабардорӣ эҷод кунед, пас аз ин функсия истифода баред:

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

Функсия пас аз эҷод кардани паём ва сохтори блоки додаҳо, нишондиҳандаҳои худро ба маълумот дар суроға танзим мекунад буф. Онхое. дар ин ҳолат, буфери додаҳо пас аз майдонҳои сарлавҳаи блоки додаҳо ҷойгир нест, чуноне ки ҳангоми сохтани блоки додаҳо бо функсия буд datab_alloc(). Буфере, ки маълумоте, ки ба функсия дода шудааст, дар ҳамон ҷо боқӣ мемонад, аммо бо ёрии нишондиҳандаҳо он ба сарлавҳаи навтаъсиси блоки додаҳо ва мувофиқан ба паём замима карда мешавад.

Ба як паём mblk_t Якчанд блокҳои маълумотро пайдарпай пайваст кардан мумкин аст. Ин аз ҷониби функсия иҷро карда мешавад:

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

mp — паёме, ки ба он блоки дигари додаҳо илова карда мешавад;
маълумот — ишора ба блок, ки нусхаи он ба хабар илова карда мешавад;
андоза - андозаи маълумот;
pad — парчам, ки андозаи хотираи ҷудошуда бояд дар сарҳади 4-байтӣ мувофиқ карда шавад (пуркунӣ бо сифрҳо анҷом дода мешавад).

Агар дар буфери мавҷудаи маълумот фазои кофӣ мавҷуд бошад, пас маълумоти нав дар паси маълумоти мавҷуда гузошта мешавад. Агар дар буфери додаҳои паём фазои холӣ камтар бошад андоза, пас паёми нав бо андозаи кофии буфер сохта мешавад ва маълумот ба буфери он нусхабардорӣ карда мешавад. Ин паёми навест, ки бо истифода аз нишоннамо ба паёми аслӣ пайваст карда шудааст б_давом. Дар ин ҳолат, паём ба tuple табдил меёбад.

Агар ба шумо лозим аст, ки блоки дигари маълумотро ба навор илова кунед, пас шумо бояд функсияро истифода баред:

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

вай паёми охиринро дар tuple хоҳад ёфт (ӯ дорад б_давом нул хоҳад буд) ва функсияро барои ин паём даъват мекунад appendb().

Бо истифода аз функсия шумо метавонед андозаи маълумотро дар паём ё навор фаҳмед:

int msgdsize(const mblk_t *mp);

он тамоми паёмҳоро дар навор давр мезанад ва ҳаҷми умумии маълумотро дар буферҳои додаҳои ин паёмҳо бармегардонад. Барои ҳар як паём миқдори маълумот ба таври зерин ҳисоб карда мешавад:

 mp->b_wptr - mp->b_rptr

Барои якҷоя кардани ду навор, функсияро истифода баред:

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

вай наворро замима мекунад навм ба думи тупл mp ва ишоракунакро ба паёми охирини наворҳои натиҷавӣ бармегардонад.

Агар лозим бошад, наворро бо як блоки маълумот ба як паём табдил додан мумкин аст; ин аз ҷониби функсия иҷро карда мешавад:

void msgpullup(mblk_t *mp,int len);

агар баҳс len -1 аст, пас андозаи буфери ҷудошуда ба таври худкор муайян карда мешавад. Агар len рақами мусбат аст, буфери ин андоза эҷод карда мешавад ва маълумоти паёми навор ба он нусхабардорӣ карда мешавад. Агар буфер тамом шавад, нусхабардорӣ дар он ҷо қатъ мегардад. Паёми аввалини навор буфери андозаи навро бо маълумоти нусхабардорӣ мегирад. Паёмҳои боқимонда нест карда мешаванд ва хотира ба тӯда бармегардад.

Ҳангоми нест кардани сохтор mblk_t шумораи истинод блоки маълумот ба назар гирифта мешавад, агар, ҳангоми занг freeb() он ба сифр табдил меёбад, пас буфери маълумот дар баробари инстансия нест карда мешавад mblk_t, ки ба он ишора мекунад.

Оғоз кардани майдонҳои паёми нав:

void mblk_init(mblk_t *mp);

Илова кардани пораи дигари маълумот ба паём:

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

Агар маълумоти нав ба фазои холии буфери додаҳои паём мувофиқат накунад, пас ба паём паёми алоҳида сохташуда бо буфери андозаи лозима замима карда мешавад (дар паёми аввал нишондод ба паёми иловашуда гузошта мешавад) ва паём ба навор табдил меёбад.

Илова кардани пораи маълумот ба навор:

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

Функсия appendb()-ро дар як давр даъват мекунад.

Якҷоя кардани ду навор ба як:

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

хабар навм пайваст карда мешавад mp.

Эҷоди нусхаи як паём:

mblk_t *copyb(const mblk_t *mp);

Нусхабардории пурраи навор бо ҳама блокҳои додаҳо:

mblk_t *copymsg(const mblk_t *mp);

Элементҳои навор тавассути функсия нусхабардорӣ карда мешаванд нусхабардорӣ().

Нусхаи осони паёмро эҷод кунед mblk_t. Дар ин ҳолат, блоки додаҳо нусхабардорӣ карда намешавад, аммо ҳисобкунаки истинодҳои он зиёд карда мешавад db_ref:

mblk_t *dupb(mblk_t *mp);

Сохтани нусхаи сабуки tuple. Блокҳои додаҳо нусхабардорӣ карда намешаванд, танҳо ҳисобкунакҳои истинодҳои онҳо афзоиш меёбанд db_ref:

mblk_t *dupmsg(mblk_t* m);

Часпондани ҳамаи паёмҳои tuple ба як паём:

void msgpullup(mblk_t *mp,size_t len);

Агар далел len -1 аст, пас андозаи буфери ҷудошуда ба таври худкор муайян карда мешавад.

Нест кардани паём, навор:

void freemsg(mblk_t *mp);

Шумораи истинодҳои блоки додаҳо як маротиба кам карда мешавад. Агар он ба сифр расад, блоки маълумот низ нест карда мешавад.

Ҳисобкунии ҳаҷми умумии маълумот дар паём ё навор.

size_t msgdsize(const mblk_t *mp);

Гирифтани паём аз думи навбат:

mblk_t *ms_queue_peek_last (q);

Нусхабардории мундариҷаи майдонҳои ҳифзшудаи як паём ба паёми дигар (воқеан, ин майдонҳо дорои парчамҳое мебошанд, ки аз ҷониби пахшкунандаи медиа истифода мешаванд):

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

Қарор навбат_т

Навбати паёмҳо дар стримери медиа ҳамчун рӯйхати дукарата пайваст карда мешавад. Ҳар як унсури рӯйхат дорои нишондиҳанда ба блоки додаҳо бо намунаҳои сигнал мебошад. Маълум мешавад, ки танҳо нишондиҳандаҳои блоки додаҳо бо навбат ҳаракат мекунанд, дар ҳоле ки худи маълумот бе ҳаракат мемонад. Онхое. танҳо пайвандҳо ба онҳо интиқол дода мешаванд.
Сохторе, ки навбатро тавсиф мекунад навбат_т, дар зер нишон дода шудааст:

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

Сохтор дорои майдон - нишондиҳанда мебошад _q_стоппер *mblk_t нависед, он ба унсури аввал (паём) дар навбат ишора мекунад. Майдони дуюми сохтор ҳисобкунаки паёмҳои навбатӣ мебошад.
Дар расми зер навбат бо номи q1 нишон дода шудааст, ки дорои 4 паёми m1, m2, m3, m4 мебошад.
Омӯзиши муҳаррики Mediastreamer2 VoIP. Қисми 11
Дар расми зерин навбат бо номи q1 нишон дода шудааст, ки дорои 4 паём m1,m2,m3,m4 мебошад. Паёми m2 сари наворест, ки ду паёми дигар m2_1 ва m2_2 дорад.

Омӯзиши муҳаррики Mediastreamer2 VoIP. Қисми 11

Функсияҳо барои кор бо навбатҳо queue_t

Оғози навбат:

void qinit(queue_t *q);

соҳа _q_стоппер (минбаъд мо онро "стоппер" меномем) аз ҷониби функсия оғоз карда мешавад mblk_init(), унсури қаблии он ва нишоннамои элементи навбатӣ барои нишон додани худ танзим карда мешаванд. Ҳисобкунаки элементи навбат ба сифр барқарор карда мешавад.

Илова кардани унсури нав (паёмҳо):

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

Элементи нав m ба охири рӯйхат илова карда мешавад, нишондиҳандаҳои элементҳо тавре танзим карда мешаванд, ки стопор барои он элементи навбатӣ ва унсури қаблӣ барои стопор мегардад. Ҳисобкунаки элементи навбат зиёд карда мешавад.

Гирифтани элемент аз навбат:

mblk_t * getq(queue_t *q); 

Паёме, ки пас аз қатъкунанда меояд, гирифта мешавад ва ҳисобкунаки элемент кам карда мешавад. Агар дар навбат ҷуз стопер ягон элемент мавҷуд набошад, пас 0 баргардонида мешавад.

Ворид кардани паём ба навбат:

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

Элемент mp пеш аз элемент гузошта шудааст НИМЗ. Агар НИМЗ=0, пас паём ба думи навбат илова карда мешавад.

Гирифтани паём аз сардори навбат:

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

Ҳисобкунаки элемент кам карда мешавад.

Хондани нишондиҳанда ба унсури якум дар навбат:

mblk_t * peekq(queue_t *q); 

Хориҷ кардани ҳама унсурҳо аз навбат ҳангоми нест кардани худи элементҳо:

void flushq(queue_t *q, int how);

Баҳс чи тавр истифода нашудаанд. Ҳисобкунаки элементи навбат ба сифр муқаррар карда шудааст.

Макрос барои хондани ишора ба унсури охирини навбат:

mblk_t * qlast(queue_t *q);

Ҳангоми кор бо навбатҳои паёмҳо, огоҳ бошед, ки ҳангоми занг задан ms_queue_put(q, м) бо нишоннамои нул ба паём, функсия ҳалқа мекунад. Барномаи шумо ях мекунад. хамин тавр рафтор мекунад ms_queue_next(q, м).

Пайваст кардани филтрҳо

Навбати дар боло тавсифшуда барои интиқоли паёмҳо аз як филтр ба дигараш ё аз як филтр ба якчанд филтр истифода мешавад. Филтрҳо ва пайвастҳои онҳо графики равонашударо ташкил медиҳанд. Вуруд ё баромади филтр калимаи умумии “пин” номида мешавад. Барои тавсифи тартиби бо ҳам пайваст кардани филтрҳо, стримери медиа мафҳуми "нуқтаи сигнал" -ро истифода мебарад. Нуқтаи сигнал сохтор аст _MSCPoint, ки нишондиҳандаи филтр ва рақами яке аз пинҳои онро дар бар мегирад; мувофиқан он пайвасти яке аз вуруд ё баромади филтрро тавсиф мекунад.

Нуқтаи сигнали графикии коркарди маълумот

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

Пинҳонҳои филтр аз сифр сар карда рақамгузорӣ карда мешаванд.

Пайвастшавии ду пин бо навбати паём аз ҷониби сохтор тавсиф карда мешавад _MSQueue, ки дорои навбати паём ва ишоракунакҳо ба ду нуқтаи сигнал, ки мепайвандад:

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

Мо ин сохторро пайванди сигналӣ меномем. Ҳар як филтри пахшкунандаи медиа дорои ҷадвали истинодҳои воридотӣ ва ҷадвали истинодҳои баромад (MSQueue). Андозаи ҷадвалҳо ҳангоми сохтани филтр муқаррар карда мешавад; мо ин корро аллакай бо истифода аз тағирёбандаи содиршудаи навъи анҷом додаем MSFilterDesc, вақте ки мо филтри худро таҳия кардем. Дар зер сохторе оварда шудааст, ки ҳама гуна филтрро дар стримери медиа тавсиф мекунад, 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;

Пас аз он ки мо филтрҳоро дар барномаи C мувофиқи нақшаи худ пайваст кардем (вале тикерро пайваст накардем), мо бо ин як графики равонашударо сохтем, ки гиреҳҳои он намунаҳои сохтор мебошанд. MSFilter, ва кунҷҳо мисолҳои пайвандҳо мебошанд MSQueue.

Дар паси парда фаъолияти тикер

Вақте ки ман ба шумо гуфтам, ки тикер як филтр барои манбаи канаҳо аст, ин ҳама ҳақиқат дар бораи он набуд. Тикер объектест, ки функсияҳоро дар соат иҷро мекунад раванд () тамоми филтрҳои схема (график), ки ба он пайваст карда шудааст. Вақте ки мо тикерро ба филтри графикӣ дар барномаи C пайваст мекунем, мо ба тикер графикеро нишон медиҳем, ки аз ҳоло то хомӯш кардани он назорат хоҳад кард. Пас аз пайвастшавӣ, тикер ба тафтиш кардани графике, ки ба нигоҳубини он бовар карда шудааст, оғоз мекунад ва рӯйхати филтрҳоро дар бар мегирад. Барои он ки як филтр ду маротиба "ҳисоб карда нашавад", он филтрҳои ошкоршударо бо гузоштани қуттии қайд дар онҳо қайд мекунад. дида. Ҷустуҷӯ бо истифода аз ҷадвалҳои истинод, ки ҳар як филтр дорад, анҷом дода мешавад.

Ҳангоми сайри муқаддимавии худ аз график, тикер тафтиш мекунад, ки оё дар байни филтрҳо ҳадди аққал як филтр ҳамчун манбаи блокҳои додаҳо амал мекунад ё не. Агар вуҷуд надошта бошад, он гоҳ график нодуруст ҳисобида мешавад ва тикер вайрон мешавад.

Агар график "дуруст" шавад, барои ҳар як филтри ёфтшуда, функсия барои оғозёбӣ даъват карда мешавад коркарди пешакӣ (). Ҳамин ки лаҳзаи давраи коркарди навбатӣ фаро мерасад (ҳар 10 миллисония ба таври нобаёнӣ), тикер функсияро даъват мекунад раванд () барои ҳамаи филтрҳои сарчашмаи қаблан пайдошуда ва сипас барои филтрҳои боқимондаи рӯйхат. Агар филтр пайвандҳои вурудӣ дошта бошад, он гоҳ функсияро иҷро мекунад раванд () то холӣ шудани сафҳои истиноди вуруд такрор мешавад. Пас аз ин, он ба филтри навбатии рӯйхат мегузарад ва то он даме, ки истинодҳои воридотӣ аз паёмҳо холӣ нашаванд, онро "ҳаракат мекунад". Тикер то ба охир расидани рӯйхат аз филтр ба филтр мегузарад. Ин коркарди давраро ба анҷом мерасонад.

Ҳоло мо ба наворҳо бармегардем ва дар бораи он сӯҳбат хоҳем кард, ки чаро чунин як объект ба стримери медиа илова карда шудааст. Умуман, миқдори маълумоте, ки алгоритме, ки дар дохили филтр кор мекунад, мувофиқат намекунад ва чандкаратаи андозаи буферҳои додаҳои дар вуруд гирифташуда нест. Масалан, мо филтр менависем, ки табдили фаврии Фурьеро иҷро мекунад, ки аз рӯи таъриф танҳо блокҳои додаҳоро коркард карда метавонад, ки андозаи онҳо қуввати ду аст. Бигзор он 512 ҳисоб бошад. Агар маълумот тавассути канали телефон тавлид шуда бошад, пас буфери додаҳои ҳар як паём дар вуруд ба мо 160 намунаи сигналро меорад. То он даме, ки миқдори зарурии маълумот мавҷуд нест, ҷамъоварӣ кардани маълумот аз воридот васвасаи он аст. Аммо дар ин ҳолат, бархӯрд бо тикер ба амал меояд, ки то холӣ шудани пайванди вурудӣ филтрро паймоиш кунад. Пештар, мо ин қоидаро ҳамчун принсипи сеюми филтр таъин карда будем. Тибқи ин принсип, функсияи филтр () бояд ҳама маълумотро аз навбатҳои воридотӣ гирад.

Илова бар ин, аз вуруд танҳо 512 намуна гирифтан ғайриимкон аст, зеро шумо метавонед танҳо блокҳои пурра гиред, яъне. филтр бояд 640 намуна гирифта, 512-тои онҳоро истифода барад, боқимонда пеш аз ҷамъ овардани қисми нави маълумот. Ҳамин тариқ, филтри мо ба ғайр аз кори асосии худ, бояд амалҳои ёрирасонро барои нигоҳдории фосилавии маълумоти воридотӣ таъмин намояд. Тањиякунандагони стримери медиа ва њалли ин масъалаи умумї объекти махсус - MSBufferizer (буферер)-ро тањия кардаанд, ки ин масъаларо бо истифода аз tupleњо њал мекунад.

Буферизатор (MSBufferizer)

Ин объектест, ки маълумоти воридшударо дар дохили филтр ҷамъ мекунад ва ба пешниҳоди он барои коркард оғоз мекунад, вақте ки миқдори иттилоот барои иҷро кардани алгоритми филтр кофӣ аст. Ҳангоме ки буфер маълумот ҷамъ мекунад, филтр бе истифодаи қувваи коркарди протсессор дар ҳолати бекор кор мекунад. Аммо вақте ки функсияи хониш аз буфер қимати ғайр аз сифрро бармегардонад, функсияи process()-и филтр ба гирифтан ва коркарди маълумот аз буфер дар қисмҳои андозаи лозимӣ, то тамом шудани он оғоз мекунад.
Маълумоте, ки ҳанӯз талаб карда нашудааст, дар буфер ҳамчун унсури якуми корт боқӣ мемонад, ки ба он блокҳои минбаъдаи додаҳои воридотӣ замима мешаванд.

Сохторе, ки буферро тавсиф мекунад:

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

Функсияҳо барои кор бо MSBufferizer

Эҷоди як мисоли нави буферӣ:

MSBufferizer * ms_bufferizer_new(void);

Хотира ҷудо карда мешавад, оғоз карда мешавад ms_bufferizer_init() ва нишондиҳанда баргардонида мешавад.

Функсияи ибтидоӣ:

void ms_bufferizer_init(MSBufferizer *obj); 

Навбат оғоз мешавад q, майдон андоза ба сифр муқаррар карда шудааст.

Илова кардани паём:

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

Паёми m ба навбат илова карда мешавад. Андозаи ҳисобшудаи блокҳои маълумот ба илова карда мешавад андоза.

Интиқоли ҳама паёмҳо аз навбати маълумоти истинод ба буфер q:

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

Интиқоли паёмҳо аз истинод q дар буфер бо истифода аз функсия иҷро карда мешавад ms_bufferizer_put().

Хондан аз буфер:

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

Агар андозаи маълумоти дар буфер ҷамъшуда аз андозаи дархостшуда камтар бошад (додашуда), он гоҳ функсия сифрро бармегардонад, маълумот ба маълумот нусхабардорӣ карда намешавад. Дар акси ҳол, нусхабардории пайдарпайи маълумот аз наворҳои дар буфер ҷойгиршуда иҷро карда мешавад. Пас аз нусхабардорӣ, навор тоза карда мешавад ва хотира озод карда мешавад. Нусхабардорӣ дар лаҳзаи нусхабардории байтҳои додашуда ба итмом мерасад. Агар дар мобайни блоки додаҳо ҷой тамом шавад, пас дар ин паём блоки додаҳо ба қисми боқимондаи нусханашуда кам карда мешавад. Дафъаи навбатии шумо занг занед, нусхабардорӣ аз ин лаҳза идома меёбад.

Хондани миқдори маълумоте, ки ҳоло дар буфер мавҷуд аст:

int ms_bufferizer_get_avail(MSBufferizer *obj); 

Майдонро бармегардонад андоза буферкунанда.

Хориҷ кардани қисми маълумот дар буфер:

void ms_bufferizer_skip_bytes(MSBufferizer *obj, int bytes);

Миқдори муайяншудаи байтҳои маълумот гирифта ва партофта мешаванд. Маълумоти қадимтарин нест карда мешавад.

Нест кардани ҳама паёмҳо дар буфер:

void ms_bufferizer_flush(MSBufferizer *obj); 

Ҳисобкунаки маълумот ба сифр барқарор карда мешавад.

Нест кардани ҳама паёмҳо дар буфер:

void ms_bufferizer_uninit(MSBufferizer *obj); 

Ҳисобкунак аз нав барқарор карда нашудааст.

Хориҷ кардани буфер ва озод кардани хотира:

void ms_bufferizer_destroy(MSBufferizer *obj);  

Намунаҳои истифодаи буферро дар коди сарчашмаи якчанд филтрҳои стримери медиа пайдо кардан мумкин аст. Масалан, дар филтри MS_L16_ENC, ки байтҳоро дар намунаҳо аз фармоиши шабака ба фармоиши ҳост аз нав танзим мекунад: l16.c

Дар мақолаи навбатӣ мо масъалаи баҳодиҳии сарборӣ ба тикер ва роҳҳои мубориза бо сарбории аз ҳад зиёди компютерӣ дар стримери медиаро баррасӣ хоҳем кард.

Манбаъ: will.com

Илова Эзоҳ