Commit 2171d2e9 authored by Laurent Aimar's avatar Laurent Aimar

* all: clean up.

parent e40e6065
This diff is collapsed.
...@@ -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.15 2003/08/17 20:45:50 fenrir Exp $ * $Id: libmp4.h,v 1.16 2003/09/08 00:35:16 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
...@@ -776,35 +776,21 @@ typedef struct MP4_Box_s ...@@ -776,35 +776,21 @@ typedef struct MP4_Box_s
} MP4_Box_t; } MP4_Box_t;
/*---------------------------------------------------------------------------*/
/* */
/****----------------------- High level functions ------------------------****/
/* */
/*---------------------------------------------------------------------------*/
/*****************************************************************************
* Function for manipulate stream easily
*****************************************************************************/
off_t MP4_TellAbsolute( input_thread_t *p_input );
int MP4_SeekAbsolute( input_thread_t *p_input, off_t i_pos);
int MP4_ReadData( input_thread_t *p_input, uint8_t *p_buff, int i_size );
/***************************************************************************** /*****************************************************************************
* MP4_BoxGetRoot : Parse the entire file, and create all boxes in memory * MP4_BoxGetRoot : Parse the entire file, and create all boxes in memory
***************************************************************************** *****************************************************************************
* The first box is a virtual box "root" and is the father for all first * The first box is a virtual box "root" and is the father for all first
* level boxes * level boxes
*
* RETURN : 1 if succes and 0 if it failed
*****************************************************************************/ *****************************************************************************/
int MP4_BoxGetRoot( input_thread_t *p_input, MP4_Box_t *p_root ); MP4_Box_t *MP4_BoxGetRoot( input_thread_t *p_input );
/***************************************************************************** /*****************************************************************************
* MP4_FreeBox : free memory allocated after read with MP4_ReadBox * MP4_FreeBox : free memory allocated after read with MP4_ReadBox
* or MP4_BoxGetRoot, this means also children boxes * or MP4_BoxGetRoot, this means also children boxes
* XXX : all children have to be allocated by a malloc !! and * XXX : all children have to be allocated by a malloc !! and
* p_box isn't freeing * p_box is freed
*****************************************************************************/ *****************************************************************************/
void MP4_BoxFree( input_thread_t *p_input, MP4_Box_t *p_box ); void MP4_BoxFree( input_thread_t *p_input, MP4_Box_t *p_box );
...@@ -838,125 +824,3 @@ MP4_Box_t *MP4_BoxGet( MP4_Box_t *p_box, char *psz_fmt, ... ); ...@@ -838,125 +824,3 @@ MP4_Box_t *MP4_BoxGet( MP4_Box_t *p_box, char *psz_fmt, ... );
*****************************************************************************/ *****************************************************************************/
int MP4_BoxCount( MP4_Box_t *p_box, char *psz_fmt, ... ); int MP4_BoxCount( MP4_Box_t *p_box, char *psz_fmt, ... );
/*---------------------------------------------------------------------------*/
/* */
/****---------------------- Medium level functions -----------------------****/
/* */
/*---------------------------------------------------------------------------*/
#if 0
/*****************************************************************************
* MP4_CountBox: given a box, count how many child have the requested type
* FIXME : support GUUID
*****************************************************************************/
int MP4_CountBox( MP4_Box_t *p_box, uint32_t i_type );
#endif
/*****************************************************************************
* MP4_FindBox: find first box with i_type child of p_box
* return NULL if not found
*****************************************************************************/
MP4_Box_t *MP4_FindBox( MP4_Box_t *p_box, uint32_t i_type );
#if 0
/*****************************************************************************
* MP4_FindNextBox: find next box with thesame type and at the same level
* than p_box
*****************************************************************************/
MP4_Box_t *MP4_FindNextBox( MP4_Box_t *p_box );
/*****************************************************************************
* MP4_FindNbBox: find the box i_number
*****************************************************************************/
MP4_Box_t *MP4_FindNbBox( MP4_Box_t *p_box, uint32_t i_number );
#endif
/*---------------------------------------------------------------------------*/
/****----------------------- Lower level functions -----------------------****/
/**** ****/
/****------Use them only when you known what they really do and need------****/
/**** ****/
/****---------------------------------------------------------------------****/
/*---------------------------------------------------------------------------*/
/**** ------- First some function to make abstract from input -------- */
/****************************************************************************
* MP4_InputStream create an stram with an input
*
****************************************************************************/
MP4_Stream_t *MP4_InputStream( input_thread_t *p_input );
/****************************************************************************
* MP4_MemoryStream create a memory stream
* if p_buffer == NULL, will allocate a buffer of i_size, else
* it uses p_buffer XXX you have to unallocate yourself !
*
****************************************************************************/
MP4_Stream_t *MP4_MemoryStream( input_thread_t *p_input,
int i_size, uint8_t *p_buffer );
/****************************************************************************
* MP4_ReadStream read from a MP4_Stream_t
*
****************************************************************************/
int MP4_ReadStream( MP4_Stream_t *p_stream, uint8_t *p_buff, int i_size );
/****************************************************************************
* MP4_PeekStream guess it ;)
*
****************************************************************************/
int MP4_PeekStream( MP4_Stream_t *p_stream, uint8_t **pp_peek, int i_size );
/****************************************************************************
* MP4_TellStream give absolute position in the stream
* XXX for a memory stream give position from begining of the buffer
****************************************************************************/
off_t MP4_TellStream( MP4_Stream_t *p_stream );
/****************************************************************************
* MP4_SeekStream seek in a MP4_Stream_t
*
****************************************************************************/
int MP4_SeekStream( MP4_Stream_t *p_stream, off_t i_pos);
/*****************************************************************************
* MP4_ReadBox : parse the actual box and the children if they exist
*
* RETURN : 1 if succes and 0 if it failed
*****************************************************************************/
int MP4_ReadBox( MP4_Stream_t *p_stream, MP4_Box_t *p_box, MP4_Box_t *p_father );
/*****************************************************************************
* MP4_ReadBoxCommon : Load only common parameters for all boxes
*****************************************************************************
* p_box need to be an already allocated MP4_Box_t, and all data
* will only be peek not read
*
* RETURN : 0 if it fail, 1 otherwise
*****************************************************************************/
int MP4_ReadBoxCommon( MP4_Stream_t *p_stream, MP4_Box_t *p_box );
/*****************************************************************************
* MP4_MP4_GotoBox : Go to this particular box
*****************************************************************************
* RETURN : 0 if it fail, 1 otherwise
*****************************************************************************/
int MP4_GotoBox( MP4_Stream_t *p_stream, MP4_Box_t *p_box );
/*****************************************************************************
* MP4_MP4_NextBox : Go to the next box wiithin p_box->p_father
*****************************************************************************
* if p_box == NULL, go to the next box in witch we are( at the begining ).
*****************************************************************************/
int MP4_NextBox( MP4_Stream_t *p_stream, MP4_Box_t *p_box );
...@@ -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.35 2003/09/07 22:48:29 fenrir Exp $ * $Id: mp4.c,v 1.36 2003/09/08 00:35:16 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
...@@ -138,21 +138,28 @@ static int Open( vlc_object_t * p_this ) ...@@ -138,21 +138,28 @@ static int Open( vlc_object_t * p_this )
p_input->pf_demux = Demux; p_input->pf_demux = Demux;
p_input->pf_demux_control = Control; p_input->pf_demux_control = Control;
/* create our structure that will contains all data */ /* create our structure that will contains all data */
p_input->p_demux_data = p_demux = malloc( sizeof( demux_sys_t ) ); p_input->p_demux_data = p_demux = malloc( sizeof( demux_sys_t ) );
memset( p_demux, 0, sizeof( demux_sys_t ) ); memset( p_demux, 0, sizeof( demux_sys_t ) );
/* Create stream facilities */
if( ( p_demux->s= stream_OpenInput( p_input ) ) == NULL )
{
msg_Err( p_input, "cannot create stream_t" );
free( p_demux );
return VLC_EGENERIC;
}
/* Now load all boxes ( except raw data ) */ /* Now load all boxes ( except raw data ) */
if( !MP4_BoxGetRoot( p_input, &p_demux->box_root ) ) if( ( p_demux->p_root = MP4_BoxGetRoot( p_input ) ) == NULL )
{ {
msg_Warn( p_input, "MP4 plugin discarded (not a valid file)" ); msg_Warn( p_input, "MP4 plugin discarded (not a valid file)" );
return VLC_EGENERIC; goto error;
} }
MP4_BoxDumpStructure( p_input, &p_demux->box_root ); MP4_BoxDumpStructure( p_input, p_demux->p_root );
if( ( p_ftyp = MP4_BoxGet( &p_demux->box_root, "/ftyp" ) ) ) if( ( p_ftyp = MP4_BoxGet( p_demux->p_root, "/ftyp" ) ) )
{ {
switch( p_ftyp->data.p_ftyp->i_major_brand ) switch( p_ftyp->data.p_ftyp->i_major_brand )
{ {
...@@ -174,9 +181,9 @@ static int Open( vlc_object_t * p_this ) ...@@ -174,9 +181,9 @@ static int Open( 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" ) <= 0 ) if( MP4_BoxCount( p_demux->p_root, "/moov" ) <= 0 )
{ {
MP4_Box_t *p_foov = MP4_BoxGet( &p_demux->box_root, "/foov" ); MP4_Box_t *p_foov = MP4_BoxGet( p_demux->p_root, "/foov" );
if( !p_foov ) if( !p_foov )
{ {
...@@ -187,7 +194,7 @@ static int Open( vlc_object_t * p_this ) ...@@ -187,7 +194,7 @@ static int Open( vlc_object_t * p_this )
p_foov->i_type = FOURCC_moov; p_foov->i_type = FOURCC_moov;
} }
if( ( p_rmra = MP4_BoxGet( &p_demux->box_root, "/moov/rmra" ) ) ) if( ( p_rmra = MP4_BoxGet( p_demux->p_root, "/moov/rmra" ) ) )
{ {
playlist_t *p_playlist; playlist_t *p_playlist;
int i_count = MP4_BoxCount( p_rmra, "rmda" ); int i_count = MP4_BoxCount( p_rmra, "rmda" );
...@@ -267,7 +274,7 @@ static int Open( vlc_object_t * p_this ) ...@@ -267,7 +274,7 @@ static int Open( vlc_object_t * p_this )
} }
} }
if( !(p_mvhd = MP4_BoxGet( &p_demux->box_root, "/moov/mvhd" ) ) ) if( !(p_mvhd = MP4_BoxGet( p_demux->p_root, "/moov/mvhd" ) ) )
{ {
if( !p_rmra ) if( !p_rmra )
{ {
...@@ -288,7 +295,7 @@ static int Open( vlc_object_t * p_this ) ...@@ -288,7 +295,7 @@ static int Open( vlc_object_t * p_this )
} }
if( !( p_demux->i_tracks = if( !( p_demux->i_tracks =
MP4_BoxCount( &p_demux->box_root, "/moov/trak" ) ) ) MP4_BoxCount( p_demux->p_root, "/moov/trak" ) ) )
{ {
msg_Err( p_input, "cannot find any /moov/trak" ); msg_Err( p_input, "cannot find any /moov/trak" );
goto error; goto error;
...@@ -332,7 +339,7 @@ static int Open( vlc_object_t * p_this ) ...@@ -332,7 +339,7 @@ static int Open( vlc_object_t * p_this )
/* now process each track and extract all usefull informations */ /* now process each track and extract all usefull informations */
for( i = 0; i < p_demux->i_tracks; i++ ) for( i = 0; i < p_demux->i_tracks; i++ )
{ {
p_trak = MP4_BoxGet( &p_demux->box_root, "/moov/trak[%d]", i ); p_trak = MP4_BoxGet( p_demux->p_root, "/moov/trak[%d]", i );
MP4_TrackCreate( p_input, &p_demux->track[i], p_trak ); MP4_TrackCreate( p_input, &p_demux->track[i], p_trak );
if( p_demux->track[i].b_ok ) if( p_demux->track[i].b_ok )
...@@ -391,7 +398,12 @@ static int Open( vlc_object_t * p_this ) ...@@ -391,7 +398,12 @@ static int Open( vlc_object_t * p_this )
return VLC_SUCCESS; return VLC_SUCCESS;
error: error:
Close( VLC_OBJECT( p_input ) ); stream_Release( p_demux->s );
if( p_demux->p_root )
{
MP4_BoxFree( p_input, p_demux->p_root );
}
free( p_demux );
return VLC_EGENERIC; return VLC_EGENERIC;
} }
...@@ -491,7 +503,6 @@ static int Demux( input_thread_t *p_input ) ...@@ -491,7 +503,6 @@ static int Demux( input_thread_t *p_input )
size_t i_size; size_t i_size;
off_t i_pos; off_t i_pos;
data_packet_t *p_data;
pes_packet_t *p_pes; pes_packet_t *p_pes;
/* caculate size and position for this sample */ /* caculate size and position for this sample */
...@@ -502,44 +513,20 @@ static int Demux( input_thread_t *p_input ) ...@@ -502,44 +513,20 @@ static int Demux( input_thread_t *p_input )
//msg_Dbg( p_input, "stream %d size=%6d pos=%8lld", i_track, i_size, i_pos ); //msg_Dbg( p_input, "stream %d size=%6d pos=%8lld", i_track, i_size, i_pos );
/* go,go go ! */ /* go,go go ! */
if( MP4_SeekAbsolute( p_input, i_pos ) ) if( stream_Seek( p_demux->s, i_pos ) )
{ {
msg_Warn( p_input, "track[0x%x] will be disabled (eof?)", track.i_track_ID ); msg_Warn( p_input, "track[0x%x] will be disabled (eof?)", track.i_track_ID );
MP4_TrackUnselect( p_input, &track ); MP4_TrackUnselect( p_input, &track );
break; break;
} }
/* now read pes */
/* now create a pes */ if( ( p_pes = stream_PesPacket( p_demux->s, i_size ) ) == NULL )
if( !(p_pes = input_NewPES( p_input->p_method_data ) ) )
{ {
break;
}
/* and a data packet for the data */
if( !(p_data = input_NewPacket( p_input->p_method_data, i_size ) ) )
{
input_DeletePES( p_input->p_method_data, p_pes );
break;
}
p_data->p_payload_end = p_data->p_payload_start + i_size;
/* initialisation of all the field */
p_pes->i_dts = p_pes->i_pts = 0;
p_pes->p_first = p_pes->p_last = p_data;
p_pes->i_nb_data = 1;
p_pes->i_pes_size = i_size;
if( i_size > 0 )
{
if( MP4_ReadData( p_input, p_data->p_payload_start, i_size ) )
{
input_DeletePES( p_input->p_method_data, p_pes );
msg_Warn( p_input, "track[0x%x] will be disabled (eof?)", track.i_track_ID ); msg_Warn( p_input, "track[0x%x] will be disabled (eof?)", track.i_track_ID );
MP4_TrackUnselect( p_input, &track ); MP4_TrackUnselect( p_input, &track );
break; break;
} }
}
p_pes->i_dts = p_pes->i_dts =
p_pes->i_pts = input_ClockGetTS( p_input, p_pes->i_pts = input_ClockGetTS( p_input,
p_input->stream.p_selected_program, p_input->stream.p_selected_program,
...@@ -657,7 +644,8 @@ static void Close ( vlc_object_t * p_this ) ...@@ -657,7 +644,8 @@ static void Close ( vlc_object_t * p_this )
demux_sys_t *p_demux = p_input->p_demux_data; demux_sys_t *p_demux = p_input->p_demux_data;
msg_Dbg( p_input, "freeing all memory" ); msg_Dbg( p_input, "freeing all memory" );
MP4_BoxFree( p_input, &p_demux->box_root );
MP4_BoxFree( p_input, p_demux->p_root );
for( i_track = 0; i_track < p_demux->i_tracks; i_track++ ) for( i_track = 0; i_track < p_demux->i_tracks; i_track++ )
{ {
MP4_TrackDestroy( p_input, &p_demux->track[i_track] ); MP4_TrackDestroy( p_input, &p_demux->track[i_track] );
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* mp4.h : MP4 file input module for vlc * mp4.h : MP4 file input module for vlc
***************************************************************************** *****************************************************************************
* Copyright (C) 2001 VideoLAN * Copyright (C) 2001 VideoLAN
* $Id: mp4.h,v 1.6 2003/03/11 18:57:51 fenrir Exp $ * $Id: mp4.h,v 1.7 2003/09/08 00:35:16 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
...@@ -127,7 +127,9 @@ typedef struct track_data_mp4_s ...@@ -127,7 +127,9 @@ typedef struct track_data_mp4_s
*****************************************************************************/ *****************************************************************************/
struct demux_sys_t struct demux_sys_t
{ {
MP4_Box_t box_root; /* container for the whole file */ stream_t *s;
MP4_Box_t *p_root; /* container for the whole file */
mtime_t i_pcr; mtime_t i_pcr;
......
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