Commit | Line | Data |
---|---|---|
9146ca37 MR |
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 | ||
98790382 SS |
25 | #ifndef AVFORMAT_OGGDEC_H |
26 | #define AVFORMAT_OGGDEC_H | |
9146ca37 MR |
27 | |
28 | #include "avformat.h" | |
d7bb185f | 29 | #include "metadata.h" |
9146ca37 | 30 | |
77be08ee | 31 | struct ogg_codec { |
c9011976 | 32 | const int8_t *magic; |
9146ca37 | 33 | uint8_t magicsize; |
c9011976 | 34 | const int8_t *name; |
1fa9726c DC |
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 | */ | |
9146ca37 MR |
41 | int (*header)(AVFormatContext *, int); |
42 | int (*packet)(AVFormatContext *, int); | |
2d4970d8 DC |
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); | |
5e15c7d9 DC |
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; | |
7751e469 LB |
54 | /** |
55 | * Number of expected headers | |
56 | */ | |
57 | int nb_header; | |
d894f747 | 58 | void (*cleanup)(AVFormatContext *s, int idx); |
77be08ee | 59 | }; |
9146ca37 | 60 | |
77be08ee | 61 | struct ogg_stream { |
9146ca37 MR |
62 | uint8_t *buf; |
63 | unsigned int bufsize; | |
64 | unsigned int bufpos; | |
65 | unsigned int pstart; | |
66 | unsigned int psize; | |
e1a794b2 | 67 | unsigned int pflags; |
15299b38 | 68 | unsigned int pduration; |
9146ca37 | 69 | uint32_t serial; |
5e15c7d9 | 70 | uint64_t granule; |
d1f05dd1 | 71 | uint64_t start_granule; |
5e15c7d9 | 72 | int64_t lastpts; |
2d4970d8 | 73 | int64_t lastdts; |
73823cb9 DC |
74 | int64_t sync_pos; ///< file offset of the first page needed to reconstruct the current packet |
75 | int64_t page_pos; ///< file offset of the current page | |
9146ca37 | 76 | int flags; |
fc430e8f | 77 | const struct ogg_codec *codec; |
9146ca37 MR |
78 | int header; |
79 | int nsegs, segp; | |
80 | uint8_t segments[255]; | |
ecc0027b | 81 | int incomplete; ///< whether we're expecting a continuation in the next page |
5e15c7d9 | 82 | int page_end; ///< current packet is the last one completed in the page |
d8b91fae | 83 | int keyframe_seek; |
7751e469 | 84 | int nb_header; ///< set to the number of parsed headers |
1ed923ea | 85 | void *private; |
77be08ee | 86 | }; |
9146ca37 | 87 | |
77be08ee | 88 | struct ogg_state { |
9146ca37 MR |
89 | uint64_t pos; |
90 | int curidx; | |
91 | struct ogg_state *next; | |
20be72c8 | 92 | int nstreams; |
77be08ee MR |
93 | struct ogg_stream streams[1]; |
94 | }; | |
9146ca37 | 95 | |
77be08ee MR |
96 | struct ogg { |
97 | struct ogg_stream *streams; | |
9146ca37 MR |
98 | int nstreams; |
99 | int headers; | |
100 | int curidx; | |
77be08ee MR |
101 | struct ogg_state *state; |
102 | }; | |
9146ca37 MR |
103 | |
104 | #define OGG_FLAG_CONT 1 | |
105 | #define OGG_FLAG_BOS 2 | |
106 | #define OGG_FLAG_EOS 4 | |
107 | ||
d1f05dd1 LB |
108 | #define OGG_NOGRANULE_VALUE -1ull |
109 | ||
4ca59d19 | 110 | extern const struct ogg_codec ff_celt_codec; |
24ca518b | 111 | extern const struct ogg_codec ff_dirac_codec; |
77be08ee MR |
112 | extern const struct ogg_codec ff_flac_codec; |
113 | extern const struct ogg_codec ff_ogm_audio_codec; | |
114 | extern const struct ogg_codec ff_ogm_old_codec; | |
115 | extern const struct ogg_codec ff_ogm_text_codec; | |
116 | extern const struct ogg_codec ff_ogm_video_codec; | |
24ca518b | 117 | extern const struct ogg_codec ff_old_dirac_codec; |
77be08ee | 118 | extern const struct ogg_codec ff_old_flac_codec; |
ecab1c77 | 119 | extern const struct ogg_codec ff_opus_codec; |
32ad8692 | 120 | extern const struct ogg_codec ff_skeleton_codec; |
77be08ee MR |
121 | extern const struct ogg_codec ff_speex_codec; |
122 | extern const struct ogg_codec ff_theora_codec; | |
123 | extern const struct ogg_codec ff_vorbis_codec; | |
430a8168 | 124 | extern const struct ogg_codec ff_vp8_codec; |
9146ca37 | 125 | |
23f741f7 AK |
126 | int ff_vorbis_comment(AVFormatContext *ms, AVDictionary **m, |
127 | const uint8_t *buf, int size, int parse_picture); | |
9146ca37 | 128 | |
db68ef89 AS |
129 | int ff_vorbis_stream_comment(AVFormatContext *as, AVStream *st, |
130 | const uint8_t *buf, int size); | |
131 | ||
dfaed51f DC |
132 | static inline int |
133 | ogg_find_stream (struct ogg * ogg, int serial) | |
134 | { | |
135 | int i; | |
136 | ||
137 | for (i = 0; i < ogg->nstreams; i++) | |
138 | if (ogg->streams[i].serial == serial) | |
139 | return i; | |
140 | ||
141 | return -1; | |
142 | } | |
143 | ||
144 | static inline uint64_t | |
145 | ogg_gptopts (AVFormatContext * s, int i, uint64_t gp, int64_t *dts) | |
146 | { | |
147 | struct ogg *ogg = s->priv_data; | |
148 | struct ogg_stream *os = ogg->streams + i; | |
149 | uint64_t pts = AV_NOPTS_VALUE; | |
150 | ||
296bdf9c | 151 | if(os->codec && os->codec->gptopts){ |
dfaed51f DC |
152 | pts = os->codec->gptopts(s, i, gp, dts); |
153 | } else { | |
154 | pts = gp; | |
155 | if (dts) | |
156 | *dts = pts; | |
157 | } | |
158 | ||
159 | return pts; | |
160 | } | |
161 | ||
98790382 | 162 | #endif /* AVFORMAT_OGGDEC_H */ |