主题简述:
size:指定了这个 Box 的大小,从 Header 到 Data 部分,一般 Header 的大小为8字节,但是如果 Box 很大,超过了 uint32 的最大数值,那么 size 则为 1,并拓展出8字节 uint64 来表示该Box的大小,这样 Header 大小就变成16字节了。
type:指定了这个 Box 是什么 Box,例如常见的 ftyp Box,mdat Box,moov Box 等等。这里是存对应 Box 属性的 ASCII 码。
// BaseBox.h
enum BOX_TYPE{
FTYP,
MOOV,
UUID,
MDAT,
ERROR // 实际上没有这个 Box,只是为了当在错误时,要返回的值
};
// BaseBox.h
typedef unsigned char Timebyte;
struct BoxHeader{
Timebyte _h_size[4] = {0};
Timebyte _h_type[5] = {0}; // 这里定义5个字节是为了后面 to_string 的打印操作读取到最后一个0结束
// 这里可以定义一个是否有拓展长度字节的,还没遇到对应的情况,这里我就还没写
// 获取当前 Box 的大小
unsigned int GetSize() {
return _h_size[0] << 24 | _h_size[1] << 16 | _h_size[2] << 8 | _h_size[3];
}
// 获取当前 Box Data 的大小
unsigned int GetDataSize() {
return GetSize() - 8;
}
// 对当前这个 Header 进行打印操作
void to_string() {
printf("box_size: %ud\n", GetSize());
printf("box_type: %s\n", _h_type);
}
// 这个返回当前 Box 的类型
BOX_TYPE GetType() {
// ... 这里暂时先不写,后面具体定义的时候再加再加
}
};
// BaseBox.h
class BaseBox{
protected:
Timebyte *data = nullptr;
public:
BoxHeader h;
BaseBox(BoxHeader h);
BaseBox(BoxHeader h, Timebyte * d);
~BaseBox();
Timebyte * GetData() const {return data;};
};
// BaseBox.cpp
BaseBox::BaseBox(BoxHeader h)
: h(h) {
}
BaseBox::BaseBox(BoxHeader h, Timebyte *d)
: h(h), data(d){
}
BaseBox::~BaseBox() {
if (data) {
delete[] data;
data = nullptr;
}
}
BaseBox::BaseBox(BaseBox &baseBox) {
data = baseBox.data;
h = baseBox.h;
}
以上便是我定义的基本的 Box Type,Box Header,BaseBox 后面会解析对应的 Box 还会对这些进行重构和改写。