1 /*****************************************************************************
2 * mp4.h : MP4 file input module for vlc
3 *****************************************************************************
4 * Copyright (C) 2001 VideoLAN
5 * $Id: mp4.h,v 1.10 2004/01/05 12:37:52 jlj Exp $
6 * Authors: Laurent Aimar <fenrir@via.ecp.fr>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
21 *****************************************************************************/
24 /*****************************************************************************
25 * Contain all information about a chunk
26 *****************************************************************************/
27 typedef struct chunk_data_mp4_s
29 uint64_t i_offset; /* absolute position of this chunk in the file */
30 uint32_t i_sample_description_index; /* index for SampleEntry to use */
31 uint32_t i_sample_count; /* how many samples in this chunk */
32 uint32_t i_sample_first; /* index of the first sample in this chunk */
34 /* now provide way to calculate pts, dts, and offset without to
35 much memory and with fast acces */
37 /* with this we can calculate dts/pts without waste memory */
39 uint32_t *p_sample_count_dts;
40 uint32_t *p_sample_delta_dts; /* dts delta */
42 /* TODO if needed add pts
43 but quickly *add* support for edts and seeking */
48 /*****************************************************************************
49 * Contain all needed information for read all track with vlc
50 *****************************************************************************/
51 typedef struct track_data_mp4_s
53 int i_track_ID; /* this should be unique */
55 int b_ok; /* The track is usable */
56 int b_enable; /* is the trak enable by default */
57 vlc_bool_t b_selected; /* is the trak being played */
62 /* display size only ! */
66 /* more internal data */
67 uint64_t i_timescale; /* time scale for this track only */
69 /* give the next sample to read, i_chunk is to find quickly where
70 the sample is located */
71 uint32_t i_sample; /* next sample to read */
72 uint32_t i_chunk; /* chunk where next sample is stored */
73 /* total count of chunk and sample */
74 uint32_t i_chunk_count;
75 uint32_t i_sample_count;
77 chunk_data_mp4_t *chunk; /* always defined for each chunk */
79 /* sample size, p_sample_size defined only if i_sample_size == 0
80 else i_sample_size is size for all sample */
81 uint32_t i_sample_size;
82 uint32_t *p_sample_size; /* XXX perhaps add file offset if take
83 too much time to do sumations each time*/
85 MP4_Box_t *p_stbl; /* will contain all timing information */
86 MP4_Box_t *p_stsd; /* will contain all data to initialize decoder */
87 MP4_Box_t *p_sample;/* point on actual sdsd */
94 /*****************************************************************************
96 *****************************************************************************/
99 MP4_Box_t *p_root; /* container for the whole file */
103 uint64_t i_time; /* time position of the presentation
104 * in movie timescale */
105 uint64_t i_timescale; /* movie time scale */
106 uint64_t i_duration; /* movie duration */
107 unsigned int i_tracks; /* number of tracks */
108 track_data_mp4_t *track; /* array of track */
112 static inline uint64_t MP4_GetTrackPos( track_data_mp4_t *p_track )
114 unsigned int i_sample;
118 i_pos = p_track->chunk[p_track->i_chunk].i_offset;
120 if( p_track->i_sample_size )
122 i_pos += ( p_track->i_sample -
123 p_track->chunk[p_track->i_chunk].i_sample_first ) *
124 p_track->i_sample_size;
128 for( i_sample = p_track->chunk[p_track->i_chunk].i_sample_first;
129 i_sample < p_track->i_sample; i_sample++ )
131 i_pos += p_track->p_sample_size[i_sample];
139 /* Return time in µs of a track */
140 static inline mtime_t MP4_GetTrackPTS( track_data_mp4_t *p_track )
142 unsigned int i_sample;
143 unsigned int i_index;
146 i_sample = p_track->i_sample - p_track->chunk[p_track->i_chunk].i_sample_first;
147 i_dts = p_track->chunk[p_track->i_chunk].i_first_dts;
149 while( i_sample > 0 )
151 if( i_sample > p_track->chunk[p_track->i_chunk].p_sample_count_dts[i_index] )
153 i_dts += p_track->chunk[p_track->i_chunk].p_sample_count_dts[i_index] *
154 p_track->chunk[p_track->i_chunk].p_sample_delta_dts[i_index];
155 i_sample -= p_track->chunk[p_track->i_chunk].p_sample_count_dts[i_index];
161 p_track->chunk[p_track->i_chunk].p_sample_delta_dts[i_index];
169 (mtime_t)p_track->i_timescale ) );
172 static inline mtime_t MP4_GetMoviePTS(demux_sys_t *p_demux )
176 (mtime_t)p_demux->i_time /
177 (mtime_t)p_demux->i_timescale )