annotate oggdec.h @ 6455:3f50c7effad1 libavformat

rtsp: 10l, try to update the correct rtp stream This fixes a bug from rev 22917. Now RTSP streams where the individual RTCP sender reports aren't sent at the same time actually are synced properly.
author mstorsjo
date Fri, 03 Sep 2010 07:10:21 +0000
parents 4d8244eae68f
children
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;
5434
68c8e7affd44 Fix PTS for OGM codecs.
conrad
parents: 5276
diff changeset
65 uint64_t granule;
68c8e7affd44 Fix PTS for OGM codecs.
conrad
parents: 5276
diff changeset
66 int64_t lastpts;
5514
52c7b29eca31 oggdec: Set dts when known
conrad
parents: 5512
diff changeset
67 int64_t lastdts;
5808
9145ca829bce oggdec: Save offset of the page needed to reconstruct the current packet
conrad
parents: 5637
diff changeset
68 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
69 int64_t page_pos; ///< file offset of the current page
2714
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
70 int flags;
4911
42098ccb51ab Warning fix: Make ogg_stream.codec const
conrad
parents: 4764
diff changeset
71 const struct ogg_codec *codec;
2714
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
72 int header;
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
73 int nsegs, segp;
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
74 uint8_t segments[255];
5637
37e2c3e635b3 Fix playback with invalid files that don't set the continuation flag for
conrad
parents: 5514
diff changeset
75 int incomplete; ///< whether we're expecting a continuation in the next page
5434
68c8e7affd44 Fix PTS for OGM codecs.
conrad
parents: 5276
diff changeset
76 int page_end; ///< current packet is the last one completed in the page
5818
1a3c4f74f17d oggdec: Seek to keyframes
conrad
parents: 5812
diff changeset
77 int keyframe_seek;
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;
4016
6cd006bc2de9 OGG: untypedef demuxer structs
mru
parents: 3852
diff changeset
94 struct ogg_state *state;
6cd006bc2de9 OGG: untypedef demuxer structs
mru
parents: 3852
diff changeset
95 };
2714
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
96
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
97 #define OGG_FLAG_CONT 1
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
98 #define OGG_FLAG_BOS 2
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
99 #define OGG_FLAG_EOS 4
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
100
5512
60671fac35ad Add support for dirac in ogg
conrad
parents: 5434
diff changeset
101 extern const struct ogg_codec ff_dirac_codec;
4016
6cd006bc2de9 OGG: untypedef demuxer structs
mru
parents: 3852
diff changeset
102 extern const struct ogg_codec ff_flac_codec;
6cd006bc2de9 OGG: untypedef demuxer structs
mru
parents: 3852
diff changeset
103 extern const struct ogg_codec ff_ogm_audio_codec;
6cd006bc2de9 OGG: untypedef demuxer structs
mru
parents: 3852
diff changeset
104 extern const struct ogg_codec ff_ogm_old_codec;
6cd006bc2de9 OGG: untypedef demuxer structs
mru
parents: 3852
diff changeset
105 extern const struct ogg_codec ff_ogm_text_codec;
6cd006bc2de9 OGG: untypedef demuxer structs
mru
parents: 3852
diff changeset
106 extern const struct ogg_codec ff_ogm_video_codec;
5512
60671fac35ad Add support for dirac in ogg
conrad
parents: 5434
diff changeset
107 extern const struct ogg_codec ff_old_dirac_codec;
4016
6cd006bc2de9 OGG: untypedef demuxer structs
mru
parents: 3852
diff changeset
108 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
109 extern const struct ogg_codec ff_skeleton_codec;
4016
6cd006bc2de9 OGG: untypedef demuxer structs
mru
parents: 3852
diff changeset
110 extern const struct ogg_codec ff_speex_codec;
6cd006bc2de9 OGG: untypedef demuxer structs
mru
parents: 3852
diff changeset
111 extern const struct ogg_codec ff_theora_codec;
6cd006bc2de9 OGG: untypedef demuxer structs
mru
parents: 3852
diff changeset
112 extern const struct ogg_codec ff_vorbis_codec;
2714
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
113
5825
4a67f1418e4c Const correctness for vorbis_comment
conrad
parents: 5824
diff changeset
114 int ff_vorbis_comment(AVFormatContext *ms, AVMetadata **m, const uint8_t *buf, int size);
2714
b22ba392ac21 Rename ogg2.[ch] to oggdec.[ch].
diego
parents:
diff changeset
115
5810
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
116 static inline int
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
117 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
118 {
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
119 int i;
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
120
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
121 for (i = 0; i < ogg->nstreams; i++)
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
122 if (ogg->streams[i].serial == serial)
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
123 return i;
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
124
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
125 return -1;
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
126 }
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 static inline uint64_t
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
129 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
130 {
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
131 struct ogg *ogg = s->priv_data;
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
132 struct ogg_stream *os = ogg->streams + i;
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
133 uint64_t pts = AV_NOPTS_VALUE;
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
134
5811
5e9709333748 oggdec: Check that we have a codec in gptopts (needed for skeleton)
conrad
parents: 5810
diff changeset
135 if(os->codec && os->codec->gptopts){
5810
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
136 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
137 } else {
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
138 pts = gp;
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
139 if (dts)
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
140 *dts = pts;
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
141 }
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
142
d090202af37d oggdec: Move ogg_find_stream and ogg_gptopts to oggdec.h
conrad
parents: 5808
diff changeset
143 return 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
3852
1b6245500d8c Globally rename the header inclusion guard names.
stefano
parents: 3770
diff changeset
146 #endif /* AVFORMAT_OGGDEC_H */