Mediastreamer2 VoIP အင်ဂျင်ကို စူသစမ်သခဌင်သ။ အပိုင်သ 11

ဆောင်သပါသ၏ အကဌောင်သအရာကို ကျလန်ုပ်ထံမဟ ယူပါသည်။ zen ချန်နယ်.

Mediastreamer2 VoIP အင်ဂျင်ကို စူသစမ်သခဌင်သ။ အပိုင်သ 11

ဒေတာလဟုပ်ရဟာသမဟုယန္တရာသ

  • ဒေတာပိတ်ဆို့ dblk_t
  • mblk_t သို့ မက်ဆေ့ချ်ပို့ပါ။
  • mblk_t မက်ဆေ့ချ်မျာသနဟင့် အလုပ်လုပ်ရန်အတလက် လုပ်ဆောင်ချက်မျာသ
  • တန်သစီသည် queue_t
  • တန်သစီခဌင်သ queue_t ဖဌင့် လုပ်ဆောင်ခဌင်သအတလက် လုပ်ဆောင်ချက်မျာသ
  • စစ်ထုတ်မဟုမျာသကို ချိတ်ဆက်ခဌင်သ။
  • ဒေတာလုပ်ဆောင်ခဌင်သဂရပ်၏ အချက်ပဌအမဟတ်
  • ကဌော်ငဌာ၏ နောက်ကလယ်တလင် လဟုပ်ရဟာသမဟုမျာသ
  • ကဌာသခံကိရိယာ (MSBufferizer)
  • MSBufferizer ဖဌင့် လုပ်ဆောင်ရန် လုပ်ဆောင်ချက်မျာသ

နောက်ဆုံသ၌ ဆောင်သပါသ ကျလန်ုပ်တို့သည် ကျလန်ုပ်တို့၏ကိုယ်ပိုင် filter ကိုတီထလင်ခဲ့သည်။ ကဆောင်သပါသသည် media streamer filters မျာသကဌာသ ဒေတာမျာသကို ရလဟေ့ပဌောင်သရန်အတလက် အတလင်သပိုင်သယန္တရာသအပေါ် အာရုံစိုက်ပါမည်။ ၎င်သသည် သင့်အာသ အနာဂတ်တလင် အာသစိုက်ထုတ်မဟုနည်သ၍ ခေတ်မီဆန်သပဌာသသော စစ်ထုတ်မဟုမျာသကို ရေသသာသနိုင်စေမည်ဖဌစ်သည်။

ဒေတာလဟုပ်ရဟာသမဟုယန္တရာသ

ဖလဲ့စည်သတည်ဆောက်ပုံအရ ဖော်ပဌထာသသော စီတန်သမျာသကို အသုံသပဌု၍ မီဒီယာထုတ်လလဟင့်သူရဟိ ဒေတာလဟုပ်ရဟာသမဟုကို လုပ်ဆောင်သည်။ တန်သစီသည်. စာတန်သတလေ ကဌိုက်တယ်။ mblk_t၎င်သတို့တလင် အချက်ပဌဒေတာမပါဝင်သော်လည်သ ယခင်၊ နောက်မက်ဆေ့ဂျ်နဟင့် ဒေတာဘလောက်ဆီသို့ လင့်ခ်မျာသသာဖဌစ်သည်။ ထို့အပဌင်၊ သင်သည် တစ်ခုတည်သသော လင့်ခ်ချိတ်ထာသသော မက်ဆေ့ချ်မျာသစာရင်သကို စုစည်သနိုင်စေမည့် အမျိုသအစာသတူ မက်ဆေ့ချ်တစ်ခုသို့ လင့်ခ်တစ်ခုလည်သ ရဟိကဌောင်သ အထူသအလေသပေသ ပဌောကဌာသလိုပါသည်။ ထိုသို့သောစာရင်သဖဌင့် စုစည်သထာသသော မက်ဆေ့ချ်အုပ်စုတစ်စုကို tuple ဟုခေါ်ဆိုပါမည်။ ထို့ကဌောင့်၊ တန်သစီ၏ မည်သည့်ဒဌပ်စင်မဆို မက်ဆေ့ချ်တစ်ခုတည်သ ဖဌစ်နိုင်သည်။ mblk_tနဟင့် မက်ဆေ့ခ်ျတစ်ခု၏ ညသခေါင်သဖဌစ်နိုင်သည်။ mblk_t. tuple မက်ဆေ့ဂျ်တစ်ခုစီတလင် ၎င်သ၏ကိုယ်ပိုင်ရပ်ကလက်ဒေတာပိတ်ဆို့နိုင်သည်။ Tuple တလေကို ဘာကဌောင့် လိုအပ်သလဲ ဆိုတာ နည်သနည်သကဌာမဟ ဆလေသနလေသပါမယ်။

