55 lines
1.2 KiB
C
55 lines
1.2 KiB
C
#include <osmocom/core/talloc.h>
|
|
#include <osmocom/core/utils.h>
|
|
#include <osmocom/core/linuxlist.h>
|
|
|
|
#include "rtp_provider.h"
|
|
#include "internal.h"
|
|
|
|
|
|
static LLIST_HEAD(g_providers);
|
|
static LLIST_HEAD(g_prov_instances);
|
|
|
|
void rtp_provider_register(struct rtp_provider *prov)
|
|
{
|
|
llist_add_tail(&prov->list, &g_providers);
|
|
}
|
|
|
|
const struct rtp_provider *rtp_provider_find(const char *name)
|
|
{
|
|
struct rtp_provider *p;
|
|
llist_for_each_entry(p, &g_providers, list) {
|
|
if (!strcmp(name, p->name))
|
|
return p;
|
|
}
|
|
LOGP(DMAIN, LOGL_ERROR, "Couldn't find RTP provider '%s'\n", name);
|
|
return NULL;
|
|
}
|
|
|
|
struct rtp_provider_instance *
|
|
rtp_provider_instance_alloc(void *ctx, const struct rtp_provider *provider, enum codec_type codec)
|
|
{
|
|
struct rtp_provider_instance *pi;
|
|
|
|
pi = talloc_zero(ctx, struct rtp_provider_instance);
|
|
if (!pi)
|
|
return NULL;
|
|
|
|
pi->provider = provider;
|
|
pi->codec = codec;
|
|
llist_add_tail(&pi->list, &g_prov_instances);
|
|
|
|
return pi;
|
|
}
|
|
|
|
void rtp_provider_instance_free(struct rtp_provider_instance *pi)
|
|
{
|
|
llist_del(&pi->list);
|
|
talloc_free(pi);
|
|
}
|
|
|
|
int rtp_provider_instance_gen_frame(struct rtp_provider_instance *pi, uint8_t *out, size_t out_size)
|
|
{
|
|
OSMO_ASSERT(pi->provider);
|
|
return pi->provider->rtp_gen(pi, out, out_size);
|
|
}
|