Mediastreamer2 VoIP dvigatelini o'rganish. 12-qism

Maqolaning materiali mendan olingan zen kanali.

Mediastreamer2 VoIP dvigatelini o'rganish. 12-qism

Oxirida maqola, Men ticker yukini baholash masalasini va media-strimerda ortiqcha hisoblash yukini bartaraf etish yo'llarini ko'rib chiqishga va'da berdim. Ammo men ma'lumotlar harakati bilan bog'liq hunarmandchilik filtrlarini tuzatish masalalarini yoritishni mantiqiyroq deb qaror qildim va shundan keyingina ishlashni optimallashtirish masalalarini ko'rib chiqaman.

Zavod filtrlarini tuzatish

Oldingi maqolada media-strimerda ma'lumotlar harakati mexanizmini ko'rib chiqqanimizdan so'ng, unda yashiringan xavflar haqida gapirish mantiqan to'g'ri keladi. "Ma'lumotlar oqimi" printsipining xususiyatlaridan biri shundaki, xotirani to'pdan ajratish ma'lumotlar oqimining manbalarida joylashgan filtrlarda sodir bo'ladi va oqim yo'lining oxirida joylashgan filtrlar allaqachon xotirani qaytarish bilan ajratadi. uyaga. Bundan tashqari, yangi ma'lumotlarni yaratish va ularni yo'q qilish oraliq nuqtalarda sodir bo'lishi mumkin. Umuman olganda, xotirani chiqarish ma'lumotlar blokini yaratgan filtrdan boshqa filtr tomonidan amalga oshiriladi.

Xotiraning shaffof monitoringi nuqtai nazaridan, filtr kirish blokini qabul qilganda, uni qayta ishlashdan, xotirani bo'shatgandan so'ng darhol yo'q qilish va chiqish ma'lumotlari bilan yangi yaratilgan blokni chiqishga qo'yish maqsadga muvofiqdir. Bunday holda, filtrdagi xotiraning oqishi osongina kuzatilishi mumkin edi - agar analizator filtrda oqishni aniqlasa, undan keyingi filtr kiruvchi bloklarni to'g'ri yo'q qilmaydi va unda xatolik mavjud. Ammo yuqori mahsuldorlikni saqlab qolish nuqtai nazaridan, ma'lumotlar bloklari bilan ishlashga bunday yondashuv unumli emas - bu ma'lumotlar bloklari uchun hech qanday foydali chiqindisiz xotirani ajratish / bo'sh qilish bo'yicha ko'p sonli operatsiyalarga olib keladi.

Shu sababli, media oqim filtrlari ma'lumotlarni qayta ishlashni sekinlashtirmaslik uchun xabarlarni nusxalashda engil nusxalarni yaratadigan funktsiyalardan foydalanadi (biz ular haqida oldingi maqolada gaplashdik). Bu funksiyalar faqat nusxalangan “eski” xabardan ma’lumotlar blokini “biriktirish” orqali xabar sarlavhasining yangi nusxasini yaratadi. Natijada bitta ma'lumotlar blokiga ikkita sarlavha biriktiriladi va ma'lumotlar blokidagi mos yozuvlar hisoblagichi oshiriladi. Ammo bu ikkita xabarga o'xshaydi. Bunday "ommaviy" ma'lumotlar bloki bilan ko'proq xabarlar bo'lishi mumkin, masalan, MS_TEE filtri bir vaqtning o'zida o'nta yorug'lik nusxasini ishlab chiqaradi va ularni o'z chiqishlari orasida taqsimlaydi. Agar zanjirdagi barcha filtrlar to'g'ri ishlayotgan bo'lsa, quvur liniyasi oxirida bu mos yozuvlar soni nolga yetishi kerak va xotirani ajratish funktsiyasi chaqiriladi: ms_free(). Agar qo'ng'iroq sodir bo'lmasa, xotiraning bu qismi endi yig'maga qaytarilmaydi, ya'ni. u "oqadi". Engil nusxalardan foydalanish narxi - bu qaysi grafik filtrda xotira oqayotganini osongina aniqlash qobiliyatini yo'qotish (odatdagi nusxalardan foydalanishda bo'lgani kabi).

"Mahalliy" filtrlarda xotira qochqinlarini topish mas'uliyati media-strimerni ishlab chiquvchilarga tegishli bo'lganligi sababli, siz ularni disk raskadrovka qilishingiz shart emas. Ammo hunarmandchilik filtringiz bilan siz o'zingizning baxtingizning chigirtkasisiz va kodingizdagi sizib chiqishlarni qidirishga sarflagan vaqtingiz aniqligingizga bog'liq bo'ladi. Nosozliklarni tuzatish vaqtini qisqartirish uchun filtrlarni loyihalashda sizib chiqishni lokalizatsiya qilish usullarini ko‘rib chiqishimiz kerak. Bundan tashqari, oqish filtrni haqiqiy tizimda qo'llashda o'zini namoyon qilishi mumkin, bu erda "gumonlanuvchilar" soni juda ko'p bo'lishi mumkin va disk raskadrovka vaqti cheklangan.

Xotiraning oqishi qanday namoyon bo'ladi?

Dasturning chiqishida deb taxmin qilish mantiqan to'g'ri eng ilovangiz egallagan xotiraning ortib borayotgan foizini ko'rsatadi.

Tashqi ko'rinish shundan iboratki, tizim bir nuqtada sichqonchaning harakatiga sekin reaksiyaga kirishadi va ekranni asta-sekin qayta chizadi. Bundan tashqari, tizim jurnali o'sib, qattiq diskda bo'sh joyni egallashi mumkin. Bunday holda, sizning ilovangiz g'alati harakat qila boshlaydi, buyruqlarga javob bermaydi, faylni ocholmaydi va hokazo.

Oqish faktini aniqlash uchun biz xotira analizatoridan (keyingi o'rinlarda analizator deb yuritiladi) foydalanamiz. Bo'lishi mumkin valgrind (yaxshi maqola haqida) yoki kompilyatorga o'rnatilgan gcc Xotirani tozalash vositasi yoki boshqa narsa. Agar analizator qochqinning grafik filtrlaridan birida sodir bo'lganligini ko'rsatsa, demak, quyida tavsiflangan usullardan birini qo'llash vaqti keldi.

Uch qarag'ay usuli

Yuqorida ta'kidlab o'tilganidek, xotiraning oqishi bo'lsa, analizator yig'ilishdan xotira ajratishni so'ragan filtrga ishora qiladi. Ammo uni qaytarishni "unutgan" filtrga ishora qilmaydi, bu aslida aybdor. Shunday qilib, analizator faqat bizning qo'rquvimizni tasdiqlashi mumkin, lekin ularning ildiziga ishora qilmaydi.

Grafikdagi "yomon" filtrning joylashishini bilish uchun siz grafikni analizator hali ham qochqinni aniqlaydigan tugunlarning minimal soniga kamaytirish orqali o'tishingiz va qolgan uchta qarag'ayda muammoli filtrni topishingiz mumkin.

Lekin shunday bo'lishi mumkinki, ustundagi filtrlar sonini kamaytirish orqali siz filtrlar va tizimingizning boshqa elementlari o'rtasidagi normal o'zaro ta'sirni buzasiz va oqish endi paydo bo'lmaydi. Bunday holda, siz to'liq o'lchamli grafik bilan ishlashingiz va quyida tavsiflangan yondashuvdan foydalanishingiz kerak bo'ladi.

Sürgülü izolyator usuli

Taqdimotning soddaligi uchun biz bitta filtr zanjiridan iborat grafikdan foydalanamiz. U rasmda ko'rsatilgan.

Mediastreamer2 VoIP dvigatelini o'rganish. 12-qism

Oddiy grafik, unda tayyor media strimeri filtrlari bilan bir qatorda to'rtta F1...F4 hunarmandchilik filtrlari, siz uzoq vaqt oldin qilgan to'rt xil turdagi va ularning to'g'riligiga shubha yo'q. Biroq, ularning bir nechtasida xotira buzilishi bor, deylik. Analizatorni nazorat qilish dasturimizni ishga tushirganimizda, biz uning hisobotidan ma'lum bir filtr ma'lum hajmdagi xotirani talab qilganligini va uni N marta uyaga qaytarmaganligini bilib olamiz. MS_VOID_SOURCE tipidagi ichki filtr funksiyalariga havola bo'lishini taxmin qilish oson. Uning vazifasi xotirani uyumdan olishdir. Boshqa filtrlar uni u erga qaytarishi kerak. Bular. qochqinni topamiz.

Quvurning qaysi qismida xotira oqishiga olib kelgan harakatsizlik sodir bo'lganligini aniqlash uchun xabarlarni kirishdan chiqishga o'tkazadigan, lekin ayni paytda kirishning engil bo'lmagan nusxasini yaratadigan qo'shimcha filtrni joriy etish taklif etiladi. xabarni oddiy "og'ir" nusxaga aylantiring, so'ngra kirish joyiga kelgan xabarni butunlay o'chirib tashlang. Bunday filtrni izolyator deb ataymiz. Biz ishonamizki, filtr oddiy bo'lgani uchun undagi oqish istisno qilinadi. Va yana bir ijobiy xususiyat - agar biz uni grafikamizning istalgan joyiga qo'shsak, bu kontaktlarning zanglashiga hech qanday ta'sir qilmaydi. Biz izolyator filtrini er-xotin konturli doira shaklida tasvirlaymiz.

Izolyatorni bo'shliq filtridan so'ng darhol yoqing:
Mediastreamer2 VoIP dvigatelini o'rganish. 12-qism

Biz dasturni analizator bilan yana ishga tushiramiz va bu safar analizator aybni izolyatorga yuklashini ko'ramiz. Oxir oqibat, u endi ma'lumotlar bloklarini yaratadi, keyinchalik ular noma'lum beparvolik filtri (yoki filtrlar) tomonidan yo'qoladi. Keyingi qadam izolyatorni zanjir bo'ylab o'ngga, bitta filtrga o'tkazish va tahlilni qayta boshlashdir. Shunday qilib, bosqichma-bosqich, izolyatorni o'ngga siljitish, biz keyingi analizator hisobotida "oqish" xotira bloklari soni kamaygan vaziyatga ega bo'lamiz. Bu shuni anglatadiki, bu bosqichda izolyator muammoli filtrdan so'ng darhol zanjirga tushdi. Agar faqat bitta "yomon" filtr bo'lsa, u holda oqish butunlay yo'qoladi. Shunday qilib, biz muammoli filtrni (yoki bir nechtadan birini) mahalliylashtirdik. Filtrni "tuzatgandan" so'ng, biz xotira oqishi to'liq bartaraf etilgunga qadar izolyatorni zanjir bo'ylab o'ngga siljitishni davom ettirishimiz mumkin.

Izolyator filtrini joriy qilish

Izolyatorni amalga oshirish oddiy filtrga o'xshaydi. Sarlavha fayli:

/* Файл iso_filter.h  Описание изолирующего фильтра. */

#ifndef iso_filter_h
#define iso_filter_h

/* Задаем идентификатор фильтра. */
#include <mediastreamer2/msfilter.h>

#define MY_ISO_FILTER_ID 1024

extern MSFilterDesc iso_filter_desc;

#endif

Filtrning o'zi:

/* Файл iso_filter.c  Описание изолирующего фильтра. */

#include "iso_filter.h"

    static void
iso_init (MSFilter * f)
{
}
    static void
iso_uninit (MSFilter * f)
{
}

    static void
iso_process (MSFilter * f)
{
    mblk_t *im;

    while ((im = ms_queue_get (f->inputs[0])) != NULL)
    {
        ms_queue_put (f->outputs[0], copymsg (im));
        freemsg (im);
    }
}

static MSFilterMethod iso_methods[] = {
    {0, NULL}
};

MSFilterDesc iso_filter_desc = {
    MY_ISO_FILTER_ID,
    "iso_filter",
    "A filter that reads from input and copy to its output.",
    MS_FILTER_OTHER,
    NULL,
    1,
    1,
    iso_init,
    NULL,
    iso_process,
    NULL,
    iso_uninit,
    iso_methods
};

MS_FILTER_DESC_EXPORT (iso_desc)

Xotirani boshqarish funktsiyalarini almashtirish usuli

Aniqroq tadqiqotlar uchun media strimer xotiraga kirish funktsiyalarini o'zingizga almashtirish imkoniyatini beradi, bu asosiy ishdan tashqari, "Kim, qaerda va nima uchun" ni yozib oladi. Uchta funksiya almashtirilmoqda. Bu quyidagi tarzda amalga oshiriladi:

OrtpMemoryFunctions reserv;
OrtpMemoryFunctions my;

reserv.malloc_fun = ortp_malloc;
reserv.realloc_fun = ortp_realloc;
reserv.free_fun = ortp_free;

my.malloc_fun = &my_malloc;
my.realloc_fun = &my_realloc;
my.free_fun = &my_free;

ortp_set_memory_functions(&my);

Bu xususiyat analizator filtrlarni shunchalik sekinlashtirganda, bizning sxemamiz qurilgan tizimning ishlashi buzilgan hollarda yordamga keladi. Bunday vaziyatda siz analizatordan voz kechishingiz va xotira funktsiyalarini almashtirishdan foydalanishingiz kerak.

Tarmoqlari bo'lmagan oddiy grafik uchun harakatlar algoritmini ko'rib chiqdik. Ammo bu yondashuv boshqa holatlarga nisbatan qo'llanilishi mumkin, albatta, murakkablik bilan, lekin g'oya bir xil bo'lib qoladi.

Keyingi maqolada biz ticker yukini baholash masalasini va media strimerda ortiqcha hisoblash yukini qanday hal qilishni ko'rib chiqamiz.

Manba: www.habr.com

a Izoh qo'shish