]> git.sesse.net Git - vlc/blob - modules/demux/ogg.h
demux: ogg: don't recreate decoders on same chained streams.
[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 /*****************************************************************************
26  * Definitions of structures and functions used by this plugin
27  *****************************************************************************/
28
29 //#define OGG_DEMUX_DEBUG 1
30 #ifdef OGG_DEMUX_DEBUG
31   #define DemuxDebug(code) code
32 #else
33   #define DemuxDebug(code)
34 #endif
35
36 /* Some defines from OggDS http://svn.xiph.org/trunk/oggds/ */
37 #define PACKET_TYPE_HEADER   0x01
38 #define PACKET_TYPE_BITS     0x07
39 #define PACKET_LEN_BITS01    0xc0
40 #define PACKET_LEN_BITS2     0x02
41 #define PACKET_IS_SYNCPOINT  0x08
42
43 typedef struct oggseek_index_entry demux_index_entry_t;
44 typedef struct ogg_skeleton_t ogg_skeleton_t;
45
46 typedef struct logical_stream_s
47 {
48     ogg_stream_state os;                        /* logical stream of packets */
49
50     es_format_t      fmt;
51     es_format_t      fmt_old;                  /* format of old ES is reused */
52     es_out_id_t      *p_es;
53     double           f_rate;
54
55     int              i_serial_no;
56
57     /* the header of some logical streams (eg vorbis) contain essential
58      * data for the decoder. We back them up here in case we need to re-feed
59      * them to the decoder. */
60     bool             b_force_backup;
61     bool             b_have_updated_format;
62     int              i_packets_backup;
63     int32_t          i_extra_headers_packets;
64     void             *p_headers;
65     int              i_headers;
66     ogg_int64_t      i_previous_granulepos;
67
68     /* program clock reference (in units of 90kHz) derived from the previous
69      * granulepos */
70     mtime_t          i_pcr;
71     mtime_t          i_interpolated_pcr;
72     mtime_t          i_previous_pcr;
73
74     /* Misc */
75     bool b_initializing;
76     bool b_finished;
77     bool b_reinit;
78     bool b_reusing_with_other_fmt;
79     bool b_oggds;
80     int i_granule_shift;
81
82     /* Opus has a starting offset in the headers. */
83     int i_pre_skip;
84     /* Vorbis and Opus can trim the end of a stream using granule positions. */
85     int i_end_trim;
86
87     /* offset of first keyframe for theora; can be 0 or 1 depending on version number */
88     int8_t i_keyframe_offset;
89
90     /* keyframe index for seeking, created as we discover keyframes */
91     demux_index_entry_t *idx;
92
93     /* Skeleton data */
94     ogg_skeleton_t *p_skel;
95
96     /* skip some frames after a seek */
97     int i_skip_frames;
98
99     /* data start offset (absolute) in bytes */
100     int64_t i_data_start;
101
102     /* kate streams have the number of headers in the ID header */
103     int i_kate_num_headers;
104
105     /* for Annodex logical bitstreams */
106     int i_secondary_header_packets;
107
108     block_t *p_preparse_block;
109 } logical_stream_t;
110
111 struct ogg_skeleton_t
112 {
113     int            i_messages;
114     char         **ppsz_messages;
115     unsigned char *p_index;
116     uint64_t       i_index;
117     uint64_t       i_index_size;
118     int64_t        i_indexstampden;/* time denominator */
119     int64_t        i_indexfirstnum;/* first sample time numerator */
120     int64_t        i_indexlastnum;
121 };
122
123 struct demux_sys_t
124 {
125     ogg_sync_state oy;        /* sync and verify incoming physical bitstream */
126
127     int i_streams;                           /* number of logical bitstreams */
128     logical_stream_t **pp_stream;  /* pointer to an array of logical streams */
129     logical_stream_t *p_skelstream; /* pointer to skeleton stream if any */
130
131     logical_stream_t *p_old_stream; /* pointer to a old logical stream to avoid recreating it */
132
133     /* program clock reference (in units of 90kHz) derived from the pcr of
134      * the sub-streams */
135     mtime_t i_pcr;
136
137     /* new stream or starting from a chain */
138     bool b_chained_boundary;
139
140     /* bitrate */
141     int     i_bitrate;
142     bool    b_partial_bitrate;
143
144     /* after reading all headers, the first data page is stuffed into the relevant stream, ready to use */
145     bool    b_page_waiting;
146
147     /* count of total frames in video stream */
148     int64_t i_total_frames;
149
150     /* length of file in bytes */
151     int64_t i_total_length;
152
153     /* offset position in file (for reading) */
154     int64_t i_input_position;
155
156     /* current page being parsed */
157     ogg_page current_page;
158
159     /* */
160     vlc_meta_t          *p_meta;
161     int                 i_seekpoints;
162     seekpoint_t         **pp_seekpoints;
163
164     /* skeleton */
165     struct
166     {
167         uint16_t major;
168         uint16_t minor;
169     } skeleton;
170
171     /* */
172     int                 i_attachments;
173     input_attachment_t  **attachments;
174
175     /* preparsing info */
176     bool b_preparsing_done;
177
178     /* Length, if available. */
179     int64_t i_length;
180
181     DemuxDebug( bool b_seeked; )
182 };
183
184
185 unsigned const char * Read7BitsVariableLE( unsigned const char *,
186                                            unsigned const char *,
187                                            uint64_t * );
188 bool Ogg_GetBoundsUsingSkeletonIndex( logical_stream_t *p_stream, int64_t i_time,
189                                       int64_t *pi_lower, int64_t *pi_upper );