[vlc-commits] mux: mp4: match codec instead of spu cat

Francois Cartegnie git at videolan.org
Mon Jan 8 12:10:55 CET 2018


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Wed Jan  3 21:42:06 2018 +0100| [d92bb2ccf9ba8d71ff8f59ce2ced9690d7f417c2] | committer: Francois Cartegnie

mux: mp4: match codec instead of spu cat

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=d92bb2ccf9ba8d71ff8f59ce2ced9690d7f417c2
---

 modules/mux/mp4/libmp4mux.c | 83 +++++++++++++++++++++++++--------------------
 modules/mux/mp4/mp4.c       | 31 ++++++++++-------
 2 files changed, 66 insertions(+), 48 deletions(-)

diff --git a/modules/mux/mp4/libmp4mux.c b/modules/mux/mp4/libmp4mux.c
index bf087ab426..03a0e8833f 100644
--- a/modules/mux/mp4/libmp4mux.c
+++ b/modules/mux/mp4/libmp4mux.c
@@ -1011,34 +1011,39 @@ static bo_t *GetVideBox(vlc_object_t *p_obj, mp4mux_trackinfo_t *p_track, bool b
     return vide;
 }
 
-static bo_t *GetTextBox(void)
+static bo_t *GetTextBox(vlc_object_t *p_obj, mp4mux_trackinfo_t *p_track, bool b_mov)
 {
-    bo_t *text = box_new("text");
-    if(!text)
-        return NULL;
+    if(p_track->fmt.i_codec == VLC_CODEC_SUBT)
+    {
+        bo_t *text = box_new("text");
+        if(!text)
+            return NULL;
 
-    for (int i = 0; i < 6; i++)
-        bo_add_8(text, 0);        // reserved;
-    bo_add_16be(text, 1);         // data-reference-index
+        for (int i = 0; i < 6; i++)
+            bo_add_8(text, 0);        // reserved;
+        bo_add_16be(text, 1);         // data-reference-index
 
-    bo_add_32be(text, 0);         // display flags
-    bo_add_32be(text, 0);         // justification
-    for (int i = 0; i < 3; i++)
-        bo_add_16be(text, 0);     // back ground color
+        bo_add_32be(text, 0);         // display flags
+        bo_add_32be(text, 0);         // justification
+        for (int i = 0; i < 3; i++)
+            bo_add_16be(text, 0);     // back ground color
 
-    bo_add_16be(text, 0);         // box text
-    bo_add_16be(text, 0);         // box text
-    bo_add_16be(text, 0);         // box text
-    bo_add_16be(text, 0);         // box text
+        bo_add_16be(text, 0);         // box text
+        bo_add_16be(text, 0);         // box text
+        bo_add_16be(text, 0);         // box text
+        bo_add_16be(text, 0);         // box text
 
-    bo_add_64be(text, 0);         // reserved
-    for (int i = 0; i < 3; i++)
-        bo_add_16be(text, 0xff);  // foreground color
+        bo_add_64be(text, 0);         // reserved
+        for (int i = 0; i < 3; i++)
+            bo_add_16be(text, 0xff);  // foreground color
 
-    bo_add_8 (text, 9);
-    bo_add_mem(text, 9, (uint8_t*)"Helvetica");
+        bo_add_8 (text, 9);
+        bo_add_mem(text, 9, (uint8_t*)"Helvetica");
 
-    return text;
+        return text;
+    }
+
+    return NULL;
 }
 
 static int64_t GetScaledEntryDuration( const mp4mux_entry_t *p_entry, uint32_t i_timescale,
@@ -1067,7 +1072,7 @@ static bo_t *GetStblBox(vlc_object_t *p_obj, mp4mux_trackinfo_t *p_track, bool b
     else if (p_track->fmt.i_cat == VIDEO_ES)
         box_gather(stsd, GetVideBox(p_obj, p_track, b_mov));
     else if (p_track->fmt.i_cat == SPU_ES)
-        box_gather(stsd, GetTextBox());
+        box_gather(stsd, GetTextBox(p_obj, p_track, b_mov));
 
     /* chunk offset table */
     bo_t *stco;
@@ -1529,7 +1534,10 @@ bo_t * mp4mux_GetMoovBox(vlc_object_t *p_obj, mp4mux_trackinfo_t **pp_tracks, un
         else if (p_stream->fmt.i_cat == VIDEO_ES)
             bo_add_fourcc(hdlr, "vide");
         else if (p_stream->fmt.i_cat == SPU_ES)
-            bo_add_fourcc(hdlr, "text");
+        {
+            if(p_stream->fmt.i_codec == VLC_CODEC_SUBT)
+                bo_add_fourcc(hdlr, "text");
+        }
 
         bo_add_32be(hdlr, 0);         // reserved
         bo_add_32be(hdlr, 0);         // reserved
@@ -1579,22 +1587,25 @@ bo_t * mp4mux_GetMoovBox(vlc_object_t *p_obj, mp4mux_trackinfo_t **pp_tracks, un
                 box_gather(minf, vmhd);
             }
         } else if (p_stream->fmt.i_cat == SPU_ES) {
-            bo_t *gmin = box_full_new("gmin", 0, 1);
-            if(gmin)
+            if(p_stream->fmt.i_codec == VLC_CODEC_SUBT)
             {
-                bo_add_16be(gmin, 0);     // graphicsmode
-                for (int i = 0; i < 3; i++)
-                    bo_add_16be(gmin, 0); // opcolor
-                bo_add_16be(gmin, 0);     // balance
-                bo_add_16be(gmin, 0);     // reserved
-
-                bo_t *gmhd = box_new("gmhd");
-                if(gmhd)
+                bo_t *gmin = box_full_new("gmin", 0, 1);
+                if(gmin)
                 {
-                    box_gather(gmhd, gmin);
-                    box_gather(minf, gmhd);
+                    bo_add_16be(gmin, 0);     // graphicsmode
+                    for (int i = 0; i < 3; i++)
+                        bo_add_16be(gmin, 0); // opcolor
+                    bo_add_16be(gmin, 0);     // balance
+                    bo_add_16be(gmin, 0);     // reserved
+
+                    bo_t *gmhd = box_new("gmhd");
+                    if(gmhd)
+                    {
+                        box_gather(gmhd, gmin);
+                        box_gather(minf, gmhd);
+                    }
+                    else bo_free(gmin);
                 }
-                else bo_free(gmin);
             }
         }
 
diff --git a/modules/mux/mp4/mp4.c b/modules/mux/mp4/mp4.c
index b3393c7afd..eb1c659baf 100644
--- a/modules/mux/mp4/mp4.c
+++ b/modules/mux/mp4/mp4.c
@@ -683,14 +683,14 @@ static int Mux(sout_mux_t *p_mux)
             }
         }
 
