SeekTable

Struct SeekTable 

Source
pub struct SeekTable {
    pub points: Contiguous<{ Self::MAX_POINTS }, SeekPoint>,
}
Expand description

A SEEKTABLE metadata block

Because FLAC frames do not store their compressed length, a seek table is used for random access within a FLAC file. By mapping a sample number to a byte offset, one can quickly reach different parts of the file without decoding the whole thing.

Also note that seek point byte offsets are relative to the start of the first FLAC frame, and not relative to the start of the entire file. This allows us to change the size of the set of metadata blocks without having to recalculate the contents of the seek table.

Because the byte and sample offsets are file-specific, a seek table generated for one file should not be transferred to another FLAC file where the frames are different sizes and in different positions.

This block may occur only once in a FLAC file.

Its seekpoints occupy the entire block.

§Example

use bitstream_io::{BitReader, BitRead, BigEndian};
use flac_codec::metadata::{BlockHeader, BlockType, SeekTable, SeekPoint};

let data: &[u8] = &[
    0x83, 0x00, 0x00, 0x48,  // block header
    // seekpoint 0
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x14,
    // seekpoint 1
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c,
    0x00, 0x14,
    // seekpoint 2
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22,
    0x00, 0x14,
    // seekpoint 3
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c,
    0x00, 0x14,
];

let mut r = BitReader::endian(data, BigEndian);
let header = r.parse::<BlockHeader>().unwrap();
assert_eq!(
    &header,
    &BlockHeader {
        last: true,
        block_type: BlockType::SeekTable,
        size: 0x48u8.into(),
    },
);

let seektable = r.parse_using::<SeekTable>(header.size).unwrap();

assert_eq!(
    Vec::from(seektable.points),
    vec![
        SeekPoint::Defined {
            sample_offset: 0x00,
            byte_offset: 0x00,
            frame_samples: 0x14,
        },
        SeekPoint::Defined {
            sample_offset: 0x14,
            byte_offset: 0x0c,
            frame_samples: 0x14,
        },
        SeekPoint::Defined {
            sample_offset: 0x28,
            byte_offset: 0x22,
            frame_samples: 0x14,
        },
        SeekPoint::Defined {
            sample_offset: 0x3c,
            byte_offset: 0x3c,
            frame_samples: 0x14,
        },
    ],
);

Fields§

§points: Contiguous<{ Self::MAX_POINTS }, SeekPoint>

The seek table’s individual seek points

Implementations§

Source§

impl SeekTable

Source

pub const MAX_POINTS: usize = 932_067usize

The maximum number of seek points that fit into a seek table

Trait Implementations§

Source§

impl AsBlockRef for SeekTable

Source§

fn as_block_ref(&self) -> BlockRef<'_>

Returns fresh reference to ourself.
Source§

impl Clone for SeekTable

Source§

fn clone(&self) -> SeekTable

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for SeekTable

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for SeekTable

Source§

fn default() -> SeekTable

Returns the “default value” for a type. Read more
Source§

impl From<SeekTable> for Block

Source§

fn from(b: SeekTable) -> Self

Converts to this type from the input type.
Source§

impl FromBitStreamUsing for SeekTable

Source§

type Context = BlockSize

Some context to consume when parsing
Source§

type Error = Error

Error generated during parsing, such as io::Error
Source§

fn from_reader<R: BitRead + ?Sized>( r: &mut R, size: BlockSize, ) -> Result<Self, Self::Error>

Parse Self from reader with the given context
Source§

impl MetadataBlock for SeekTable

Source§

const TYPE: BlockType = BlockType::SeekTable

The metadata block’s type
Source§

const MULTIPLE: bool = false

Whether the block can occur multiple times in a file
Source§

fn bytes(&self) -> Option<BlockSize>

Size of block, in bytes, not including header
Source§

fn total_size(&self) -> Option<BlockSize>

Size of block, in bytes, including block header
Source§

impl OptionalMetadataBlock for SeekTable

Source§

const OPTIONAL_TYPE: OptionalBlockType = OptionalBlockType::SeekTable

Our optional block type
Source§

impl PartialEq for SeekTable

Source§

fn eq(&self, other: &SeekTable) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl ToBitStream for SeekTable

Source§

type Error = Error

Error generated during building, such as io::Error
Source§

fn to_writer<W: BitWrite + ?Sized>(&self, w: &mut W) -> Result<(), Self::Error>

Generate self to writer
Source§

fn bits<C>(&self) -> Result<C, Self::Error>
where C: Counter, Self: Sized,

Returns length of self in bits, if possible
Source§

fn bits_len<C, E>(&self) -> Result<C, Self::Error>
where C: Counter, E: Endianness, Self: Sized,

👎Deprecated since 4.0.0: use of bits() is preferred
Returns total length of self, if possible
Source§

impl TryFrom<Block> for SeekTable

Source§

type Error = ()

The type returned in the event of a conversion error.
Source§

fn try_from(block: Block) -> Result<Self, ()>

Performs the conversion.
Source§

impl Eq for SeekTable

Source§

impl StructuralPartialEq for SeekTable

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.