* mp4: raaaah, sometime moov box are masqueraded by a free box, so I look
authorLaurent Aimar <fenrir@videolan.org>
Wed, 7 May 2003 02:31:20 +0000 (02:31 +0000)
committerLaurent Aimar <fenrir@videolan.org>
Wed, 7 May 2003 02:31:20 +0000 (02:31 +0000)
at free box content to see if it could be moov box, I hope there won't be
any misdetection. (Even when there is a spec, nobody follows it :((

modules/demux/mp4/libmp4.c
modules/demux/mp4/libmp4.h
modules/demux/mp4/mp4.c

index 3644d8e..67e7c93 100644 (file)
@@ -2,7 +2,7 @@
  * libmp4.c : LibMP4 library for mp4 module for vlc
  *****************************************************************************
  * Copyright (C) 2001 VideoLAN
- * $Id: libmp4.c,v 1.24 2003/05/06 16:05:10 fenrir Exp $
+ * $Id: libmp4.c,v 1.25 2003/05/07 02:31:20 fenrir Exp $
  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  *
  * This program is free software; you can redistribute it and/or modify
@@ -658,6 +658,32 @@ void MP4_FreeBox_Common( input_thread_t *p_input, MP4_Box_t *p_box )
 
 int MP4_ReadBoxSkip( MP4_Stream_t *p_stream, MP4_Box_t *p_box )
 {
+    /* XXX sometime moov is hiden in a free box */
+    if( p_box->p_father && p_box->p_father->i_type == VLC_FOURCC( 'r', 'o', 'o', 't' )&&
+        p_box->i_type == FOURCC_free )
+    {
+        uint8_t *p_peek;
+        int     i_read;
+        vlc_fourcc_t i_fcc;
+
+        i_read  = MP4_PeekStream( p_stream, &p_peek, 44 );
+
+        p_peek += MP4_BOX_HEADERSIZE( p_box ) + 4;
+        i_read -= MP4_BOX_HEADERSIZE( p_box ) + 4;
+
+        if( i_read >= 8 )
+        {
+            i_fcc = VLC_FOURCC( p_peek[0], p_peek[1], p_peek[2], p_peek[3] );
+
+            if( i_fcc == FOURCC_cmov || i_fcc == FOURCC_mvhd )
+            {
+                msg_Warn( p_stream->p_input, "Detected moov hidden in a free box ..." );
+
+                p_box->i_type = FOURCC_foov;
+                return MP4_ReadBoxContainer( p_stream, p_box );
+            }
+        }
+    }
     /* Nothing to do */
 #ifdef MP4_VERBOSE
     msg_Dbg( p_stream->p_input, "Skip box: \"%4.4s\"",
@@ -1826,8 +1852,8 @@ int MP4_ReadBox_cmov( MP4_Stream_t *p_stream, MP4_Box_t *p_box )
     }
     memset( p_box->data.p_cmov, 0, sizeof( MP4_Box_data_cmov_t ) );
 
-    if( !( p_box->p_father )||
-        ( p_box->p_father->i_type != FOURCC_moov ) )
+    if( !p_box->p_father ||
+        ( p_box->p_father->i_type != FOURCC_moov && p_box->p_father->i_type != FOURCC_foov) )
     {
         msg_Warn( p_stream->p_input, "Read box: \"cmov\" box alone" );
         return( 1 );
@@ -2113,6 +2139,7 @@ static struct
     { FOURCC_MAC3,  MP4_ReadBox_sample_soun,    MP4_FreeBox_Common },
     { FOURCC_MAC6,  MP4_ReadBox_sample_soun,    MP4_FreeBox_Common },
     { FOURCC_Qclp,  MP4_ReadBox_sample_soun,    MP4_FreeBox_Common },
+    { FOURCC_samr,  MP4_ReadBox_sample_soun,    MP4_FreeBox_Common },
 
     { FOURCC_vide,  MP4_ReadBox_sample_vide,    MP4_FreeBox_Common },
     { FOURCC_mp4v,  MP4_ReadBox_sample_vide,    MP4_FreeBox_Common },
@@ -2413,8 +2440,10 @@ int MP4_BoxGetRoot( input_thread_t *p_input, MP4_Box_t *p_root )
 
         /* check if there is a cmov, if so replace
           compressed moov by  uncompressed one */
-        if( ( p_moov = MP4_FindBox( p_root, FOURCC_moov ) )&&
-            ( p_cmov = MP4_FindBox( p_moov, FOURCC_cmov ) ) )
+        if( ( ( p_moov = MP4_FindBox( p_root, FOURCC_moov ) )&&
+              ( p_cmov = MP4_FindBox( p_moov, FOURCC_cmov ) ) ) ||
+            ( ( p_moov = MP4_FindBox( p_root, FOURCC_foov ) )&&
+              ( p_cmov = MP4_FindBox( p_moov, FOURCC_cmov ) ) ) )
         {
             /* rename the compressed moov as a box to skip */
             p_moov->i_type = FOURCC_skip;
index 4bc68cb..f310743 100644 (file)
@@ -2,7 +2,7 @@
  * libmp4.h : LibMP4 library for mp4 module for vlc
  *****************************************************************************
  * Copyright (C) 2001 VideoLAN
- * $Id: libmp4.h,v 1.11 2003/05/06 16:05:10 fenrir Exp $
+ * $Id: libmp4.h,v 1.12 2003/05/07 02:31:20 fenrir Exp $
  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  * 
  * This program is free software; you can redistribute it and/or modify
@@ -24,6 +24,7 @@
 
 #define FOURCC_ftyp VLC_FOURCC( 'f', 't', 'y', 'p' )
 #define FOURCC_moov VLC_FOURCC( 'm', 'o', 'o', 'v' )
+#define FOURCC_foov VLC_FOURCC( 'f', 'o', 'o', 'v' )
 #define FOURCC_cmov VLC_FOURCC( 'c', 'm', 'o', 'v' )
 #define FOURCC_dcom VLC_FOURCC( 'd', 'c', 'o', 'm' )
 #define FOURCC_cmvd VLC_FOURCC( 'c', 'm', 'v', 'd' )
 #define FOURCC_alaw VLC_FOURCC( 'a', 'l', 'a', 'w' )
 #define FOURCC_ulaw VLC_FOURCC( 'u', 'l', 'a', 'w' )
 #define FOURCC_Qclp VLC_FOURCC( 'Q', 'c', 'l', 'p' )
+#define FOURCC_samr VLC_FOURCC( 's', 'a', 'm', 'r' )
 
 #define FOURCC_zlib VLC_FOURCC( 'z', 'l', 'i', 'b' )
 #define FOURCC_SVQ1 VLC_FOURCC( 'S', 'V', 'Q', '1' )
index 1a8fbab..596a104 100644 (file)
@@ -2,7 +2,7 @@
  * mp4.c : MP4 file input module for vlc
  *****************************************************************************
  * Copyright (C) 2001 VideoLAN
- * $Id: mp4.c,v 1.29 2003/05/06 16:05:10 fenrir Exp $
+ * $Id: mp4.c,v 1.30 2003/05/07 02:31:20 fenrir Exp $
  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  *
  * This program is free software; you can redistribute it and/or modify
@@ -147,6 +147,7 @@ static int MP4Init( vlc_object_t * p_this )
     {
         case( FOURCC_ftyp ):
         case( FOURCC_moov ):
+        case( FOURCC_foov ):
         case( FOURCC_moof ):
         case( FOURCC_mdat ):
         case( FOURCC_udta ):
@@ -201,13 +202,18 @@ static int MP4Init( vlc_object_t * p_this )
     }
 
     /* the file need to have one moov box */
-    if( MP4_BoxCount( &p_demux->box_root, "/moov" ) != 1 )
+    if( MP4_BoxCount( &p_demux->box_root, "/moov" ) <= 0 )
     {
-        msg_Err( p_input,
-                 "MP4 plugin discarded (%d moov boxes)",
-                 MP4_BoxCount( &p_demux->box_root, "/moov" ) );
-//        MP4End( p_input );
-//        return( -1 );
+        MP4_Box_t *p_foov = MP4_BoxGet( &p_demux->box_root, "/foov" );
+
+        if( !p_foov )
+        {
+            msg_Err( p_input, "MP4 plugin discarded (no moov box)" );
+            MP4End( p_input );
+            return( VLC_EGENERIC );
+        }
+        /* we have a free box as a moov, rename it */
+        p_foov->i_type = FOURCC_moov;
     }
 
     if( ( p_rmra = MP4_BoxGet( &p_demux->box_root,  "/moov/rmra" ) ) )