Added TX3G and FTAB MP4 boxes

This commit is contained in:
Ramoe 2017-11-23 09:10:58 +01:00 committed by Thulinma
parent 310e7bc5f9
commit 741c4755cc
3 changed files with 358 additions and 0 deletions

View file

@ -443,8 +443,17 @@ namespace MP4 {
case 0x73636869: case 0x73636869:
return ((SCHI *)this)->toPrettyString(indent); return ((SCHI *)this)->toPrettyString(indent);
break; break;
case 0x74783367:
INFO_MSG("TX3G box found!");
return ((TX3G *)this)->toPrettyString(indent);
break;
case 0x66746162:
INFO_MSG("FTAB box found!");
return ((FontTableBox *)this)->toPrettyString(indent);
break;
/*LTS-END*/ /*LTS-END*/
default: default:
INFO_MSG("no code found: 0x%0.8x",ntohl(*((int *)(data + 4))));
break; break;
} }
std::stringstream retval; std::stringstream retval;

View file

@ -1532,6 +1532,10 @@ namespace MP4 {
if (type == "audio") { if (type == "audio") {
setHandlerType("soun"); setHandlerType("soun");
} }
if (type == "meta") {
setHandlerType("sbtl");
}
setName(name); setName(name);
} }
@ -1627,6 +1631,10 @@ namespace MP4 {
return r.str(); return r.str();
} }
STHD::STHD() {
memcpy(data + 4, "sthd", 4);
}
HMHD::HMHD() { HMHD::HMHD() {
memcpy(data + 4, "hmhd", 4); memcpy(data + 4, "hmhd", 4);
} }
@ -1676,6 +1684,8 @@ namespace MP4 {
NMHD::NMHD() { NMHD::NMHD() {
memcpy(data + 4, "nmhd", 4); memcpy(data + 4, "nmhd", 4);
setVersion(0);
setFlags(0);
} }
std::string NMHD::toPrettyString(uint32_t indent) { std::string NMHD::toPrettyString(uint32_t indent) {
@ -3160,6 +3170,9 @@ namespace MP4 {
} }
std::string VisualSampleEntry::toPrettyVisualString(uint32_t indent, std::string name) { std::string VisualSampleEntry::toPrettyVisualString(uint32_t indent, std::string name) {
std::stringstream r; std::stringstream r;
r << std::string(indent, ' ') << name << " (" << boxedSize() << ")" << std::endl; r << std::string(indent, ' ') << name << " (" << boxedSize() << ")" << std::endl;
@ -3288,10 +3301,258 @@ namespace MP4 {
return r.str(); return r.str();
} }
TextSampleEntry::TextSampleEntry() {
initialize();
}
std::string TextSampleEntry::toPrettyTextString(uint32_t indent, std::string name) {
std::stringstream r;
r << std::string(indent, ' ') << name << " (" << boxedSize() << ")" << std::endl;
r << std::string(indent + 1, ' ') << "DisplayFlags: " << getDisplayFlags() << std::endl;
r << std::string(indent + 1, ' ') << "Horizontal Justification: " << (int) getHzJustification() << std::endl;
r << std::string(indent + 1, ' ') << "Vertial Justification: " << (int) getVtJustification() << std::endl;
r << std::string(indent + 1, ' ') << "Background color rgba " << std::endl;
r << std::string(indent + 2, ' ') << "[0]: " << (int) getBackGroundColorRGBA(0) << std::endl;
r << std::string(indent + 2, ' ') << "[1]: " << (int) getBackGroundColorRGBA(1) << std::endl;
r << std::string(indent + 2, ' ') << "[2]: " << (int) getBackGroundColorRGBA(2) << std::endl;
r << std::string(indent + 2, ' ') << "[3]: " << (int) getBackGroundColorRGBA(3) << std::endl;
r << std::string(indent + 1, ' ') << "BoxRecord" << std::endl;
r << std::string(indent + 2, ' ') << "Top: " << getBoxRecord().top << std::endl;
r << std::string(indent + 2, ' ') << "Left: " << getBoxRecord().left << std::endl;
r << std::string(indent + 2, ' ') << "Bottom: " << getBoxRecord().bottom << std::endl;
r << std::string(indent + 2, ' ') << "Right: " << getBoxRecord().right << std::endl;
r << std::string(indent + 1, ' ') << "StyleRecord" << std::endl;
r << std::string(indent + 2, ' ') << "StartChar: " << getStyleRecord().startChar << std::endl;
r << std::string(indent + 2, ' ') << "EndChar: " << getStyleRecord().endChar << std::endl;
r << std::string(indent + 2, ' ') << "Font-ID: " << getStyleRecord().font_id << std::endl;
r << std::string(indent + 2, ' ') << "Face-Style-Flags: " << (int) getStyleRecord().face_style_flags << std::endl;
r << std::string(indent + 2, ' ') << "Font-Size: " << (int) getStyleRecord().font_size << std::endl;
r << std::string(indent + 1, ' ') << "Text color rgba:" << std::endl;
r << std::string(indent + 2, ' ') << "[0]: " << (int) getStyleRecord().text_color_rgba[0] << std::endl;
r << std::string(indent + 2, ' ') << "[1]: " << (int) getStyleRecord().text_color_rgba[1] << std::endl;
r << std::string(indent + 2, ' ') << "[2]: " << (int) getStyleRecord().text_color_rgba[2] << std::endl;
r << std::string(indent + 2, ' ') << "[3]: " << (int) getStyleRecord().text_color_rgba[3] << std::endl;
return r.str();
}
TextSampleEntry::TextSampleEntry(DTSC::Track & track) {
initialize();
if (track.codec == "subtitle") {
setCodec("tx3g");
} else {
//not supported codec
INFO_MSG("not supported codec: %s",track.codec.c_str());
}
}
void TextSampleEntry::setCodec(const char * newCodec) {
memcpy(data + 4, newCodec, 4);
}
void TextSampleEntry::setCodecBox(Box & newBox) {
setBox(newBox, 8);
}
void TextSampleEntry::initialize() {
memcpy(data + 4, "erro", 4);
setHzJustification(1);
setVtJustification(-1);
setDisplayFlags(0);
StyleRecord res;
res.startChar = 0;
res.endChar = 0;
res.font_id= 1;
res.face_style_flags = 0;
res.font_size = 18;
res.text_color_rgba[0] = 255;
res.text_color_rgba[1] = 255;
res.text_color_rgba[2] = 255;
res.text_color_rgba[3] = 255;
setStyleRecord(res);
setBackGroundColorRGBA(0, 0);
setBackGroundColorRGBA(1, 0);
setBackGroundColorRGBA(2, 0);
setBackGroundColorRGBA(3, 0);
BoxRecord b;
b.top = 0;
b.left = 0;
b.bottom = 0 ;
b.right = 0;
setBoxRecord(b);
}
FontRecord::FontRecord() {
INFO_MSG("fontrecord constr");
font = NULL;
}
void FontRecord::setFont(const char* f) {
if(font) {
free(font);
}
font_name_length = strlen(f);
font = (char*) malloc (font_name_length);
memcpy(font, f, font_name_length);
font[font_name_length] = 0;
INFO_MSG("font set");
}
void FontTableBox::setFontId(uint16_t id) {
setInt16(id,1111);
}
FontRecord::~FontRecord() {
// if(font) {
// free(font);
// }
}
TX3G::TX3G() {
INFO_MSG("tx3g constructor");
memcpy(data +4, "tx3g", 4);
}
FontTableBox::FontTableBox() {
INFO_MSG("ftab constructor");
memcpy(data + 4, "ftab", 4);
// font_entry[0].font_id = 1;
// font_entry[0].setFont("Serif");
setEntryCount(1);
FontRecord fr;
fr.font_id = 1;
fr.setFont("Serif");
setFontRecord(fr);
}
void FontTableBox::setEntryCount(uint16_t val) {
setInt16(val, 0);
}
void FontTableBox::setFontRecord(FontRecord f) {
setInt16(f.font_id, 2);
setInt8(f.font_name_length, 4);
setString(f.font, f.font_name_length-1, 5);
}
BoxRecord TextSampleEntry::getBoxRecord() {
BoxRecord res;
res.top = getInt16(18);
res.left = getInt16(20);
res.bottom = getInt16(22);
res.right = getInt16(24);
return res;
}
void TextSampleEntry::setFontTableBox(FontTableBox f) {
setBox(f,38);
}
void TextSampleEntry::setBoxRecord(BoxRecord b) {
setInt16(b.top, 18);
setInt16(b.left, 20);
setInt16(b.bottom, 22);
setInt16(b.right, 24);
}
void TextSampleEntry::setStyleRecord(StyleRecord s) {
setInt16(s.startChar, 26);
setInt16(s.endChar, 28);
setInt16(s.font_id, 30);
setInt8(s.face_style_flags, 32);
setInt8(s.font_size, 33);
setInt8(s.text_color_rgba[0], 34);
setInt8(s.text_color_rgba[1], 35);
setInt8(s.text_color_rgba[2], 36);
setInt8(s.text_color_rgba[3], 37);
}
StyleRecord TextSampleEntry::getStyleRecord() {
StyleRecord res;
res.startChar = getInt16(26);
res.endChar = getInt16(28);
res.font_id= getInt16(30);
res.face_style_flags = getInt8(32);
res.font_size = getInt8(33);
res.text_color_rgba[0] = getInt8(34);
res.text_color_rgba[1] = getInt8(35);
res.text_color_rgba[2] = getInt8(36);
res.text_color_rgba[3] = getInt8(37);
return res;
}
uint32_t TextSampleEntry::getDisplayFlags() {
return getInt32(8);
}
void TextSampleEntry::setDisplayFlags(uint32_t flags) {
setInt32(flags, 8);
}
int8_t TextSampleEntry::getHzJustification() {
return getInt8(12);
}
int8_t TextSampleEntry::getVtJustification() {
return getInt8(13);
}
void TextSampleEntry::setHzJustification(int8_t n) {
setInt8(n, 12);
}
void TextSampleEntry::setVtJustification(int8_t n) {
setInt8(n, 13);
}
uint8_t TextSampleEntry::getBackGroundColorRGBA(uint8_t n) {
return getInt8(14 + n);
}
void TextSampleEntry::setBackGroundColorRGBA(uint8_t pos, uint8_t value) {
setInt8(value, 14 + pos);
}
MP4A::MP4A() { MP4A::MP4A() {
memcpy(data + 4, "mp4a", 4); memcpy(data + 4, "mp4a", 4);
} }
std::string TX3G::toPrettyString(uint32_t indent) {
return toPrettyTextString(indent, "[tx3g] MPEG-4 Timed Text");
}
std::string MP4A::toPrettyString(uint32_t indent) { std::string MP4A::toPrettyString(uint32_t indent) {
return toPrettyAudioString(indent, "[mp4a] MPEG-4 Audio"); return toPrettyAudioString(indent, "[mp4a] MPEG-4 Audio");
} }

View file

@ -367,6 +367,12 @@ namespace MP4 {
std::string toPrettyString(uint32_t indent = 0); std::string toPrettyString(uint32_t indent = 0);
}; };
class STHD: public fullBox {
public:
STHD();
std::string toPrettyString(uint32_t indent = 0);
};
class HMHD: public fullBox { class HMHD: public fullBox {
public: public:
HMHD(); HMHD();
@ -699,6 +705,88 @@ namespace MP4 {
std::string toPrettyAudioString(uint32_t indent = 0, std::string name = ""); std::string toPrettyAudioString(uint32_t indent = 0, std::string name = "");
}; };
struct BoxRecord {
int16_t top;
int16_t left;
int16_t bottom;
int16_t right;
};
struct StyleRecord {
uint16_t startChar;
uint16_t endChar;
uint16_t font_id;
uint8_t face_style_flags;
uint8_t font_size;
uint8_t text_color_rgba[4];
};
class FontRecord {
public:
FontRecord();
~FontRecord();
uint16_t font_id;
uint8_t font_name_length;
char* font;
//uint8_t font[font_name_length];
void setFont(const char* f);
};
class FontTableBox: public Box {
public:
FontTableBox();
void setEntryCount(uint16_t);
uint16_t getEntryCount();
void setFontRecord(FontRecord f);
FontRecord font_entry[1];
void setFontId(uint16_t id);
//FontRecord font_entry[entry_count];
};
class TextSampleEntry: public SampleEntry {
public:
TextSampleEntry();
TextSampleEntry(DTSC::Track & track);
void initialize();
void setHzJustification(int8_t n);
void setVtJustification(int8_t n);
uint32_t getDisplayFlags();
void setDisplayFlags(uint32_t flags);
int8_t getHzJustification();
int8_t getVtJustification();
uint8_t getBackGroundColorRGBA(uint8_t n = 0);
void setBackGroundColorRGBA(uint8_t pos, uint8_t value);
void setCodec(const char * newCodec);
void setCodecBox(Box & newBox);
Box & getCodecBox();
BoxRecord getBoxRecord();
void setBoxRecord(BoxRecord b);
StyleRecord getStyleRecord();
void setStyleRecord(StyleRecord s);
FontTableBox getFontTableBox();
void setFontTableBox(FontTableBox f);
std::string toPrettyTextString(uint32_t indent = 0, std::string name = "");
};
class TX3G: public TextSampleEntry {
public:
TX3G();
std::string toPrettyString(uint32_t indent = 0);
};
class MP4A: public AudioSampleEntry { class MP4A: public AudioSampleEntry {
public: public:
MP4A(); MP4A();