[FFmpeg-devel] [PATCH 2/2] movtextenc.c: Support for Bold, Italic and Underlined styles
Niklesh Lalwani
niklesh.lalwani at iitb.ac.in
Thu Jun 18 14:48:43 CEST 2015
Thanks Clement, I'll make the necessary changes.
I guess there shouldn't be any alignment problem here. I have tried to take
care of that.
The AVBPrint buffer is initialized with max size inside
mov_text_encode_init(). So, the length shouldn't be a problem.
Niklesh
On 18-Jun-2015 2:35 PM, "Clément Bœsch" <u at pkh.me> wrote:
> On Wed, Jun 17, 2015 at 08:43:26PM +0530, Niklesh Lalwani wrote:
> > From: Niklesh <niklesh.lalwani at iitb.ac.in>
> >
> > Support for Bold, Italic and Underlined styles. The style information is
> appended into the buffer after the text. Dynarray is used to account for
> multiple style records. Tested on QuickTime OSX and iPhone.
> > Signed-off-by: Niklesh <niklesh.lalwani at iitb.ac.in>
> > ---
> > libavcodec/movtextenc.c | 165
> ++++++++++++++++++++++++++++++++++++++++++------
> > 1 file changed, 145 insertions(+), 20 deletions(-)
> >
> > diff --git a/libavcodec/movtextenc.c b/libavcodec/movtextenc.c
> > index 1b8f454..56c599d 100644
> > --- a/libavcodec/movtextenc.c
> > +++ b/libavcodec/movtextenc.c
> > @@ -24,14 +24,38 @@
> > #include "libavutil/avassert.h"
> > #include "libavutil/avstring.h"
> > #include "libavutil/intreadwrite.h"
> > +#include "libavutil/mem.h"
> > +#include "libavutil/common.h"
> > #include "ass_split.h"
> > #include "ass.h"
> >
>
> > +#define STYLE_FLAG_BOLD 1
> > +#define STYLE_FLAG_ITALIC 2
> > +#define STYLE_FLAG_UNDERLINE 4
>
> #define STYLE_FLAG_BOLD (1<<0)
> #define STYLE_FLAG_ITALIC (1<<1)
> #define STYLE_FLAG_UNDERLINE (1<<2)
>
> it's more obvious they are combinable flags that way, and you can see when
> you reach a 8, 16, 32 or whatever boundary.
>
> > +#define STYLE_RECORD_SIZE 12
> > +#define SIZE_ADD 10
> > +
> > +
> > +typedef struct {
> > + uint16_t style_start;
> > + uint16_t style_end;
> > + uint8_t style_flag;
> > +} StyleBox;
> > +
> > typedef struct {
> > ASSSplitContext *ass_ctx;
> > - char buffer[2048];
> > - char *ptr;
> > - char *end;
> > + AVBPrint buffer;
> > + StyleBox **style_attributes;
> > + StyleBox *style_attributes_temp;
> > + int count;
> > + uint8_t style_box_flag;
> > + uint32_t tsmb_size;
> > + uint32_t tsmb_type;
> > + uint16_t style_entries;
> > + uint16_t style_fontID;
> > + uint8_t style_fontsize;
> > + uint32_t style_color;
> > + uint16_t text_pos;
> > } MovTextContext;
> >
> >
> > @@ -79,32 +103,98 @@ static av_cold int
> mov_text_encode_init(AVCodecContext *avctx)
> > if (!avctx->extradata)
> > return AVERROR(ENOMEM);
> >
> > + av_bprint_init(&s->buffer, 0, AV_BPRINT_SIZE_UNLIMITED);
> > +
> > memcpy(avctx->extradata, text_sample_entry, avctx->extradata_size);
> >
> > s->ass_ctx = ff_ass_split(avctx->subtitle_header);
> > return s->ass_ctx ? 0 : AVERROR_INVALIDDATA;
> > }
> >
> > +static void mov_text_style_cb(void *priv, const char style, int close)
> > +{
> > + MovTextContext *s = priv;
> > + if (!close) {
> > + if (s->style_box_flag == 0) { //first style entry
> > +
> > + s->style_attributes_temp = av_malloc(sizeof(StyleBox));
>
> sizeof(*s->style_attributes_temp)
>
> > + if (!s->style_attributes_temp)
> > + return AVERROR(ENOMEM);
> > +
> > + s->style_attributes_temp->style_flag = 0;
>
> > + s->style_attributes_temp->style_start =
> AV_RB16(&s->text_pos);
>
> there is no risk of alignement constraints that wouldn't be honored here,
> right?
>
> [...]
> > - if (s->ptr == s->buffer)
> > - return 0;
> > -
>
> > - AV_WB16(buf, strlen(s->buffer));
> > + AV_WB16(buf, s->text_pos);
>
> Any risk of having a len too large? Maybe you should initialize the
> AVBuffer with a max limit size.
>
> [...]
>
> No other comment from me.
>
> --
> Clément B.
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
>
More information about the ffmpeg-devel
mailing list