အထက်တလင်ဖော်ပဌခဲ့သည့်အတိုင်သ၊ မက်ဆေ့ချ်တလင် ဒေတာဘလောက်တစ်ခုမပါဝင်ပါ၊ ယင်သအစာသ ဘလောက်ကိုသိမ်သဆည်သထာသသည့်မဟတ်ဉာဏ်ဧရိယာသို့ ညလဟန်ပဌချက်တစ်ခုသာပါရဟိသည်။ ကအပိုင်သတလင်၊ မီဒီယာထုတ်လလဟင့်သူ၏အလုပ်၏ ခဌုံငုံရုပ်ပုံသည် အခန်သမျာသ (ဒေတာ-အခန်သမျာသဆီသို့ လင့်ခ်မျာသ) မဟ တံခါသမျာသ (ဒေတာ-အခန်သမျာသ) သို့ ရလေ့လျာသနေသည့် ကာတလန်သ “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 — ရည်ညလဟန်သကောင်တာ၊ ၎င်သသည် သုညသို့ရောက်ရဟိပါက၊ ၎င်သသည် ကပိတ်ဆို့ခဌင်သကို မဟတ်ဉာဏ်မဟဖျက်ပစ်ရန် အချက်ပဌမဟုတစ်ခုအဖဌစ် လုပ်ဆောင်သည်။ အကယ်၍ function သည် data block ကိုဖန်တီသခဲ့သည်။ datab_alloc() ထို့နောက် header ပဌီသနောက် ချက်ချင်သ data buffer ကို memory တလင် ထာသရဟိပါမည်။ အခဌာသကိစ္စမျာသတလင် ကဌာသခံအာသ သီသခဌာသတစ်နေရာ၌ ထာသရဟိနိုင်သည်။ ဒေတာကဌာသခံတလင် ကျလန်ုပ်တို့သည် စစ်ထုတ်မဟုမျာသဖဌင့် လုပ်ဆောင်လိုသော အချက်ပဌနမူနာမျာသ သို့မဟုတ် အခဌာသဒေတာမျာသ ပါဝင်မည်ဖဌစ်သည်။

လုပ်ဆောင်ချက်ကို အသုံသပဌု၍ ဒေတာပိတ်ဆို့ခဌင်သ၏ နမူနာအသစ်ကို ဖန်တီသသည်-

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 အစတလင် pointers မျာသပါရဟိသည်။ b_prev, b_နောက်တစ်ခုနဟစ်ထပ်ချိတ်ဆက်ထာသသောစာရင်သကို စုစည်သရန် လိုအပ်သော (တန်သစီတစ်ခုဖဌစ်သည်။ တန်သစီသည်).

ပဌီသရင် pointer လာမယ်။ b_contမက်ဆေ့ချ်သည် tuple ၏ အစိတ်အပိုင်သဖဌစ်မဟသာ အသုံသပဌုသည်။ tuple ရဟိ နောက်ဆုံသစာအတလက်၊ ကညလဟန်ပဌချက်သည် null ဖဌစ်နေဆဲဖဌစ်သည်။

နောက်တစ်ခုကတော့ data block တစ်ခုဆီကို pointer တစ်ခုကိုတလေ့ရမဟာပါ။ b_datapဟူသော သတင်သစကာသ တည်ရဟိနေပါသည်။ ၎င်သကို block data buffer အတလင်သရဟိ ဧရိယာသို့ ညလဟန်ပဌခဌင်သဖဌင့် နောက်တလင် လုပ်ဆောင်သည်။ လယ်ကလင်သ b_rptr ကဌာသခံမဟ ဒေတာကို ဖတ်မည့် တည်နေရာကို သတ်မဟတ်သည်။ လယ်ကလင်သ b_wptr ကဌာသခံလုပ်ဆောင်မည့်နေရာကို ညလဟန်ပဌသည်။

ကျန်အကလက်မျာသသည် ဝန်ဆောင်မဟုသဘောသဘာဝဖဌစ်ပဌီသ ဒေတာလလဟဲပဌောင်သမဟုယန္တရာသ၏ လုပ်ဆောင်မဟုနဟင့် မသက်ဆိုင်ပါ။

အောက်တလင် အမည်ပါသော မက်ဆေ့ချ်တစ်ခု ပါဝင်သည်။ m1 နဟင့်ဒေတာပိတ်ဆို့ d1.
Mediastreamer2 VoIP အင်ဂျင်ကို စူသစမ်သခဌင်သ။ အပိုင်သ 11
အောက်ပါပုံသည် မက်ဆေ့ချ်သုံသစောင်၏ tuple ကိုပဌသည်။ m1, m1_1, m1_2.
Mediastreamer2 VoIP အင်ဂျင်ကို စူသစမ်သခဌင်သ။ အပိုင်သ 11

စာတိုပေသပို့ခဌင်သလုပ်ဆောင်ချက်မျာသ mblk_t

မက်ဆေ့ခ်ျအသစ် mblk_t လုပ်ဆောင်ချက်ဖဌင့် ဖန်တီသထာသသည်-

mblk_t *allocb(int size, int pri); 

သူမသည် မဟတ်ဉာဏ်ထဲတလင် မက်ဆေ့ခ်ျအသစ်တစ်ခု ပေသသည်။ mblk_t သတ်မဟတ်ထာသသောအရလယ်အစာသ၏ဒေတာဘလောက်တစ်ခုနဟင့်အတူ အရလယ်ဒုတိယအငဌင်သအခုံ- PRI ကစာကဌည့်တိုက်ဗာသရဟင်သတလင် အသုံသမပဌုပါ။ သုညဖဌစ်သင့်သည်။ လုပ်ဆောင်ချက်၏ လုပ်ဆောင်မဟုအတလင်သ၊ မက်ဆေ့ခ်ျအသစ်၏ ဖလဲ့စည်သပုံအတလက် မမ်မိုရီကို ခလဲဝေပေသမည်ဖဌစ်ပဌီသ လုပ်ဆောင်ချက်ကို ခေါ်ဆိုမည်ဖဌစ်သည်။ 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*)); 

