1 /*****************************************************************************
2 * mp4.h : MP4 file input module for vlc
3 *****************************************************************************
4 * Copyright (C) 2001 VideoLAN
5 * $Id: mp4.h,v 1.9 2003/11/27 12:32:51 fenrir 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 */
92 /*****************************************************************************
94 *****************************************************************************/
97 MP4_Box_t *p_root; /* container for the whole file */
101 uint64_t i_time; /* time position of the presentation
102 * in movie timescale */
103 uint64_t i_timescale; /* movie time scale */
104 uint64_t i_duration; /* movie duration */
105 unsigned int i_tracks; /* number of tracks */
106 track_data_mp4_t *track; /* array of track */
110 static inline uint64_t MP4_GetTrackPos( track_data_mp4_t *p_track )
112 unsigned int i_sample;
116 i_pos = p_track->chunk[p_track->i_chunk].i_offset;
118 if( p_track->i_sample_size )
120 i_pos += ( p_track->i_sample -
121 p_track->chunk[p_track->i_chunk].i_sample_first ) *
122 p_track->i_sample_size;
126 for( i_sample = p_track->chunk[p_track->i_chunk].i_sample_first;
127 i_sample < p_track->i_sample; i_sample++ )
129 i_pos += p_track->p_sample_size[i_sample];
137 /* Return time in µs of a track */
138 static inline mtime_t MP4_GetTrackPTS( track_data_mp4_t *p_track )
140 unsigned int i_sample;
141 unsigned int i_index;
144 i_sample = p_track->i_sample - p_track->chunk[p_track->i_chunk].i_sample_first;
145 i_dts = p_track->chunk[p_track->i_chunk].i_first_dts;
147 while( i_sample > 0 )
149 if( i_sample > p_track->chunk[p_track->i_chunk].p_sample_count_dts[i_index] )
151 i_dts += p_track->chunk[p_track->i_chunk].p_sample_count_dts[i_index] *
152 p_track->chunk[p_track->i_chunk].p_sample_delta_dts[i_index];
153 i_sample -= p_track->chunk[p_track->i_chunk].p_sample_count_dts[i_index];
159 p_track->chunk[p_track->i_chunk].p_sample_delta_dts[i_index];
167 (mtime_t)p_track->i_timescale ) );
170 static inline mtime_t MP4_GetMoviePTS(demux_sys_t *p_demux )
174 (mtime_t)p_demux->i_time /
175 (mtime_t)p_demux->i_timescale )