1885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Copyright (c) 2011 Xiph.Org Foundation
2885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   Written by Jean-Marc Valin */
3885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/*
4885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   Redistribution and use in source and binary forms, with or without
5885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   modification, are permitted provided that the following conditions
6885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   are met:
7885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
8885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   - Redistributions of source code must retain the above copyright
9885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   notice, this list of conditions and the following disclaimer.
10885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
11885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   - Redistributions in binary form must reproduce the above copyright
12885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   notice, this list of conditions and the following disclaimer in the
13885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   documentation and/or other materials provided with the distribution.
14885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
15885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
18885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
19885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
23885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org*/
27885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
28885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#ifdef HAVE_CONFIG_H
29885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "config.h"
30885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif
31885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
32885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "opus_multistream.h"
33885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "opus.h"
34885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "opus_private.h"
35885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "stack_alloc.h"
36885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include <stdarg.h>
37885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "float_cast.h"
38885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#include "os_support.h"
39885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
40885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
41e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.orgint validate_layout(const ChannelLayout *layout)
42885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org{
43885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   int i, max_channel;
44885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
45885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   max_channel = layout->nb_streams+layout->nb_coupled_streams;
46885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   if (max_channel>255)
47885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      return 0;
48885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   for (i=0;i<layout->nb_channels;i++)
49885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   {
50885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      if (layout->mapping[i] >= max_channel && layout->mapping[i] != 255)
51885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         return 0;
52885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   }
53885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   return 1;
54885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
55885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
56885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
57e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.orgint get_left_channel(const ChannelLayout *layout, int stream_id, int prev)
58885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org{
59885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   int i;
60885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   i = (prev<0) ? 0 : prev+1;
61885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   for (;i<layout->nb_channels;i++)
62885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   {
63885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      if (layout->mapping[i]==stream_id*2)
64885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         return i;
65885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   }
66885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   return -1;
67885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
68885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
69e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.orgint get_right_channel(const ChannelLayout *layout, int stream_id, int prev)
70885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org{
71885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   int i;
72885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   i = (prev<0) ? 0 : prev+1;
73885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   for (;i<layout->nb_channels;i++)
74885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   {
75885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      if (layout->mapping[i]==stream_id*2+1)
76885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         return i;
77885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   }
78885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   return -1;
79885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
80885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
81e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.orgint get_mono_channel(const ChannelLayout *layout, int stream_id, int prev)
82885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org{
83885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   int i;
84885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   i = (prev<0) ? 0 : prev+1;
85885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   for (;i<layout->nb_channels;i++)
86885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   {
87885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org      if (layout->mapping[i]==stream_id+layout->nb_coupled_streams)
88885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org         return i;
89885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   }
90885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org   return -1;
91885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
92885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
93