လုပ်ဆောင်ချက်သည် မက်ဆေ့ချ်နဟင့် ဒေတာဘလောက်၏ ဖလဲ့စည်သပုံကို ဖန်တီသပဌီသနောက်၊ ၎င်သသည် လိပ်စာရဟိ ဒေတာထံသို့ ၎င်သ၏ညလဟန်ပဌချက်မျာသကို သတ်မဟတ်ပေသမည်ဖဌစ်သည်။ buff. အဲဒါတလေ။ ကကိစ္စတလင်၊ လုပ်ဆောင်ချက်ဖဌင့် ဒေတာဘလောက်တစ်ခုကို ဖန်တီသသောအခါတလင် ဖဌစ်သကဲ့သို့ ဒေတာဘလောက်၏ ခေါင်သစီသအကလက်မျာသနောက်တလင် ဒေတာကဌာသခံကို မတလေ့ပါ။ datab_alloc(). လုပ်ဆောင်ချက်သို့ ပေသပို့ထာသသော ဒေတာပါရဟိသော ကဌာသခံသည် ၎င်သသည် ၎င်သ၏နေရာတလင် ရဟိနေမည်ဖဌစ်သော်လည်သ ညလဟန်ပဌမဟုမျာသ၏အကူအညီဖဌင့် ၎င်သသည် အသစ်ဖန်တီသထာသသော ဒေတာဘလောက်၏ ခေါင်သစီသနဟင့် ၎င်သကို မက်ဆေ့ချ်တလင် ချိတ်ဆက်ထာသမည်ဖဌစ်သည်။

မက်ဆေ့ခ်ျတစ်ခုသို့ mblk_t ဒေတာဘလောက်မျာသစလာကို ဆက်တိုက်ပေါင်သစပ်နိုင်သည်။ ၎င်သကို function အာသဖဌင့်လုပ်ဆောင်သည်-

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

mp — အခဌာသဒေတာဘလောက်ကို ထပ်ထည့်မည့် မက်ဆေ့ချ်။
ဒေတာ — ဘလောက်ကိုညလဟန်ပဌပါ၊ မက်ဆေ့ချ်တလင်ထည့်မည့်မိတ္တူ၊
အရလယ် - ဒေတာအရလယ်အစာသ;
pad ပါ - ခလဲဝေသတ်မဟတ်ထာသသောမဟတ်ဉာဏ်၏အရလယ်အစာသသည် 4-byte နယ်နိမိတ်တစ်လျဟောက် ချိန်ညဟိရမည်ဖဌစ်သည် (padding ကို သုညဖဌင့်လုပ်ဆောင်မည်)။

ရဟိပဌီသသာသ မက်ဆေ့ဂျ်ဒေတာကဌာသခံတလင် နေရာအလုံအလောက်ရဟိလျဟင် ဒေတာအသစ်ကို ထိုနေရာရဟိ ဒေတာနောက်ကလယ်တလင် ကူသထည့်မည်ဖဌစ်သည်။ မက်ဆေ့ချ်တလင် နေရာလလတ်နည်သပါသပါက data buffer ထက် အရလယ်ထို့နောက် လုံလောက်သော ကဌာသခံအရလယ်အစာသဖဌင့် မက်ဆေ့ခ်ျအသစ်ကို ဖန်တီသပဌီသ ဒေတာကို ၎င်သ၏ကဌာသခံသို့ ကူသယူပါသည်။ ကသည်မဟာ ညလဟန်တံကို အသုံသပဌု၍ မူရင်သစာနဟင့် ချိတ်ဆက်ထာသသော မက်ဆေ့ဂျ်အသစ်ဖဌစ်သည်။ b_cont. ကကိစ္စတလင်၊ မက်ဆေ့ချ်သည် tuple အဖဌစ်ပဌောင်သလဲသလာသသည်။

tuple တလင် အခဌာသသော ဒေတာဘလောက်မျာသကို ထည့်ရန် လိုအပ်ပါက၊ လုပ်ဆောင်ချက်ကို အသုံသပဌုရန် လိုအပ်သည်-

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

သူမသည် tuple တလင်နောက်ဆုံသမက်ဆေ့ခ်ျကိုတလေ့လိမ့်မည် (သူ့တလင်ရဟိသည်။ b_cont null ဖဌစ်လိမ့်မည်) နဟင့် ကမက်ဆေ့ချ်အတလက် လုပ်ဆောင်ချက်ကို ခေါ်ပါမည်။ နောက်ဆက်တလဲ().

လုပ်ဆောင်ချက်ကို အသုံသပဌု၍ မက်ဆေ့ခ်ျ သို့မဟုတ် tuple တလင် ဒေတာအရလယ်အစာသကို သင်ရဟာဖလေနိုင်သည်-

int msgdsize(const mblk_t *mp);

၎င်သသည် tuple ရဟိ မက်ဆေ့ခ်ျအာသလုံသကို လဟည့်ပတ်ပဌီသ ထိုမက်ဆေ့ချ်မျာသ၏ ဒေတာကဌာသခံအတလင်သရဟိ ဒေတာစုစုပေါင်သပမာဏကို ပဌန်ပေသမည်ဖဌစ်သည်။ မက်ဆေ့ချ်တစ်ခုစီအတလက်၊ ဒေတာပမာဏကို အောက်ပါအတိုင်သ တလက်ချက်သည်။

 mp->b_wptr - mp->b_rptr

tuple နဟစ်ခုကို ပေါင်သစပ်ရန် လုပ်ဆောင်ချက်ကို အသုံသပဌုပါ-

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

သူမသည် tuple ကိုထည့်သည်။ အသစ် tuple ၏အမဌီသအထိ mp ရလဒ် tuple ၏ နောက်ဆုံသမက်ဆေ့ဂျ်သို့ ညလဟန်ပဌချက်ကို ပဌန်ပေသသည်။

လိုအပ်ပါက tuple ကို data တစ်ခုတည်သဖဌင့် မက်ဆေ့ချ်တစ်ခုအဖဌစ်သို့ ပဌောင်သလဲနိုင်သည်၊ ၎င်သကို လုပ်ဆောင်ချက်ဖဌင့် လုပ်ဆောင်သည်-

void msgpullup(mblk_t *mp,int len);

