shiguredo_rtmp 2026.1.0-canary.6

RTMP library
Documentation
use alloc::vec::Vec;

use crate::rtmp_message::{RtmpMessageStreamId, RtmpMessageType};
use crate::rtmp_timestamp::RtmpTimestamp;

#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct RtmpChunkStreamId(u32);

impl RtmpChunkStreamId {
    pub fn new(id: u32) -> Option<Self> {
        (2..=65599).contains(&id).then_some(Self(id))
    }

    pub fn from_message_stream_id(message_stream_id: RtmpMessageStreamId) -> Self {
        Self((message_stream_id.get() + 2).min(65599))
    }

    pub const fn get(self) -> u32 {
        self.0
    }
}

#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub enum MessageHeaderFormat {
    F0 = 0,
    F1,
    F2,
    F3,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct RtmpChunkSize(usize);

impl RtmpChunkSize {
    pub const MIN: Self = Self(1);
    pub const MAX: Self = Self(65536);

    pub fn new(size: usize) -> Option<Self> {
        let this = Self(size);
        (Self::MIN..=Self::MAX).contains(&this).then_some(this)
    }

    pub fn saturating_new(size: usize) -> Self {
        Self(size).clamp(Self::MIN, Self::MAX)
    }

    pub const fn get(self) -> usize {
        self.0
    }
}

impl Default for RtmpChunkSize {
    fn default() -> Self {
        Self(128)
    }
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct RtmpChunk {
    pub chunk_stream_id: RtmpChunkStreamId,
    pub message_stream_id: RtmpMessageStreamId,
    pub message_type: RtmpMessageType,
    pub timestamp: RtmpTimestamp,
    pub payload: Vec<u8>,
}