1 /***
2 This file is part of PulseAudio.
3
4 Copyright 2006 Lennart Poettering
5
6 PulseAudio is free software; you can redistribute it and/or modify
7 it under the terms of the GNU Lesser General Public License as published
8 by the Free Software Foundation; either version 2.1 of the License,
9 or (at your option) any later version.
10
11 PulseAudio is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public License
17 along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
18 ***/
19
20 #ifdef HAVE_CONFIG_H
21 #include <config.h>
22 #endif
23
24 #include "rtp.h"
25
26 #include <pulsecore/core-util.h>
27
pa_rtp_payload_from_sample_spec(const pa_sample_spec * ss)28 uint8_t pa_rtp_payload_from_sample_spec(const pa_sample_spec *ss) {
29 pa_assert(ss);
30
31 if (ss->format == PA_SAMPLE_S16BE && ss->rate == 44100 && ss->channels == 2)
32 return 10;
33 if (ss->format == PA_SAMPLE_S16BE && ss->rate == 44100 && ss->channels == 1)
34 return 11;
35
36 return 127;
37 }
38
pa_rtp_sample_spec_from_payload(uint8_t payload,pa_sample_spec * ss)39 pa_sample_spec *pa_rtp_sample_spec_from_payload(uint8_t payload, pa_sample_spec *ss) {
40 pa_assert(ss);
41
42 switch (payload) {
43 case 10:
44 ss->channels = 2;
45 ss->format = PA_SAMPLE_S16BE;
46 ss->rate = 44100;
47 break;
48
49 case 11:
50 ss->channels = 1;
51 ss->format = PA_SAMPLE_S16BE;
52 ss->rate = 44100;
53 break;
54
55 case 127:
56 ss->channels = 2;
57 ss->format = PA_SAMPLE_S16LE;
58 ss->rate = 48000;
59 break;
60
61 default:
62 return NULL;
63 }
64
65 return ss;
66 }
67
pa_rtp_sample_spec_fixup(pa_sample_spec * ss,bool enable_opus)68 pa_sample_spec *pa_rtp_sample_spec_fixup(pa_sample_spec * ss, bool enable_opus) {
69 pa_assert(ss);
70
71 if (!pa_rtp_sample_spec_valid(ss) && enable_opus)
72 ss->format = PA_SAMPLE_S16LE;
73 else if (!pa_rtp_sample_spec_valid(ss) || !enable_opus)
74 ss->format = PA_SAMPLE_S16BE;
75
76 pa_assert(pa_rtp_sample_spec_valid(ss));
77 return ss;
78 }
79
pa_rtp_sample_spec_valid(const pa_sample_spec * ss)80 int pa_rtp_sample_spec_valid(const pa_sample_spec *ss) {
81 pa_assert(ss);
82
83 if (!pa_sample_spec_valid(ss))
84 return 0;
85
86 return ss->format == PA_SAMPLE_S16BE || ss->format == PA_SAMPLE_S16LE;
87 }
88
pa_rtp_format_to_string(pa_sample_format_t f)89 const char* pa_rtp_format_to_string(pa_sample_format_t f) {
90 switch (f) {
91 case PA_SAMPLE_S16BE:
92 case PA_SAMPLE_S16LE:
93 return "L16";
94 default:
95 return NULL;
96 }
97 }
98
pa_rtp_string_to_format(const char * s,bool enable_opus)99 pa_sample_format_t pa_rtp_string_to_format(const char *s, bool enable_opus) {
100 pa_assert(s);
101
102 if (pa_streq(s, "L16") && enable_opus)
103 return PA_SAMPLE_S16LE;
104 else if (pa_streq(s, "L16"))
105 return PA_SAMPLE_S16BE;
106 else
107 return PA_SAMPLE_INVALID;
108 }
109