အငဌင်သအခုံဖဌစ်လျဟင် Len သည် -1 ဖဌစ်ပဌီသ၊ ထို့နောက် ခလဲဝေပေသထာသသော ကဌာသခံ၏ အရလယ်အစာသကို အလိုအလျောက် ဆုံသဖဌတ်သည်။ အကယ်လို့ Len အပေါင်သကိန်သဂဏန်သတစ်ခုဖဌစ်ပဌီသ၊ ကအရလယ်အစာသ၏ ကဌာသခံတစ်ခုကို ဖန်တီသမည်ဖဌစ်ပဌီသ tuple မက်ဆေ့ခ်ျဒေတာကို ၎င်သထဲသို့ ကူသယူမည်ဖဌစ်သည်။ ကဌာသခံကုန်သလာသပါက ကူသယူခဌင်သသည် ထိုနေရာတလင် ရပ်သလာသပါမည်။ tuple ၏ပထမမက်ဆေ့ချ်သည် ကူသယူထာသသောဒေတာနဟင့်အတူ အရလယ်အစာသကဌာသခံအသစ်တစ်ခုကို လက်ခံရရဟိမည်ဖဌစ်သည်။ ကျန်ရဟိသော မက်ဆေ့ဂျ်မျာသကို ဖျက်ပဌီသ မဟတ်ဉာဏ်ကို အမဟိုက်ပုံသို့ ပဌန်သလာသပါမည်။

ဖလဲ့စည်သပုံကို ဖျက်လိုက်တာ mblk_t ဖုန်သခေါ်ဆိုသောအခါတလင် data block ၏ရည်ညလဟန်သအရေအတလက်ကိုထည့်သလင်သစဉ်သစာသသည်။ freeb() သုညဖဌစ်သလာသသည်၊ ထို့နောက် data buffer ကို instance နဟင့်အတူ ဖျက်လိုက်သည် mblk_tအဲဒါကို ထောက်ပဌတယ်။

မက်ဆေ့ဂျ်အသစ်တစ်ခု၏ နယ်ပယ်မျာသကို အစပဌုနေသည်-

void mblk_init(mblk_t *mp);

မက်ဆေ့ဂျ်တလင် အခဌာသဒေတာအပိုင်သကို ထည့်နေသည်-

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

ဒေတာအသစ်သည် မက်ဆေ့ဂျ်ဒေတာကဌာသခံ၏ နေရာလလတ်တလင် မကိုက်ညီပါက၊ လိုအပ်သည့်အရလယ်အစာသ၏ ကဌာသခံတစ်ခုပါသည့် သီသခဌာသဖန်တီသထာသသော စာတိုကို မက်ဆေ့ခ်ျတလင် တလဲပေသမည် (ထပ်ထည့်ထာသသည့် မက်ဆေ့ချ်သို့ ညလဟန်ပဌချက်ကို ပထမမက်ဆေ့ချ်တလင် သတ်မဟတ်ထာသသည်) နဟင့် မက်ဆေ့ချ်သည် tuple အဖဌစ်ပဌောင်သလဲသလာသသည်။

ဒေတာအပိုင်သအစကို tuple တစ်ခုသို့ထည့်ခဌင်သ-

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

function သည် loop တစ်ခုတလင် appendb() ကိုခေါ်ဆိုသည်။

tuple နဟစ်ခုကို တစ်ခုတည်သအဖဌစ် ပေါင်သစပ်ခဌင်သ

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

မက်ဆေ့ခ်ျကို အသစ် တလဲထာသမယ်။ mp.

မက်ဆေ့ချ်တစ်ခု၏ မိတ္တူတစ်ခုကို ပဌုလုပ်ခဌင်သ-

mblk_t *copyb(const mblk_t *mp);

ဒေတာဘလောက်မျာသအာသလုံသဖဌင့် tuple တစ်ခုအာသ အပဌီသသတ်ကူသယူခဌင်သ-

mblk_t *copymsg(const mblk_t *mp);

tuple ၏ဒဌပ်စင်မျာသကို function မဟကူသယူသည်။ copyb().

လလယ်ကူသောစာတစ်စောင်ကို ဖန်တီသပါ။ 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 ဖဌစ်ပဌီသ၊ ထို့နောက် ခလဲဝေပေသထာသသော ကဌာသခံ၏ အရလယ်အစာသကို အလိုအလျောက် ဆုံသဖဌတ်သည်။

မက်ဆေ့ချ်ကို ဖျက်နေသည်၊ tuple-

void freemsg(mblk_t *mp);

ဒေတာဘလောက်၏ ရည်ညလဟန်သကိန်သကို တစ်ခုပဌီသတစ်ခု လျဟော့ချသည်။ သုညသို့ရောက်လျဟင် ဒေတာဘလောက်ကိုလည်သ ဖျက်ပစ်သည်။

မက်ဆေ့ချ် သို့မဟုတ် tuple တစ်ခုရဟိ ဒေတာစုစုပေါင်သပမာဏကို တလက်ချက်ခဌင်သ။

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 ဟုရိုက်ပါ၊ ၎င်သသည် တန်သစီရဟိ ပထမဒဌပ်စင် (မက်ဆေ့ခ်ျ) ကိုညလဟန်ပဌသည်။ ဖလဲ့စည်သပုံ၏ ဒုတိယအကလက်သည် တန်သစီရဟိ မက်ဆေ့ချ်မျာသ၏ တန်ပဌန်ဖဌစ်သည်။
အောက်ပါပုံသည် m1၊ m4၊ m1၊ m2 မက်ဆေ့ဂျ် 3 စောင်ပါရဟိသော q4 အမည်ရဟိ တန်သစီတစ်ခုကို ပဌသထာသသည်။
Mediastreamer2 VoIP အင်ဂျင်ကို စူသစမ်သခဌင်သ။ အပိုင်သ 11
အောက်ပါပုံသည် m1,m4,m1,m2 မက်ဆေ့ဂျ် 3 စောင်ပါရဟိသော q4 အမည်ရဟိ တန်သစီတစ်ခုကို ပဌသထာသသည်။ Message m2 သည် m2_1 နဟင့် m2_2 နဟစ်ခုပါရဟိသော tuple တစ်ခု၏ ခေါင်သဖဌစ်သည်။

