annotate oggdec.h @ 5812:c66b238d4d33 libavformat

oggdec: Parse skeleton to determine the start time of each stream
author conrad
date Thu, 11 Mar 2010 07:17:40 +0000
parents 5e9709333748
children 1a3c4f74f17d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2714
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
1 /**
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
2 Copyright (C) 2005 Michael Ahlberg, Måns Rullgård
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
3
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
4 Permission is hereby granted, free of charge, to any person
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
5 obtaining a copy of this software and associated documentation
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
6 files (the "Software"), to deal in the Software without
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
7 restriction, including without limitation the rights to use, copy,
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
8 modify, merge, publish, distribute, sublicense, and/or sell copies
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
9 of the Software, and to permit persons to whom the Software is
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
10 furnished to do so, subject to the following conditions:
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
11
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
12 The above copyright notice and this permission notice shall be
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
13 included in all copies or substantial portions of the Software.
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
14
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
16 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
17 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
18 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
19 HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
20 WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
22 DEALINGS IN THE SOFTWARE.
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
23 **/
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
24
3852
1b6245500d8c Globally rename the header inclusion guard names.
stefano
parents: 3770
diff changeset
25 #ifndef AVFORMAT_OGGDEC_H
1b6245500d8c Globally rename the header inclusion guard names.
stefano
parents: 3770
diff changeset
26 #define AVFORMAT_OGGDEC_H
2714
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
27
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
28 #include "avformat.h"
5032
3aabdadf9d5f Add a VorbisComment metadata conversion table and use it in the FLAC and
jbr
parents: 4911
diff changeset
29 #include "metadata.h"
2714
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
30
4016
6cd006bc2de9 OGG: untypedef demuxer structs
mru
parents: 3852
diff changeset
31 struct ogg_codec {
3019
46c79fb51125 String pointers of ogg_codec_t should have const attribute.
reimar
parents: 2998
diff changeset
32 const int8_t *magic;
2714
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
33 uint8_t magicsize;
3019
46c79fb51125 String pointers of ogg_codec_t should have const attribute.
reimar
parents: 2998
diff changeset
34 const int8_t *name;
4764
c6abeafbec30 Document ogg_codec's header function
conrad
parents: 4058
diff changeset
35 /**
c6abeafbec30 Document ogg_codec's header function
conrad
parents: 4058
diff changeset
36 * Attempt to process a packet as a header
c6abeafbec30 Document ogg_codec's header function
conrad
parents: 4058
diff changeset
37 * @return 1 if the packet was a valid header,
c6abeafbec30 Document ogg_codec's header function
conrad
parents: 4058
diff changeset
38 * 0 if the packet was not a header (was a data packet)
c6abeafbec30 Document ogg_codec's header function
conrad
parents: 4058
diff changeset
39 * -1 if an error occurred or for unsupported stream
c6abeafbec30 Document ogg_codec's header function
conrad
parents: 4058
diff changeset
40 */
2714
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
41 int (*header)(AVFormatContext *, int);
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
42 int (*packet)(AVFormatContext *, int);
5514
52c7b29eca31 oggdec: Set dts when known
conrad
parents: 5512
diff changeset
43 /**
52c7b29eca31 oggdec: Set dts when known
conrad
parents: 5512
diff changeset
44 * Translate a granule into a timestamp.
52c7b29eca31 oggdec: Set dts when known
conrad
parents: 5512
diff changeset
45 * Will set dts if non-null and known.
52c7b29eca31 oggdec: Set dts when known
conrad
parents: 5512
diff changeset
46 * @return pts
52c7b29eca31 oggdec: Set dts when known
conrad
parents: 5512
diff changeset
47 */
52c7b29eca31 oggdec: Set dts when known
conrad
parents: 5512
diff changeset
48 uint64_t (*gptopts)(AVFormatContext *, int, uint64_t, int64_t *dts);
5434
68c8e7affd44 Fix PTS for OGM codecs.
conrad
parents: 5276
diff changeset
49 /**
68c8e7affd44 Fix PTS for OGM codecs.
conrad
parents: 5276
diff changeset
50 * 1 if granule is the start time of the associated packet.
68c8e7affd44 Fix PTS for OGM codecs.
conrad
parents: 5276
diff changeset
51 * 0 if granule is the end time of the associated packet.
68c8e7affd44 Fix PTS for OGM codecs.
conrad
parents: 5276
diff changeset
52 */
68c8e7affd44 Fix PTS for OGM codecs.
conrad
parents: 5276
diff changeset
53 int granule_is_start;
4016
6cd006bc2de9 OGG: untypedef demuxer structs
mru
parents: 3852
diff changeset
54 };
2714
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
55
4016
6cd006bc2de9 OGG: untypedef demuxer structs
mru
parents: 3852
diff changeset
56 struct ogg_stream {
2714
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
57 uint8_t *buf;
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
58 unsigned int bufsize;
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
59 unsigned int bufpos;
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
60 unsigned int pstart;
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
61 unsigned int psize;
2732
2b101e9d25c0 set PKT_FLAG_KEY for Theora and OGM streams
mru
parents: 2714
diff changeset
62 unsigned int pflags;
5276
5de92e352cf9 Calculate correct packet durations when demuxing Ogg/Speex. This involves
jbr
parents: 5032
diff changeset
63 unsigned int pduration;
2714
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
64 uint32_t serial;
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
65 uint32_t seq;
5434
68c8e7affd44 Fix PTS for OGM codecs.
conrad
parents: 5276
diff changeset
66 uint64_t granule;
68c8e7affd44 Fix PTS for OGM codecs.
conrad
parents: 5276
diff changeset
67 int64_t lastpts;
5514
52c7b29eca31 oggdec: Set dts when known
conrad
parents: 5512
diff changeset
68 int64_t lastdts;
5808
9145ca829bce oggdec: Save offset of the page needed to reconstruct the current packet
conrad
parents: 5637
diff changeset
69 int64_t sync_pos; ///< file offset of the first page needed to reconstruct the current packet
9145ca829bce oggdec: Save offset of the page needed to reconstruct the current packet
conrad
parents: 5637
diff changeset
70 int64_t page_pos; ///< file offset of the current page
2714
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
71 int flags;
4911
42098ccb51ab Warning fix: Make ogg_stream.codec const
conrad
parents: 4764
diff changeset
72 const struct ogg_codec *codec;
2714
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
73 int header;
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
74 int nsegs, segp;
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
75 uint8_t segments[255];
5637
37e2c3e635b3 Fix playback with invalid files that don't set the continuation flag for
conrad
parents: 5514
diff changeset
76 int incomplete; ///< whether we're expecting a continuation in the next page
5434
68c8e7affd44 Fix PTS for OGM codecs.
conrad
parents: 5276
diff changeset
77 int page_end; ///< current packet is the last one completed in the page
2714
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
78 void *private;
4016
6cd006bc2de9 OGG: untypedef demuxer structs
mru
parents: 3852
diff changeset
79 };
2714
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
80
4016
6cd006bc2de9 OGG: untypedef demuxer structs
mru
parents: 3852
diff changeset
81 struct ogg_state {
2714
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
82 uint64_t pos;
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
83 int curidx;
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
84 struct ogg_state *next;
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
85 int nstreams;
4016
6cd006bc2de9 OGG: untypedef demuxer structs
mru
parents: 3852
diff changeset
86 struct ogg_stream streams[1];
6cd006bc2de9 OGG: untypedef demuxer structs
mru
parents: 3852
diff changeset
87 };
2714
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
88
4016
6cd006bc2de9 OGG: untypedef demuxer structs
mru
parents: 3852
diff changeset
89 struct ogg {
6cd006bc2de9 OGG: untypedef demuxer structs
mru
parents: 3852
diff changeset
90 struct ogg_stream *streams;
2714
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
91 int nstreams;
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
92 int headers;
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
93 int curidx;
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
94 uint64_t size;
4016
6cd006bc2de9 OGG: untypedef demuxer structs
mru
parents: 3852
diff changeset
95 struct ogg_state *state;
6cd006bc2de9 OGG: untypedef demuxer structs
mru
parents: 3852
diff changeset
96 };
2714
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
97
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
98 #define OGG_FLAG_CONT 1
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
99 #define OGG_FLAG_BOS 2
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
100 #define OGG_FLAG_EOS 4
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
101
5512
60671fac35ad Add support for dirac in ogg
conrad
parents: 5434
diff changeset
102 extern const struct ogg_codec ff_dirac_codec;
4016
6cd006bc2de9 OGG: untypedef demuxer structs
mru
parents: 3852
diff changeset
103 extern const struct ogg_codec ff_flac_codec;
6cd006bc2de9 OGG: untypedef demuxer structs
mru
parents: 3852
diff changeset
104 extern const struct ogg_codec ff_ogm_audio_codec;
6cd006bc2de9 OGG: untypedef demuxer structs
mru
parents: 3852
diff changeset
105 extern const struct ogg_codec ff_ogm_old_codec;
6cd006bc2de9 OGG: untypedef demuxer structs
mru
parents: 3852
diff changeset
106 extern const struct ogg_codec ff_ogm_text_codec;
6cd006bc2de9 OGG: untypedef demuxer structs
mru
parents: 3852
diff changeset
107 extern const struct ogg_codec ff_ogm_video_codec;
5512
60671fac35ad Add support for dirac in ogg
conrad
parents: 5434
diff changeset
108 extern const struct ogg_codec ff_old_dirac_codec;
4016
6cd006bc2de9 OGG: untypedef demuxer structs
mru
parents: 3852
diff changeset
109 extern const struct ogg_codec ff_old_flac_codec;
5812
c66b238d4d33 oggdec: Parse skeleton to determine the start time of each stream
conrad
parents: 5811
diff changeset
110 extern const struct ogg_codec ff_skeleton_codec;
4016
6cd006bc2de9 OGG: untypedef demuxer structs
mru
parents: 3852
diff changeset
111 extern const struct ogg_codec ff_speex_codec;
6cd006bc2de9 OGG: untypedef demuxer structs
mru
parents: 3852
diff changeset
112 extern const struct ogg_codec ff_theora_codec;
6cd006bc2de9 OGG: untypedef demuxer structs
mru
parents: 3852
diff changeset
113 extern const struct ogg_codec ff_vorbis_codec;
2714
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
114
5032
3aabdadf9d5f Add a VorbisComment metadata conversion table and use it in the FLAC and
jbr
parents: 4911
diff changeset
115 extern const AVMetadataConv ff_vorbiscomment_metadata_conv[];
3aabdadf9d5f Add a VorbisComment metadata conversion table and use it in the FLAC and
jbr
parents: 4911
diff changeset
116
4058
dcdf236c9909 Delete unnecessary 'extern' keywords.
diego
parents: 4016
diff changeset
117 int vorbis_comment(AVFormatContext *ms, uint8_t *buf, int size);
2714
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
118
5810
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
119 static inline int
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
120 ogg_find_stream (struct ogg * ogg, int serial)
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
121 {
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
122 int i;
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
123
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
124 for (i = 0; i < ogg->nstreams; i++)
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
125 if (ogg->streams[i].serial == serial)
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
126 return i;
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
127
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
128 return -1;
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
129 }
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
130
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
131 static inline uint64_t
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
132 ogg_gptopts (AVFormatContext * s, int i, uint64_t gp, int64_t *dts)
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
133 {
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
134 struct ogg *ogg = s->priv_data;
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
135 struct ogg_stream *os = ogg->streams + i;
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
136 uint64_t pts = AV_NOPTS_VALUE;
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
137
5811
5e9709333748 oggdec: Check that we have a codec in gptopts (needed for skeleton)
conrad
parents: 5810
diff changeset
138 if(os->codec && os->codec->gptopts){
5810
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
139 pts = os->codec->gptopts(s, i, gp, dts);
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
140 } else {
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
141 pts = gp;
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
142 if (dts)
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
143 *dts = pts;
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
144 }
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
145
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
146 return pts;
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
147 }
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
148
3852
1b6245500d8c Globally rename the header inclusion guard names.
stefano
parents: 3770
diff changeset
149 #endif /* AVFORMAT_OGGDEC_H */