libosmo-netif  0.2.0-dirty
Osmocom network interface library
include/osmocom/netif/amr.h
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
 All Data Structures Files Functions