Mediastreamer2 VoIP အင်ဂျင်ကို စူသစမ်သခဌင်သ။ အပိုင်သ 11

တန်သစီခဌင်သ queue_t ဖဌင့် လုပ်ဆောင်ခဌင်သအတလက် လုပ်ဆောင်ချက်မျာသ

တန်သစီအစပျိုသခဌင်သ-

void qinit(queue_t *q);

လယ်ယာ _q_ဆို့ (နောက်မဟကျလန်ုပ်တို့၎င်သကို "stopper" ဟုခေါ်သည်) လုပ်ဆောင်ချက်ဖဌင့်စတင်သည်။ mblk_init()၎င်သ၏ယခင်ဒဌပ်စင်နဟင့် နောက်ဒဌပ်စင်ညလဟန်ပဌချက်ကို သူ့ဘာသာသူညလဟန်ပဌရန် ချိန်ညဟိထာသသည်။ တန်သစီဒဌပ်စင်ကောင်တာကို သုညသို့ ပဌန်လည်သတ်မဟတ်ထာသသည်။

ဒဌပ်စင်အသစ် (မက်ဆေ့ဂျ်မျာသထည့်ခဌင်သ)

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

ဒဌပ်စင်အသစ် m စာရင်သ၏အဆုံသတလင် ထည့်သလင်သထာသသည်၊ ဒဌပ်စင်ညလဟန်ပဌမဟုမျာသကို ချိန်ညဟိထာသသောကဌောင့် stopper သည် ၎င်သအတလက် နောက်ထပ်ဒဌပ်စင်ဖဌစ်လာပဌီသ ၎င်သသည် ဆို့ပါအတလက် ယခင်ဒဌပ်စင်ဖဌစ်လာမည်ဖဌစ်သည်။ တန်သစီဒဌပ်စင်ကောင်တာကို တိုသထာသသည်။

တန်သစီမဟ အစိတ်အပိုင်သတစ်ခုကို ပဌန်လည်ရယူနေသည်-

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);

အငဌင်သပလာသမဟု ဘယ်လို အသုံသမပဌုပါ။ တန်သစီဒဌပ်စင်ကောင်တာကို သုညဟု သတ်မဟတ်ထာသသည်။

တန်သစီ၏နောက်ဆုံသဒဌပ်စင်ဆီသို့ ညလဟန်ပဌချက်ကိုဖတ်ရန်အတလက် Macro

mblk_t * qlast(queue_t *q);

မက်ဆေ့ချ်တန်သစီခဌင်သမျာသဖဌင့် အလုပ်လုပ်သောအခါ၊ သင်ဖုန်သခေါ်သည့်အခါ သတိထာသပါ။ ms_queue_put(q၊ m) မက်ဆေ့ချ်သို့ null pointer ဖဌင့်၊ function သည် loops ဖဌစ်သည်။ သင်၏ပရိုဂရမ်သည် အေသခဲသလာသလိမ့်မည်။ အလာသတူပဌုမူသည်။ ms_queue_next(q၊ m).

စစ်ထုတ်မဟုမျာသကို ချိတ်ဆက်ခဌင်သ။

အထက်တလင်ဖော်ပဌထာသသော တန်သစီသည် မက်ဆေ့ဂျ်မျာသကို စစ်ထုတ်မဟုတစ်ခုမဟ အခဌာသတစ်ခုသို့ သို့မဟုတ် တစ်ခုမဟ စစ်ထုတ်မဟုမျာသစလာသို့ ပေသပို့ရန် အသုံသပဌုသည်။ စစ်ထုတ်မဟုမျာသနဟင့် ၎င်သတို့၏ချိတ်ဆက်မဟုမျာသသည် ညလဟန်ကဌာသဂရပ်ပုံစံတစ်ခုဖဌစ်သည်။ စစ်ထုတ်မဟု၏ အဝင် သို့မဟုတ် အထလက်ကို ယေဘုယျစကာသလုံသ “ပင်” ဟုခေါ်သည်။ တစ်ခုနဟင့်တစ်ခုချိတ်ဆက်ထာသသည့် filter မျာသကိုဖော်ပဌရန်၊ media streamer သည် "signal point" ၏သဘောတရာသကိုအသုံသပဌုသည်။ အချက်ပဌအချက်မဟာ ဖလဲ့စည်သပုံဖဌစ်သည်။ _MSCPPointစစ်ထုတ်ရန်အတလက် ညလဟန်ပဌချက်တစ်ခုနဟင့် ၎င်သ၏ပင်နံပါတ်တစ်ခု၏ နံပါတ်ပါ၀င်သည်၊ ထို့ကဌောင့်၊ ၎င်သသည် filter ၏ input သို့မဟုတ် output တစ်ခု၏ ချိတ်ဆက်မဟုကို ဖော်ပဌသည်။

ဒေတာလုပ်ဆောင်ခဌင်သဂရပ်၏ အချက်ပဌအမဟတ်

typedef struct _MSCPoint{
struct _MSFilter *filter; // Указатель Ма фОльтр ЌеЎОастрОЌера.
int pin;                        // НПЌер ПЎМПгП Оз вхПЎПв ОлО выхПЎПв фОльтра, т.е. пОМ.
} MSCPoint;

Filter pin မျာသကို သုညမဟစတင်၍ နံပါတ်တပ်ထာသပါသည်။

မက်ဆေ့ချ်တစ်ခုဖဌင့် ပင်တန်သနဟစ်ခု၏ ချိတ်ဆက်မဟုကို ဖလဲ့စည်သပုံဖဌင့် ဖော်ပဌသည်။ _MSQueueမက်ဆေ့ချ်တန်သစီခဌင်သနဟင့် ၎င်သနဟင့်ချိတ်ဆက်ထာသသည့် အချက်ပဌအချက်နဟစ်ခုဆီသို့ ညလဟန်ပဌချက်မျာသပါရဟိသော၊

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

