oggdec.h
Go to the documentation of this file.
1 
25 #ifndef AVFORMAT_OGGDEC_H
26 #define AVFORMAT_OGGDEC_H
27 
28 #include "avformat.h"
29 #include "metadata.h"
30 
31 struct ogg_codec {
32  const int8_t *magic;
33  uint8_t magicsize;
34  const int8_t *name;
41  int (*header)(AVFormatContext *, int);
42  int (*packet)(AVFormatContext *, int);
48  uint64_t (*gptopts)(AVFormatContext *, int, uint64_t, int64_t *dts);
54 };
55 
56 struct ogg_stream {
57  uint8_t *buf;
58  unsigned int bufsize;
59  unsigned int bufpos;
60  unsigned int pstart;
61  unsigned int psize;
62  unsigned int pflags;
63  unsigned int pduration;
64  uint32_t serial;
65  uint64_t granule;
66  int64_t lastpts;
67  int64_t lastdts;
68  int64_t sync_pos;
69  int64_t page_pos;
70  int flags;
71  const struct ogg_codec *codec;
72  int header;
73  int nsegs, segp;
74  uint8_t segments[255];
75  int incomplete;
76  int page_end;
78  void *private;
79 };
80 
81 struct ogg_state {
82  uint64_t pos;
83  int curidx;
84  struct ogg_state *next;
85  int nstreams;
86  struct ogg_stream streams[1];
87 };
88 
89 struct ogg {
91  int nstreams;
92  int headers;
93  int curidx;
94  struct ogg_state *state;
95 };
96 
97 #define OGG_FLAG_CONT 1
98 #define OGG_FLAG_BOS 2
99 #define OGG_FLAG_EOS 4
100 
101 extern const struct ogg_codec ff_celt_codec;
102 extern const struct ogg_codec ff_dirac_codec;
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;
108 extern const struct ogg_codec ff_old_dirac_codec;
109 extern const struct ogg_codec ff_old_flac_codec;
110 extern const struct ogg_codec ff_skeleton_codec;
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;
114 
115 int ff_vorbis_comment(AVFormatContext *ms, AVDictionary **m, const uint8_t *buf, int size);
116 
117 static inline int
118 ogg_find_stream (struct ogg * ogg, int serial)
119 {
120  int i;
121 
122  for (i = 0; i < ogg->nstreams; i++)
123  if (ogg->streams[i].serial == serial)
124  return i;
125 
126  return -1;
127 }
128 
129 static inline uint64_t
130 ogg_gptopts (AVFormatContext * s, int i, uint64_t gp, int64_t *dts)
131 {
132  struct ogg *ogg = s->priv_data;
133  struct ogg_stream *os = ogg->streams + i;
134  uint64_t pts = AV_NOPTS_VALUE;
135 
136  if(os->codec && os->codec->gptopts){
137  pts = os->codec->gptopts(s, i, gp, dts);
138  } else {
139  pts = gp;
140  if (dts)
141  *dts = pts;
142  }
143 
144  return pts;
145 }
146 
147 #endif /* AVFORMAT_OGGDEC_H */