* libmp4.c : LibMP4 library for mp4 module for vlc
*****************************************************************************
* Copyright (C) 2001 VideoLAN
- * $Id: libmp4.c,v 1.2 2002/07/21 15:13:19 fenrir Exp $
+ * $Id: libmp4.c,v 1.3 2002/07/21 18:47:22 fenrir Exp $
* Authors: Laurent Aimar <fenrir@via.ecp.fr>
*
* This program is free software; you can redistribute it and/or modify
#define MP4_GET4BYTES( dst ) \
dst = GetDWBE( p_peek ); p_peek += 4; i_read -= 4
+
+#define MP4_GETFOURCC( dst ) \
+ dst = GetDWLE( p_peek ); p_peek += 4; i_read -= 4
#define MP4_GET8BYTES( dst ) \
dst = GetQWBE( p_peek ); p_peek += 8; i_read -= 8
p_box->p_next = NULL;
MP4_GET4BYTES( p_box->i_shortsize );
- MP4_GET4BYTES( p_box->i_type );
+ MP4_GETFOURCC( p_box->i_type );
/* Now special case */
if( p_box->i_size )
{
msg_Dbg( p_stream->p_input, "Found Box: %c%c%c%c size %d",
- (p_box->i_type>>24)&0xff, (p_box->i_type>>16)&0xff,
- (p_box->i_type>>8)&0xff, (p_box->i_type)&0xff,
+ (p_box->i_type)&0xff, (p_box->i_type>>8)&0xff,
+ (p_box->i_type>>16)&0xff, (p_box->i_type>>24)&0xff,
(u32)p_box->i_size );
}
#endif
/* Nothing to do */
#ifdef MP4_VERBOSE
msg_Dbg( p_stream->p_input, "Skip box: \"%c%c%c%c\"",
- (p_box->i_type>>24)&0xff,
- (p_box->i_type>>16)&0xff,
- (p_box->i_type>>8)&0xff,
- (p_box->i_type)&0xff );
+ (p_box->i_type)&0xff,
+ (p_box->i_type>>8)&0xff,
+ (p_box->i_type>>16)&0xff,
+ (p_box->i_type>>24)&0xff );
#endif
return( 1 );
}
{
MP4_READBOX_ENTER( MP4_Box_data_ftyp_t );
- MP4_GET4BYTES( p_box->data.p_ftyp->i_major_brand );
+ MP4_GETFOURCC( p_box->data.p_ftyp->i_major_brand );
MP4_GET4BYTES( p_box->data.p_ftyp->i_minor_version );
if( ( p_box->data.p_ftyp->i_compatible_brands_count = i_read / 4 ) )
for( i =0; i < p_box->data.p_ftyp->i_compatible_brands_count; i++ )
{
- MP4_GET4BYTES( p_box->data.p_ftyp->i_compatible_brands[i] );
+ MP4_GETFOURCC( p_box->data.p_ftyp->i_compatible_brands[i] );
}
}
else
MP4_GETVERSIONFLAGS( p_box->data.p_hdlr );
MP4_GET4BYTES( p_box->data.p_hdlr->i_predefined );
- MP4_GET4BYTES( p_box->data.p_hdlr->i_handler_type );
+ MP4_GETFOURCC( p_box->data.p_hdlr->i_handler_type );
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 );
#ifdef MP4_VERBOSE
msg_Dbg( p_stream->p_input, "Read Box: \"hdlr\" hanler type %c%c%c%c name %s",
- ( p_box->data.p_hdlr->i_handler_type >> 24 )&0xff,
- ( p_box->data.p_hdlr->i_handler_type >> 16 )&0xff,
- ( p_box->data.p_hdlr->i_handler_type >> 8 )&0xff,
( p_box->data.p_hdlr->i_handler_type )&0xff,
+ ( p_box->data.p_hdlr->i_handler_type >> 8 )&0xff,
+ ( p_box->data.p_hdlr->i_handler_type >> 16 )&0xff,
+ ( p_box->data.p_hdlr->i_handler_type >> 24 )&0xff,
p_box->data.p_hdlr->psz_name );
#endif
MP4_GET2BYTES( p_box->data.p_sample_vide->i_depth );
MP4_GET2BYTES( p_box->data.p_sample_vide->i_predefined4 );
-
+ MP4_SeekStream( p_stream, p_box->i_pos + MP4_BOX_HEADERSIZE( p_box ) + 78);
+ MP4_ReadBoxContainerRaw( p_stream, p_box );
+
#ifdef MP4_VERBOSE
msg_Dbg( p_stream->p_input, "Read Box: \"vide\" in stsd %dx%d depth %d",
p_box->data.p_sample_vide->i_width,
MP4_READBOX_EXIT( 1 );
}
+#if 0
int MP4_ReadBox_sample_mp4v( MP4_Stream_t *p_stream, MP4_Box_t *p_box )
{
int i;
#endif
MP4_READBOX_EXIT( 1 );
}
-
+#endif
int MP4_ReadBox_stsd( MP4_Stream_t *p_stream, MP4_Box_t *p_box )
{
MP4_READBOX_ENTER( MP4_Box_data_dcom_t );
- MP4_GET4BYTES( p_box->data.p_dcom->i_algorithm );
+ MP4_GETFOURCC( p_box->data.p_dcom->i_algorithm );
#ifdef MP4_VERBOSE
msg_Dbg( p_stream->p_input,
"Read Box: \"dcom\" compression algorithm : %c%c%c%c",
- ( p_box->data.p_dcom->i_algorithm >> 24 )&0xff,
+ ( p_box->data.p_dcom->i_algorithm )&0xff,
+ ( p_box->data.p_dcom->i_algorithm >> 8 )&0xff,
( p_box->data.p_dcom->i_algorithm >> 16 )&0xff,
- ( p_box->data.p_dcom->i_algorithm >> 8 )&0xff,
- ( p_box->data.p_dcom->i_algorithm )&0xff );
+ ( p_box->data.p_dcom->i_algorithm >> 24 )&0xff );
#endif
MP4_READBOX_EXIT( 1 );
if( p_dcom->data.p_dcom->i_algorithm != FOURCC_zlib )
{
msg_Dbg( p_stream->p_input, "Read Box: \"cmov\" compression algorithm : %c%c%c%c not supported",
- ( p_dcom->data.p_dcom->i_algorithm >> 24 )&0xff,
+ ( p_dcom->data.p_dcom->i_algorithm )&0xff,
+ ( p_dcom->data.p_dcom->i_algorithm >> 8 )&0xff,
( p_dcom->data.p_dcom->i_algorithm >> 16 )&0xff,
- ( p_dcom->data.p_dcom->i_algorithm >> 8 )&0xff,
- ( p_dcom->data.p_dcom->i_algorithm )&0xff );
+ ( p_dcom->data.p_dcom->i_algorithm >> 24 )&0xff );
return( 1 );
}
{ FOURCC_mp4a, MP4_ReadBox_sample_mp4a, MP4_FreeBox_Common },
{ FOURCC_vide, MP4_ReadBox_sample_vide, MP4_FreeBox_Common },
- { FOURCC_mp4v, MP4_ReadBox_sample_mp4v, MP4_FreeBox_Common },
+ { FOURCC_mp4v, MP4_ReadBox_sample_vide, MP4_FreeBox_Common },
{ FOURCC_SVQ1, MP4_ReadBox_sample_vide, MP4_FreeBox_Common },
{ FOURCC_DIVX, MP4_ReadBox_sample_vide, MP4_FreeBox_Common },
{ FOURCC_h263, MP4_ReadBox_sample_vide, MP4_FreeBox_Common },
{ FOURCC_cvid, MP4_ReadBox_sample_vide, MP4_FreeBox_Common },
- { FOURCC_3IV1, NULL, MP4_FreeBox_Common },
+ { FOURCC_3IV1, MP4_ReadBox_sample_vide, MP4_FreeBox_Common },
+ { FOURCC_mjpa, MP4_ReadBox_sample_vide, MP4_FreeBox_Common },
+ { FOURCC_mjpb, MP4_ReadBox_sample_vide, MP4_FreeBox_Common },
+ { FOURCC_mjqt, NULL, NULL }, /* found in mjpa/b */
+ { FOURCC_mjht, NULL, NULL },
+
+ { FOURCC_jpeg, MP4_ReadBox_sample_vide, MP4_FreeBox_Common },
{ FOURCC_mp4s, NULL, MP4_FreeBox_Common },
{
msg_Warn( p_stream->p_input,
"Unknown box type %c%c%c%c (uncompletetly loaded)",
- (p_box->i_type>>24)&0xff,
- (p_box->i_type>>16)&0xff,
+ (p_box->i_type)&0xff,
(p_box->i_type>>8)&0xff,
- (p_box->i_type)&0xff );
+ (p_box->i_type>>16)&0xff,
+ (p_box->i_type>>24)&0xff );
return( 1 );
}
else
/* Should not happen */
msg_Warn( p_input,
"cannot free box %c%c%c%c, type unknown",
- (p_box->i_type >> 24)&0xff,
+ (p_box->i_type)&0xff,
+ (p_box->i_type >> 8)&0xff,
(p_box->i_type >> 16)&0xff,
- (p_box->i_type >> 8)&0xff,
- (p_box->i_type )&0xff );
+ (p_box->i_type >> 24)&0xff );
}
else
{
if( !i_level )
{
msg_Dbg( p_input, "Dumping root Box \"%c%c%c%c \"",
- (p_box->i_type>>24 ) &0xff,
- (p_box->i_type>>16 ) &0xff,
- (p_box->i_type>> 8 ) &0xff,
- (p_box->i_type ) &0xff );
+ (p_box->i_type ) &0xff,
+ (p_box->i_type >>8 ) &0xff,
+ (p_box->i_type >>16 ) &0xff,
+ (p_box->i_type >>24) &0xff );
}
else
{
str[i*5] = '|';
}
sprintf( str + i_level * 5, "+ %c%c%c%c size %d",
- (p_box->i_type>>24 ) &0xff,
- (p_box->i_type>>16 ) &0xff,
- (p_box->i_type>> 8 ) &0xff,
(p_box->i_type ) &0xff,
+ (p_box->i_type>>8 ) &0xff,
+ (p_box->i_type>>16 ) &0xff,
+ (p_box->i_type>>24 ) &0xff,
(u32)p_box->i_size );
msg_Dbg( p_input, "%s", str );
* libmp4.h : LibMP4 library for mp4 module for vlc
*****************************************************************************
* Copyright (C) 2001 VideoLAN
- * $Id: libmp4.h,v 1.2 2002/07/21 15:13:19 fenrir Exp $
+ * $Id: libmp4.h,v 1.3 2002/07/21 18:47:22 fenrir Exp $
* Authors: Laurent Aimar <fenrir@via.ecp.fr>
*
* This program is free software; you can redistribute it and/or modify
/* XXX It's not the same than VLC_FOURCC */
+#if 0
#define MP4_FOURCC( a, b, c, d ) \
( ((u32)d) | ( ((u32)c) << 8 ) | ( ((u32)b) << 16 ) | ( ((u32)a) << 24 ) )
-
+#endif
+#define MP4_FOURCC( a, b, c, d ) \
+ ( ((u32)a) | ( ((u32)b) << 8 ) | ( ((u32)c) << 16 ) | ( ((u32)d) << 24 ) )
+
#define FOURCC_uuid MP4_FOURCC( 'u', 'u', 'i', 'd' )
#define FOURCC_ftyp MP4_FOURCC( 'f', 't', 'y', 'p' )
#define FOURCC_h263 MP4_FOURCC( 'h', '2', '6', '3' )
#define FOURCC_DIVX MP4_FOURCC( 'D', 'I', 'V', 'X' )
#define FOURCC_cvid MP4_FOURCC( 'c', 'v', 'i', 'd' )
-
-
+#define FOURCC_mjpa MP4_FOURCC( 'm', 'j', 'p', 'a' )
+#define FOURCC_mjpb MP4_FOURCC( 'm', 'j', 'q', 't' )
+#define FOURCC_mjqt MP4_FOURCC( 'm', 'j', 'h', 't' )
+#define FOURCC_mjht MP4_FOURCC( 'm', 'j', 'p', 'b' )
+
+#define FOURCC_jpeg MP4_FOURCC( 'j', 'p', 'e', 'g' )
+
/*
#define FOURCC_ MP4_FOURCC( '', '', '', '' )
*/
} MP4_Box_data_sample_vide_t;
+/*
typedef struct MP4_Box_data_sample_mp4v_s
{
u8 i_reserved1[6];
} MP4_Box_data_sample_mp4v_t;
-
+*/
typedef struct MP4_Box_data_sample_hint_s
{