use crate::error::{Error, Result};
use crate::sps::{
decode_avc_sps, decode_hevc_sps, rfc6381_avc1, rfc6381_hvc1, AvcSpsInfo, HevcSpsInfo,
};
use alloc::string::String;
use alloc::vec::Vec;
use broadcast_common::Serialize;
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize))]
pub struct AvcSps(pub Vec<u8>);
impl AvcSps {
pub fn decode(&self) -> Result<AvcSpsInfo> {
decode_avc_sps(&self.0)
}
pub fn rfc6381(&self) -> Result<String> {
let info = self.decode()?;
Ok(rfc6381_avc1(
info.profile_idc,
info.constraint_flags,
info.level_idc,
))
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize))]
pub struct AvcPps(pub Vec<u8>);
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize))]
pub struct AvcSpsExt(pub Vec<u8>);
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize))]
pub struct HevcNalUnit(pub Vec<u8>);
impl HevcNalUnit {
const LENGTH_FIELD_SIZE: usize = 2;
pub fn new(data: Vec<u8>) -> Self {
Self(data)
}
pub fn decode_sps(&self) -> Result<Option<HevcSpsInfo>> {
if self.0.len() < 2 {
return Ok(None);
}
let nal_type = (self.0[0] >> 1) & 0x3F;
if nal_type != 33 {
return Ok(None);
}
decode_hevc_sps(&self.0).map(Some)
}
pub fn rfc6381(&self) -> Result<Option<String>> {
if let Some(info) = self.decode_sps()? {
Ok(Some(rfc6381_hvc1(&info)))
} else {
Ok(None)
}
}
}
impl Serialize for HevcNalUnit {
type Error = Error;
fn serialized_len(&self) -> usize {
Self::LENGTH_FIELD_SIZE + self.0.len()
}
fn serialize_into(&self, buf: &mut [u8]) -> Result<usize> {
let need = self.serialized_len();
if buf.len() < need {
return Err(Error::OutputBufferTooSmall {
need,
have: buf.len(),
});
}
let len = self.0.len();
buf[..2].copy_from_slice(&(len as u16).to_be_bytes());
buf[2..need].copy_from_slice(&self.0);
Ok(need)
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize))]
pub struct HevcNalArray {
pub array_completeness: bool,
pub nal_unit_type: u8,
pub nalus: Vec<HevcNalUnit>,
}
impl HevcNalArray {
pub fn new(array_completeness: bool, nal_unit_type: u8, nalus: Vec<HevcNalUnit>) -> Self {
Self {
array_completeness,
nal_unit_type,
nalus,
}
}
}
impl Serialize for HevcNalArray {
type Error = Error;
fn serialized_len(&self) -> usize {
3 + self.nalus.iter().map(|n| n.serialized_len()).sum::<usize>()
}
fn serialize_into(&self, buf: &mut [u8]) -> Result<usize> {
let need = self.serialized_len();
if buf.len() < need {
return Err(Error::OutputBufferTooSmall {
need,
have: buf.len(),
});
}
let mut cursor = 0usize;
let first_byte =
(if self.array_completeness { 0x80u8 } else { 0u8 }) | (self.nal_unit_type & 0x3F);
buf[cursor] = first_byte;
cursor += 1;
let count = self.nalus.len();
buf[cursor..cursor + 2].copy_from_slice(&(count as u16).to_be_bytes());
cursor += 2;
for nalu in &self.nalus {
cursor += nalu.serialize_into(&mut buf[cursor..])?;
}
Ok(cursor)
}
}