diff mbox series

[FFmpeg-devel,1/2] avcodec/movtextenc: fix writing to bytestream on BE arches

Message ID 20201014214908.279899-1-andriy.gelman@gmail.com
State Accepted
Commit d4c46dc32856bd9c7c7ab29ee727676c7855fa1c
Headers show
Series [FFmpeg-devel,1/2] avcodec/movtextenc: fix writing to bytestream on BE arches | expand

Checks

Context Check Description
andriy/x86_make success Make finished
andriy/x86_make_fate success Make fate finished

Commit Message

Andriy Gelman Oct. 14, 2020, 9:49 p.m. UTC
From: Andriy Gelman <andriy.gelman@gmail.com>

Fixes fate-binsub-movtextenc on PPC64

Currently tags are written in reverse order on BE arches. This is fixed
by using MKBETAG() and AV_RB32() to be arch agnostics.

Also s->font_count is of type int. On BE arches with 32bit int,
count = AV_RB16(&s->font_count) will read two most significant bytes
instead of the least signifcant bytes. This is fixed by assiging
s->font_count to count first.

The final change is modyfying the type of len. On BE arches
the most signifanct byte of the int was written instead of the least
significant byte.

Signed-off-by: Andriy Gelman <andriy.gelman@gmail.com>
---
 libavcodec/movtextenc.c | 17 +++++++++++------
 1 file changed, 11 insertions(+), 6 deletions(-)

Comments

