From: Andriy Gelman <[email protected]>

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 <[email protected]>
---
 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);
-- 
2.28.0

_______________________________________________
ffmpeg-devel mailing list
[email protected]
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
[email protected] with subject "unsubscribe".

Reply via email to