Mercurial > libavformat.hg
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 |
rev | line source |
---|---|
2714 | 1 /** |
2 Copyright (C) 2005 Michael Ahlberg, Måns Rullgård | |
3 | |
4 Permission is hereby granted, free of charge, to any person | |
5 obtaining a copy of this software and associated documentation | |
6 files (the "Software"), to deal in the Software without | |
7 restriction, including without limitation the rights to use, copy, | |
8 modify, merge, publish, distribute, sublicense, and/or sell copies | |
9 of the Software, and to permit persons to whom the Software is | |
10 furnished to do so, subject to the following conditions: | |
11 | |
12 The above copyright notice and this permission notice shall be | |
13 included in all copies or substantial portions of the Software. | |
14 | |
15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |
16 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
17 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | |
18 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT | |
19 HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, | |
20 WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | |
22 DEALINGS IN THE SOFTWARE. | |
23 **/ | |
24 | |
3852 | 25 #ifndef AVFORMAT_OGGDEC_H |
26 #define AVFORMAT_OGGDEC_H | |
2714 | 27 |
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 | 30 |
4016 | 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 | 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 | 35 /** |
36 * Attempt to process a packet as a header | |
37 * @return 1 if the packet was a valid header, | |
38 * 0 if the packet was not a header (was a data packet) | |
39 * -1 if an error occurred or for unsupported stream | |
40 */ | |
2714 | 41 int (*header)(AVFormatContext *, int); |
42 int (*packet)(AVFormatContext *, int); | |
5514 | 43 /** |
44 * Translate a granule into a timestamp. | |
45 * Will set dts if non-null and known. | |
46 * @return pts | |
47 */ | |
48 uint64_t (*gptopts)(AVFormatContext *, int, uint64_t, int64_t *dts); | |
5434 | 49 /** |
50 * 1 if granule is the start time of the associated packet. | |
51 * 0 if granule is the end time of the associated packet. | |
52 */ | |
53 int granule_is_start; | |
4016 | 54 }; |
2714 | 55 |
4016 | 56 struct ogg_stream { |
2714 | 57 uint8_t *buf; |
58 unsigned int bufsize; | |
59 unsigned int bufpos; | |
60 unsigned int pstart; | |
61 unsigned int psize; | |
2732 | 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 | 64 uint32_t serial; |
65 uint32_t seq; | |
5434 | 66 uint64_t granule; |
67 int64_t lastpts; | |
5514 | 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 | 71 int flags; |
4911 | 72 const struct ogg_codec *codec; |
2714 | 73 int header; |
74 int nsegs, segp; | |
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 | 77 int page_end; ///< current packet is the last one completed in the page |
2714 | 78 void *private; |
4016 | 79 }; |
2714 | 80 |
4016 | 81 struct ogg_state { |
2714 | 82 uint64_t pos; |
83 int curidx; | |
84 struct ogg_state *next; | |
85 int nstreams; | |
4016 | 86 struct ogg_stream streams[1]; |
87 }; | |
2714 | 88 |
4016 | 89 struct ogg { |
90 struct ogg_stream *streams; | |
2714 | 91 int nstreams; |
92 int headers; | |
93 int curidx; | |
94 uint64_t size; | |
4016 | 95 struct ogg_state *state; |
96 }; | |
2714 | 97 |
98 #define OGG_FLAG_CONT 1 | |
99 #define OGG_FLAG_BOS 2 | |
100 #define OGG_FLAG_EOS 4 | |
101 | |
5512 | 102 extern const struct ogg_codec ff_dirac_codec; |
4016 | 103 extern const struct ogg_codec ff_flac_codec; |
104 extern const struct ogg_codec ff_ogm_audio_codec; | |
105 extern const struct ogg_codec ff_ogm_old_codec; | |
106 extern const struct ogg_codec ff_ogm_text_codec; | |
107 extern const struct ogg_codec ff_ogm_video_codec; | |
5512 | 108 extern const struct ogg_codec ff_old_dirac_codec; |
4016 | 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 | 111 extern const struct ogg_codec ff_speex_codec; |
112 extern const struct ogg_codec ff_theora_codec; | |
113 extern const struct ogg_codec ff_vorbis_codec; | |
2714 | 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 | 117 int vorbis_comment(AVFormatContext *ms, uint8_t *buf, int size); |
2714 | 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 | 149 #endif /* AVFORMAT_OGGDEC_H */ |