use gbp::CodecError;
use serde::{Deserialize, Serialize};
use serde_bytes::ByteBuf;
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct GapPayload {
#[serde(rename = "msid")]
pub media_source_id: u32,
#[serde(rename = "seq")]
pub rtp_sequence: u32,
#[serde(rename = "ts")]
pub rtp_timestamp: u64,
#[serde(rename = "kp")]
pub key_phase: u32,
#[serde(rename = "opus")]
pub opus_frame: ByteBuf,
}
impl GapPayload {
pub fn opus_20ms(
media_source_id: u32,
rtp_sequence: u16,
key_phase: u32,
opus: Vec<u8>,
) -> Self {
Self {
media_source_id,
rtp_sequence: rtp_sequence as u32,
rtp_timestamp: 960,
key_phase,
opus_frame: ByteBuf::from(opus),
}
}
pub fn with_timestamp(
media_source_id: u32,
rtp_sequence: u16,
rtp_timestamp: u64,
key_phase: u32,
opus: Vec<u8>,
) -> Self {
Self {
media_source_id,
rtp_sequence: rtp_sequence as u32,
rtp_timestamp,
key_phase,
opus_frame: ByteBuf::from(opus),
}
}
pub fn to_cbor(&self) -> Vec<u8> {
let mut buf = Vec::new();
ciborium::into_writer(self, &mut buf).expect("cbor encode");
buf
}
pub fn from_cbor(data: &[u8]) -> Result<Self, CodecError> {
ciborium::from_reader(data).map_err(|e| CodecError::Decode(e.to_string()))
}
}