Nous étudions le moteur VoIP Mediastreamer2. Partie 12

Article extrait de ma chaîne zen .



Dans un article précédent , j'ai promis d'examiner la question de l'estimation de la charge sur le téléscripteur et des moyens de faire face à une charge informatique excessive dans le streamer multimédia. Mais j'ai décidé qu'il serait plus logique de couvrir les problèmes de débogage des filtres d'artisanat associés aux données en mouvement et de ne considérer que les problèmes d'optimisation des performances.


Débogage des filtres artisanaux


Après avoir examiné le mécanisme de déplacement des données dans un streamer multimédia dans un article précédent, il serait logique de parler des dangers qui s'y cachent. L'une des caractéristiques du principe du "flux de données" est que l'allocation de mémoire à partir du segment de mémoire se produit dans les filtres situés à la source du flux de données, et les filtres situés à la fin du chemin de flux libèrent la mémoire et reviennent au segment de mémoire. De plus, la création de nouvelles données et leur destruction peuvent se produire quelque part à des points intermédiaires. Dans le cas général, la libération de la mémoire est effectuée par le mauvais filtre qui a créé le bloc de données.


, , , , . — , . , , — / .


, , ( ). "" "" . , . . "" , MS_TEE , . , : ms_free(). , , .. "". ( ) .


"" , . — . , . , , , "" , .


?


, top , .


, - , . , . , , ..


( ). Valgrind ( ) gcc MemorySanitizer - . , , .



, , . "" , , , . , , .


"" , , .


, . , .



. .



, F1...F4, , . , . , , N- . , MS_VOID_SOURCE. — . . .. .


, , , , "" , , . . , , . — , . - .


voidsourse:


, , , . , ( ). , . , , , "" . , . "" , . ( ). "" , .


-


. :


/*  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

:


/*  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)


, , ", ". . :


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

, , . .


, . , , .


Dans le prochain article, nous examinerons la question de l'estimation de la charge sur le ticker et des moyens de faire face à une charge de calcul excessive dans le streamer multimédia.


All Articles