-        if (p_stream->mux.fmt.i_cat == SPU_ES && p_stream->mux.i_entry_count > 0)
+        if (p_stream->mux.fmt.i_cat == SPU_ES &&
+            p_stream->mux.i_entry_count > 0 &&
+            p_stream->mux.entry[p_stream->mux.i_entry_count-1].i_length == 0)
         {
              /* length of previous spu, stored in spu clearer */
             int64_t i_length = dts_fb_pts( p_data ) - p_stream->i_last_dts;
             if(i_length < 0)
                 i_length = 0;
-            assert( p_stream->mux.entry[p_stream->mux.i_entry_count-1].i_length == 0 );
-            assert( p_stream->mux.entry[p_stream->mux.i_entry_count-1].i_size == 3 );
             /* Fix entry */
             p_stream->mux.entry[p_stream->mux.i_entry_count-1].i_length = i_length;
             p_stream->mux.i_read_duration += i_length;
@@ -728,22 +728,29 @@ static int Mux(sout_mux_t *p_mux)
         /* Add SPU clearing tag (duration tb fixed on next SPU or stream end )*/
         if (p_stream->mux.fmt.i_cat == SPU_ES)
         {
-            block_t *p_empty = block_Alloc(3);
-            if (p_empty)
+            block_t *p_empty = NULL;
+            if(p_stream->mux.fmt.i_codec == VLC_CODEC_SUBT)
             {
-                /* point to start of our empty */
-                p_stream->i_last_dts += e->i_length;
+                p_empty = block_Alloc(3);
+                if (p_empty)
+                {
+                    /* point to start of our empty */
+                    p_stream->i_last_dts += e->i_length;
 
-                /* Write a " " */
-                p_empty->p_buffer[0] = 0;
-                p_empty->p_buffer[1] = 1;
-                p_empty->p_buffer[2] = ' ';
+                    /* Write a " " */
+                    p_empty->p_buffer[0] = 0;
+                    p_empty->p_buffer[1] = 1;
+                    p_empty->p_buffer[2] = ' ';
+                }
+            }
 
+            if(p_empty)
+            {
                 /* Append a idx entry */
                 /* XXX: No need to grow the entry here */
                 mp4mux_entry_t *e_empty = &p_stream->mux.entry[p_stream->mux.i_entry_count++];
                 e_empty->i_pos    = p_sys->i_pos;
-                e_empty->i_size   = 3;
+                e_empty->i_size   = p_empty->i_buffer;
                 e_empty->i_pts_dts= 0;
                 e_empty->i_length = 0; /* will add dts diff later*/
                 e_empty->i_flags  = 0;



More information about the vlc-commits mailing list