On Mon, Jul 06, 2015 at 10:27:47PM +0530, Niklesh Lalwani wrote: > From: Niklesh <niklesh.lalw...@iitb.ac.in> > > Signed-off-by: Niklesh <niklesh.lalw...@iitb.ac.in> > --- > libavcodec/movtextdec.c | 254 > +++++++++++++++++++++++++++++++++--------------- > 1 file changed, 173 insertions(+), 81 deletions(-) > > diff --git a/libavcodec/movtextdec.c b/libavcodec/movtextdec.c > index a3afd91..7e9e4f5 100644 > --- a/libavcodec/movtextdec.c > +++ b/libavcodec/movtextdec.c > @@ -31,37 +31,166 @@ > #define STYLE_FLAG_ITALIC (1<<1) > #define STYLE_FLAG_UNDERLINE (1<<2) > > +#define STYL_BOX (1<<0) > +#define HLIT_BOX (1<<1) > +#define HCLR_BOX (1<<2) > + > typedef struct { > uint16_t style_start; > uint16_t style_end; > uint8_t style_flag; > } StyleBox; > > +typedef struct { > + uint16_t hlit_start; > + uint16_t hlit_end; > +} HighlightBox; > + > +typedef struct { > + uint8_t hlit_color[4]; > +} HilightcolorBox; > + > +typedef struct { > + StyleBox **s; > + StyleBox *s_temp; > + HighlightBox h; > + HilightcolorBox c; > + uint8_t box_flags; > + uint16_t style_entries; > + uint64_t tracksize; > + int size_var; > + int count_s; > +} MovTextContext; > +
> +struct Box > +{ style > + uint32_t type; > + size_t base_size; > + int (*decode)(const uint8_t *tsmb, MovTextContext *m, AVPacket *avpkt); > +}; > + > +static void mov_text_cleanup(MovTextContext *m) > +{ > + int i; > + if (m->box_flags & STYL_BOX) { > + for(i = 0; i < m->count_s; i++) { > + av_freep(&m->s[i]); > + } > + av_freep(&m->s); > + } > +} > + > +static int decode_hlit(const uint8_t *tsmb, MovTextContext *m, AVPacket > *avpkt) > +{ > + m->box_flags |= HLIT_BOX; > + m->h.hlit_start = AV_RB16(tsmb); > + tsmb += 2; > + m->h.hlit_end = AV_RB16(tsmb); > + tsmb += 2; > + return 0; > +} > + > +static int decode_hclr(const uint8_t *tsmb, MovTextContext *m, AVPacket > *avpkt) > +{ > + m->box_flags |= HCLR_BOX; > + m->c.hlit_color[0] = *tsmb++; > + m->c.hlit_color[1] = *tsmb++; > + m->c.hlit_color[2] = *tsmb++; > + m->c.hlit_color[3] = *tsmb++; you can use memcpy here it seems > + return 0; > +} > + > +static int decode_styl(const uint8_t *tsmb, MovTextContext *m, AVPacket > *avpkt) > +{ > + int i; > + m->style_entries = AV_RB16(tsmb); > + tsmb += 2; > + // A single style record is of length 12 bytes. > + if (m->tracksize + m->size_var + 2 + m->style_entries * 12 > avpkt->size) > + return -1; > + > + m->box_flags |= STYL_BOX; > + for(i = 0; i < m->style_entries; i++) { > + m->s_temp = av_malloc(sizeof(StyleBox)); sizeof(*m->s_temp) > + if (!m->s_temp) { > + mov_text_cleanup(m); > + return AVERROR(ENOMEM); > + } > + m->s_temp->style_start = AV_RB16(tsmb); > + tsmb += 2; > + m->s_temp->style_end = AV_RB16(tsmb); > + tsmb += 2; > + // fontID = AV_RB16(tsmb); > + tsmb += 2; > + m->s_temp->style_flag = AV_RB8(tsmb); > + av_dynarray_add(&m->s, &m->count_s, m->s_temp); > + if(!m->s) { > + mov_text_cleanup(m); > + return AVERROR(ENOMEM); > + } > + // fontsize = AV_RB8(tsmb); > + tsmb += 2; > + // text-color-rgba > + tsmb += 4; > + } > + return 0; > +} > + > +struct Box box_types[] = { static const > + { MKBETAG('s','t','y','l'), 2, decode_styl }, > + { MKBETAG('h','l','i','t'), 4, decode_hlit }, > + { MKBETAG('h','c','l','r'), 4, decode_hclr } > +}; > + > +const static size_t box_count = sizeof(box_types) / sizeof(struct Box); use FF_ARRAY_ELEMS() in the only place it's used instead > + > static int text_to_ass(AVBPrint *buf, const char *text, const char *text_end, > - StyleBox **s, int style_entries) > + MovTextContext *m) nit: vertical align > { > int i = 0; > int text_pos = 0; > while (text < text_end) { > - for (i = 0; i < style_entries; i++) { > - if (s[i]->style_flag && text_pos == s[i]->style_end) { > - if (s[i]->style_flag & STYLE_FLAG_BOLD) > - av_bprintf(buf, "{\\b0}"); > - if (s[i]->style_flag & STYLE_FLAG_ITALIC) > - av_bprintf(buf, "{\\i0}"); > - if (s[i]->style_flag & STYLE_FLAG_UNDERLINE) > - av_bprintf(buf, "{\\u0}"); > + if (m->box_flags & STYL_BOX) { > + for (i = 0; i < m->style_entries; i++) { > + if (m->s[i]->style_flag && text_pos == m->s[i]->style_end) { > + if (m->s[i]->style_flag & STYLE_FLAG_BOLD) > + av_bprintf(buf, "{\\b0}"); > + if (m->s[i]->style_flag & STYLE_FLAG_ITALIC) > + av_bprintf(buf, "{\\i0}"); > + if (m->s[i]->style_flag & STYLE_FLAG_UNDERLINE) > + av_bprintf(buf, "{\\u0}"); > + } > + } keep this block not re-idented (and eventually add a /* TODO: reindent */ above) to keep the diff small and ease review. You can re-indent in a later commit. ditto below if applicable. > + for (i = 0; i < m->style_entries; i++) { > + if (m->s[i]->style_flag && text_pos == m->s[i]->style_start) > { > + if (m->s[i]->style_flag & STYLE_FLAG_BOLD) > + av_bprintf(buf, "{\\b1}"); > + if (m->s[i]->style_flag & STYLE_FLAG_ITALIC) > + av_bprintf(buf, "{\\i1}"); > + if (m->s[i]->style_flag & STYLE_FLAG_UNDERLINE) > + av_bprintf(buf, "{\\u1}"); > + } > } > } > - > - for (i = 0; i < style_entries; i++) { > - if (s[i]->style_flag && text_pos == s[i]->style_start) { > - if (s[i]->style_flag & STYLE_FLAG_BOLD) > - av_bprintf(buf, "{\\b1}"); > - if (s[i]->style_flag & STYLE_FLAG_ITALIC) > - av_bprintf(buf, "{\\i1}"); > - if (s[i]->style_flag & STYLE_FLAG_UNDERLINE) > - av_bprintf(buf, "{\\u1}"); > + if (m->box_flags & HLIT_BOX) { > + if (text_pos == m->h.hlit_start) { > + /* If hclr box is present, set the secondary color to the > color specified. > + * Otherwise, set primary color to white and secondary color > to black. > + * These colors will come from TextSampleModifier boxes in > future > + * and inverse video technique for highlight will be > implemented. > + */ > + if (m->box_flags & HCLR_BOX) { > + av_bprintf(buf, "{\\2c&H%02x%02x%02x&}", > m->c.hlit_color[2], m->c.hlit_color[1], m->c.hlit_color[0]); > + } else { > + av_bprintf(buf, "{\\1c&H000000&}{\\2c&HFFFFFF}"); wrong indent > + } > + } > + if (text_pos == m->h.hlit_end) { > + if (m->box_flags & HCLR_BOX) { > + av_bprintf(buf, "{\\2c&H000000}"); > + } else { > + av_bprintf(buf, "{\\1c&HFFFFFF&}{\\2c&H000000}"); > + } > } > } > > @@ -78,7 +207,6 @@ static int text_to_ass(AVBPrint *buf, const char *text, > const char *text_end, > text++; > text_pos++; > } > - nit: unrelated changee > return 0; > } > [...] -- Clément B.
pgpUPoP4EfH9G.pgp
Description: PGP signature
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel