Commit b5a213db authored by Laurent Aimar's avatar Laurent Aimar

* mp4: raaaah, sometime moov box are masqueraded by a free box, so I look

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 :((
parent cec1f957
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* libmp4.c : LibMP4 library for mp4 module for vlc * libmp4.c : LibMP4 library for mp4 module for vlc
***************************************************************************** *****************************************************************************
* Copyright (C) 2001 VideoLAN * 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> * Authors: Laurent Aimar <fenrir@via.ecp.fr>
* *
* This program is free software; you can redistribute it and/or modify * 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 ) ...@@ -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 ) 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 */ /* Nothing to do */
#ifdef MP4_VERBOSE #ifdef MP4_VERBOSE
msg_Dbg( p_stream->p_input, "Skip box: \"%4.4s\"", 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 ) ...@@ -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 ) ); memset( p_box->data.p_cmov, 0, sizeof( MP4_Box_data_cmov_t ) );
if( !( p_box->p_father )|| if( !p_box->p_father ||
( p_box->p_father->i_type != FOURCC_moov ) ) ( 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" ); msg_Warn( p_stream->p_input, "Read box: \"cmov\" box alone" );
return( 1 ); return( 1 );
...@@ -2113,6 +2139,7 @@ static struct ...@@ -2113,6 +2139,7 @@ static struct
{ FOURCC_MAC3, MP4_ReadBox_sample_soun, MP4_FreeBox_Common }, { FOURCC_MAC3, MP4_ReadBox_sample_soun, MP4_FreeBox_Common },
{ FOURCC_MAC6, 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_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_vide, MP4_ReadBox_sample_vide, MP4_FreeBox_Common },
{ FOURCC_mp4v, 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 ) ...@@ -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 /* check if there is a cmov, if so replace
compressed moov by uncompressed one */ compressed moov by uncompressed one */
if( ( p_moov = MP4_FindBox( p_root, FOURCC_moov ) )&& if( ( ( p_moov = MP4_FindBox( p_root, FOURCC_moov ) )&&
( p_cmov = MP4_FindBox( p_moov, FOURCC_cmov ) ) ) ( 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 */ /* rename the compressed moov as a box to skip */
p_moov->i_type = FOURCC_skip; p_moov->i_type = FOURCC_skip;
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* libmp4.h : LibMP4 library for mp4 module for vlc * libmp4.h : LibMP4 library for mp4 module for vlc
***************************************************************************** *****************************************************************************
* Copyright (C) 2001 VideoLAN * 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> * Authors: Laurent Aimar <fenrir@via.ecp.fr>
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#define FOURCC_ftyp VLC_FOURCC( 'f', 't', 'y', 'p' ) #define FOURCC_ftyp VLC_FOURCC( 'f', 't', 'y', 'p' )
#define FOURCC_moov VLC_FOURCC( 'm', 'o', 'o', 'v' ) #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_cmov VLC_FOURCC( 'c', 'm', 'o', 'v' )
#define FOURCC_dcom VLC_FOURCC( 'd', 'c', 'o', 'm' ) #define FOURCC_dcom VLC_FOURCC( 'd', 'c', 'o', 'm' )
#define FOURCC_cmvd VLC_FOURCC( 'c', 'm', 'v', 'd' ) #define FOURCC_cmvd VLC_FOURCC( 'c', 'm', 'v', 'd' )
...@@ -108,6 +109,7 @@ ...@@ -108,6 +109,7 @@
#define FOURCC_alaw VLC_FOURCC( 'a', 'l', 'a', 'w' ) #define FOURCC_alaw VLC_FOURCC( 'a', 'l', 'a', 'w' )
#define FOURCC_ulaw VLC_FOURCC( 'u', 'l', 'a', 'w' ) #define FOURCC_ulaw VLC_FOURCC( 'u', 'l', 'a', 'w' )
#define FOURCC_Qclp VLC_FOURCC( 'Q', 'c', 'l', 'p' ) #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_zlib VLC_FOURCC( 'z', 'l', 'i', 'b' )
#define FOURCC_SVQ1 VLC_FOURCC( 'S', 'V', 'Q', '1' ) #define FOURCC_SVQ1 VLC_FOURCC( 'S', 'V', 'Q', '1' )
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* mp4.c : MP4 file input module for vlc * mp4.c : MP4 file input module for vlc
***************************************************************************** *****************************************************************************
* Copyright (C) 2001 VideoLAN * 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> * Authors: Laurent Aimar <fenrir@via.ecp.fr>
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
...@@ -147,6 +147,7 @@ static int MP4Init( vlc_object_t * p_this ) ...@@ -147,6 +147,7 @@ static int MP4Init( vlc_object_t * p_this )
{ {
case( FOURCC_ftyp ): case( FOURCC_ftyp ):
case( FOURCC_moov ): case( FOURCC_moov ):
case( FOURCC_foov ):
case( FOURCC_moof ): case( FOURCC_moof ):
case( FOURCC_mdat ): case( FOURCC_mdat ):
case( FOURCC_udta ): case( FOURCC_udta ):
...@@ -201,13 +202,18 @@ static int MP4Init( vlc_object_t * p_this ) ...@@ -201,13 +202,18 @@ static int MP4Init( vlc_object_t * p_this )
} }
/* the file need to have one moov box */ /* 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_Box_t *p_foov = MP4_BoxGet( &p_demux->box_root, "/foov" );
"MP4 plugin discarded (%d moov boxes)",
MP4_BoxCount( &p_demux->box_root, "/moov" ) ); if( !p_foov )
// MP4End( p_input ); {
// return( -1 ); 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" ) ) ) if( ( p_rmra = MP4_BoxGet( &p_demux->box_root, "/moov/rmra" ) ) )
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment