From 14c6bb798d6bebc80f07e863236adbaf8d156a9c Mon Sep 17 00:00:00 2001 From: William Wilgus Date: Fri, 4 Jan 2019 02:01:18 -0600 Subject: Sync opus codec to upstream git Change-Id: I0cfcc0005c4ad7bfbb1aaf454188ce70fb043dc1 --- lib/rbcodec/codecs/libopus/opus_header.c | 117 ++++++------------------------- 1 file changed, 20 insertions(+), 97 deletions(-) (limited to 'lib/rbcodec/codecs/libopus/opus_header.c') diff --git a/lib/rbcodec/codecs/libopus/opus_header.c b/lib/rbcodec/codecs/libopus/opus_header.c index d00d4fba23..5fe5a7a4f9 100644 --- a/lib/rbcodec/codecs/libopus/opus_header.c +++ b/lib/rbcodec/codecs/libopus/opus_header.c @@ -44,7 +44,7 @@ 2..254: reserved, 255: multistream with no mapping) - if (mapping != 0) - - N = totel number of streams (8 bits) + - N = total number of streams (8 bits) - M = number of paired streams (8 bits) - C times channel origin - if (C<2*M) @@ -57,50 +57,12 @@ - stream = byte-M */ -typedef struct { - unsigned char *data; - int maxlen; - int pos; -} Packet; - typedef struct { const unsigned char *data; int maxlen; int pos; } ROPacket; -static int write_uint32(Packet *p, ogg_uint32_t val) -{ - if (p->pos>p->maxlen-4) - return 0; - p->data[p->pos ] = (val ) & 0xFF; - p->data[p->pos+1] = (val>> 8) & 0xFF; - p->data[p->pos+2] = (val>>16) & 0xFF; - p->data[p->pos+3] = (val>>24) & 0xFF; - p->pos += 4; - return 1; -} - -static int write_uint16(Packet *p, ogg_uint16_t val) -{ - if (p->pos>p->maxlen-2) - return 0; - p->data[p->pos ] = (val ) & 0xFF; - p->data[p->pos+1] = (val>> 8) & 0xFF; - p->pos += 2; - return 1; -} - -static int write_chars(Packet *p, const unsigned char *str, int nb_chars) -{ - int i; - if (p->pos>p->maxlen-nb_chars) - return 0; - for (i=0;idata[p->pos++] = str[i]; - return 1; -} - static int read_uint32(ROPacket *p, ogg_uint32_t *val) { if (p->pos>p->maxlen-4) @@ -194,12 +156,28 @@ int opus_header_parse(const unsigned char *packet, int len, OpusHeader *h) h->nb_coupled = ch; /* Multi-stream support */ - for (i=0;ichannels;i++) + if (h->channel_mapping == 3) { - if (!read_chars(&p, &h->stream_map[i], 1)) + int dmatrix_size = h->channels * (h->nb_streams + h->nb_coupled) * 2; + if (dmatrix_size > len - p.pos) return 0; - if (h->stream_map[i]>(h->nb_streams+h->nb_coupled) && h->stream_map[i]!=255) + if (dmatrix_size > OPUS_DEMIXING_MATRIX_SIZE_MAX) + p.pos += dmatrix_size; + else if (!read_chars(&p, h->dmatrix, dmatrix_size)) return 0; + for (i=0;ichannels;i++) { + h->stream_map[i] = i; + } + } + else + { + for (i=0;ichannels;i++) + { + if (!read_chars(&p, &h->stream_map[i], 1)) + return 0; + if (h->stream_map[i]>(h->nb_streams+h->nb_coupled) && h->stream_map[i]!=255) + return 0; + } } } else { if(h->channels>2) @@ -216,61 +194,6 @@ int opus_header_parse(const unsigned char *packet, int len, OpusHeader *h) return 1; } -int opus_header_to_packet(const OpusHeader *h, unsigned char *packet, int len) -{ - int i; - Packet p; - unsigned char ch; - - p.data = packet; - p.maxlen = len; - p.pos = 0; - if (len<19)return 0; - if (!write_chars(&p, (const unsigned char*)"OpusHead", 8)) - return 0; - /* Version is 1 */ - ch = 1; - if (!write_chars(&p, &ch, 1)) - return 0; - - ch = h->channels; - if (!write_chars(&p, &ch, 1)) - return 0; - - if (!write_uint16(&p, h->preskip)) - return 0; - - if (!write_uint32(&p, h->input_sample_rate)) - return 0; - - if (!write_uint16(&p, h->gain)) - return 0; - - ch = h->channel_mapping; - if (!write_chars(&p, &ch, 1)) - return 0; - - if (h->channel_mapping != 0) - { - ch = h->nb_streams; - if (!write_chars(&p, &ch, 1)) - return 0; - - ch = h->nb_coupled; - if (!write_chars(&p, &ch, 1)) - return 0; - - /* Multi-stream support */ - for (i=0;ichannels;i++) - { - if (!write_chars(&p, &h->stream_map[i], 1)) - return 0; - } - } - - return p.pos; -} - /* This is just here because it's a convenient file linked by both opusenc and opusdec (to guarantee this maps stays in sync). */ const int wav_permute_matrix[8][8] = -- cgit v1.2.3