* 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
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\"",
}
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 );
{ 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 },
/* 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;
* 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
#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' )
* 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
{
case( FOURCC_ftyp ):
case( FOURCC_moov ):
+ case( FOURCC_foov ):
case( FOURCC_moof ):
case( FOURCC_mdat ):
case( FOURCC_udta ):
}
/* 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" ) ) )