blob: c2785f23e709002d35fb3afb05699bd87efe16d1 [file] [log] [blame]
Jacob Erlbeck136a3192014-03-13 14:33:37 +01001#include <stdlib.h>
2#include <unistd.h>
3#include <stdio.h>
4#include <string.h>
5#include <err.h>
6
7#include <osmocom/core/talloc.h>
8#include <osmocom/core/application.h>
9
10#include <openbsc/debug.h>
11#include <openbsc/gsm_data.h>
12#include <openbsc/mgcp.h>
13#include <openbsc/mgcp_internal.h>
14
15#include "bscconfig.h"
16#ifndef BUILD_MGCP_TRANSCODING
17#error "Requires MGCP transcoding enabled (see --enable-mgcp-transcoding)"
18#endif
19
20#include "src/osmo-bsc_mgcp/mgcp_transcode.h"
21
22static int audio_name_to_type(const char *name)
23{
24 if (!strcasecmp(name, "gsm"))
25 return 3;
26#ifdef HAVE_BCG729
27 else if (!strcasecmp(name, "g729"))
28 return 18;
29#endif
30 else if (!strcasecmp(name, "pcma"))
31 return 8;
32 else if (!strcasecmp(name, "l16"))
33 return 11;
34 return -1;
35}
36
37int mgcp_get_trans_frame_size(void *state_, int nsamples, int dst);
38
39int main(int argc, char **argv)
40{
41 char buf[4096] = {0};
42 int cc, rc;
43 struct mgcp_rtp_end dst_end = {0};
44 struct mgcp_rtp_end src_end = {0};
45 struct mgcp_trunk_config tcfg = {{0}};
46 struct mgcp_endpoint endp = {0};
47 struct mgcp_process_rtp_state *state;
48 int in_size;
49
50 osmo_init_logging(&log_info);
51
52 tcfg.endpoints = &endp;
53 tcfg.number_endpoints = 1;
54 endp.tcfg = &tcfg;
55
56 if (argc <= 2)
57 errx(1, "Usage: {gsm|g729|pcma|l16} {gsm|g729|pcma|l16}");
58
59 if ((src_end.payload_type = audio_name_to_type(argv[1])) == -1)
60 errx(1, "invalid input format '%s'", argv[1]);
61 if ((dst_end.payload_type = audio_name_to_type(argv[2])) == -1)
62 errx(1, "invalid output format '%s'", argv[2]);
63
64 rc = mgcp_transcoding_setup(&endp, &dst_end, &src_end);
65 if (rc < 0)
66 errx(1, "setup failed: %s", strerror(-rc));
67
68 state = dst_end.rtp_process_data;
69 OSMO_ASSERT(state != NULL);
70
71 in_size = mgcp_transcoding_get_frame_size(state, 160, 0);
72 OSMO_ASSERT(sizeof(buf) >= in_size + 12);
73
74 while ((cc = read(0, buf + 12, in_size))) {
75 if (cc != in_size)
76 err(1, "read");
77
78 cc += 12; /* include RTP header */
79
80 rc = mgcp_transcoding_process_rtp(&endp, &dst_end,
81 buf, &cc, sizeof(buf));
82 if (rc < 0)
83 errx(1, "processing failed: %s", strerror(-rc));
84
85 cc -= 12; /* ignore RTP header */
86 if (write(1, buf + 12, cc) != cc)
87 err(1, "write");
88 }
89 return 0;
90}
91