]> git.sesse.net Git - vlc/blob - modules/demux/ogg.h
mp4 demux: fix memory leak when demuxing (e)ac-3
[vlc] / modules / demux / ogg.h
1 /*****************************************************************************
2  * ogg.h : ogg stream demux module for vlc
3  *****************************************************************************
4  * Copyright (C) 2001-2010 VLC authors and VideoLAN
5  *
6  * Authors: Gildas Bazin <gbazin@netcourrier.com>
7  *          Andre Pang <Andre.Pang@csiro.au> (Annodex support)
8  *          Gabriel Finch <salsaman@gmail.com> (moved from ogg.c to ogg.h)
9  *
10  * This program is free software; you can redistribute it and/or modify it
11  * under the terms of the GNU Lesser General Public License as published by
12  * the Free Software Foundation; either version 2.1 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  * GNU Lesser General Public License for more details.
19  *
20  * You should have received a copy of the GNU Lesser General Public License
21  * along with this program; if not, write to the Free Software Foundation,
22  * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23  *****************************************************************************/
24
25 #ifdef HAVE_CONFIG_H
26 # include "config.h"
27 #endif
28
29 #ifdef HAVE_LIBVORBIS
30   #include <vorbis/codec.h>
31 #endif
32
33 /*****************************************************************************
34  * Definitions of structures and functions used by this plugin
35  *****************************************************************************/
36
37 //#define OGG_DEMUX_DEBUG 1
38 #ifdef OGG_DEMUX_DEBUG
39   #define DemuxDebug(code) code
40 #else
41   #define DemuxDebug(code)
42 #endif
43
44 /* Some defines from OggDS http://svn.xiph.org/trunk/oggds/ */
45 #define PACKET_TYPE_HEADER   0x01
46 #define PACKET_TYPE_BITS     0x07
47 #define PACKET_LEN_BITS01    0xc0
48 #define PACKET_LEN_BITS2     0x02
49 #define PACKET_IS_SYNCPOINT  0x08
50
51 typedef struct oggseek_index_entry demux_index_entry_t;
52 typedef struct ogg_skeleton_t ogg_skeleton_t;
53
54 typedef struct backup_queue
55 {
56     block_t *p_block;
57     mtime_t i_duration;
58 } backup_queue_t;
59
60 typedef struct logical_stream_s
61 {
62     ogg_stream_state os;                        /* logical stream of packets */
63
64     es_format_t      fmt;
65     es_format_t      fmt_old;                  /* format of old ES is reused */
66     es_out_id_t      *p_es;
67     double           f_rate;
68
69     int              i_serial_no;
70
71     /* the header of some logical streams (eg vorbis) contain essential
72      * data for the decoder. We back them up here in case we need to re-feed
73      * them to the decoder. */
74     bool             b_force_backup;
75     int              i_packets_backup;
76     int32_t          i_extra_headers_packets;
77     void             *p_headers;
78     int              i_headers;
79     ogg_int64_t      i_previous_granulepos;
80     ogg_int64_t      i_granulepos_offset;/* first granule offset */
81
82     /* program clock reference (in units of 90kHz) derived from the previous
83      * granulepos */
84     mtime_t          i_pcr;
85     mtime_t          i_previous_pcr;
86
87     /* Misc */
88     bool b_initializing;
89     bool b_finished;
90     bool b_reinit;
91     bool b_oggds;
92     int i_granule_shift;
93
94     /* Opus has a starting offset in the headers. */
95     int i_pre_skip;
96     /* Vorbis and Opus can trim the end of a stream using granule positions. */
97     int i_end_trim;
98
99     /* offset of first keyframe for theora; can be 0 or 1 depending on version number */
100     int8_t i_keyframe_offset;
101
102     /* keyframe index for seeking, created as we discover keyframes */
103     demux_index_entry_t *idx;
104
105     /* Skeleton data */
106     ogg_skeleton_t *p_skel;
107
108     /* skip some frames after a seek */
109     unsigned int i_skip_frames;
110
111     /* data start offset (absolute) in bytes */
112     int64_t i_data_start;
113
114     /* for Annodex logical bitstreams */
115     int i_secondary_header_packets;
116
117     /* All blocks which can't be sent because track PCR isn't known yet */
118     block_t **p_prepcr_blocks;
119     int i_prepcr_blocks;
120     /* All blocks that are queued because ES isn't created yet */
121     block_t *p_preparse_block;
122
123     union
124     {
125 #ifdef HAVE_LIBVORBIS
126         struct
127         {
128             vorbis_info *p_info;
129             vorbis_comment *p_comment;
130             bool b_invalid;
131             int i_prev_blocksize;
132         } vorbis;
133 #endif
134         struct
135         {
136             /* kate streams have the number of headers in the ID header */
137             int i_num_headers;
138         } kate;
139         struct
140         {
141             bool b_interlaced;
142         } dirac;
143         struct
144         {
145             int32_t i_framesize;
146             int32_t i_framesperpacket;
147         } speex;
148     } special;
149
150 } logical_stream_t;
151
152 struct ogg_skeleton_t
153 {
154     int            i_messages;
155     char         **ppsz_messages;
156     unsigned char *p_index;
157     uint64_t       i_index;
158     uint64_t       i_index_size;
159     int64_t        i_indexstampden;/* time denominator */
160     int64_t        i_indexfirstnum;/* first sample time numerator */
161     int64_t        i_indexlastnum;
162 };
163
164 struct demux_sys_t
165 {
166     ogg_sync_state oy;        /* sync and verify incoming physical bitstream */
167
168     int i_streams;                           /* number of logical bitstreams */
169     logical_stream_t **pp_stream;  /* pointer to an array of logical streams */
170     logical_stream_t *p_skelstream; /* pointer to skeleton stream if any */
171
172     logical_stream_t *p_old_stream; /* pointer to a old logical stream to avoid recreating it */
173
174     /* program clock reference (in units of 90kHz) derived from the pcr of
175      * the sub-streams */
176     mtime_t i_pcr;
177     mtime_t i_nzpcr_offset;
178     /* informative only */
179     mtime_t i_pcr_jitter;
180     int64_t i_access_delay;
181
182     /* new stream or starting from a chain */
183     bool b_chained_boundary;
184
185     /* bitrate */
186     int     i_bitrate;
187     bool    b_partial_bitrate;
188
189     /* after reading all headers, the first data page is stuffed into the relevant stream, ready to use */
190     bool    b_page_waiting;
191
192     /* count of total frames in video stream */
193     int64_t i_total_frames;
194
195     /* length of file in bytes */
196     int64_t i_total_length;
197
198     /* offset position in file (for reading) */
199     int64_t i_input_position;
200
201     /* current page being parsed */
202     ogg_page current_page;
203
204     /* */
205     vlc_meta_t          *p_meta;
206     int                 i_seekpoints;
207     seekpoint_t         **pp_seekpoints;
208
209     /* skeleton */
210     struct
211     {
212         uint16_t major;
213         uint16_t minor;
214     } skeleton;
215
216     /* */
217     int                 i_attachments;
218     input_attachment_t  **attachments;
219
220     /* preparsing info */
221     bool b_preparsing_done;
222     bool b_es_created;
223
224     /* Length, if available. */
225     int64_t i_length;
226
227 };
228
229
230 unsigned const char * Read7BitsVariableLE( unsigned const char *,
231                                            unsigned const char *,
232                                            uint64_t * );
233 bool Ogg_GetBoundsUsingSkeletonIndex( logical_stream_t *p_stream, int64_t i_time,
234                                       int64_t *pi_lower, int64_t *pi_upper );