]> git.sesse.net Git - vlc/commitdiff
* libmp4.c: MMhh .mp4 is 99.99% the same thing than .mov but not 100% :(((
authorLaurent Aimar <fenrir@videolan.org>
Fri, 16 Jul 2004 19:33:20 +0000 (19:33 +0000)
committerLaurent Aimar <fenrir@videolan.org>
Fri, 16 Jul 2004 19:33:20 +0000 (19:33 +0000)
 * mp4.c: hdlr atom in the .mp4 and .mov way.

modules/demux/mp4/libmp4.c
modules/mux/mp4.c

index e5c1a37fc06b27c54e1d8f5001694a8ed1527a3d..60b844f70949b3092566fd9c29b04b2987713f85 100644 (file)
@@ -729,15 +729,39 @@ static int MP4_ReadBox_mdhd( MP4_Stream_t *p_stream, MP4_Box_t *p_box )
 
 static int MP4_ReadBox_hdlr( MP4_Stream_t *p_stream, MP4_Box_t *p_box )
 {
+    int32_t i_reserved;
+
     MP4_READBOX_ENTER( MP4_Box_data_hdlr_t );
 
     MP4_GETVERSIONFLAGS( p_box->data.p_hdlr );
 
-    MP4_GET4BYTES( p_box->data.p_hdlr->i_predefined );
+    MP4_GETFOURCC( p_box->data.p_hdlr->i_predefined );
     MP4_GETFOURCC( p_box->data.p_hdlr->i_handler_type );
 
+    MP4_GET4BYTES( i_reserved );
+    MP4_GET4BYTES( i_reserved );
+    MP4_GET4BYTES( i_reserved );
+
     p_box->data.p_hdlr->psz_name = calloc( sizeof( char ), i_read + 1 );
-    memcpy( p_box->data.p_hdlr->psz_name, p_peek, i_read );
+
+    /* Yes, I love .mp4 :( */
+    if( p_box->data.p_hdlr->i_predefined == VLC_FOURCC( 'm', 'h', 'l', 'r' ) )
+    {
+        uint8_t i_len;
+        int i_copy;
+
+        MP4_GET1BYTE( i_len );
+        i_copy = __MIN( i_read, i_len );
+
+        memcpy( p_box->data.p_hdlr->psz_name, p_peek, i_copy );
+        p_box->data.p_hdlr->psz_name[i_copy] = '\0';
+    }
+    else
+    {
+        memcpy( p_box->data.p_hdlr->psz_name, p_peek, i_read );
+        p_box->data.p_hdlr->psz_name[i_read] = '\0';
+    }
+
 
 #ifdef MP4_VERBOSE
     msg_Dbg( p_stream->s, "read box: \"hdlr\" hanler type %4.4s name %s",
index 4fd0264aa1db0934f5725e351e47e046434a047b..b0ecdff4a54fae9a27026e4968f6f8152b9f03df 100644 (file)
@@ -1697,25 +1697,25 @@ static bo_t *GetMoovBox( sout_mux_t *p_mux )
         /* handler reference */
         hdlr = box_full_new( "hdlr", 0, 0 );
 
-        bo_add_fourcc( hdlr, "mhlr" );         // media handler
+        if( p_sys->b_mov )
+            bo_add_fourcc( hdlr, "mhlr" );         // media handler
+        else
+            bo_add_32be( hdlr, 0 );
+
         if( p_stream->fmt.i_cat == AUDIO_ES )
-        {
             bo_add_fourcc( hdlr, "soun" );
-        }
         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" );
-        }
 
         bo_add_32be( hdlr, 0 );         // reserved
         bo_add_32be( hdlr, 0 );         // reserved
         bo_add_32be( hdlr, 0 );         // reserved
 
-        bo_add_8( hdlr, 12 );
+        if( p_sys->b_mov )
+            bo_add_8( hdlr, 12 );   /* Pascal string for .mov */
+
         if( p_stream->fmt.i_cat == AUDIO_ES )
             bo_add_mem( hdlr, 12, "SoundHandler" );
         else if( p_stream->fmt.i_cat == VIDEO_ES )
@@ -1723,6 +1723,9 @@ static bo_t *GetMoovBox( sout_mux_t *p_mux )
         else
             bo_add_mem( hdlr, 12, "Text Handler" );
 
+        if( !p_sys->b_mov )
+            bo_add_8( hdlr, 0 );   /* asciiz string for .mp4, yes that's BRAIN DAMAGED F**K MP4 */
+
         box_fix( hdlr );
         box_gather( mdia, hdlr );