M4Err tx3g_Read(Atom *s, BitStream *bs, u64 *read) { M4Err e; u64 sr; Atom *a; TextSampleEntryAtom *ptr = (TextSampleEntryAtom*)s; BS_ReadData(bs, (unsigned char*)ptr->reserved, 6); ptr->dataReferenceIndex = BS_ReadInt(bs, 16); ptr->displayFlags = BS_ReadInt(bs, 32); ptr->horizontal_justification = BS_ReadInt(bs, 8); ptr->vertical_justification = BS_ReadInt(bs, 8); ptr->back_color = gpp_read_rgba(bs); gpp_read_box(bs, &ptr->default_box); gpp_read_style(bs, &ptr->default_style); *read += 18 + GPP_BOX_SIZE + GPP_STYLE_SIZE; while (*read < ptr->size) { e = ParseAtom(&a, bs, &sr); if (e) return e; *read += a->size; if (a->type==FontTableAtomType) { if (ptr->font_table) DelAtom((Atom *) ptr->font_table); ptr->font_table = (FontTableAtom *)a; } else { DelAtom(a); } } if (*read != ptr->size) return M4ReadAtomFailed; return M4OK; }
GF_Err tx3g_Read(GF_Box *s, GF_BitStream *bs) { GF_Err e; GF_Box *a; GF_Tx3gSampleEntryBox *ptr = (GF_Tx3gSampleEntryBox*)s; if (ptr->size < 18 + GPP_BOX_SIZE + GPP_STYLE_SIZE) return GF_ISOM_INVALID_FILE; gf_bs_read_data(bs, ptr->reserved, 6); ptr->dataReferenceIndex = gf_bs_read_u16(bs); ptr->displayFlags = gf_bs_read_u32(bs); ptr->horizontal_justification = gf_bs_read_u8(bs); ptr->vertical_justification = gf_bs_read_u8(bs); ptr->back_color = gpp_read_rgba(bs); gpp_read_box(bs, &ptr->default_box); gpp_read_style(bs, &ptr->default_style); ptr->size -= 18 + GPP_BOX_SIZE + GPP_STYLE_SIZE; while (ptr->size) { e = gf_isom_parse_box(&a, bs); if (e) return e; if (ptr->size<a->size) return GF_ISOM_INVALID_FILE; ptr->size -= a->size; if (a->type==GF_ISOM_BOX_TYPE_FTAB) { if (ptr->font_table) gf_isom_box_del((GF_Box *) ptr->font_table); ptr->font_table = (GF_FontTableBox *)a; } else { gf_isom_box_del(a); } } return GF_OK; }
static void gpp_read_style(BitStream *bs, StyleRecord *rec) { rec->startChar = BS_ReadInt(bs, 16); rec->endChar = BS_ReadInt(bs, 16); rec->fontID = BS_ReadInt(bs, 16); rec->style_flags = BS_ReadInt(bs, 8); rec->font_size = BS_ReadInt(bs, 8); rec->text_color = gpp_read_rgba(bs); }
static void gpp_read_style(GF_BitStream *bs, GF_StyleRecord *rec) { rec->startCharOffset = gf_bs_read_u16(bs); rec->endCharOffset = gf_bs_read_u16(bs); rec->fontID = gf_bs_read_u16(bs); rec->style_flags = gf_bs_read_u8(bs); rec->font_size = gf_bs_read_u8(bs); rec->text_color = gpp_read_rgba(bs); }
GF_Err tx3g_Read(GF_Box *s, GF_BitStream *bs) { GF_Err e; GF_Box *a; GF_Tx3gSampleEntryBox *ptr = (GF_Tx3gSampleEntryBox*)s; if (ptr->size < 18 + GPP_BOX_SIZE + GPP_STYLE_SIZE) return GF_ISOM_INVALID_FILE; gf_bs_read_data(bs, ptr->reserved, 6); ptr->dataReferenceIndex = gf_bs_read_u16(bs); ptr->displayFlags = gf_bs_read_u32(bs); ptr->horizontal_justification = gf_bs_read_u8(bs); ptr->vertical_justification = gf_bs_read_u8(bs); ptr->back_color = gpp_read_rgba(bs); gpp_read_box(bs, &ptr->default_box); gpp_read_style(bs, &ptr->default_style); ptr->size -= 18 + GPP_BOX_SIZE + GPP_STYLE_SIZE; while (ptr->size) { if (ptr->size < 8) { /* Sometimes there are void atoms at the end of an atom and they are not parsed correctecly */ /* So just skip them if we have less than 8 bytes to parse */ /* "The actual size of an atom cannot be less than 8 bytes" from QTFF specs */ ptr->size = 0; return GF_OK; } e = gf_isom_parse_box(&a, bs); if (e) return e; if (ptr->size<a->size) return GF_ISOM_INVALID_FILE; ptr->size -= a->size; if (a->type==GF_ISOM_BOX_TYPE_FTAB) { if (ptr->font_table) gf_isom_box_del((GF_Box *) ptr->font_table); ptr->font_table = (GF_FontTableBox *)a; } else { gf_isom_box_del(a); } } return GF_OK; }
GF_Err tx3g_Read(GF_Box *s, GF_BitStream *bs) { GF_Err e; GF_Box *a; GF_Tx3gSampleEntryBox *ptr = (GF_Tx3gSampleEntryBox*)s; if (ptr->size < 18 + GPP_BOX_SIZE + GPP_STYLE_SIZE) return GF_ISOM_INVALID_FILE; gf_bs_read_data(bs, ptr->reserved, 6); ptr->dataReferenceIndex = gf_bs_read_u16(bs); ptr->displayFlags = gf_bs_read_u32(bs); ptr->horizontal_justification = gf_bs_read_u8(bs); ptr->vertical_justification = gf_bs_read_u8(bs); ptr->back_color = gpp_read_rgba(bs); gpp_read_box(bs, &ptr->default_box); gpp_read_style(bs, &ptr->default_style); ptr->size -= 18 + GPP_BOX_SIZE + GPP_STYLE_SIZE; while (ptr->size >= 8) { e = gf_isom_parse_box(&a, bs); if (e) return e; if (ptr->size<a->size) { GF_LOG(GF_LOG_WARNING, GF_LOG_CONTAINER, ("[iso file] Box \"%s\" larger than remaining bytes in tx3g - ignoring box\n", gf_4cc_to_str(a->type))); ptr->size = 0; gf_isom_box_del(a); return GF_OK; } ptr->size -= a->size; if (a->type == GF_ISOM_BOX_TYPE_FTAB) { if (ptr->font_table) gf_isom_box_del((GF_Box *)ptr->font_table); ptr->font_table = (GF_FontTableBox *)a; } else { e = gf_isom_box_add_default(s, a); if (e) return e; } } return GF_OK; }