aboutsummaryrefslogtreecommitdiffstats
path: root/rtpsource/rtp_provider.c
blob: 7e12db3771cb2151b81279122a7eef384d1d2878 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#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);

const struct value_string codec_type_names[] = {
	{ CODEC_ULAW,		"ULAW" },
	{ CODEC_ALAW,		"ALAW" },
	{ CODEC_GSM_FR,		"GSM_FR" },
	{ CODEC_GSM_EFR,	"GSM_EFR" },
	{ CODEC_GSM_HR,		"GSM_HR" },
	{ CODEC_AMR_4_75,	"AMR_4_75" },
	{ CODEC_AMR_5_15,	"AMR_5_15" },
	{ CODEC_AMR_5_90,	"AMR_5_90" },
	{ CODEC_AMR_6_70,	"AMR_6_70" },
	{ CODEC_AMR_7_40,	"AMR_7_40" },
	{ CODEC_AMR_7_95,	"AMR_7_95" },
	{ CODEC_AMR_10_2,	"AMR_10_2" },
	{ CODEC_AMR_12_2,	"AMR_12_2" },
	{ CODEC_AMR_SID,	"AMR_SID" },
	{ 0, NULL }
};

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