stsd(Sample Description Box)

Created
Jan 23, 2022 09:45 AM
Tags
BoxTypes: ‘stsd’ Container: Sample Table Box (‘stbl’) Mandatory: Yes Quantity: Exactly one
stsd给出sample的描述信息,这里面包含了在解码阶段需要用到的任意初始化信息,比如 编码 等。对于视频、音频来说,所需要的初始化信息不同
 
The sample description table gives detailed information about the coding type used, and any initialization information needed for that coding. The information stored in the sample description box after the entry-count is both track-type specific as documented here, and can also have variants within a track type (e.g. different codings may use different specific information after some common fields, even within a video track).
 
在SampleDescriptionBox 中,handler_type 参数 为 track 的类型(soun、vide、hint),entry_count 变量代表当前box中 smaple description 的条目数。
stsc 中,sample_description_index 就是指向这些sample description的索引。
针对不同的handler_type,SampleDescriptionBox 后续应用不同的 SampleEntry 类型,比如video track为VisualSampleEntry。
VisualSampleEntry包含如下字段:
  • data_reference_index:当MP4文件的数据部分,可以被分割成多个片段,每一段对应一个索引,并分别通过URL地址来获取,此时,data_reference_index 指向对应的片段(比较少用到);
  • width、height:视频的宽高,单位是像素;
  • horizresolution、vertresolution:水平、垂直方向的分辨率(像素/英寸),16.16定点数,默认是0x00480000(72dpi);
  • frame_count:一个sample中包含多少个frame,对video track来说,默认是1;
  • compressorname:仅供参考的名字,通常用于展示,占32个字节,比如 AVC Coding。第一个字节,表示这个名字实际要占用N个字节的长度。第2到第N+1个字节,存储这个名字。第N+2到32个字节为填充字节。compressorname 可以设置为0;
  • depth:位图的深度信息,比如 0x0018(24),表示不带alpha通道的图片
 
notion image
 
use crate::atoms::*; #[derive(Debug, Clone, PartialEq, Default)] pub struct StsdBox { pub version: u8, pub flags: u32, pub avc1: Option<Avc1Box>, pub hev1: Option<Hev1Box>, pub vp09: Option<Vp09Box>, pub mp4a: Option<Mp4aBox>, pub tx3g: Option<Tx3gBox>, } impl StsdBox { pub fn get_type(&self) -> BoxType { BoxType::StsdBox } pub fn get_size(&self) -> u64 { let mut size = HEADER_SIZE + HEADER_EXT_SIZE + 4; if let Some(ref avc1) = self.avc1 { size += avc1.box_size(); } else if let Some(ref hev1) = self.hev1 { size += hev1.box_size(); } else if let Some(ref vp09) = self.vp09 { size += vp09.box_size(); } else if let Some(ref mp4a) = self.mp4a { size += mp4a.box_size(); } else if let Some(ref tx3g) = self.tx3g { size += tx3g.box_size(); } size } }