[FFmpeg-devel] [PATCH] Improve upon dynamic arrays- movtext subtitles

Philip Langdale philipl at overt.org
Mon May 25 18:24:47 CEST 2015


On Mon, 25 May 2015 21:51:36 +0530
Niklesh Lalwani <niklesh.lalwani at iitb.ac.in> wrote:

> Updated Patch.
> 
> Thanks,
> 
> Niklesh

use "return AVERROR(ENOMEM);"

> On Mon, May 25, 2015 at 9:10 PM, Philip Langdale <philipl at overt.org>
> wrote:
> 
> > On Mon, 25 May 2015 00:37:03 +0530
> > Niklesh Lalwani <niklesh.lalwani at iitb.ac.in> wrote:
> >
> > > From: Niklesh <niklesh.lalwani at iitb.ac.in>
> > >
> > > Signed-off-by: Niklesh <niklesh.lalwani at iitb.ac.in>
> > > ---
> > >  libavcodec/movtextdec.c | 32 ++++++++++++++++----------------
> > >  1 file changed, 16 insertions(+), 16 deletions(-)
> > >
> > > diff --git a/libavcodec/movtextdec.c b/libavcodec/movtextdec.c
> > > index 04e1c8a..11934f9 100644
> > > --- a/libavcodec/movtextdec.c
> > > +++ b/libavcodec/movtextdec.c
> > > @@ -32,14 +32,13 @@
> > >  #define STYLE_FLAG_UNDERLINE    4
> > >
> > >  static int text_to_ass(AVBPrint *buf, const char *text, const
> > > char *text_end,
> > > -                        int **style_start, int **style_end,
> > > -                        int **style_flags, int style_entries)
> > > +                        char **style_start, char **style_end,
> > > +                        uint8_t **style_flags, int style_entries)
> > >  {
> > >      int i = 0;
> > > -    int style_pos = 0;
> > >      while (text < text_end) {
> > >          for (i = 0; i < style_entries; i++) {
> > > -            if (*style_flags[i] && style_pos == *style_start[i])
> > > {
> > > +            if (*style_flags[i] && text == style_start[i]) {
> > >                  if (*style_flags[i] & STYLE_FLAG_BOLD)
> > >                      av_bprintf(buf, "{\\b1}");
> > >                  if (*style_flags[i] & STYLE_FLAG_ITALIC)
> > > @@ -61,7 +60,7 @@ static int text_to_ass(AVBPrint *buf, const char
> > > *text, const char *text_end, }
> > >
> > >          for (i = 0; i < style_entries; i++) {
> > > -            if (*style_flags[i] && style_pos == *style_end[i]) {
> > > +            if (*style_flags[i] && text == style_end[i]) {
> > >                  if (*style_flags[i] & STYLE_FLAG_BOLD)
> > >                      av_bprintf(buf, "{\\b0}");
> > >                  if (*style_flags[i] & STYLE_FLAG_ITALIC)
> > > @@ -71,7 +70,6 @@ static int text_to_ass(AVBPrint *buf, const char
> > > *text, const char *text_end, }
> > >          }
> > >          text++;
> > > -        style_pos++;
> > >      }
> > >
> > >      return 0;
> > > @@ -98,13 +96,13 @@ static int
> > > mov_text_decode_frame(AVCodecContext *avctx, //char *ptr_temp;
> > >      int text_length, tsmb_type, style_entries;
> > >      uint64_t tsmb_size, tracksize;
> > > -    int **style_start = {0,};
> > > -    int **style_end = {0,};
> > > -    int **style_flags = {0,};
> > > +    char **style_start = { 0, };
> > > +    char **style_end = { 0, };
> > > +    uint8_t **style_flags = { 0, };
> > >      const uint8_t *tsmb;
> > >      int index, i, size_var;
> > > -    int *flag;
> > > -    int *style_pos;
> > > +    uint8_t *flag;
> > > +    char *style_pos;
> > >
> > >      if (!ptr || avpkt->size < 2)
> > >          return AVERROR_INVALIDDATA;
> > > @@ -172,19 +170,17 @@ static int
> > > mov_text_decode_frame(AVCodecContext *avctx, break;
> > >
> > >                  for(i = 0; i < style_entries; i++) {
> > > -                    style_pos = av_malloc(4);
> > > -                    *style_pos = AV_RB16(tsmb);
> > > +                    style_pos = ptr + AV_RB16(tsmb);
> > >                      index = i;
> > >                      av_dynarray_add(&style_start, &index,
> > > style_pos); tsmb += 2;
> > > -                    style_pos = av_malloc(4);
> > > -                    *style_pos = AV_RB16(tsmb);
> > > +                    style_pos = ptr + AV_RB16(tsmb);
> > >                      index = i;
> > >                      av_dynarray_add(&style_end, &index,
> > > style_pos); tsmb += 2;
> > >                      // fontID = AV_RB16(tsmb);
> > >                      tsmb += 2;
> > > -                    flag = av_malloc(4);
> > > +                    flag = av_malloc(1);
> >
> > You need to check for malloc failure and return an error.
> >
> > >                      *flag = AV_RB8(tsmb);
> > >                      index = i;
> > >                      av_dynarray_add(&style_flags, &index, flag);
> > > @@ -194,6 +190,10 @@ static int
> > > mov_text_decode_frame(AVCodecContext *avctx, tsmb += 4;
> > >                  }
> > >                  text_to_ass(&buf, ptr, end, style_start,
> > > style_end, style_flags, style_entries); +
> > > +                for(i = 0; i < style_entries; i++) {
> > > +                    av_freep(&style_flags[i]);
> > > +                }
> > >                  av_freep(&style_start);
> > >                  av_freep(&style_end);
> > >                  av_freep(&style_flags);
> >
> >
> >
> >
> > --phil
> > _______________________________________________
> > ffmpeg-devel mailing list
> > ffmpeg-devel at ffmpeg.org
> > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 

--phil


More information about the ffmpeg-devel mailing list