#include "rtp-ext.h" // https://datatracker.ietf.org/doc/html/rfc6464 /* The audio level header extension carries the level of the audio in the RTP [RFC3550] payload of the packet with which it is associated. This information is carried in an RTP header extension element as defined by "A General Mechanism for RTP Header Extensions" [RFC5285]. The payload of the audio level header extension element can be encoded using either the one-byte or two-byte header defined in [RFC5285]. Figures 1 and 2 show sample audio level encodings with each of these header formats. 0 1 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ID | len=0 |V| level | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Figure 1: Sample Audio Level Encoding Using the One-Byte Header Format 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ID | len=1 |V| level | 0 (pad) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Figure 2: Sample Audio Level Encoding Using the Two-Byte Header Format */ int rtp_ext_ssrc_audio_level_parse(const uint8_t* data, int bytes, uint8_t *activity, uint8_t *level) { if (bytes < 1) return -1; *activity = (data[0] & 0x80) ? 1 : 0; *level = data[0] & 0x7f; return 0; } int rtp_ext_ssrc_audio_level_write(uint8_t* data, int bytes, uint8_t activity, uint8_t level) { if (bytes < 1) return -1; data[0] = (activity ? 0x80 : 0) | level; return 1; }