oggdec: add support for VP8 demuxing
[libav.git] / libavformat / oggdec.h
CommitLineData
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 31struct 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 61struct 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 88struct 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
96struct 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 110extern const struct ogg_codec ff_celt_codec;
24ca518b 111extern const struct ogg_codec ff_dirac_codec;
77be08ee
MR
112extern const struct ogg_codec ff_flac_codec;
113extern const struct ogg_codec ff_ogm_audio_codec;
114extern const struct ogg_codec ff_ogm_old_codec;
115extern const struct ogg_codec ff_ogm_text_codec;
116extern const struct ogg_codec ff_ogm_video_codec;
24ca518b 117extern const struct ogg_codec ff_old_dirac_codec;
77be08ee 118extern const struct ogg_codec ff_old_flac_codec;
ecab1c77 119extern const struct ogg_codec ff_opus_codec;
32ad8692 120extern const struct ogg_codec ff_skeleton_codec;
77be08ee
MR
121extern const struct ogg_codec ff_speex_codec;
122extern const struct ogg_codec ff_theora_codec;
123extern const struct ogg_codec ff_vorbis_codec;
430a8168 124extern const struct ogg_codec ff_vp8_codec;
9146ca37 125
23f741f7
AK
126int ff_vorbis_comment(AVFormatContext *ms, AVDictionary **m,
127 const uint8_t *buf, int size, int parse_picture);
9146ca37 128
db68ef89
AS
129int ff_vorbis_stream_comment(AVFormatContext *as, AVStream *st,
130 const uint8_t *buf, int size);
131
dfaed51f
DC
132static inline int
133ogg_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
144static inline uint64_t
145ogg_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 */