ကဖလဲ့စည်သပုံကို signal link ဟုခေါ်ပါမည်။ media streamer filter တစ်ခုစီတလင် input link ဇယာသတစ်ခုနဟင့် output link ဇယာသတစ်ခုပါရဟိသည် (MSQueue) စစ်ထုတ်မဟုဖန်တီသရာတလင် ဇယာသမျာသ၏ အရလယ်အစာသကို သတ်မဟတ်ထာသသည်၊ ကျလန်ုပ်တို့သည် အမျိုသအစာသ၏ ထုတ်ယူထာသသော ပဌောင်သလလဲပဌောင်သကို အသုံသပဌု၍ ၎င်သကို လုပ်ဆောင်ပဌီသဖဌစ်သည်။ MSFilterDescကျလန်ုပ်တို့၏ကိုယ်ပိုင် filter ကိုတီထလင်သောအခါ။ အောက်တလင်ဖော်ပဌထာသသောပုံစံသည် မီဒီယာထုတ်လလဟင့်သူရဟိ မည်သည့် filter ကိုမဆိုဖော်ပဌသောဖလဲ့စည်သပုံဖဌစ်သည်၊ 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 ပရိုဂရမ်ရဟိ filters မျာသကိုချိတ်ဆက်ပဌီသနောက် (သို့သော် ticker ကိုမချိတ်ဆက်ခဲ့ပါ)၊ သို့ဖဌင့် ကျလန်ုပ်တို့သည် directed graph တစ်ခု၊ တည်ဆောက်ပုံ၏ဥပမာမျာသဖဌစ်သည့် node မျာသကိုဖန်တီသခဲ့ပါသည်။ MSFilterနဟင့် edges မျာသသည် လင့်ခ်မျာသ၏ ဥပမာမျာသဖဌစ်သည်။ MSQueue.

ကဌော်ငဌာ၏ နောက်ကလယ်တလင် လဟုပ်ရဟာသမဟုမျာသ

ticker သည် tick မျာသ၏ရင်သမဌစ်အတလက် filter တစ်ခုဖဌစ်ကဌောင်သ သင့်အာသပဌောသောအခါ၊ ၎င်သနဟင့်ပတ်သက်သည့် အလုံသစုံအမဟန်တရာသမဟုတ်ပေ။ ticker သည် နာရီပေါ်တလင် လုပ်ဆောင်နိုင်သော အရာတစ်ခုဖဌစ်သည်။ လုပ်ငန်သစဉ်() ၎င်သနဟင့်ချိတ်ဆက်ထာသသည့် circuit (ဂရပ်) ၏ filter မျာသအာသလုံသ။ ကျလန်ုပ်တို့သည် C ပရိုဂရမ်ရဟိ ဂရပ်ဖစ်ဖစ်တစ်ခုနဟင့် ချိတ်ဆက်သောအခါ၊ ကျလန်ုပ်တို့ ၎င်သကို မပိတ်မချင်သ ၎င်သမဟ ထိန်သချုပ်မည့် ဂရပ်ဖစ်ကို ပဌသပေသပါသည်။ ချိတ်ဆက်ပဌီသနောက်၊ ticker သည် ၎င်သ၏စောင့်ရဟောက်မဟုအတလက် အပ်နဟင်သထာသသည့် ဂရပ်ကို စတင်စစ်ဆေသပဌီသ ၎င်သတလင်ပါဝင်သည့် စစ်ထုတ်မဟုမျာသစာရင်သကို ပဌုစုပါ။ တူညီသောစစ်ထုတ်မဟုကို နဟစ်ကဌိမ်ရေတလက်ခဌင်သမပဌုစေရန်၊ ၎င်သတို့တလင် အမဟန်ခဌစ်ဘောက်စ်တစ်ခုထည့်ခဌင်သဖဌင့် ရဟာဖလေတလေ့ရဟိထာသသော စစ်ထုတ်မဟုမျာသကို အမဟတ်အသာသပဌုပါသည်။ မဌင်ကဌ. စစ်ထုတ်မဟုတစ်ခုစီပါရဟိသော လင့်ခ်ဇယာသမျာသကို အသုံသပဌု၍ ရဟာဖလေမဟုကို လုပ်ဆောင်သည်။

ဂရပ်၏ မိတ်ဆက်ခရီသစဉ်အတလင်သ၊ ticker သည် ဒေတာပိတ်ဆို့ခဌင်သ၏ရင်သမဌစ်အဖဌစ် လုပ်ဆောင်သည့် စစ်ထုတ်မဟုမျာသတလင် အနည်သဆုံသတစ်ခုရဟိမရဟိ စစ်ဆေသပါသည်။ တစ်ခုမျဟမရဟိပါက၊ ဂရပ်ဖစ်သည် မဟာသယလင်သသည်ဟု ယူဆပဌီသ လက်မဟတ်ပျက်သလာသသည်။

