Mercurial > libavformat.hg
annotate oggparsevorbis.c @ 5834:134741dc8327 libavformat
Replace all the occurrences of AVERROR_EIO with AVERROR(EIO), and mark
AVERROR_EIO for deletion at the next major bump.
author | stefano |
---|---|
date | Sat, 13 Mar 2010 19:19:44 +0000 |
parents | 925e7a7b3227 |
children | 121d6994c20e |
rev | line source |
---|---|
726
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
1 /** |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
2 Copyright (C) 2005 Michael Ahlberg, Måns Rullgård |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
3 |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
4 Permission is hereby granted, free of charge, to any person |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
5 obtaining a copy of this software and associated documentation |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
6 files (the "Software"), to deal in the Software without |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
7 restriction, including without limitation the rights to use, copy, |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
8 modify, merge, publish, distribute, sublicense, and/or sell copies |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
9 of the Software, and to permit persons to whom the Software is |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
10 furnished to do so, subject to the following conditions: |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
11 |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
12 The above copyright notice and this permission notice shall be |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
13 included in all copies or substantial portions of the Software. |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
14 |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
16 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
17 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
18 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
19 HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
20 WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
22 DEALINGS IN THE SOFTWARE. |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
23 **/ |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
24 |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
25 #include <stdlib.h> |
3286 | 26 #include "libavutil/avstring.h" |
27 #include "libavutil/bswap.h" | |
4872 | 28 #include "libavcodec/get_bits.h" |
3286 | 29 #include "libavcodec/bytestream.h" |
726
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
30 #include "avformat.h" |
2714 | 31 #include "oggdec.h" |
726
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
32 |
5032
3aabdadf9d5f
Add a VorbisComment metadata conversion table and use it in the FLAC and
jbr
parents:
4872
diff
changeset
|
33 /** |
3aabdadf9d5f
Add a VorbisComment metadata conversion table and use it in the FLAC and
jbr
parents:
4872
diff
changeset
|
34 * VorbisComment metadata conversion mapping. |
3aabdadf9d5f
Add a VorbisComment metadata conversion table and use it in the FLAC and
jbr
parents:
4872
diff
changeset
|
35 * from Ogg Vorbis I format specification: comment field and header specification |
3aabdadf9d5f
Add a VorbisComment metadata conversion table and use it in the FLAC and
jbr
parents:
4872
diff
changeset
|
36 * http://xiph.org/vorbis/doc/v-comment.html |
3aabdadf9d5f
Add a VorbisComment metadata conversion table and use it in the FLAC and
jbr
parents:
4872
diff
changeset
|
37 */ |
3aabdadf9d5f
Add a VorbisComment metadata conversion table and use it in the FLAC and
jbr
parents:
4872
diff
changeset
|
38 const AVMetadataConv ff_vorbiscomment_metadata_conv[] = { |
5618
27fd77f20a89
Add a list of generic tags and change demuxers to follow it.
pross
parents:
5446
diff
changeset
|
39 { "ALBUMARTIST", "album_artist"}, |
5032
3aabdadf9d5f
Add a VorbisComment metadata conversion table and use it in the FLAC and
jbr
parents:
4872
diff
changeset
|
40 { "TRACKNUMBER", "track" }, |
3aabdadf9d5f
Add a VorbisComment metadata conversion table and use it in the FLAC and
jbr
parents:
4872
diff
changeset
|
41 { 0 } |
3aabdadf9d5f
Add a VorbisComment metadata conversion table and use it in the FLAC and
jbr
parents:
4872
diff
changeset
|
42 }; |
3aabdadf9d5f
Add a VorbisComment metadata conversion table and use it in the FLAC and
jbr
parents:
4872
diff
changeset
|
43 |
5828 | 44 static int ogm_chapter(AVFormatContext *as, uint8_t *key, uint8_t *val) |
45 { | |
46 int i, cnum, h, m, s, ms, keylen = strlen(key); | |
47 AVChapter *chapter = NULL; | |
48 | |
49 if (keylen < 9 || sscanf(key, "CHAPTER%02d", &cnum) != 1) | |
50 return 0; | |
51 | |
52 if (keylen == 9) { | |
53 if (sscanf(val, "%02d:%02d:%02d.%03d", &h, &m, &s, &ms) < 4) | |
54 return 0; | |
55 | |
56 ff_new_chapter(as, cnum, (AVRational){1,1000}, | |
57 ms + 1000*(s + 60*(m + 60*h)), | |
58 AV_NOPTS_VALUE, NULL); | |
59 av_free(val); | |
60 } else if (!strcmp(key+9, "NAME")) { | |
61 for(i = 0; i < as->nb_chapters; i++) | |
62 if (as->chapters[i]->id == cnum) { | |
63 chapter = as->chapters[i]; | |
64 break; | |
65 } | |
66 if (!chapter) | |
67 return 0; | |
68 | |
69 av_metadata_set2(&chapter->metadata, "title", val, | |
70 AV_METADATA_DONT_STRDUP_VAL); | |
71 } else | |
72 return 0; | |
73 | |
74 av_free(key); | |
75 return 1; | |
76 } | |
77 | |
4058 | 78 int |
5825 | 79 ff_vorbis_comment(AVFormatContext * as, AVMetadata **m, const uint8_t *buf, int size) |
726
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
80 { |
2996 | 81 const uint8_t *p = buf; |
82 const uint8_t *end = buf + size; | |
5232
ee0eaff74dd3
Fix possible buffer over-read in vorbis_comment, fix it double to be sure.
reimar
parents:
5228
diff
changeset
|
83 unsigned n, j; |
ee0eaff74dd3
Fix possible buffer over-read in vorbis_comment, fix it double to be sure.
reimar
parents:
5228
diff
changeset
|
84 int s; |
726
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
85 |
2595 | 86 if (size < 8) /* must have vendor_length and user_comment_list_length */ |
726
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
87 return -1; |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
88 |
2600 | 89 s = bytestream_get_le32(&p); |
726
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
90 |
5232
ee0eaff74dd3
Fix possible buffer over-read in vorbis_comment, fix it double to be sure.
reimar
parents:
5228
diff
changeset
|
91 if (end - p - 4 < s || s < 0) |
726
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
92 return -1; |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
93 |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
94 p += s; |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
95 |
2600 | 96 n = bytestream_get_le32(&p); |
726
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
97 |
5232
ee0eaff74dd3
Fix possible buffer over-read in vorbis_comment, fix it double to be sure.
reimar
parents:
5228
diff
changeset
|
98 while (end - p >= 4 && n > 0) { |
2996 | 99 const char *t, *v; |
726
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
100 int tl, vl; |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
101 |
2600 | 102 s = bytestream_get_le32(&p); |
726
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
103 |
5232
ee0eaff74dd3
Fix possible buffer over-read in vorbis_comment, fix it double to be sure.
reimar
parents:
5228
diff
changeset
|
104 if (end - p < s || s < 0) |
726
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
105 break; |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
106 |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
107 t = p; |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
108 p += s; |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
109 n--; |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
110 |
2197 | 111 v = memchr(t, '=', s); |
726
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
112 if (!v) |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
113 continue; |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
114 |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
115 tl = v - t; |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
116 vl = s - tl - 1; |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
117 v++; |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
118 |
2197 | 119 if (tl && vl) { |
4466 | 120 char *tt, *ct; |
121 | |
122 tt = av_malloc(tl + 1); | |
123 ct = av_malloc(vl + 1); | |
124 if (!tt || !ct) { | |
125 av_freep(&tt); | |
126 av_freep(&ct); | |
127 av_log(as, AV_LOG_WARNING, "out-of-memory error. skipping VorbisComment tag.\n"); | |
128 continue; | |
129 } | |
726
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
130 |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
131 for (j = 0; j < tl; j++) |
2197 | 132 tt[j] = toupper(t[j]); |
726
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
133 tt[tl] = 0; |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
134 |
2197 | 135 memcpy(ct, v, vl); |
726
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
136 ct[vl] = 0; |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
137 |
5828 | 138 if (!ogm_chapter(as, tt, ct)) |
139 av_metadata_set2(m, tt, ct, | |
5446
4211f91f69b1
Use AV_METADATA_DONT_STRDUP* / use av_malloced metadata instead of strduped
michael
parents:
5294
diff
changeset
|
140 AV_METADATA_DONT_STRDUP_KEY | |
4211f91f69b1
Use AV_METADATA_DONT_STRDUP* / use av_malloced metadata instead of strduped
michael
parents:
5294
diff
changeset
|
141 AV_METADATA_DONT_STRDUP_VAL); |
726
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
142 } |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
143 } |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
144 |
2601 | 145 if (p != end) |
5228
a59767d33928
Correctly print number of remaining bytes in oggparsevorbis instead of always
reimar
parents:
5032
diff
changeset
|
146 av_log(as, AV_LOG_INFO, "%ti bytes of comment header remain\n", end-p); |
726
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
147 if (n > 0) |
2197 | 148 av_log(as, AV_LOG_INFO, |
149 "truncated comment header, %i comments not found\n", n); | |
726
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
150 |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
151 return 0; |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
152 } |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
153 |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
154 |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
155 /** Parse the vorbis header |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
156 * Vorbis Identification header from Vorbis_I_spec.html#vorbis-spec-codec |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
157 * [vorbis_version] = read 32 bits as unsigned integer | Not used |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
158 * [audio_channels] = read 8 bit integer as unsigned | Used |
885 | 159 * [audio_sample_rate] = read 32 bits as unsigned integer | Used |
726
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
160 * [bitrate_maximum] = read 32 bits as signed integer | Not used yet |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
161 * [bitrate_nominal] = read 32 bits as signed integer | Not used yet |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
162 * [bitrate_minimum] = read 32 bits as signed integer | Used as bitrate |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
163 * [blocksize_0] = read 4 bits as unsigned integer | Not Used |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
164 * [blocksize_1] = read 4 bits as unsigned integer | Not Used |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
165 * [framing_flag] = read one bit | Not Used |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
166 * */ |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
167 |
4016 | 168 struct oggvorbis_private { |
760 | 169 unsigned int len[3]; |
170 unsigned char *packet[3]; | |
4016 | 171 }; |
760 | 172 |
173 | |
174 static unsigned int | |
4016 | 175 fixup_vorbis_headers(AVFormatContext * as, struct oggvorbis_private *priv, |
2198 | 176 uint8_t **buf) |
760 | 177 { |
178 int i,offset, len; | |
179 unsigned char *ptr; | |
180 | |
181 len = priv->len[0] + priv->len[1] + priv->len[2]; | |
182 ptr = *buf = av_mallocz(len + len/255 + 64); | |
183 | |
184 ptr[0] = 2; | |
185 offset = 1; | |
186 offset += av_xiphlacing(&ptr[offset], priv->len[0]); | |
187 offset += av_xiphlacing(&ptr[offset], priv->len[1]); | |
2197 | 188 for (i = 0; i < 3; i++) { |
760 | 189 memcpy(&ptr[offset], priv->packet[i], priv->len[i]); |
190 offset += priv->len[i]; | |
5815
9e5e8c64ab54
oggdec: Fix memory leak in setting up vorbis headers
conrad
parents:
5814
diff
changeset
|
191 av_freep(&priv->packet[i]); |
760 | 192 } |
3584 | 193 *buf = av_realloc(*buf, offset + FF_INPUT_BUFFER_PADDING_SIZE); |
760 | 194 return offset; |
195 } | |
196 | |
197 | |
726
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
198 static int |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
199 vorbis_header (AVFormatContext * s, int idx) |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
200 { |
4016 | 201 struct ogg *ogg = s->priv_data; |
202 struct ogg_stream *os = ogg->streams + idx; | |
726
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
203 AVStream *st = s->streams[idx]; |
4016 | 204 struct oggvorbis_private *priv; |
5814
e993cab1faf3
oggdec: Don't use ogg_stream's seq for vorbis or speex headers
conrad
parents:
5618
diff
changeset
|
205 int pkt_type = os->buf[os->pstart]; |
726
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
206 |
5814
e993cab1faf3
oggdec: Don't use ogg_stream's seq for vorbis or speex headers
conrad
parents:
5618
diff
changeset
|
207 if (!(pkt_type & 1)) |
726
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
208 return 0; |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
209 |
5814
e993cab1faf3
oggdec: Don't use ogg_stream's seq for vorbis or speex headers
conrad
parents:
5618
diff
changeset
|
210 if (!os->private) { |
4016 | 211 os->private = av_mallocz(sizeof(struct oggvorbis_private)); |
2197 | 212 if (!os->private) |
760 | 213 return 0; |
214 } | |
726
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
215 |
5814
e993cab1faf3
oggdec: Don't use ogg_stream's seq for vorbis or speex headers
conrad
parents:
5618
diff
changeset
|
216 if (os->psize < 1 || pkt_type > 5) |
2595 | 217 return -1; |
218 | |
760 | 219 priv = os->private; |
5814
e993cab1faf3
oggdec: Don't use ogg_stream's seq for vorbis or speex headers
conrad
parents:
5618
diff
changeset
|
220 priv->len[pkt_type >> 1] = os->psize; |
e993cab1faf3
oggdec: Don't use ogg_stream's seq for vorbis or speex headers
conrad
parents:
5618
diff
changeset
|
221 priv->packet[pkt_type >> 1] = av_mallocz(os->psize); |
e993cab1faf3
oggdec: Don't use ogg_stream's seq for vorbis or speex headers
conrad
parents:
5618
diff
changeset
|
222 memcpy(priv->packet[pkt_type >> 1], os->buf + os->pstart, os->psize); |
726
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
223 if (os->buf[os->pstart] == 1) { |
2996 | 224 const uint8_t *p = os->buf + os->pstart + 7; /* skip "\001vorbis" tag */ |
2597 | 225 unsigned blocksize, bs0, bs1; |
2595 | 226 |
227 if (os->psize != 30) | |
228 return -1; | |
229 | |
2597 | 230 if (bytestream_get_le32(&p) != 0) /* vorbis_version */ |
231 return -1; | |
232 | |
2596 | 233 st->codec->channels = bytestream_get_byte(&p); |
234 st->codec->sample_rate = bytestream_get_le32(&p); | |
235 p += 4; // skip maximum bitrate | |
236 st->codec->bit_rate = bytestream_get_le32(&p); // nominal bitrate | |
2597 | 237 p += 4; // skip minimum bitrate |
238 | |
239 blocksize = bytestream_get_byte(&p); | |
240 bs0 = blocksize & 15; | |
241 bs1 = blocksize >> 4; | |
242 | |
243 if (bs0 > bs1) | |
244 return -1; | |
245 if (bs0 < 6 || bs1 > 13) | |
246 return -1; | |
247 | |
248 if (bytestream_get_byte(&p) != 1) /* framing_flag */ | |
249 return -1; | |
726
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
250 |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
760
diff
changeset
|
251 st->codec->codec_type = CODEC_TYPE_AUDIO; |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
760
diff
changeset
|
252 st->codec->codec_id = CODEC_ID_VORBIS; |
726
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
253 |
1077 | 254 st->time_base.num = 1; |
255 st->time_base.den = st->codec->sample_rate; | |
726
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
256 } else if (os->buf[os->pstart] == 3) { |
2595 | 257 if (os->psize > 8) |
5824
b9f21d75c81a
oggdec: Metadata is per-stream; don't merge multiple streams' together
conrad
parents:
5823
diff
changeset
|
258 ff_vorbis_comment (s, &st->metadata, os->buf + os->pstart + 7, os->psize - 8); |
760 | 259 } else { |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
760
diff
changeset
|
260 st->codec->extradata_size = |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
760
diff
changeset
|
261 fixup_vorbis_headers(s, priv, &st->codec->extradata); |
726
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
262 } |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
263 |
5814
e993cab1faf3
oggdec: Don't use ogg_stream's seq for vorbis or speex headers
conrad
parents:
5618
diff
changeset
|
264 return 1; |
726
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
265 } |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
266 |
4016 | 267 const struct ogg_codec ff_vorbis_codec = { |
726
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
268 .magic = "\001vorbis", |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
269 .magicsize = 7, |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
270 .header = vorbis_header |
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
271 }; |