13f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org/*
23f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
33f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org *
43f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org *  Use of this source code is governed by a BSD-style license
53f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org *  that can be found in the LICENSE file in the root of the source
63f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org *  tree. An additional intellectual property rights grant can be found
73f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org *  in the file PATENTS.  All contributing project authors may
83f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
93f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org */
103f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
113f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org/*
123f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org * This file generates databases with information about all supported audio
133f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org * codecs.
143f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org */
153f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
163f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org// TODO(tlegrand): Change constant input pointers in all functions to constant
173f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org// references, where appropriate.
18ed0b4fb2f28fa291e726fc1cf6852611f2176392turaj@webrtc.org#include "webrtc/modules/audio_coding/main/acm2/acm_codec_database.h"
193f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
203f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#include <assert.h>
213f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
22ed0b4fb2f28fa291e726fc1cf6852611f2176392turaj@webrtc.org#include "webrtc/modules/audio_coding/main/acm2/acm_common_defs.h"
23e5abc854f3dc47de16067c2a41476c39b7626722henrik.lundin@webrtc.org#include "webrtc/modules/audio_coding/neteq/interface/audio_decoder.h"
243f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#include "webrtc/system_wrappers/interface/trace.h"
253f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
263f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org// Includes needed to create the codecs.
273f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org// G711, PCM mu-law and A-law
28ed0b4fb2f28fa291e726fc1cf6852611f2176392turaj@webrtc.org#include "webrtc/modules/audio_coding/main/acm2/acm_pcma.h"
29ed0b4fb2f28fa291e726fc1cf6852611f2176392turaj@webrtc.org#include "webrtc/modules/audio_coding/main/acm2/acm_pcmu.h"
303f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#include "webrtc/modules/audio_coding/codecs/g711/include/g711_interface.h"
313f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org// CNG
323f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#include "webrtc/modules/audio_coding/codecs/cng/include/webrtc_cng.h"
33ed0b4fb2f28fa291e726fc1cf6852611f2176392turaj@webrtc.org#include "webrtc/modules/audio_coding/main/acm2/acm_cng.h"
343f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_ISAC
353f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#include "webrtc/modules/audio_coding/codecs/isac/main/interface/isac.h"
363f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
373f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_ISACFX
383f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#include "webrtc/modules/audio_coding/codecs/isac/fix/interface/isacfix.h"
393f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
403f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#if (defined WEBRTC_CODEC_ISACFX) || (defined WEBRTC_CODEC_ISAC)
41ed0b4fb2f28fa291e726fc1cf6852611f2176392turaj@webrtc.org#include "webrtc/modules/audio_coding/main/acm2/acm_isac.h"
42ed0b4fb2f28fa291e726fc1cf6852611f2176392turaj@webrtc.org#include "webrtc/modules/audio_coding/main/acm2/acm_isac_macros.h"
433f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
443f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_PCM16
453f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#include "webrtc/modules/audio_coding/codecs/pcm16b/include/pcm16b.h"
46ed0b4fb2f28fa291e726fc1cf6852611f2176392turaj@webrtc.org#include "webrtc/modules/audio_coding/main/acm2/acm_pcm16b.h"
473f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
483f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_ILBC
493f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#include "webrtc/modules/audio_coding/codecs/ilbc/interface/ilbc.h"
50ed0b4fb2f28fa291e726fc1cf6852611f2176392turaj@webrtc.org#include "webrtc/modules/audio_coding/main/acm2/acm_ilbc.h"
513f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
523f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_AMR
533f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#include "webrtc/modules/audio_coding/codecs/amr/include/amr_interface.h"
54ed0b4fb2f28fa291e726fc1cf6852611f2176392turaj@webrtc.org#include "webrtc/modules/audio_coding/main/acm2/acm_amr.h"
553f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
563f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_AMRWB
573f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#include "webrtc/modules/audio_coding/codecs/amrwb/include/amrwb_interface.h"
58ed0b4fb2f28fa291e726fc1cf6852611f2176392turaj@webrtc.org#include "webrtc/modules/audio_coding/main/acm2/acm_amrwb.h"
593f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
603f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_CELT
613f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#include "webrtc/modules/audio_coding/codecs/celt/include/celt_interface.h"
62ed0b4fb2f28fa291e726fc1cf6852611f2176392turaj@webrtc.org#include "webrtc/modules/audio_coding/main/acm2/acm_celt.h"
633f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
643f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_G722
653f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#include "webrtc/modules/audio_coding/codecs/g722/include/g722_interface.h"
66ed0b4fb2f28fa291e726fc1cf6852611f2176392turaj@webrtc.org#include "webrtc/modules/audio_coding/main/acm2/acm_g722.h"
673f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
683f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_G722_1
693f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#include "webrtc/modules/audio_coding/codecs/g7221/include/g7221_interface.h"
70ed0b4fb2f28fa291e726fc1cf6852611f2176392turaj@webrtc.org#include "webrtc/modules/audio_coding/main/acm2/acm_g7221.h"
713f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
723f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_G722_1C
733f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#include "webrtc/modules/audio_coding/codecs/g7221c/include/g7221c_interface.h"
74ed0b4fb2f28fa291e726fc1cf6852611f2176392turaj@webrtc.org#include "webrtc/modules/audio_coding/main/acm2/acm_g7221c.h"
753f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
763f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_G729
773f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#include "webrtc/modules/audio_coding/codecs/g729/include/g729_interface.h"
78ed0b4fb2f28fa291e726fc1cf6852611f2176392turaj@webrtc.org#include "webrtc/modules/audio_coding/main/acm2/acm_g729.h"
793f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
803f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_G729_1
813f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#include "webrtc/modules/audio_coding/codecs/g7291/include/g7291_interface.h"
82ed0b4fb2f28fa291e726fc1cf6852611f2176392turaj@webrtc.org#include "webrtc/modules/audio_coding/main/acm2/acm_g7291.h"
833f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
843f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_GSMFR
853f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#include "webrtc/modules/audio_coding/codecs/gsmfr/include/gsmfr_interface.h"
86ed0b4fb2f28fa291e726fc1cf6852611f2176392turaj@webrtc.org#include "webrtc/modules/audio_coding/main/acm2/acm_gsmfr.h"
873f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
883f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_OPUS
893f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#include "webrtc/modules/audio_coding/codecs/opus/interface/opus_interface.h"
90ed0b4fb2f28fa291e726fc1cf6852611f2176392turaj@webrtc.org#include "webrtc/modules/audio_coding/main/acm2/acm_opus.h"
913f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
923f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_SPEEX
933f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#include "webrtc/modules/audio_coding/codecs/speex/include/speex_interface.h"
94ed0b4fb2f28fa291e726fc1cf6852611f2176392turaj@webrtc.org#include "webrtc/modules/audio_coding/main/acm2/acm_speex.h"
953f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
963f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_AVT
97ed0b4fb2f28fa291e726fc1cf6852611f2176392turaj@webrtc.org#include "webrtc/modules/audio_coding/main/acm2/acm_dtmf_playout.h"
983f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
993f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_RED
100ed0b4fb2f28fa291e726fc1cf6852611f2176392turaj@webrtc.org#include "webrtc/modules/audio_coding/main/acm2/acm_red.h"
1013f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
1023f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
1033f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.orgnamespace webrtc {
1043f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
1050a1c75a50d10621f70d5921c5b8b9c0eb144bb42turaj@webrtc.orgnamespace acm2 {
1060a1c75a50d10621f70d5921c5b8b9c0eb144bb42turaj@webrtc.org
1074d081990603c0fc3c08a81523efc811b8e0828baturaj@webrtc.org// Not yet used payload-types.
1084d081990603c0fc3c08a81523efc811b8e0828baturaj@webrtc.org// 83,  82,  81, 80, 79,  78,  77,  76,  75,  74,  73,  72,  71,  70,  69, 68,
1094d081990603c0fc3c08a81523efc811b8e0828baturaj@webrtc.org// 67, 66, 65
1103f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
1113f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.orgconst CodecInst ACMCodecDB::database_[] = {
1123f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#if (defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX))
1133f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  {103, "ISAC", 16000, kIsacPacSize480, 1, kIsacWbDefaultRate},
1143f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org# if (defined(WEBRTC_CODEC_ISAC))
1153f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  {104, "ISAC", 32000, kIsacPacSize960, 1, kIsacSwbDefaultRate},
1163f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  {105, "ISAC", 48000, kIsacPacSize1440, 1, kIsacSwbDefaultRate},
1173f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org# endif
1183f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
1193f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_PCM16
1203f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  // Mono
1214d081990603c0fc3c08a81523efc811b8e0828baturaj@webrtc.org  {107, "L16", 8000, 80, 1, 128000},
1224d081990603c0fc3c08a81523efc811b8e0828baturaj@webrtc.org  {108, "L16", 16000, 160, 1, 256000},
1234d081990603c0fc3c08a81523efc811b8e0828baturaj@webrtc.org  {109, "L16", 32000, 320, 1, 512000},
1243f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  // Stereo
1254d081990603c0fc3c08a81523efc811b8e0828baturaj@webrtc.org  {111, "L16", 8000, 80, 2, 128000},
1264d081990603c0fc3c08a81523efc811b8e0828baturaj@webrtc.org  {112, "L16", 16000, 160, 2, 256000},
1274d081990603c0fc3c08a81523efc811b8e0828baturaj@webrtc.org  {113, "L16", 32000, 320, 2, 512000},
1283f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
1293f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  // G.711, PCM mu-law and A-law.
1303f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  // Mono
1313f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  {0, "PCMU", 8000, 160, 1, 64000},
1323f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  {8, "PCMA", 8000, 160, 1, 64000},
1333f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  // Stereo
1343f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  {110, "PCMU", 8000, 160, 2, 64000},
1353f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  {118, "PCMA", 8000, 160, 2, 64000},
1363f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_ILBC
1373f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  {102, "ILBC", 8000, 240, 1, 13300},
1383f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
1393f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_AMR
1404d081990603c0fc3c08a81523efc811b8e0828baturaj@webrtc.org  {114, "AMR", 8000, 160, 1, 12200},
1413f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
1423f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_AMRWB
1434d081990603c0fc3c08a81523efc811b8e0828baturaj@webrtc.org  {115, "AMR-WB", 16000, 320, 1, 20000},
1443f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
1453f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_CELT
1463f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  // Mono
1474d081990603c0fc3c08a81523efc811b8e0828baturaj@webrtc.org  {116, "CELT", 32000, 640, 1, 64000},
1483f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  // Stereo
1494d081990603c0fc3c08a81523efc811b8e0828baturaj@webrtc.org  {117, "CELT", 32000, 640, 2, 64000},
1503f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
1513f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_G722
1523f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  // Mono
1533f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  {9, "G722", 16000, 320, 1, 64000},
1543f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  // Stereo
1553f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  {119, "G722", 16000, 320, 2, 64000},
1563f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
1573f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_G722_1
1584d081990603c0fc3c08a81523efc811b8e0828baturaj@webrtc.org  {92, "G7221", 16000, 320, 1, 32000},
1594d081990603c0fc3c08a81523efc811b8e0828baturaj@webrtc.org  {91, "G7221", 16000, 320, 1, 24000},
1604d081990603c0fc3c08a81523efc811b8e0828baturaj@webrtc.org  {90, "G7221", 16000, 320, 1, 16000},
1613f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
1623f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_G722_1C
1634d081990603c0fc3c08a81523efc811b8e0828baturaj@webrtc.org  {89, "G7221", 32000, 640, 1, 48000},
1644d081990603c0fc3c08a81523efc811b8e0828baturaj@webrtc.org  {88, "G7221", 32000, 640, 1, 32000},
1654d081990603c0fc3c08a81523efc811b8e0828baturaj@webrtc.org  {87, "G7221", 32000, 640, 1, 24000},
1663f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
1673f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_G729
1683f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  {18, "G729", 8000, 240, 1, 8000},
1693f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
1703f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_G729_1
1714d081990603c0fc3c08a81523efc811b8e0828baturaj@webrtc.org  {86, "G7291", 16000, 320, 1, 32000},
1723f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
1733f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_GSMFR
1743f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  {3, "GSM", 8000, 160, 1, 13200},
1753f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
1763f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_OPUS
1773f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  // Opus internally supports 48, 24, 16, 12, 8 kHz.
1783f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  // Mono and stereo.
1793f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  {120, "opus", 48000, 960, 2, 64000},
1803f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
1813f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_SPEEX
1824d081990603c0fc3c08a81523efc811b8e0828baturaj@webrtc.org  {85, "speex", 8000, 160, 1, 11000},
1834d081990603c0fc3c08a81523efc811b8e0828baturaj@webrtc.org  {84, "speex", 16000, 320, 1, 22000},
1843f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
1853f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  // Comfort noise for four different sampling frequencies.
1863f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  {13, "CN", 8000, 240, 1, 0},
1873f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  {98, "CN", 16000, 480, 1, 0},
1883f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  {99, "CN", 32000, 960, 1, 0},
1894d081990603c0fc3c08a81523efc811b8e0828baturaj@webrtc.org#ifdef ENABLE_48000_HZ
1903f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  {100, "CN", 48000, 1440, 1, 0},
1914d081990603c0fc3c08a81523efc811b8e0828baturaj@webrtc.org#endif
1923f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_AVT
1933f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  {106, "telephone-event", 8000, 240, 1, 0},
1943f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
1953f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_RED
1963f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  {127, "red", 8000, 0, 1, 0},
1973f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
1983f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  // To prevent compile errors due to trailing commas.
1993f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  {-1, "Null", -1, -1, -1, -1}
2003f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org};
2013f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
2023f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org// Create database with all codec settings at compile time.
2033f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org// Each entry needs the following parameters in the given order:
2043f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org// Number of allowed packet sizes, a vector with the allowed packet sizes,
2053f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org// Basic block samples, max number of channels that are supported.
2063f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.orgconst ACMCodecDB::CodecSettings ACMCodecDB::codec_settings_[] = {
2073f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#if (defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX))
2083f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    {2, {kIsacPacSize480, kIsacPacSize960}, 0, 1, true},
2093f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org# if (defined(WEBRTC_CODEC_ISAC))
2103f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    {1, {kIsacPacSize960}, 0, 1, false},
2113f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    {1, {kIsacPacSize1440}, 0, 1, true},
2123f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org# endif
2133f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
2143f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_PCM16
2153f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    // Mono
2163f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    {4, {80, 160, 240, 320}, 0, 2, false},
2173f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    {4, {160, 320, 480, 640}, 0, 2, false},
2183f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    {2, {320, 640}, 0, 2, false},
2193f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    // Stereo
2203f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    {4, {80, 160, 240, 320}, 0, 2, false},
2213f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    {4, {160, 320, 480, 640}, 0, 2, false},
2223f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    {2, {320, 640}, 0, 2},
2233f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
2243f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    // G.711, PCM mu-law and A-law.
2253f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    // Mono
2263f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    {6, {80, 160, 240, 320, 400, 480}, 0, 2, false},
2273f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    {6, {80, 160, 240, 320, 400, 480}, 0, 2, false},
2283f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    // Stereo
2293f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    {6, {80, 160, 240, 320, 400, 480}, 0, 2, false},
2303f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    {6, {80, 160, 240, 320, 400, 480}, 0, 2, false},
2313f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_ILBC
2323f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    {4, {160, 240, 320, 480}, 0, 1, false},
2333f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
2343f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_AMR
2353f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    {3, {160, 320, 480}, 0, 1, true},
2363f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
2373f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_AMRWB
2383f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    {3, {320, 640, 960}, 0, 1, true},
2393f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
2403f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_CELT
2413f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    // Mono
2423f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    {1, {640}, 0, 2, false},
2433f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    // Stereo
2443f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    {1, {640}, 0, 2, false},
2453f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
2463f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_G722
2473f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    // Mono
2483f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    {6, {160, 320, 480, 640, 800, 960}, 0, 2, false},
2493f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    // Stereo
2503f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    {6, {160, 320, 480, 640, 800, 960}, 0, 2, false},
2513f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
2523f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_G722_1
2533f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    {1, {320}, 320, 1, false},
2543f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    {1, {320}, 320, 1, false},
2553f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    {1, {320}, 320, 1, false},
2563f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
2573f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_G722_1C
2583f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    {1, {640}, 640, 1, false},
2593f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    {1, {640}, 640, 1, false},
2603f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    {1, {640}, 640, 1, false},
2613f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
2623f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_G729
2633f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    {6, {80, 160, 240, 320, 400, 480}, 0, 1, false},
2643f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
2653f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_G729_1
2663f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    {3, {320, 640, 960}, 0, 1, false},
2673f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
2683f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_GSMFR
2693f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    {3, {160, 320, 480}, 160, 1, false},
2703f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
2713f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_OPUS
2723f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    // Opus supports frames shorter than 10ms,
2733f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    // but it doesn't help us to use them.
2743f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    // Mono and stereo.
275933267f0b6fddf3fe62b5f990188da5980bca984turaj@webrtc.org    {4, {480, 960, 1920, 2880}, 0, 2, false},
2763f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
2773f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_SPEEX
2783f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    {3, {160, 320, 480}, 0, 1, false},
2793f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    {3, {320, 640, 960}, 0, 1, false},
2803f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
2813f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    // Comfort noise for three different sampling frequencies.
2823f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    {1, {240}, 240, 1, false},
2833f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    {1, {480}, 480, 1, false},
2843f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    {1, {960}, 960, 1, false},
2854d081990603c0fc3c08a81523efc811b8e0828baturaj@webrtc.org#ifdef ENABLE_48000_HZ
2863f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    {1, {1440}, 1440, 1, false},
2874d081990603c0fc3c08a81523efc811b8e0828baturaj@webrtc.org#endif
2883f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_AVT
2893f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    {1, {240}, 240, 1, false},
2903f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
2913f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_RED
2923f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    {1, {0}, 0, 1, false},
2933f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
2943f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    // To prevent compile errors due to trailing commas.
2953f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    {-1, {-1}, -1, -1, false}
2963f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org};
2973f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
2983f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org// Create a database of all NetEQ decoders at compile time.
2993f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.orgconst NetEqDecoder ACMCodecDB::neteq_decoders_[] = {
3003f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#if (defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX))
3013f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    kDecoderISAC,
3023f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org# if (defined(WEBRTC_CODEC_ISAC))
3033f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    kDecoderISACswb,
3043f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    kDecoderISACfb,
3053f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org# endif
3063f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
3073f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_PCM16
3083f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    // Mono
3093f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    kDecoderPCM16B,
3103f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    kDecoderPCM16Bwb,
3113f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    kDecoderPCM16Bswb32kHz,
3123f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    // Stereo
3133f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    kDecoderPCM16B_2ch,
3143f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    kDecoderPCM16Bwb_2ch,
3153f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    kDecoderPCM16Bswb32kHz_2ch,
3163f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
3173f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    // G.711, PCM mu-las and A-law.
3183f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    // Mono
3193f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    kDecoderPCMu,
3203f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    kDecoderPCMa,
3213f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    // Stereo
3223f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    kDecoderPCMu_2ch,
3233f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    kDecoderPCMa_2ch,
3243f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_ILBC
3253f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    kDecoderILBC,
3263f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
3273f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_AMR
3283f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    kDecoderAMR,
3293f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
3303f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_AMRWB
3313f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    kDecoderAMRWB,
3323f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
3333f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_CELT
3343f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    // Mono
3353f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    kDecoderCELT_32,
3363f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    // Stereo
3373f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    kDecoderCELT_32_2ch,
3383f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
3393f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_G722
3403f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    // Mono
3413f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    kDecoderG722,
3423f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    // Stereo
3433f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    kDecoderG722_2ch,
3443f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
3453f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_G722_1
3463f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    kDecoderG722_1_32,
3473f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    kDecoderG722_1_24,
3483f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    kDecoderG722_1_16,
3493f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
3503f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_G722_1C
3513f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    kDecoderG722_1C_48,
3523f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    kDecoderG722_1C_32,
3533f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    kDecoderG722_1C_24,
3543f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
3553f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_G729
3563f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    kDecoderG729,
3573f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
3583f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_G729_1
3593f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    kDecoderG729_1,
3603f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
3613f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_GSMFR
3623f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    kDecoderGSMFR,
3633f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
3643f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_OPUS
3653f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    // Mono and stereo.
3663f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    kDecoderOpus,
3673f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
3683f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_SPEEX
3693f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    kDecoderSPEEX_8,
3703f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    kDecoderSPEEX_16,
3713f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
3723f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    // Comfort noise for three different sampling frequencies.
3733f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    kDecoderCNGnb,
3743f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    kDecoderCNGwb,
3754d081990603c0fc3c08a81523efc811b8e0828baturaj@webrtc.org    kDecoderCNGswb32kHz
3764d081990603c0fc3c08a81523efc811b8e0828baturaj@webrtc.org#ifdef ENABLE_48000_HZ
3774d081990603c0fc3c08a81523efc811b8e0828baturaj@webrtc.org    , kDecoderCNGswb48kHz
3784d081990603c0fc3c08a81523efc811b8e0828baturaj@webrtc.org#endif
3793f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_AVT
3803f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    , kDecoderAVT
3813f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
3823f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_RED
3833f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    , kDecoderRED
3843f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
3853f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org};
3863f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
3873f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org// Get codec information from database.
3883f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org// TODO(tlegrand): replace memcpy with a pointer to the data base memory.
3893f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.orgint ACMCodecDB::Codec(int codec_id, CodecInst* codec_inst) {
3903f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  // Error check to see that codec_id is not out of bounds.
3913f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  if ((codec_id < 0) || (codec_id >= kNumCodecs)) {
3923f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    return -1;
3933f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  }
3943f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
3953f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  // Copy database information for the codec to the output.
3963f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  memcpy(codec_inst, &database_[codec_id], sizeof(CodecInst));
3973f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
3983f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  return 0;
3993f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org}
4003f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
4013f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org// Enumerator for error codes when asking for codec database id.
4023f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.orgenum {
4033f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  kInvalidCodec = -10,
4043f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  kInvalidPayloadtype = -30,
4053f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  kInvalidPacketSize = -40,
4063f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  kInvalidRate = -50
4073f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org};
4083f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
4093f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org// Gets the codec id number from the database. If there is some mismatch in
4103f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org// the codec settings, the function will return an error code.
4113f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org// NOTE! The first mismatch found will generate the return value.
4123f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.orgint ACMCodecDB::CodecNumber(const CodecInst& codec_inst, int* mirror_id) {
4133f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  // Look for a matching codec in the database.
4143f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  int codec_id = CodecId(codec_inst);
4153f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
4163f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  // Checks if we found a matching codec.
4173f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  if (codec_id == -1) {
4183f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    return kInvalidCodec;
4193f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  }
4203f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
4213f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  // Checks the validity of payload type
4223f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  if (!ValidPayloadType(codec_inst.pltype)) {
4233f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    return kInvalidPayloadtype;
4243f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  }
4253f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
4263f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  // Comfort Noise is special case, packet-size & rate is not checked.
4273f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  if (STR_CASE_CMP(database_[codec_id].plname, "CN") == 0) {
4283f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    *mirror_id = codec_id;
4293f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    return codec_id;
4303f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  }
4313f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
4323f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  // RED is special case, packet-size & rate is not checked.
4333f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  if (STR_CASE_CMP(database_[codec_id].plname, "red") == 0) {
4343f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    *mirror_id = codec_id;
4353f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    return codec_id;
4363f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  }
4373f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
4383f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  // Checks the validity of packet size.
4393f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  if (codec_settings_[codec_id].num_packet_sizes > 0) {
4403f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    bool packet_size_ok = false;
4413f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    int i;
4423f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    int packet_size_samples;
4433f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    for (i = 0; i < codec_settings_[codec_id].num_packet_sizes; i++) {
4443f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      packet_size_samples =
4453f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org          codec_settings_[codec_id].packet_sizes_samples[i];
4463f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      if (codec_inst.pacsize == packet_size_samples) {
4473f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        packet_size_ok = true;
4483f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        break;
4493f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      }
4503f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    }
4513f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
4523f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    if (!packet_size_ok) {
4533f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      return kInvalidPacketSize;
4543f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    }
4553f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  }
4563f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
4573f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  if (codec_inst.pacsize < 1) {
4583f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    return kInvalidPacketSize;
4593f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  }
4603f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
4613f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  // Check the validity of rate. Codecs with multiple rates have their own
4623f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  // function for this.
4633f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  *mirror_id = codec_id;
4643f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  if (STR_CASE_CMP("isac", codec_inst.plname) == 0) {
4653f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    if (IsISACRateValid(codec_inst.rate)) {
4663f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      // Set mirrorID to iSAC WB which is only created once to be used both for
4673f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      // iSAC WB and SWB, because they need to share struct.
4683f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      *mirror_id = kISAC;
4693f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      return  codec_id;
4703f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    } else {
4713f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      return kInvalidRate;
4723f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    }
4733f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  } else if (STR_CASE_CMP("ilbc", codec_inst.plname) == 0) {
4743f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    return IsILBCRateValid(codec_inst.rate, codec_inst.pacsize)
4753f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        ? codec_id : kInvalidRate;
4763f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  } else if (STR_CASE_CMP("amr", codec_inst.plname) == 0) {
4773f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    return IsAMRRateValid(codec_inst.rate)
4783f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        ? codec_id : kInvalidRate;
4793f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  } else if (STR_CASE_CMP("amr-wb", codec_inst.plname) == 0) {
4803f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    return IsAMRwbRateValid(codec_inst.rate)
4813f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        ? codec_id : kInvalidRate;
4823f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  } else if (STR_CASE_CMP("g7291", codec_inst.plname) == 0) {
4833f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    return IsG7291RateValid(codec_inst.rate)
4843f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        ? codec_id : kInvalidRate;
4853f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  } else if (STR_CASE_CMP("opus", codec_inst.plname) == 0) {
4863f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    return IsOpusRateValid(codec_inst.rate)
4873f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        ? codec_id : kInvalidRate;
4883f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  } else if (STR_CASE_CMP("speex", codec_inst.plname) == 0) {
4893f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    return IsSpeexRateValid(codec_inst.rate)
4903f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        ? codec_id : kInvalidRate;
4913f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  } else if (STR_CASE_CMP("celt", codec_inst.plname) == 0) {
4923f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    return IsCeltRateValid(codec_inst.rate)
4933f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        ? codec_id : kInvalidRate;
4943f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  }
4953f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
4963f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  return IsRateValid(codec_id, codec_inst.rate) ?
4973f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      codec_id : kInvalidRate;
4983f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org}
4993f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
5003f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org// Looks for a matching payload name, frequency, and channels in the
5013f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org// codec list. Need to check all three since some codecs have several codec
5023f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org// entries with different frequencies and/or channels.
5033f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org// Does not check other codec settings, such as payload type and packet size.
5043f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org// Returns the id of the codec, or -1 if no match is found.
5053f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.orgint ACMCodecDB::CodecId(const CodecInst& codec_inst) {
5063f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  return (CodecId(codec_inst.plname, codec_inst.plfreq,
5073f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org                  codec_inst.channels));
5083f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org}
5093f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
5103f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.orgint ACMCodecDB::CodecId(const char* payload_name, int frequency, int channels) {
5113f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  for (int id = 0; id < kNumCodecs; id++) {
5123f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    bool name_match = false;
5133f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    bool frequency_match = false;
5143f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    bool channels_match = false;
5153f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
5163f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    // Payload name, sampling frequency and number of channels need to match.
5173f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    // NOTE! If |frequency| is -1, the frequency is not applicable, and is
5183f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    // always treated as true, like for RED.
5193f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    name_match = (STR_CASE_CMP(database_[id].plname, payload_name) == 0);
5203f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    frequency_match = (frequency == database_[id].plfreq) || (frequency == -1);
5213f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    // The number of channels must match for all codecs but Opus.
5223f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    if (STR_CASE_CMP(payload_name, "opus") != 0) {
5233f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      channels_match = (channels == database_[id].channels);
5243f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    } else {
5253f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      // For opus we just check that number of channels is valid.
5263f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      channels_match = (channels == 1 || channels == 2);
5273f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    }
5283f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
5293f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    if (name_match && frequency_match && channels_match) {
5303f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      // We have found a matching codec in the list.
5313f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      return id;
5323f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    }
5333f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  }
5343f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
5353f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  // We didn't find a matching codec.
5363f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  return -1;
5373f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org}
5383f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org// Gets codec id number, and mirror id, from database for the receiver.
5393f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.orgint ACMCodecDB::ReceiverCodecNumber(const CodecInst& codec_inst,
5403f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org                                    int* mirror_id) {
5413f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  // Look for a matching codec in the database.
5423f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  int codec_id = CodecId(codec_inst);
5433f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
5443f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  // Set |mirror_id| to |codec_id|, except for iSAC. In case of iSAC we always
5453f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  // set |mirror_id| to iSAC WB (kISAC) which is only created once to be used
5463f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  // both for iSAC WB and SWB, because they need to share struct.
5473f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  if (STR_CASE_CMP(codec_inst.plname, "ISAC") != 0) {
5483f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    *mirror_id = codec_id;
5493f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  } else {
5503f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    *mirror_id = kISAC;
5513f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  }
5523f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
5533f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  return codec_id;
5543f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org}
5553f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
5563f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org// Returns the codec sampling frequency for codec with id = "codec_id" in
5573f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org// database.
5583f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.orgint ACMCodecDB::CodecFreq(int codec_id) {
5593f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  // Error check to see that codec_id is not out of bounds.
5603f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  if (codec_id < 0 || codec_id >= kNumCodecs) {
5613f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    return -1;
5623f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  }
5633f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
5643f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  return database_[codec_id].plfreq;
5653f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org}
5663f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
5673f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org// Returns the codec's basic coding block size in samples.
5683f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.orgint ACMCodecDB::BasicCodingBlock(int codec_id) {
5693f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  // Error check to see that codec_id is not out of bounds.
5703f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  if (codec_id < 0 || codec_id >= kNumCodecs) {
5713f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    return -1;
5723f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  }
5733f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
5743f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  return codec_settings_[codec_id].basic_block_samples;
5753f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org}
5763f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
5773f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org// Returns the NetEQ decoder database.
5783f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.orgconst NetEqDecoder* ACMCodecDB::NetEQDecoders() {
5793f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  return neteq_decoders_;
5803f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org}
5813f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
5823f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org// Gets mirror id. The Id is used for codecs sharing struct for settings that
5833f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org// need different payload types.
5843f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.orgint ACMCodecDB::MirrorID(int codec_id) {
5853f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  if (STR_CASE_CMP(database_[codec_id].plname, "isac") == 0) {
5863f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    return kISAC;
5873f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  } else {
5883f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    return codec_id;
5893f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  }
5903f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org}
5913f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
5923f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org// Creates memory/instance for storing codec state.
5933f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.orgACMGenericCodec* ACMCodecDB::CreateCodecInstance(const CodecInst& codec_inst) {
5943f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  // All we have support for right now.
5953f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  if (!STR_CASE_CMP(codec_inst.plname, "ISAC")) {
5963f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#if (defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX))
5973f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    return new ACMISAC(kISAC);
5983f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
5993f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  } else if (!STR_CASE_CMP(codec_inst.plname, "PCMU")) {
6003f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    if (codec_inst.channels == 1) {
6013f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      return new ACMPCMU(kPCMU);
6023f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    } else {
6033f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      return new ACMPCMU(kPCMU_2ch);
6043f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    }
6053f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  } else if (!STR_CASE_CMP(codec_inst.plname, "PCMA")) {
6063f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    if (codec_inst.channels == 1) {
6073f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      return new ACMPCMA(kPCMA);
6083f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    } else {
6093f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      return new ACMPCMA(kPCMA_2ch);
6103f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    }
6113f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  } else if (!STR_CASE_CMP(codec_inst.plname, "ILBC")) {
6123f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_ILBC
6133f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    return new ACMILBC(kILBC);
6143f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
6153f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  } else if (!STR_CASE_CMP(codec_inst.plname, "AMR")) {
6163f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_AMR
6173f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    return new ACMAMR(kGSMAMR);
6183f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
6193f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  } else if (!STR_CASE_CMP(codec_inst.plname, "AMR-WB")) {
6203f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_AMRWB
6213f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    return new ACMAMRwb(kGSMAMRWB);
6223f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
6233f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  } else if (!STR_CASE_CMP(codec_inst.plname, "CELT")) {
6243f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_CELT
6253f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    if (codec_inst.channels == 1) {
6263f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      return new ACMCELT(kCELT32);
6273f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    } else {
6283f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      return new ACMCELT(kCELT32_2ch);
6293f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    }
6303f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
6313f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  } else if (!STR_CASE_CMP(codec_inst.plname, "G722")) {
6323f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_G722
6333f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    if (codec_inst.channels == 1) {
6343f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      return new ACMG722(kG722);
6353f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    } else {
6363f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      return new ACMG722(kG722_2ch);
6373f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    }
6383f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
6393f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  } else if (!STR_CASE_CMP(codec_inst.plname, "G7221")) {
6403f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    switch (codec_inst.plfreq) {
6413f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      case 16000: {
6423f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_G722_1
6433f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        int codec_id;
6443f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        switch (codec_inst->rate) {
6453f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org          case 16000 : {
6463f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org            codec_id = kG722_1_16;
6473f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org            break;
6483f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org          }
6493f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org          case 24000 : {
6503f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org            codec_id = kG722_1_24;
6513f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org            break;
6523f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org          }
6533f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org          case 32000 : {
6543f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org            codec_id = kG722_1_32;
6553f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org            break;
6563f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org          }
6573f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org          default: {
6583f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org            return NULL;
6593f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org          }
6603f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org          return new ACMG722_1(codec_id);
6613f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        }
6623f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
6633f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      }
6643f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      case 32000: {
6653f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_G722_1C
6663f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        int codec_id;
6673f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        switch (codec_inst->rate) {
6683f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org          case 24000 : {
6693f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org            codec_id = kG722_1C_24;
6703f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org            break;
6713f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org          }
6723f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org          case 32000 : {
6733f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org            codec_id = kG722_1C_32;
6743f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org            break;
6753f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org          }
6763f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org          case 48000 : {
6773f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org            codec_id = kG722_1C_48;
6783f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org            break;
6793f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org          }
6803f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org          default: {
6813f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org            return NULL;
6823f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org          }
6833f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org          return new ACMG722_1C(codec_id);
6843f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        }
6853f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
6863f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      }
6873f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    }
6883f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  } else if (!STR_CASE_CMP(codec_inst.plname, "CN")) {
6893f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    // For CN we need to check sampling frequency to know what codec to create.
6903f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    int codec_id;
6913f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    switch (codec_inst.plfreq) {
6923f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      case 8000: {
6933f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        codec_id = kCNNB;
6943f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        break;
6953f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      }
6963f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      case 16000: {
6973f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        codec_id = kCNWB;
6983f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        break;
6993f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      }
7003f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      case 32000: {
7013f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        codec_id = kCNSWB;
7023f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        break;
7033f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      }
7044d081990603c0fc3c08a81523efc811b8e0828baturaj@webrtc.org#ifdef ENABLE_48000_HZ
7053f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      case 48000: {
7063f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        codec_id = kCNFB;
7073f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        break;
7083f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      }
7094d081990603c0fc3c08a81523efc811b8e0828baturaj@webrtc.org#endif
7103f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      default: {
7113f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        return NULL;
7123f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      }
7133f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    }
7143f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    return new ACMCNG(codec_id);
7153f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  } else if (!STR_CASE_CMP(codec_inst.plname, "G729")) {
7163f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_G729
7173f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    return new ACMG729(kG729);
7183f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
7193f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  } else if (!STR_CASE_CMP(codec_inst.plname, "G7291")) {
7203f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_G729_1
7213f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    return new ACMG729_1(kG729_1);
7223f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
7233f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  } else if (!STR_CASE_CMP(codec_inst.plname, "opus")) {
7243f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_OPUS
7253f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    return new ACMOpus(kOpus);
7263f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
7273f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  } else if (!STR_CASE_CMP(codec_inst.plname, "speex")) {
7283f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_SPEEX
7293f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    int codec_id;
7303f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    switch (codec_inst->plfreq) {
7313f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      case 8000: {
7323f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        codec_id = kSPEEX8;
7333f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        break;
7343f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      }
7353f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      case 16000: {
7363f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        codec_id = kSPEEX16;
7373f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        break;
7383f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      }
7393f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      default: {
7403f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        return NULL;
7413f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      }
7423f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    }
7433f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    return new ACMSPEEX(codec_id);
7443f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
7453f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  } else if (!STR_CASE_CMP(codec_inst.plname, "CN")) {
7463f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    // For CN we need to check sampling frequency to know what codec to create.
7473f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    int codec_id;
7483f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    switch (codec_inst.plfreq) {
7493f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      case 8000: {
7503f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        codec_id = kCNNB;
7513f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        break;
7523f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      }
7533f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      case 16000: {
7543f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        codec_id = kCNWB;
7553f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        break;
7563f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      }
7573f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      case 32000: {
7583f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        codec_id = kCNSWB;
7593f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        break;
7603f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      }
7614d081990603c0fc3c08a81523efc811b8e0828baturaj@webrtc.org#ifdef ENABLE_48000_HZ
7623f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      case 48000: {
7633f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        codec_id = kCNFB;
7643f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        break;
7653f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      }
7664d081990603c0fc3c08a81523efc811b8e0828baturaj@webrtc.org#endif
7673f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      default: {
7683f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        return NULL;
7693f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      }
7703f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    }
7713f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    return new ACMCNG(codec_id);
7723f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  } else if (!STR_CASE_CMP(codec_inst.plname, "L16")) {
7733f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_PCM16
7743f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    // For L16 we need to check sampling frequency to know what codec to create.
7753f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    int codec_id;
7763f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    if (codec_inst.channels == 1) {
7773f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      switch (codec_inst.plfreq) {
7783f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        case 8000: {
7793f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org          codec_id = kPCM16B;
7803f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org          break;
7813f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        }
7823f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        case 16000: {
7833f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org          codec_id = kPCM16Bwb;
7843f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org          break;
7853f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        }
7863f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        case 32000: {
7873f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org          codec_id = kPCM16Bswb32kHz;
7883f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org          break;
7893f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        }
7903f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        default: {
7913f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org          return NULL;
7923f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        }
7933f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      }
7943f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    } else {
7953f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      switch (codec_inst.plfreq) {
7963f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        case 8000: {
7973f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org          codec_id = kPCM16B_2ch;
7983f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org          break;
7993f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        }
8003f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        case 16000: {
8013f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org          codec_id = kPCM16Bwb_2ch;
8023f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org          break;
8033f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        }
8043f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        case 32000: {
8053f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org          codec_id = kPCM16Bswb32kHz_2ch;
8063f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org          break;
8073f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        }
8083f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        default: {
8093f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org          return NULL;
8103f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org        }
8113f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      }
8123f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    }
8133f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    return new ACMPCM16B(codec_id);
8143f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
8153f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  } else if (!STR_CASE_CMP(codec_inst.plname, "telephone-event")) {
8163f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_AVT
8173f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    return new ACMDTMFPlayout(kAVT);
8183f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
8193f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  } else if (!STR_CASE_CMP(codec_inst.plname, "red")) {
8203f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#ifdef WEBRTC_CODEC_RED
8213f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    return new ACMRED(kRED);
8223f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org#endif
8233f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  }
8243f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  return NULL;
8253f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org}
8263f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
8273f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org// Checks if the bitrate is valid for the codec.
8283f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.orgbool ACMCodecDB::IsRateValid(int codec_id, int rate) {
8293f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  if (database_[codec_id].rate == rate) {
8303f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    return true;
8313f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  } else {
8323f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    return false;
8333f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  }
8343f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org}
8353f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
8363f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org// Checks if the bitrate is valid for iSAC.
8373f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.orgbool ACMCodecDB::IsISACRateValid(int rate) {
8383f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  if ((rate == -1) || ((rate <= 56000) && (rate >= 10000))) {
8393f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    return true;
8403f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  } else {
8413f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    return false;
8423f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  }
8433f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org}
8443f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
8453f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org// Checks if the bitrate is valid for iLBC.
8463f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.orgbool ACMCodecDB::IsILBCRateValid(int rate, int frame_size_samples) {
8473f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  if (((frame_size_samples == 240) || (frame_size_samples == 480)) &&
8483f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      (rate == 13300)) {
8493f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    return true;
8503f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  } else if (((frame_size_samples == 160) || (frame_size_samples == 320)) &&
8513f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      (rate == 15200)) {
8523f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    return true;
8533f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  } else {
8543f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    return false;
8553f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  }
8563f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org}
8573f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
8583f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org// Check if the bitrate is valid for the GSM-AMR.
8593f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.orgbool ACMCodecDB::IsAMRRateValid(int rate) {
8603f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  switch (rate) {
8613f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    case 4750:
8623f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    case 5150:
8633f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    case 5900:
8643f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    case 6700:
8653f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    case 7400:
8663f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    case 7950:
8673f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    case 10200:
8683f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    case 12200: {
8693f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      return true;
8703f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    }
8713f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    default: {
8723f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      return false;
8733f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    }
8743f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  }
8753f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org}
8763f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
8773f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org// Check if the bitrate is valid for GSM-AMR-WB.
8783f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.orgbool ACMCodecDB::IsAMRwbRateValid(int rate) {
8793f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  switch (rate) {
8803f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    case 7000:
8813f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    case 9000:
8823f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    case 12000:
8833f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    case 14000:
8843f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    case 16000:
8853f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    case 18000:
8863f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    case 20000:
8873f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    case 23000:
8883f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    case 24000: {
8893f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      return true;
8903f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    }
8913f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    default: {
8923f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      return false;
8933f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    }
8943f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  }
8953f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org}
8963f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
8973f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org// Check if the bitrate is valid for G.729.1.
8983f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.orgbool ACMCodecDB::IsG7291RateValid(int rate) {
8993f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  switch (rate) {
9003f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    case 8000:
9013f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    case 12000:
9023f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    case 14000:
9033f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    case 16000:
9043f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    case 18000:
9053f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    case 20000:
9063f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    case 22000:
9073f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    case 24000:
9083f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    case 26000:
9093f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    case 28000:
9103f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    case 30000:
9113f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    case 32000: {
9123f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      return true;
9133f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    }
9143f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    default: {
9153f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org      return false;
9163f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    }
9173f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  }
9183f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org}
9193f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
9203f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org// Checks if the bitrate is valid for Speex.
9213f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.orgbool ACMCodecDB::IsSpeexRateValid(int rate) {
9223f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  if (rate > 2000) {
9233f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    return true;
9243f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  } else {
9253f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    return false;
9263f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  }
9273f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org}
9283f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
9293f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org// Checks if the bitrate is valid for Opus.
9303f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.orgbool ACMCodecDB::IsOpusRateValid(int rate) {
9313f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  if ((rate < 6000) || (rate > 510000)) {
9323f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    return false;
9333f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  }
9343f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  return true;
9353f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org}
9363f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
9373f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org// Checks if the bitrate is valid for Celt.
9383f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.orgbool ACMCodecDB::IsCeltRateValid(int rate) {
9393f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  if ((rate >= 48000) && (rate <= 128000)) {
9403f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    return true;
9413f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  } else {
9423f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    return false;
9433f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  }
9443f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org}
9453f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
9463f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org// Checks if the payload type is in the valid range.
9473f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.orgbool ACMCodecDB::ValidPayloadType(int payload_type) {
9483f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  if ((payload_type < 0) || (payload_type > 127)) {
9493f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org    return false;
9503f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  }
9513f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  return true;
9523f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org}
9533f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
9543f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.orgbool ACMCodecDB::OwnsDecoder(int codec_id) {
9553f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  assert(codec_id >= 0 && codec_id < ACMCodecDB::kNumCodecs);
9563f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org  return ACMCodecDB::codec_settings_[codec_id].owns_decoder;
9573f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org}
9583f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org
9590a1c75a50d10621f70d5921c5b8b9c0eb144bb42turaj@webrtc.org}  // namespace acm2
9600a1c75a50d10621f70d5921c5b8b9c0eb144bb42turaj@webrtc.org
9613f39c00d9875d7e09062725757b789f4da375ef9turaj@webrtc.org}  // namespace webrtc
962