blob: f453234c82cf0a9def95783cde80ef352eb0e15c [file] [log] [blame]
Pau Espin Pedrol71ed4632022-09-02 18:51:19 +02001/*
2 * (C) 2019-2022 by sysmocom s.f.m.c. GmbH <info@sysmocom.de>
3 * All rights reserved.
4 *
5 * Author: Pau Espin Pedrol <pespin@sysmocom.de>
6 *
7 * Released under the terms of GNU General Public License, Version 2 or
8 * (at your option) any later version.
9 */
10
11module AMR_Types {
12
13import from General_Types all;
Pau Espin Pedrol1a8f8f82022-09-06 20:25:50 +020014import from Osmocom_Types all;
Pau Espin Pedrol71ed4632022-09-02 18:51:19 +020015
16/* AMR voice frame type identifiers
17 * See also 3GPP TS 26.101, Table 1a: Interpretation of Frame Type, Mode
18 * Indication and Mode Request fields */
19type enumerated AMRFT {
20 AMR_FT_0, /* 4.75 */
21 AMR_FT_1, /* 5.15 */
22 AMR_FT_2, /* 5.90 */
23 AMR_FT_3, /* 6.70 */
24 AMR_FT_4, /* 7.40 */
25 AMR_FT_5, /* 7.95 */
26 AMR_FT_6, /* 10.2 */
27 AMR_FT_7, /* 12.2 */
28 AMR_FT_SID /* SID */
29};
30
31/* AMR voice frame length (in bytes, rounded),
32 * See also RFC 3267, chapter 3.6 */
33const integer c_AMRFT_len[9] := {12, 13, 15, 17, 19, 20, 26, 31, 5};
34
35function f_amrft_payload_len(INT4b amr_ft) return integer {
Pau Espin Pedrol30f06672022-10-25 12:30:58 +020036 return c_AMRFT_len[amr_ft];
37}
38
39const integer c_AMRFT_bits_len[9] := {95, 103, 118, 134, 148, 159, 204, 244, 39};
40
41function f_amrft_payload_bits_len(INT4b amr_ft) return integer {
42 return c_AMRFT_bits_len[amr_ft];
Pau Espin Pedrol71ed4632022-09-02 18:51:19 +020043}
44
Pau Espin Pedrol1a8f8f82022-09-06 20:25:50 +020045type record RTP_AMR_Hdr {
46 uint4_t cmr,
47 BIT4 padding1,
48 BIT1 f,
49 uint4_t ft,
50 BIT1 q,
51 BIT2 padding2
52} with { variant "FIELDORDER(msb)" };
53
54template (value) RTP_AMR_Hdr ts_RTP_AMR_Hdr(template (value) uint4_t cmr,
55 template (value) uint4_t ft,
56 template (value) BIT1 q := '1'B,
57 template (value) BIT1 f := '0'B) := {
58 cmr := cmr,
59 padding1 := '0000'B,
60 f := f,
61 ft := ft,
62 q := q,
63 padding2 := '00'B
64}
65external function enc_RTP_AMR_Hdr(in RTP_AMR_Hdr amr_hdr) return octetstring
66 with { extension "prototype(convert) encode(RAW)" };
67external function dec_RTP_AMR_Hdr(in octetstring stream) return RTP_AMR_Hdr
68 with { extension "prototype(convert) decode(RAW)" };
69
Pau Espin Pedrol26258472022-10-25 12:51:24 +020070
71type record RTP_AMR_BWE_Hdr {
72 uint4_t cmr,
73 BIT1 f,
74 uint4_t ft,
75 BIT1 q
76} with { variant "FIELDORDER(msb)" };
77template (value) RTP_AMR_BWE_Hdr ts_RTP_AMR_BWE_Hdr(template (value) uint4_t cmr,
78 template (value) uint4_t ft,
79 template (value) BIT1 q := '1'B,
80 template (value) BIT1 f := '0'B) := {
81 cmr := cmr,
82 f := f,
83 ft := ft,
84 q := q
85}
86external function enc_RTP_AMR_BWE_Hdr(in RTP_AMR_BWE_Hdr amr_hdr) return octetstring
87 with { extension "prototype(convert) encode(RAW)" };
88external function dec_RTP_AMR_BWE_Hdr(in octetstring stream) return RTP_AMR_BWE_Hdr
89 with { extension "prototype(convert) decode(RAW)" };
90
Pau Espin Pedrol71ed4632022-09-02 18:51:19 +020091} with { encode "RAW"}