1 /* Copyright (C)2012 Xiph.Org Foundation
3 * Redistribution and use in source and binary forms, with or without
4 * modification, are permitted provided that the following conditions
7 * - Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
10 * - Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
15 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
16 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
17 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
18 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
22 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
23 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 * \file opus_common.c Common functions of the opus decoder and audio format
36 #include "opus_common.h"
37 #include "portable_io.h"
45 static int read_chars(struct packet
*p
, unsigned char *str
, int nb_chars
)
49 if (p
->pos
> p
->maxlen
- nb_chars
)
51 for (i
= 0; i
< nb_chars
; i
++)
52 str
[i
] = p
->data
[p
->pos
++];
56 static int read_uint32(struct packet
*p
, ogg_uint32_t
*val
)
58 if (p
->pos
> p
->maxlen
- 4)
60 *val
= read_u32(p
->data
+ p
->pos
);
65 static int read_uint16(struct packet
*p
, ogg_uint16_t
*val
)
67 if (p
->pos
> p
->maxlen
- 2)
69 *val
= read_u16(p
->data
+ p
->pos
);
75 * Get metadata of an opus stream.
77 * This is called from both the audio format handler (which passes ogg packet
78 * 0) and from the decoder.
80 * \param packet Start of the packet.
81 * \param len Number of bytes.
86 int opus_parse_header(const char *packet
, int len
, struct opus_header
*h
)
91 unsigned char ch
, channel_mapping
;
92 ogg_uint16_t shortval
;
99 return -E_OPUS_HEADER
;
100 read_chars(&p
, (unsigned char*)str
, 8);
101 if (memcmp(str
, "OpusHead", 8) != 0)
102 return -E_OPUS_HEADER
;
104 if (!read_chars(&p
, &ch
, 1))
105 return -E_OPUS_HEADER
;
107 if((h
->version
& 240) != 0) /* Only major version 0 supported. */
108 return -E_OPUS_HEADER
;
110 if (!read_chars(&p
, &ch
, 1))
111 return -E_OPUS_HEADER
;
113 if (h
->channels
== 0)
114 return -E_OPUS_HEADER
;
116 if (!read_uint16(&p
, &shortval
))
117 return -E_OPUS_HEADER
;
118 h
->preskip
= shortval
;
120 if (!read_uint32(&p
, &h
->input_sample_rate
))
121 return -E_OPUS_HEADER
;
123 if (!read_uint16(&p
, &shortval
))
124 return -E_OPUS_HEADER
;
125 h
->gain
= (short)shortval
;
127 if (!read_chars(&p
, &ch
, 1))
128 return -E_OPUS_HEADER
;
129 channel_mapping
= ch
;
131 if (channel_mapping
!= 0) {
132 if (!read_chars(&p
, &ch
, 1))
133 return -E_OPUS_HEADER
;
136 return -E_OPUS_HEADER
;
139 if (!read_chars(&p
, &ch
, 1))
140 return -E_OPUS_HEADER
;
142 if (ch
> h
->nb_streams
|| (ch
+ h
->nb_streams
) > 255)
143 return -E_OPUS_HEADER
;
146 /* Multi-stream support */
147 for (i
= 0; i
< h
->channels
; i
++) {
148 if (!read_chars(&p
, &h
->stream_map
[i
], 1))
149 return -E_OPUS_HEADER
;
150 if (h
->stream_map
[i
] > (h
->nb_streams
+ h
->nb_coupled
)
151 && h
->stream_map
[i
] != 255)
152 return -E_OPUS_HEADER
;
156 return -E_OPUS_HEADER
;
158 h
->nb_coupled
= h
->channels
> 1;
159 h
->stream_map
[0] = 0;
160 h
->stream_map
[1] = 1;
163 * For version 0/1 we know there won't be any more data so reject any
164 * that have data past the end.
166 if ((h
->version
== 0 || h
->version
== 1) && p
.pos
!= len
)
167 return -E_OPUS_HEADER
;