Andreas Rheinhardt Oct. 15, 2020, 2:06 p.m. UTC | #1
Andriy Gelman:
> From: Andriy Gelman <andriy.gelman@gmail.com>
> 
> Fixes fate-binsub-movtextenc on PPC64
> 
> Currently tags are written in reverse order on BE arches. This is fixed
> by using MKBETAG() and AV_RB32() to be arch agnostics.
> 
> Also s->font_count is of type int. On BE arches with 32bit int,
> count = AV_RB16(&s->font_count) will read two most significant bytes
> instead of the least signifcant bytes. This is fixed by assiging
> s->font_count to count first.
> 
> The final change is modyfying the type of len. On BE arches
> the most signifanct byte of the int was written instead of the least
> significant byte.
> 
> Signed-off-by: Andriy Gelman <andriy.gelman@gmail.com>
> ---
>  libavcodec/movtextenc.c | 17 +++++++++++------
>  1 file changed, 11 insertions(+), 6 deletions(-)
> 
> diff --git a/libavcodec/movtextenc.c b/libavcodec/movtextenc.c
> index b2368b641b..f38cd9cba2 100644
> --- a/libavcodec/movtextenc.c
> +++ b/libavcodec/movtextenc.c
> @@ -116,6 +116,7 @@ static void encode_styl(MovTextContext *s, uint32_t tsmb_type)
>      if ((s->box_flags & STYL_BOX) && s->count) {
>          tsmb_size = s->count * STYLE_RECORD_SIZE + SIZE_ADD;
>          tsmb_size = AV_RB32(&tsmb_size);
> +        tsmb_type = AV_RB32(&tsmb_type);
>          style_entries = AV_RB16(&s->count);
>          /*The above three attributes are hard coded for now
>          but will come from ASS style in the future*/
> @@ -149,6 +150,7 @@ static void encode_hlit(MovTextContext *s, uint32_t tsmb_type)
>      if (s->box_flags & HLIT_BOX) {
>          tsmb_size = 12;
>          tsmb_size = AV_RB32(&tsmb_size);
> +        tsmb_type = AV_RB32(&tsmb_type);
>          start     = AV_RB16(&s->hlit.start);
>          end       = AV_RB16(&s->hlit.end);
>          av_bprint_append_any(&s->buffer, &tsmb_size, 4);
> @@ -164,6 +166,7 @@ static void encode_hclr(MovTextContext *s, uint32_t tsmb_type)
>      if (s->box_flags & HCLR_BOX) {
>          tsmb_size = 12;
>          tsmb_size = AV_RB32(&tsmb_size);
> +        tsmb_type = AV_RB32(&tsmb_type);
>          color     = AV_RB32(&s->hclr.color);
>          av_bprint_append_any(&s->buffer, &tsmb_size, 4);
>          av_bprint_append_any(&s->buffer, &tsmb_type, 4);
> @@ -172,9 +175,9 @@ static void encode_hclr(MovTextContext *s, uint32_t tsmb_type)
>  }
>  
>  static const Box box_types[] = {
> -    { MKTAG('s','t','y','l'), encode_styl },
> -    { MKTAG('h','l','i','t'), encode_hlit },
> -    { MKTAG('h','c','l','r'), encode_hclr },
> +    { MKBETAG('s','t','y','l'), encode_styl },
> +    { MKBETAG('h','l','i','t'), encode_hlit },
> +    { MKBETAG('h','c','l','r'), encode_hclr },
>  };
>  
>  const static size_t box_count = FF_ARRAY_ELEMS(box_types);
> @@ -316,14 +319,16 @@ static int encode_sample_description(AVCodecContext *avctx)
>      //     FontTableBox {
>      tsmb_size = SIZE_ADD + 3 * s->font_count + font_names_total_len;
>      tsmb_size = AV_RB32(&tsmb_size);
> -    tsmb_type = MKTAG('f','t','a','b');
> -    count = AV_RB16(&s->font_count);
> +    tsmb_type = MKBETAG('f','t','a','b');
> +    tsmb_type = AV_RB32(&tsmb_type);
> +    count = s->font_count;
> +    count = AV_RB16(&count);
>      av_bprint_append_any(&s->buffer, &tsmb_size, 4);
>      av_bprint_append_any(&s->buffer, &tsmb_type, 4);
>      av_bprint_append_any(&s->buffer, &count, 2);
>      //     FontRecord {
>      for (i = 0; i < s->font_count; i++) {
> -        int len;
> +        uint8_t len;
>          fontID = i + 1;
>          fontID = AV_RB16(&fontID);
>          av_bprint_append_any(&s->buffer, &fontID, 2);
> 
I have sent an alternative version that avoids this horrible way of
writing output independent of endianness by instead using small buffers
and writing the values into it via AV_WBx(). This also allows to combine
several av_bprint_append_any() calls into one. Said patch is patch #2 of
this patchset:
https://ffmpeg.org/pipermail/ffmpeg-devel/2020-October/271057.html (The
second email has not yet come through due to the mailing list's random
delay.)

- Andreas
Andriy Gelman Oct. 15, 2020, 3:25 p.m. UTC | #2
On Thu, 15. Oct 16:06, Andreas Rheinhardt wrote:
> Andriy Gelman:
> > From: Andriy Gelman <andriy.gelman@gmail.com>
> > 
> > Fixes fate-binsub-movtextenc on PPC64
> > 
> > Currently tags are written in reverse order on BE arches. This is fixed
> > by using MKBETAG() and AV_RB32() to be arch agnostics.
> > 
> > Also s->font_count is of type int. On BE arches with 32bit int,
> > count = AV_RB16(&s->font_count) will read two most significant bytes
> > instead of the least signifcant bytes. This is fixed by assiging
> > s->font_count to count first.
> > 
> > The final change is modyfying the type of len. On BE arches
> > the most signifanct byte of the int was written instead of the least
> > significant byte.
> > 
> > Signed-off-by: Andriy Gelman <andriy.gelman@gmail.com>
> > ---
> >  libavcodec/movtextenc.c | 17 +++++++++++------
> >  1 file changed, 11 insertions(+), 6 deletions(-)
> > 
> > diff --git a/libavcodec/movtextenc.c b/libavcodec/movtextenc.c
> > index b2368b641b..f38cd9cba2 100644
> > --- a/libavcodec/movtextenc.c
> > +++ b/libavcodec/movtextenc.c
> > @@ -116,6 +116,7 @@ static void encode_styl(MovTextContext *s, uint32_t tsmb_type)
> >      if ((s->box_flags & STYL_BOX) && s->count) {
> >          tsmb_size = s->count * STYLE_RECORD_SIZE + SIZE_ADD;
> >          tsmb_size = AV_RB32(&tsmb_size);
> > +        tsmb_type = AV_RB32(&tsmb_type);
> >          style_entries = AV_RB16(&s->count);
> >          /*The above three attributes are hard coded for now
> >          but will come from ASS style in the future*/
> > @@ -149,6 +150,7 @@ static void encode_hlit(MovTextContext *s, uint32_t tsmb_type)
> >      if (s->box_flags & HLIT_BOX) {
> >          tsmb_size = 12;
> >          tsmb_size = AV_RB32(&tsmb_size);
> > +        tsmb_type = AV_RB32(&tsmb_type);
> >          start     = AV_RB16(&s->hlit.start);
> >          end       = AV_RB16(&s->hlit.end);
> >          av_bprint_append_any(&s->buffer, &tsmb_size, 4);
> > @@ -164,6 +166,7 @@ static void encode_hclr(MovTextContext *s, uint32_t tsmb_type)
> >      if (s->box_flags & HCLR_BOX) {
> >          tsmb_size = 12;
> >          tsmb_size = AV_RB32(&tsmb_size);
> > +        tsmb_type = AV_RB32(&tsmb_type);
> >          color     = AV_RB32(&s->hclr.color);
> >          av_bprint_append_any(&s->buffer, &tsmb_size, 4);
> >          av_bprint_append_any(&s->buffer, &tsmb_type, 4);
> > @@ -172,9 +175,9 @@ static void encode_hclr(MovTextContext *s, uint32_t tsmb_type)
> >  }
> >  
> >  static const Box box_types[] = {
> > -    { MKTAG('s','t','y','l'), encode_styl },
> > -    { MKTAG('h','l','i','t'), encode_hlit },
> > -    { MKTAG('h','c','l','r'), encode_hclr },
> > +    { MKBETAG('s','t','y','l'), encode_styl },
> > +    { MKBETAG('h','l','i','t'), encode_hlit },
> > +    { MKBETAG('h','c','l','r'), encode_hclr },
> >  };
> >  
> >  const static size_t box_count = FF_ARRAY_ELEMS(box_types);
> > @@ -316,14 +319,16 @@ static int encode_sample_description(AVCodecContext *avctx)
> >      //     FontTableBox {
> >      tsmb_size = SIZE_ADD + 3 * s->font_count + font_names_total_len;
> >      tsmb_size = AV_RB32(&tsmb_size);
> > -    tsmb_type = MKTAG('f','t','a','b');
> > -    count = AV_RB16(&s->font_count);
> > +    tsmb_type = MKBETAG('f','t','a','b');
> > +    tsmb_type = AV_RB32(&tsmb_type);
> > +    count = s->font_count;
> > +    count = AV_RB16(&count);
> >      av_bprint_append_any(&s->buffer, &tsmb_size, 4);
> >      av_bprint_append_any(&s->buffer, &tsmb_type, 4);
> >      av_bprint_append_any(&s->buffer, &count, 2);
> >      //     FontRecord {
> >      for (i = 0; i < s->font_count; i++) {
> > -        int len;
> > +        uint8_t len;
> >          fontID = i + 1;
> >          fontID = AV_RB16(&fontID);
> >          av_bprint_append_any(&s->buffer, &fontID, 2);
> > 

> I have sent an alternative version that avoids this horrible way of
> writing output independent of endianness by instead using small buffers
> and writing the values into it via AV_WBx(). This also allows to combine
> several av_bprint_append_any() calls into one. Said patch is patch #2 of
> this patchset:
> https://ffmpeg.org/pipermail/ffmpeg-devel/2020-October/271057.html (The
> second email has not yet come through due to the mailing list's random
> delay.)

My patch is a smaller diff and is consistent with the style of the code.

Up to maintainer but I'd suggest your changes are a separate patch.

--
Andriy
Andreas Rheinhardt Oct. 15, 2020, 9:55 p.m. UTC | #3
Andriy Gelman:
> On Thu, 15. Oct 16:06, Andreas Rheinhardt wrote:
>> Andriy Gelman:
>>> From: Andriy Gelman <andriy.gelman@gmail.com>
>>>
>>> Fixes fate-binsub-movtextenc on PPC64
>>>
>>> Currently tags are written in reverse order on BE arches. This is fixed
>>> by using MKBETAG() and AV_RB32() to be arch agnostics.
>>>
>>> Also s->font_count is of type int. On BE arches with 32bit int,
>>> count = AV_RB16(&s->font_count) will read two most significant bytes
>>> instead of the least signifcant bytes. This is fixed by assiging
>>> s->font_count to count first.
>>>
>>> The final change is modyfying the type of len. On BE arches
>>> the most signifanct byte of the int was written instead of the least
>>> significant byte.
>>>
>>> Signed-off-by: Andriy Gelman <andriy.gelman@gmail.com>
>>> ---
>>>  libavcodec/movtextenc.c | 17 +++++++++++------
>>>  1 file changed, 11 insertions(+), 6 deletions(-)
>>>
>>> diff --git a/libavcodec/movtextenc.c b/libavcodec/movtextenc.c
>>> index b2368b641b..f38cd9cba2 100644
>>> --- a/libavcodec/movtextenc.c
>>> +++ b/libavcodec/movtextenc.c
>>> @@ -116,6 +116,7 @@ static void encode_styl(MovTextContext *s, uint32_t tsmb_type)
>>>      if ((s->box_flags & STYL_BOX) && s->count) {
>>>          tsmb_size = s->count * STYLE_RECORD_SIZE + SIZE_ADD;
>>>          tsmb_size = AV_RB32(&tsmb_size);
>>> +        tsmb_type = AV_RB32(&tsmb_type);
>>>          style_entries = AV_RB16(&s->count);
>>>          /*The above three attributes are hard coded for now
>>>          but will come from ASS style in the future*/
>>> @@ -149,6 +150,7 @@ static void encode_hlit(MovTextContext *s, uint32_t tsmb_type)
>>>      if (s->box_flags & HLIT_BOX) {
>>>          tsmb_size = 12;
>>>          tsmb_size = AV_RB32(&tsmb_size);
>>> +        tsmb_type = AV_RB32(&tsmb_type);
>>>          start     = AV_RB16(&s->hlit.start);
>>>          end       = AV_RB16(&s->hlit.end);
>>>          av_bprint_append_any(&s->buffer, &tsmb_size, 4);
>>> @@ -164,6 +166,7 @@ static void encode_hclr(MovTextContext *s, uint32_t tsmb_type)
>>>      if (s->box_flags & HCLR_BOX) {
>>>          tsmb_size = 12;
>>>          tsmb_size = AV_RB32(&tsmb_size);
>>> +        tsmb_type = AV_RB32(&tsmb_type);
>>>          color     = AV_RB32(&s->hclr.color);
>>>          av_bprint_append_any(&s->buffer, &tsmb_size, 4);
>>>          av_bprint_append_any(&s->buffer, &tsmb_type, 4);
>>> @@ -172,9 +175,9 @@ static void encode_hclr(MovTextContext *s, uint32_t tsmb_type)
>>>  }
>>>  
>>>  static const Box box_types[] = {
>>> -    { MKTAG('s','t','y','l'), encode_styl },
>>> -    { MKTAG('h','l','i','t'), encode_hlit },
>>> -    { MKTAG('h','c','l','r'), encode_hclr },
>>> +    { MKBETAG('s','t','y','l'), encode_styl },
>>> +    { MKBETAG('h','l','i','t'), encode_hlit },
>>> +    { MKBETAG('h','c','l','r'), encode_hclr },
>>>  };
>>>  
>>>  const static size_t box_count = FF_ARRAY_ELEMS(box_types);
>>> @@ -316,14 +319,16 @@ static int encode_sample_description(AVCodecContext *avctx)
>>>      //     FontTableBox {
>>>      tsmb_size = SIZE_ADD + 3 * s->font_count + font_names_total_len;
>>>      tsmb_size = AV_RB32(&tsmb_size);
>>> -    tsmb_type = MKTAG('f','t','a','b');
>>> -    count = AV_RB16(&s->font_count);
>>> +    tsmb_type = MKBETAG('f','t','a','b');
>>> +    tsmb_type = AV_RB32(&tsmb_type);
>>> +    count = s->font_count;
>>> +    count = AV_RB16(&count);
>>>      av_bprint_append_any(&s->buffer, &tsmb_size, 4);
>>>      av_bprint_append_any(&s->buffer, &tsmb_type, 4);
>>>      av_bprint_append_any(&s->buffer, &count, 2);
>>>      //     FontRecord {
>>>      for (i = 0; i < s->font_count; i++) {
>>> -        int len;
>>> +        uint8_t len;
>>>          fontID = i + 1;
>>>          fontID = AV_RB16(&fontID);
>>>          av_bprint_append_any(&s->buffer, &fontID, 2);
>>>
> 
>> I have sent an alternative version that avoids this horrible way of
>> writing output independent of endianness by instead using small buffers
>> and writing the values into it via AV_WBx(). This also allows to combine
>> several av_bprint_append_any() calls into one. Said patch is patch #2 of
>> this patchset:
>> https://ffmpeg.org/pipermail/ffmpeg-devel/2020-October/271057.html (The
>> second email has not yet come through due to the mailing list's random
>> delay.)
> 
> My patch is a smaller diff and is consistent with the style of the code.
>> Up to maintainer but I'd suggest your changes are a separate patch.
> 
This encoder has no maintainer listed, so I suggest you apply your patch
to fix the endianness issue and I rebase my patches on top of yours.
Btw: Your commit message has typos: signifcant, assiging, modyfying,
signifanct.

- Andreas
Andriy Gelman Oct. 16, 2020, 2:37 a.m. UTC | #4
On Thu, 15. Oct 23:55, Andreas Rheinhardt wrote:
> Andriy Gelman:
> > On Thu, 15. Oct 16:06, Andreas Rheinhardt wrote:
> >> Andriy Gelman:
> >>> From: Andriy Gelman <andriy.gelman@gmail.com>
> >>>
> >>> Fixes fate-binsub-movtextenc on PPC64
> >>>
> >>> Currently tags are written in reverse order on BE arches. This is fixed
> >>> by using MKBETAG() and AV_RB32() to be arch agnostics.
> >>>
> >>> Also s->font_count is of type int. On BE arches with 32bit int,
> >>> count = AV_RB16(&s->font_count) will read two most significant bytes
> >>> instead of the least signifcant bytes. This is fixed by assiging
> >>> s->font_count to count first.
> >>>
> >>> The final change is modyfying the type of len. On BE arches
> >>> the most signifanct byte of the int was written instead of the least
> >>> significant byte.
> >>>
> >>> Signed-off-by: Andriy Gelman <andriy.gelman@gmail.com>
> >>> ---
> >>>  libavcodec/movtextenc.c | 17 +++++++++++------
> >>>  1 file changed, 11 insertions(+), 6 deletions(-)
> >>>
> >>> diff --git a/libavcodec/movtextenc.c b/libavcodec/movtextenc.c
> >>> index b2368b641b..f38cd9cba2 100644
> >>> --- a/libavcodec/movtextenc.c
> >>> +++ b/libavcodec/movtextenc.c
> >>> @@ -116,6 +116,7 @@ static void encode_styl(MovTextContext *s, uint32_t tsmb_type)
> >>>      if ((s->box_flags & STYL_BOX) && s->count) {
> >>>          tsmb_size = s->count * STYLE_RECORD_SIZE + SIZE_ADD;
> >>>          tsmb_size = AV_RB32(&tsmb_size);
> >>> +        tsmb_type = AV_RB32(&tsmb_type);
> >>>          style_entries = AV_RB16(&s->count);
> >>>          /*The above three attributes are hard coded for now
> >>>          but will come from ASS style in the future*/
> >>> @@ -149,6 +150,7 @@ static void encode_hlit(MovTextContext *s, uint32_t tsmb_type)
> >>>      if (s->box_flags & HLIT_BOX) {
> >>>          tsmb_size = 12;
> >>>          tsmb_size = AV_RB32(&tsmb_size);
> >>> +        tsmb_type = AV_RB32(&tsmb_type);
> >>>          start     = AV_RB16(&s->hlit.start);
> >>>          end       = AV_RB16(&s->hlit.end);
> >>>          av_bprint_append_any(&s->buffer, &tsmb_size, 4);
> >>> @@ -164,6 +166,7 @@ static void encode_hclr(MovTextContext *s, uint32_t tsmb_type)
> >>>      if (s->box_flags & HCLR_BOX) {
> >>>          tsmb_size = 12;
> >>>          tsmb_size = AV_RB32(&tsmb_size);
> >>> +        tsmb_type = AV_RB32(&tsmb_type);
> >>>          color     = AV_RB32(&s->hclr.color);
> >>>          av_bprint_append_any(&s->buffer, &tsmb_size, 4);
> >>>          av_bprint_append_any(&s->buffer, &tsmb_type, 4);
> >>> @@ -172,9 +175,9 @@ static void encode_hclr(MovTextContext *s, uint32_t tsmb_type)
> >>>  }
> >>>  
> >>>  static const Box box_types[] = {
> >>> -    { MKTAG('s','t','y','l'), encode_styl },
> >>> -    { MKTAG('h','l','i','t'), encode_hlit },
> >>> -    { MKTAG('h','c','l','r'), encode_hclr },
> >>> +    { MKBETAG('s','t','y','l'), encode_styl },
> >>> +    { MKBETAG('h','l','i','t'), encode_hlit },
> >>> +    { MKBETAG('h','c','l','r'), encode_hclr },
> >>>  };
> >>>  
> >>>  const static size_t box_count = FF_ARRAY_ELEMS(box_types);
> >>> @@ -316,14 +319,16 @@ static int encode_sample_description(AVCodecContext *avctx)
> >>>      //     FontTableBox {
> >>>      tsmb_size = SIZE_ADD + 3 * s->font_count + font_names_total_len;
> >>>      tsmb_size = AV_RB32(&tsmb_size);
> >>> -    tsmb_type = MKTAG('f','t','a','b');
> >>> -    count = AV_RB16(&s->font_count);
> >>> +    tsmb_type = MKBETAG('f','t','a','b');
> >>> +    tsmb_type = AV_RB32(&tsmb_type);
> >>> +    count = s->font_count;
> >>> +    count = AV_RB16(&count);
> >>>      av_bprint_append_any(&s->buffer, &tsmb_size, 4);
> >>>      av_bprint_append_any(&s->buffer, &tsmb_type, 4);
> >>>      av_bprint_append_any(&s->buffer, &count, 2);
> >>>      //     FontRecord {
> >>>      for (i = 0; i < s->font_count; i++) {
> >>> -        int len;
> >>> +        uint8_t len;
> >>>          fontID = i + 1;
> >>>          fontID = AV_RB16(&fontID);
> >>>          av_bprint_append_any(&s->buffer, &fontID, 2);
> >>>
> > 
> >> I have sent an alternative version that avoids this horrible way of
> >> writing output independent of endianness by instead using small buffers
> >> and writing the values into it via AV_WBx(). This also allows to combine
> >> several av_bprint_append_any() calls into one. Said patch is patch #2 of
> >> this patchset:
> >> https://ffmpeg.org/pipermail/ffmpeg-devel/2020-October/271057.html (The
> >> second email has not yet come through due to the mailing list's random
> >> delay.)
> > 
> > My patch is a smaller diff and is consistent with the style of the code.
> >> Up to maintainer but I'd suggest your changes are a separate patch.
> > 

> This encoder has no maintainer listed, so I suggest you apply your patch
> to fix the endianness issue and I rebase my patches on top of yours.
> Btw: Your commit message has typos: signifcant, assiging, modyfying,
> signifanct.

Sounds good. Fixed the typos and pushed.

thanks,
diff mbox series

Patch

diff --git a/libavcodec/movtextenc.c b/libavcodec/movtextenc.c
index b2368b641b..f38cd9cba2 100644
--- a/libavcodec/movtextenc.c
+++ b/libavcodec/movtextenc.c
@@ -116,6 +116,7 @@  static void encode_styl(MovTextContext *s, uint32_t tsmb_type)
     if ((s->box_flags & STYL_BOX) && s->count) {
         tsmb_size = s->count * STYLE_RECORD_SIZE + SIZE_ADD;
         tsmb_size = AV_RB32(&tsmb_size);
+        tsmb_type = AV_RB32(&tsmb_type);
         style_entries = AV_RB16(&s->count);
         /*The above three attributes are hard coded for now
         but will come from ASS style in the future*/
@@ -149,6 +150,7 @@  static void encode_hlit(MovTextContext *s, uint32_t tsmb_type)
     if (s->box_flags & HLIT_BOX) {
         tsmb_size = 12;
         tsmb_size = AV_RB32(&tsmb_size);
+        tsmb_type = AV_RB32(&tsmb_type);
         start     = AV_RB16(&s->hlit.start);
         end       = AV_RB16(&s->hlit.end);
         av_bprint_append_any(&s->buffer, &tsmb_size, 4);
@@ -164,6 +166,7 @@  static void encode_hclr(MovTextContext *s, uint32_t tsmb_type)
     if (s->box_flags & HCLR_BOX) {
         tsmb_size = 12;
         tsmb_size = AV_RB32(&tsmb_size);
+        tsmb_type = AV_RB32(&tsmb_type);
         color     = AV_RB32(&s->hclr.color);
         av_bprint_append_any(&s->buffer, &tsmb_size, 4);
         av_bprint_append_any(&s->buffer, &tsmb_type, 4);
@@ -172,9 +175,9 @@  static void encode_hclr(MovTextContext *s, uint32_t tsmb_type)
 }
 
 static const Box box_types[] = {
-    { MKTAG('s','t','y','l'), encode_styl },
-    { MKTAG('h','l','i','t'), encode_hlit },
-    { MKTAG('h','c','l','r'), encode_hclr },
+    { MKBETAG('s','t','y','l'), encode_styl },
+    { MKBETAG('h','l','i','t'), encode_hlit },
+    { MKBETAG('h','c','l','r'), encode_hclr },
 };
 
 const static size_t box_count = FF_ARRAY_ELEMS(box_types);
@@ -316,14 +319,16 @@  static int encode_sample_description(AVCodecContext *avctx)
     //     FontTableBox {
     tsmb_size = SIZE_ADD + 3 * s->font_count + font_names_total_len;
     tsmb_size = AV_RB32(&tsmb_size);
-    tsmb_type = MKTAG('f','t','a','b');
-    count = AV_RB16(&s->font_count);
+    tsmb_type = MKBETAG('f','t','a','b');
+    tsmb_type = AV_RB32(&tsmb_type);
+    count = s->font_count;
+    count = AV_RB16(&count);
     av_bprint_append_any(&s->buffer, &tsmb_size, 4);
     av_bprint_append_any(&s->buffer, &tsmb_type, 4);
     av_bprint_append_any(&s->buffer, &count, 2);
     //     FontRecord {
     for (i = 0; i < s->font_count; i++) {
-        int len;
+        uint8_t len;
         fontID = i + 1;
         fontID = AV_RB16(&fontID);
         av_bprint_append_any(&s->buffer, &fontID, 2);