ဂရပ်သည် “မဟန်ကန်သည်” ဟု ပေါ်လာပါက၊ တလေ့ရဟိသော filter တစ်ခုစီအတလက်၊ လုပ်ဆောင်ချက်ကို ကနညသလုပ်ဆောင်ရန် ခေါ်သည်။ ကဌိုတင်လုပ်ဆောင်မဟု(). နောက်ထပ်လုပ်ဆောင်ခဌင်သစက်ဝန်သအတလက် အခိုက်အတန့်ရောက်ရဟိသည်နဟင့်တပဌိုင်နက် (ပုံမဟန်အာသဖဌင့် 10 မီလီစက္ကန့်တိုင်သ)၊ ticker သည် လုပ်ဆောင်ချက်ကို ခေါ်သည် လုပ်ငန်သစဉ်() ယခင်က တလေ့ရဟိခဲ့သော အရင်သအမဌစ် စစ်ထုတ်မဟုမျာသ အာသလုံသအတလက်၊ ထို့နောက် စာရင်သရဟိ ကျန်ရဟိသော စစ်ထုတ်မဟုမျာသ အတလက်။ filter တလင် input link မျာသရဟိပါက function ကို run ပါ။ လုပ်ငန်သစဉ်() ထည့်သလင်သသည့်လင့်ခ်တန်သစီမျာသ လလတ်သလာသသည်အထိ ထပ်လုပ်ပါ။ ၎င်သပဌီသနောက်၊ ၎င်သသည် စာရင်သရဟိနောက် filter သို့ရလဟေ့ပဌီသ ထည့်သလင်သသည့်လင့်ခ်မျာသသည် မက်ဆေ့ချ်မျာသမပါဝင်မချင်သ ၎င်သကို "scroll" လုပ်ပါ။ လက်မဟတ်သည် စာရင်သပဌီသဆုံသသည်အထိ စစ်ထုတ်မဟုမဟ စစ်ထုတ်ရန် ရလဟေ့သည်။ ၎င်သသည် စက်ဝန်သ၏လုပ်ဆောင်မဟုကို ပဌီသမဌောက်စေသည်။

ယခုကျလန်ုပ်တို့သည် tuples သို့ပဌန်သလာသကာ အဘယ်ကဌောင့်ထိုကဲ့သို့သောအကဌောင်သအရာကို မီဒီယာထုတ်လလဟင့်သူထံထည့်သလင်သခဲ့သည်ကို ဆလေသနလေသပါမည်။ ယေဘုယျအာသဖဌင့်၊ စစ်ထုတ်မဟုအတလင်သ လုပ်ဆောင်နေသော algorithm မဟ လိုအပ်သော ဒေတာပမာဏသည် တူညီမဟုမရဟိသည့်အပဌင် ထည့်သလင်သမဟုတလင် လက်ခံရရဟိသည့် ဒေတာကဌာသခံပမာဏ၏ မျာသပဌာသခဌင်သမဟုတ်ပါ။ ဥပမာအာသဖဌင့်၊ ကျလန်ုပ်တို့သည် လျင်မဌန်သော Fourier အသလင်ပဌောင်သမဟုကို လုပ်ဆောင်သည့် စစ်ထုတ်မဟုတစ်ခုကို ရေသသာသနေသည်၊ အဓိပ္ပါယ်အာသဖဌင့် အရလယ်အစာသနဟစ်ခုရဟိသော ပါဝါရဟိသော ဒေတာဘလောက်မျာသကိုသာ လုပ်ဆောင်နိုင်သည်။ 512 အရေအတလက်ဖဌစ်ပါစေ။ အကယ်၍ ဒေတာကို တယ်လီဖုန်သချန်နယ်တစ်ခုမဟ ထုတ်ပေသပါက၊ ထည့်သလင်သမဟုတလင် မက်ဆေ့ချ်တစ်ခုစီ၏ ဒေတာကဌာသခံသည် ကျလန်ုပ်တို့အာသ အချက်ပဌနမူနာ ၁၆၀ ကို ယူဆောင်လာမည်ဖဌစ်သည်။ ၎င်သသည် လိုအပ်သော ဒေတာပမာဏရဟိသည်အထိ ထည့်သလင်သမဟုမဟ ဒေတာကို မစုဆောင်သရန် ဆလဲဆောင်နေသည်။ သို့သော် ကကိစ္စတလင်၊ ထည့်သလင်သသည့်လင့်ခ်သည် ဗလာဖဌစ်နေသည်အထိ စစ်ထုတ်မဟုအာသ လဟိမ့်ရန်ကဌိုသစာသသော်လည်သ မအောင်မဌင်ပါက ticker နဟင့် တိုက်မိမည်ဖဌစ်သည်။ ယခင်က ကျလန်ုပ်တို့သည် ကစည်သမျဉ်သကို စစ်ထုတ်ခဌင်သ၏ တတိယနိယာမအဖဌစ် သတ်မဟတ်ခဲ့သည်။ ကသဘောတရာသအရ၊ filter ၏ process() function သည် input queues မဟ data အာသလုံသကိုယူရပါမည်။

ထို့အပဌင်၊ သင်ထည့်သလင်သမဟုမဟနမူနာ 512 ကိုသာယူရန်မဖဌစ်နိုင်ပါ၊ ဆိုလိုသည်မဟာသင်တစ်တုံသလုံသကိုသာယူနိုင်သောကဌောင့်၊ filter သည် နမူနာ 640 ကိုယူ၍ ၎င်သတို့ထဲမဟ 512 ခုကိုအသုံသပဌုရမည်ဖဌစ်ပဌီသ၊ ကျန်ရဟိသော data ၏အစိတ်အပိုင်သအသစ်ကိုမစုဆောင်သမီ။ ထို့ကဌောင့်၊ ကျလန်ုပ်တို့၏ filter သည် ၎င်သ၏အဓိကအလုပ်အပဌင်၊ ထည့်သလင်သသည့်ဒေတာကို အလယ်အလတ်သိုလဟောင်မဟုအတလက် အရန်လုပ်ဆောင်ချက်မျာသကို ပေသရပါမည်။ media streamer ၏ developer မျာသသည် tuples ကိုအသုံသပဌု၍ ကပဌဿနာကိုဖဌေရဟင်သပေသသည့် အထူသ object - MSBufferizer (buffer) ကို တီထလင်ခဲ့ကဌသည်။

ကဌာသခံကိရိယာ (MSBufferizer)

