Mercurial > libavformat.hg
annotate oggparsevorbis.c @ 5293:f18f00a37c22 libavformat
Avoid segfault for empty input files
| author | vitor |
|---|---|
| date | Sat, 17 Oct 2009 20:37:58 +0000 |
| parents | ee0eaff74dd3 |
| children | f16b8dab057b |
| 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[] = { |
|
3aabdadf9d5f
Add a VorbisComment metadata conversion table and use it in the FLAC and
jbr
parents:
4872
diff
changeset
|
39 { "ARTIST" , "author" }, |
|
3aabdadf9d5f
Add a VorbisComment metadata conversion table and use it in the FLAC and
jbr
parents:
4872
diff
changeset
|
40 { "TITLE" , "title" }, |
|
3aabdadf9d5f
Add a VorbisComment metadata conversion table and use it in the FLAC and
jbr
parents:
4872
diff
changeset
|
41 { "ALBUM" , "album" }, |
|
3aabdadf9d5f
Add a VorbisComment metadata conversion table and use it in the FLAC and
jbr
parents:
4872
diff
changeset
|
42 { "DATE" , "year" }, |
|
3aabdadf9d5f
Add a VorbisComment metadata conversion table and use it in the FLAC and
jbr
parents:
4872
diff
changeset
|
43 { "TRACKNUMBER", "track" }, |
|
3aabdadf9d5f
Add a VorbisComment metadata conversion table and use it in the FLAC and
jbr
parents:
4872
diff
changeset
|
44 { "GENRE" , "genre" }, |
|
3aabdadf9d5f
Add a VorbisComment metadata conversion table and use it in the FLAC and
jbr
parents:
4872
diff
changeset
|
45 { 0 } |
|
3aabdadf9d5f
Add a VorbisComment metadata conversion table and use it in the FLAC and
jbr
parents:
4872
diff
changeset
|
46 }; |
|
3aabdadf9d5f
Add a VorbisComment metadata conversion table and use it in the FLAC and
jbr
parents:
4872
diff
changeset
|
47 |
| 4058 | 48 int |
| 2197 | 49 vorbis_comment(AVFormatContext * as, 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
|
50 { |
| 2996 | 51 const uint8_t *p = buf; |
| 52 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
|
53 unsigned n, j; |
|
ee0eaff74dd3
Fix possible buffer over-read in vorbis_comment, fix it double to be sure.
reimar
parents:
5228
diff
changeset
|
54 int s; |
|
726
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
55 |
| 2595 | 56 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
|
57 return -1; |
|
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
58 |
| 2600 | 59 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
|
60 |
|
5232
ee0eaff74dd3
Fix possible buffer over-read in vorbis_comment, fix it double to be sure.
reimar
parents:
5228
diff
changeset
|
61 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
|
62 return -1; |
|
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
63 |
|
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
64 p += s; |
|
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
65 |
| 2600 | 66 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
|
67 |
|
5232
ee0eaff74dd3
Fix possible buffer over-read in vorbis_comment, fix it double to be sure.
reimar
parents:
5228
diff
changeset
|
68 while (end - p >= 4 && n > 0) { |
| 2996 | 69 const char *t, *v; |
|
726
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
70 int tl, vl; |
|
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
71 |
| 2600 | 72 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
|
73 |
|
5232
ee0eaff74dd3
Fix possible buffer over-read in vorbis_comment, fix it double to be sure.
reimar
parents:
5228
diff
changeset
|
74 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
|
75 break; |
|
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
76 |
|
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
77 t = p; |
|
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
78 p += s; |
|
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
79 n--; |
|
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
80 |
| 2197 | 81 v = memchr(t, '=', s); |
|
726
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
82 if (!v) |
|
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
83 continue; |
|
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
84 |
|
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
85 tl = v - t; |
|
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
86 vl = s - tl - 1; |
|
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
87 v++; |
|
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
88 |
| 2197 | 89 if (tl && vl) { |
| 4466 | 90 char *tt, *ct; |
| 91 | |
| 92 tt = av_malloc(tl + 1); | |
| 93 ct = av_malloc(vl + 1); | |
| 94 if (!tt || !ct) { | |
| 95 av_freep(&tt); | |
| 96 av_freep(&ct); | |
| 97 av_log(as, AV_LOG_WARNING, "out-of-memory error. skipping VorbisComment tag.\n"); | |
| 98 continue; | |
| 99 } | |
|
726
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
100 |
|
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
101 for (j = 0; j < tl; j++) |
| 2197 | 102 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
|
103 tt[tl] = 0; |
|
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
104 |
| 2197 | 105 memcpy(ct, v, vl); |
|
726
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
106 ct[vl] = 0; |
|
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
107 |
| 4455 | 108 av_metadata_set(&as->metadata, tt, ct); |
| 4466 | 109 |
| 110 av_freep(&tt); | |
| 111 av_freep(&ct); | |
|
726
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
112 } |
|
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
113 } |
|
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
114 |
| 2601 | 115 if (p != end) |
|
5228
a59767d33928
Correctly print number of remaining bytes in oggparsevorbis instead of always
reimar
parents:
5032
diff
changeset
|
116 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
|
117 if (n > 0) |
| 2197 | 118 av_log(as, AV_LOG_INFO, |
| 119 "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
|
120 |
|
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
121 return 0; |
|
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
122 } |
|
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
123 |
|
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
124 |
|
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
125 /** Parse the vorbis header |
|
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
126 * 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
|
127 * [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
|
128 * [audio_channels] = read 8 bit integer as unsigned | Used |
| 885 | 129 * [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
|
130 * [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
|
131 * [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
|
132 * [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
|
133 * [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
|
134 * [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
|
135 * [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
|
136 * */ |
|
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
137 |
| 4016 | 138 struct oggvorbis_private { |
| 760 | 139 unsigned int len[3]; |
| 140 unsigned char *packet[3]; | |
| 4016 | 141 }; |
| 760 | 142 |
| 143 | |
| 144 static unsigned int | |
| 4016 | 145 fixup_vorbis_headers(AVFormatContext * as, struct oggvorbis_private *priv, |
| 2198 | 146 uint8_t **buf) |
| 760 | 147 { |
| 148 int i,offset, len; | |
| 149 unsigned char *ptr; | |
| 150 | |
| 151 len = priv->len[0] + priv->len[1] + priv->len[2]; | |
| 152 ptr = *buf = av_mallocz(len + len/255 + 64); | |
| 153 | |
| 154 ptr[0] = 2; | |
| 155 offset = 1; | |
| 156 offset += av_xiphlacing(&ptr[offset], priv->len[0]); | |
| 157 offset += av_xiphlacing(&ptr[offset], priv->len[1]); | |
| 2197 | 158 for (i = 0; i < 3; i++) { |
| 760 | 159 memcpy(&ptr[offset], priv->packet[i], priv->len[i]); |
| 160 offset += priv->len[i]; | |
| 161 } | |
| 3584 | 162 *buf = av_realloc(*buf, offset + FF_INPUT_BUFFER_PADDING_SIZE); |
| 760 | 163 return offset; |
| 164 } | |
| 165 | |
| 166 | |
|
726
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
167 static int |
|
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
168 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
|
169 { |
| 4016 | 170 struct ogg *ogg = s->priv_data; |
| 171 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
|
172 AVStream *st = s->streams[idx]; |
| 4016 | 173 struct oggvorbis_private *priv; |
|
726
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
174 |
|
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
175 if (os->seq > 2) |
|
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
176 return 0; |
|
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
177 |
| 2197 | 178 if (os->seq == 0) { |
| 4016 | 179 os->private = av_mallocz(sizeof(struct oggvorbis_private)); |
| 2197 | 180 if (!os->private) |
| 760 | 181 return 0; |
| 182 } | |
|
726
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
183 |
| 2595 | 184 if (os->psize < 1) |
| 185 return -1; | |
| 186 | |
| 760 | 187 priv = os->private; |
| 188 priv->len[os->seq] = os->psize; | |
| 189 priv->packet[os->seq] = av_mallocz(os->psize); | |
| 190 memcpy(priv->packet[os->seq], 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
|
191 if (os->buf[os->pstart] == 1) { |
| 2996 | 192 const uint8_t *p = os->buf + os->pstart + 7; /* skip "\001vorbis" tag */ |
| 2597 | 193 unsigned blocksize, bs0, bs1; |
| 2595 | 194 |
| 195 if (os->psize != 30) | |
| 196 return -1; | |
| 197 | |
| 2597 | 198 if (bytestream_get_le32(&p) != 0) /* vorbis_version */ |
| 199 return -1; | |
| 200 | |
| 2596 | 201 st->codec->channels = bytestream_get_byte(&p); |
| 202 st->codec->sample_rate = bytestream_get_le32(&p); | |
| 203 p += 4; // skip maximum bitrate | |
| 204 st->codec->bit_rate = bytestream_get_le32(&p); // nominal bitrate | |
| 2597 | 205 p += 4; // skip minimum bitrate |
| 206 | |
| 207 blocksize = bytestream_get_byte(&p); | |
| 208 bs0 = blocksize & 15; | |
| 209 bs1 = blocksize >> 4; | |
| 210 | |
| 211 if (bs0 > bs1) | |
| 212 return -1; | |
| 213 if (bs0 < 6 || bs1 > 13) | |
| 214 return -1; | |
| 215 | |
| 216 if (bytestream_get_byte(&p) != 1) /* framing_flag */ | |
| 217 return -1; | |
|
726
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
218 |
|
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
760
diff
changeset
|
219 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
|
220 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
|
221 |
| 1077 | 222 st->time_base.num = 1; |
| 223 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
|
224 } else if (os->buf[os->pstart] == 3) { |
| 2595 | 225 if (os->psize > 8) |
| 226 vorbis_comment (s, os->buf + os->pstart + 7, os->psize - 8); | |
| 760 | 227 } 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
|
228 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
|
229 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
|
230 } |
|
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
231 |
|
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
232 return os->seq < 3; |
|
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
233 } |
|
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
234 |
| 4016 | 235 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
|
236 .magic = "\001vorbis", |
|
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
237 .magicsize = 7, |
|
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
238 .header = vorbis_header |
|
17178af951b4
Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents:
diff
changeset
|
239 }; |
