libosmo-netif
0.2.0-dirty
Osmocom network interface library
|
00001 #ifndef _OSMO_AMR_H_ 00002 #define _OSMO_AMR_H_ 00003 00004 #include <osmocom/core/endian.h> 00005 00006 /* As defined by RFC3267: Adaptive Multi-Rate (AMR) */ 00007 00008 /* 00009 * +----------------+-------------------+---------------- 00010 * | payload header | table of contents | speech data ... 00011 * +----------------+-------------------+---------------- 00012 */ 00013 00014 /* 00015 * 4.4. Octet-aligned Mode: 00016 * 00017 * 4.4.1. The Payload Header: 00018 * 00019 * 0 1 2 3 4 5 6 7 00020 * +-+-+-+-+-+-+-+-+ 00021 * | CMR |X X X X| 00022 * +-+-+-+-+-+-+-+-+ 00023 * 00024 * According to: 3GPP TS 26.201 "AMR Wideband speech codec; Frame Structure", 00025 * version 5.0.0 (2001-03), 3rd Generation Partnership Project (3GPP): 00026 * 00027 * Possible Frame type / CMR values: 00028 * 00029 * 0-8 for AMR-WB (from 6.60 kbit/s to 23.85 kbit/s) 00030 * 9 (SID) confort noise. 00031 * 10-13 future use. 00032 * 14 means lost speech frame (only available for AMR-WB) 00033 * 15 means no data 00034 * 00035 * 4.4.2. The table of contents: 00036 * 00037 * 0 1 2 3 4 5 6 7 00038 * +-+-+-+-+-+-+-+-+ 00039 * |F| FT |Q|X X| 00040 * +-+-+-+-+-+-+-+-+ 00041 * 00042 * X means padding. 00043 */ 00044 00045 struct amr_hdr { 00046 #if OSMO_IS_BIG_ENDIAN 00047 /* Payload Header */ 00048 uint8_t cmr:4, /* Codec Mode Request */ 00049 pad1:4; 00050 /* Table of Contents */ 00051 uint8_t f:1, /* followed by another speech frame? */ 00052 ft:4, /* coding mode */ 00053 q:1, /* OK (not damaged) at origin? */ 00054 pad2:2; 00055 #elif OSMO_IS_LITTLE_ENDIAN 00056 /* Payload Header */ 00057 uint8_t pad1:4, 00058 cmr:4; 00059 /* Table of Contents */ 00060 uint8_t pad2:2, 00061 q:1, 00062 ft:4, 00063 f:1; 00064 #endif 00065 } __attribute__((packed)); 00066 00067 static inline void *osmo_amr_get_payload(struct amr_hdr *amrh) 00068 { 00069 return (uint8_t *)amrh + sizeof(struct amr_hdr); 00070 } 00071 00072 #define AMR_FT_0 0 /* 4.75 */ 00073 #define AMR_FT_1 1 /* 5.15 */ 00074 #define AMR_FT_2 2 /* 5.90 */ 00075 #define AMR_FT_3 3 /* 6.70 */ 00076 #define AMR_FT_4 4 /* 7.40 */ 00077 #define AMR_FT_5 5 /* 7.95 */ 00078 #define AMR_FT_6 6 /* 10.2 */ 00079 #define AMR_FT_7 7 /* 12.2 */ 00080 #define AMR_FT_SID 8 /* SID */ 00081 #define AMR_FT_MAX 9 00082 00083 int osmo_amr_ft_valid(uint8_t amr_ft); 00084 size_t osmo_amr_bytes(uint8_t amr_cmr); 00085 00086 #endif