+ Some((lsf, errors))
+}
+
+pub(crate) fn parse_stream(frame: &[f32] /* length 192 */) -> Option<(StreamFrame, u8)> {
+ let deinterleaved = frame_initial_decode(frame);
+ let stream_part = &deinterleaved[12..];
+ let (stream, errors) = fec::decode(stream_part, 144, p_2)?;
+ let frame_num = u16::from_be_bytes([stream[0], stream[1]]);
+ let eos = (frame_num & 0x8000) > 0;
+ let frame_num = frame_num & 0x7fff; // higher layer has to handle wraparound
+ debug!("frame number: {frame_num}, codec2: {:?}", &stream[2..18]);
+
+ if let Some((counter, part)) = decode_lich(&deinterleaved[0..12]) {
+ debug!(
+ "LICH: received part {counter} part {part:?} from raw {:?}",
+ &deinterleaved[0..12]
+ );
+ Some((
+ StreamFrame {
+ lich_idx: counter,
+ lich_part: part,
+ frame_number: frame_num,
+ end_of_stream: eos,
+ stream_data: stream[2..18].try_into().unwrap(),
+ },
+ errors,
+ ))
+ } else {
+ None
+ }
+}
+
+pub(crate) fn parse_packet(frame: &[f32] /* length 192 */) -> Option<(PacketFrame, u8)> {
+ let deinterleaved = frame_initial_decode(frame);
+ let (packet, errors) = fec::decode(&deinterleaved, 206, p_3)?;
+ let final_frame = (packet[25] & 0x80) > 0;
+ let number = (packet[25] >> 2) & 0x1f;
+ let counter = if final_frame {
+ PacketFrameCounter::FinalFrame {
+ payload_len: number as usize,
+ }
+ } else {
+ PacketFrameCounter::Frame {
+ index: number as usize,
+ }
+ };
+ Some((
+ PacketFrame {
+ payload: packet[0..25].try_into().unwrap(),
+ counter,
+ },
+ errors,
+ ))