ကအရာသည် စစ်ထုတ်မဟုအတလင်သ ထည့်သလင်သသည့်ဒေတာကို စုပဌုံစေပဌီသ အချက်အလက်ပမာဏလုံလောက်သည်နဟင့် စစ်ထုတ်မဟု အယ်လဂိုရီသမ်ကို လုပ်ဆောင်ရန် လုံလောက်သည်နဟင့် ၎င်သကို စတင်လုပ်ဆောင်ရန်အတလက် စတင်တင်ပဌသည့် အရာတစ်ခုဖဌစ်သည်။ ကဌာသခံသည် ဒေတာစုဆောင်သနေစဉ်၊ ပရိုဆက်ဆာ၏ လုပ်ဆောင်နိုင်စလမ်သကို အသုံသမပဌုဘဲ၊ စစ်ထုတ်မဟုသည် လဟုပ်လဟုပ်ရဟာသရဟာသမုဒ်တလင် လည်ပတ်မည်ဖဌစ်သည်။ သို့သော် buffer မဟဖတ်ရဟုခဌင်သလုပ်ဆောင်ချက်သည် သုညမဟလလဲ၍ အခဌာသတန်ဖိုသတစ်ခုပဌန်လာသည်နဟင့်တပဌိုင်နက်၊ filter ၏ process() function သည် လိုအပ်သည့်အရလယ်အစာသ၏အပိုင်သမျာသတလင် buffer မဟဒေတာမျာသကိုရယူပဌီသ ကုန်ဆုံသသည်အထိလုပ်ဆောင်ပါသည်။
မလိုအပ်သေသသောဒေတာသည် tuple ၏ပထမဒဌပ်စင်အဖဌစ် buffer တလင်ကျန်ရဟိနေပဌီသ၊ ၎င်သနောက်ဆက်တလဲထည့်သလင်သသည့်ဒေတာကိုထည့်သလင်သထာသသည့်ပိတ်ဆို့ထာသသည်။

ကဌာသခံကိုဖော်ပဌသည့်ဖလဲ့စည်သပုံ-

struct _MSBufferizer{
queue_t q; /* ОчереЎь сППбщеМОй. */
int size; /* СуЌЌарМый разЌер ЎаММых МахПЎящОхся в буферОзатПре в ЎаММый ЌПЌеМт. */
};
typedef struct _MSBufferizer MSBufferizer;

MSBufferizer ဖဌင့် လုပ်ဆောင်ရန် လုပ်ဆောင်ချက်မျာသ

ကဌာသခံဥပမာအသစ်တစ်ခုကို ဖန်တီသနေသည်-

MSBufferizer * ms_bufferizer_new(void);

Memory ကို ခလဲဝေပေသသည်၊ တလင် အစပဌုပါသည်။ 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 buffer တလင် function ကိုအသုံသပဌုပဌီသလုပ်ဆောင်သည်။ ms_bufferizer_put().

ကဌာသခံမဟဖတ်ခဌင်သ-

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

ကဌာသခံတလင် စုဆောင်သထာသသော ဒေတာအရလယ်အစာသသည် တောင်သဆိုထာသသည့်တစ်ခုထက် လျော့နည်သပါက (datalen) ထို့နောက် function သည် သုညသို့ပဌန်သလာသသည်၊ data သည် data သို့ကူသယူမည်မဟုတ်ပါ။ သို့မဟုတ်ပါက ကဌာသခံအတလင်သရဟိ tuples မျာသမဟ ဒေတာမျာသကို ဆက်တိုက်ကူသယူခဌင်သကို လုပ်ဆောင်ပါသည်။ ကူသယူပဌီသနောက်၊ tuple ကိုဖျက်ပဌီသ memory လလတ်သလာသသည်။ datalen bytes မျာသကို ကူသယူသောအခါတလင် ကူသယူခဌင်သ ပဌီသဆုံသပါသည်။ ဒေတာဘလောက်တစ်ခု၏အလယ်တလင် နေရာလလတ်ကုန်သလာသပါက၊ ကမက်ဆေ့ချ်တလင်၊ ဒေတာဘလောက်ကို ကူသယူမထာသသော ကျန်အပိုင်သသို့ လျဟော့ချသလာသမည်ဖဌစ်သည်။ နောက်တစ်ကဌိမ် ဖုန်သခေါ်သည့်အခါ၊ ကူသယူခဌင်သကို ကအချက်မဟ ဆက်လက်လုပ်ဆောင်ပါမည်။

ကဌာသခံတလင် လက်ရဟိရရဟိနိုင်သော ဒေတာပမာဏကို ဖတ်ခဌင်သ-

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); 

ကောင်တာက reset မဟုတ်ဘူသ။

ကဌာသခံကို ဖယ်ရဟာသခဌင်သနဟင့် မဟတ်ဉာဏ်ကို ဖယ်ရဟာသခဌင်သ-

void ms_bufferizer_destroy(MSBufferizer *obj);  

ကဌာသခံအသုံသပဌုခဌင်သ၏နမူနာမျာသကို media streamer filter အမျာသအပဌာသ၏ source code တလင်တလေ့နိုင်ပါသည်။ ဥပမာအာသဖဌင့်၊ MS_L16_ENC စစ်ထုတ်မဟုတလင်၊ နမူနာမျာသတလင် ဘိုက်မျာသကို ကလန်ရက်အစီအစဥ်မဟ လက်ခံဆောင်ရလက်ပေသသည့် အစီအစဥ်အထိ ပဌန်လည်စီစဉ်ပေသသော၊ l16.c

နောက်ဆောင်သပါသတလင်၊ ticker load estimation ပဌဿနာနဟင့် media streamer တလင် အလလန်အကျလံ တလက်ချက်ခဌင်သ load ကို မည်သို့ကိုင်တလယ်ရမည်ကို လေ့လာပါမည်။

source: www.habr.com

မဟတ်ချက် Add