use crate::encoding::{BitWriter, Encodable, EncodingResult};
use crate::types::*;
impl Encodable for SpliceCommand {
fn encode(&self, writer: &mut BitWriter) -> EncodingResult<()> {
match self {
SpliceCommand::SpliceNull => {
Ok(())
}
SpliceCommand::SpliceSchedule(schedule) => schedule.encode(writer),
SpliceCommand::SpliceInsert(insert) => insert.encode(writer),
SpliceCommand::TimeSignal(signal) => signal.encode(writer),
SpliceCommand::BandwidthReservation(reservation) => reservation.encode(writer),
SpliceCommand::PrivateCommand(private) => private.encode(writer),
SpliceCommand::Unknown => {
Ok(())
}
}
}
fn encoded_size(&self) -> usize {
match self {
SpliceCommand::SpliceNull => 0,
SpliceCommand::SpliceSchedule(schedule) => schedule.encoded_size(),
SpliceCommand::SpliceInsert(insert) => insert.encoded_size(),
SpliceCommand::TimeSignal(signal) => signal.encoded_size(),
SpliceCommand::BandwidthReservation(reservation) => reservation.encoded_size(),
SpliceCommand::PrivateCommand(private) => private.encoded_size(),
SpliceCommand::Unknown => 0,
}
}
}
impl Encodable for SpliceInsert {
fn encode(&self, writer: &mut BitWriter) -> EncodingResult<()> {
writer.write_bits(self.splice_event_id as u64, 32)?;
writer.write_bits(self.splice_event_cancel_indicator as u64, 1)?;
writer.write_bits(self.reserved as u64, 7)?;
if self.splice_event_cancel_indicator == 0 {
writer.write_bits(self.out_of_network_indicator as u64, 1)?;
writer.write_bits(self.program_splice_flag as u64, 1)?;
writer.write_bits(self.duration_flag as u64, 1)?;
writer.write_bits(self.splice_immediate_flag as u64, 1)?;
writer.write_bits((self.reserved2 >> 2) as u64 & 1, 1)?;
writer.write_bits(self.reserved2 as u64 & 0x7, 3)?;
if self.program_splice_flag == 1 && self.splice_immediate_flag == 0 {
if let Some(ref splice_time) = self.splice_time {
splice_time.encode(writer)?;
}
}
if self.program_splice_flag == 0 {
writer.write_bits(self.component_count as u64, 8)?;
for component in &self.components {
component.encode(writer)?;
}
}
}
if self.duration_flag == 1 {
if let Some(ref break_duration) = self.break_duration {
break_duration.encode(writer)?;
}
}
writer.write_bits(self.unique_program_id as u64, 16)?;
writer.write_bits(self.avail_num as u64, 8)?;
writer.write_bits(self.avails_expected as u64, 8)?;
Ok(())
}
fn encoded_size(&self) -> usize {
let mut size = 4; size += 1;
if self.splice_event_cancel_indicator == 0 {
size += 1;
if self.program_splice_flag == 1 && self.splice_immediate_flag == 0 {
if let Some(ref splice_time) = self.splice_time {
size += splice_time.encoded_size();
}
}
if self.program_splice_flag == 0 {
size += 1; for component in &self.components {
size += component.encoded_size();
}
}
}
if self.duration_flag == 1 {
if let Some(ref break_duration) = self.break_duration {
size += break_duration.encoded_size();
}
}
size += 4;
size
}
}
impl Encodable for TimeSignal {
fn encode(&self, writer: &mut BitWriter) -> EncodingResult<()> {
self.splice_time.encode(writer)?;
Ok(())
}
fn encoded_size(&self) -> usize {
self.splice_time.encoded_size()
}
}
impl Encodable for SpliceSchedule {
fn encode(&self, writer: &mut BitWriter) -> EncodingResult<()> {
writer.write_bits(1u64, 8)?;
writer.write_bits(self.splice_event_id as u64, 32)?;
writer.write_bits(self.splice_event_cancel_indicator as u64, 1)?;
writer.write_bits((self.reserved >> 6) as u64 & 1, 1)?;
writer.write_bits(self.reserved as u64 & 0x3F, 6)?;
if self.splice_event_cancel_indicator == 0 {
writer.write_bits(self.out_of_network_indicator as u64, 1)?;
writer.write_bits(1u64, 1)?;
writer.write_bits(self.duration_flag as u64, 1)?;
writer.write_bits(0x1F, 5)?;
if let Some(utc_time) = self.utc_splice_time {
writer.write_bits(utc_time as u64, 32)?;
}
if self.duration_flag == 1 {
if let Some(splice_duration) = self.splice_duration {
writer.write_bits(splice_duration as u64, 40)?; }
}
writer.write_bits(self.unique_program_id as u64, 16)?;
writer.write_bits(self.num_splice as u64, 8)?;
writer.write_bits(self.num_splice as u64, 8)?;
}
Ok(())
}
fn encoded_size(&self) -> usize {
let mut size = 1 + 4 + 1;
if self.splice_event_cancel_indicator == 0 {
size += 1; size += 4;
if self.duration_flag == 1 {
size += 5; }
size += 4; }
size
}
}
impl Encodable for BandwidthReservation {
fn encode(&self, writer: &mut BitWriter) -> EncodingResult<()> {
writer.write_bits(self.reserved as u64, 8)?;
writer.write_bits(self.dwbw_reservation as u64, 32)?;
Ok(())
}
fn encoded_size(&self) -> usize {
5 }
}
impl Encodable for PrivateCommand {
fn encode(&self, writer: &mut BitWriter) -> EncodingResult<()> {
writer.write_bits(self.private_command_id as u64, 16)?;
writer.write_bits(self.private_command_length as u64, 8)?;
writer.write_bytes(&self.private_bytes)?;
Ok(())
}
fn encoded_size(&self) -> usize {
2 + 1 + self.private_bytes.len() }
}
impl Encodable for SpliceInsertComponent {
fn encode(&self, writer: &mut BitWriter) -> EncodingResult<()> {
writer.write_bits(self.component_tag as u64, 8)?;
if let Some(ref splice_time) = self.splice_time {
splice_time.encode(writer)?;
}
Ok(())
}
fn encoded_size(&self) -> usize {
let mut size = 1;
if let Some(ref splice_time) = self.splice_time {
size += splice_time.encoded_size();
}
size
}
}