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