Mercurial > libavformat.hg
annotate oggdec.h @ 5836:2997c88028cd libavformat
Move the probe loop from av_open_input_file() into its own method
av_probe_input_buffer() so that it can be reused. Here are a few
differences to the original way things were probed:
- maximum probe buffer size can be specified as a parameter.
- offset within the stream to probe from can be specified as a parameter.
- instead of seeking back to the start each time a probe fails, stream
data is appended to the reallocated buffer. This lowers the amount
of data read from the stream (there is no repetition) and results in
fewer closed and reopened streams (when seeking fails).
New attempt after r22296, which was revert in r22315 due to a FATE
failure.
See the thread:
Subject: [FFmpeg-devel] [PATCH] Move av_open_input_file probe loop to its own method
Date: 2010-03-05 03:23:57 GMT
Patch by Micah F. Galizia printf("%s%s@%s.%s", "micah", "galizia", "gmail", "com").
author | stefano |
---|---|
date | Sun, 14 Mar 2010 22:40:16 +0000 |
parents | 8e97be5c4b94 |
children | 121d6994c20e |
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; |
5434 | 65 uint64_t granule; |
66 int64_t lastpts; | |
5514 | 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 | 70 int flags; |
4911 | 71 const struct ogg_codec *codec; |
2714 | 72 int header; |
73 int nsegs, segp; | |
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 | 76 int page_end; ///< current packet is the last one completed in the page |
5818 | 77 int keyframe_seek; |
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 |
5825 | 117 int ff_vorbis_comment(AVFormatContext *ms, AVMetadata **m, const 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 */ |